diff options
author | np <np@FreeBSD.org> | 2009-09-08 21:17:17 +0000 |
---|---|---|
committer | np <np@FreeBSD.org> | 2009-09-08 21:17:17 +0000 |
commit | ba75578c03f4d837ac7cb26c0b6a82ab8dc93ed5 (patch) | |
tree | 68b22d660fca65bc870288614e3d6480e233e7bb /sys/netinet | |
parent | e645b495eda0a345c1b9caa5f932817c25234633 (diff) | |
download | FreeBSD-src-ba75578c03f4d837ac7cb26c0b6a82ab8dc93ed5.zip FreeBSD-src-ba75578c03f4d837ac7cb26c0b6a82ab8dc93ed5.tar.gz |
Add arp_update_event. This replaces route_arp_update_event, which
has not worked since the arp-v2 rewrite.
The event handler will be called with the llentry write-locked and
can examine la_flags to determine whether the entry is being added
or removed.
Reviewed by: gnn, kmacy
Approved by: gnn (mentor)
MFC after: 1 month
Diffstat (limited to 'sys/netinet')
-rw-r--r-- | sys/netinet/if_ether.c | 2 | ||||
-rw-r--r-- | sys/netinet/if_ether.h | 5 | ||||
-rw-r--r-- | sys/netinet/in.c | 1 |
3 files changed, 8 insertions, 0 deletions
diff --git a/sys/netinet/if_ether.c b/sys/netinet/if_ether.c index c170c7a..941a93b 100644 --- a/sys/netinet/if_ether.c +++ b/sys/netinet/if_ether.c @@ -684,6 +684,8 @@ match: (void)memcpy(&la->ll_addr, ar_sha(ah), ifp->if_addrlen); la->la_flags |= LLE_VALID; + EVENTHANDLER_INVOKE(arp_update_event, la); + if (!(la->la_flags & LLE_STATIC)) { la->la_expire = time_uptime + V_arpt_keep; callout_reset(&la->la_timer, hz * V_arpt_keep, diff --git a/sys/netinet/if_ether.h b/sys/netinet/if_ether.h index ce63d8d..1b69436 100644 --- a/sys/netinet/if_ether.h +++ b/sys/netinet/if_ether.h @@ -117,6 +117,11 @@ int arpresolve(struct ifnet *ifp, struct rtentry *rt, struct llentry **lle); void arp_ifinit(struct ifnet *, struct ifaddr *); void arp_ifinit2(struct ifnet *, struct ifaddr *, u_char *); + +#include <sys/eventhandler.h> +typedef void (*llevent_arp_update_fn)(void *, struct llentry *); +EVENTHANDLER_DECLARE(arp_update_event, llevent_arp_update_fn); + #endif #endif diff --git a/sys/netinet/in.c b/sys/netinet/in.c index 4edc1db..c11b3e7 100644 --- a/sys/netinet/in.c +++ b/sys/netinet/in.c @@ -1418,6 +1418,7 @@ in_lltable_lookup(struct lltable *llt, u_int flags, const struct sockaddr *l3add if (!(lle->la_flags & LLE_IFADDR) || (flags & LLE_IFADDR)) { LLE_WLOCK(lle); lle->la_flags = LLE_DELETED; + EVENTHANDLER_INVOKE(arp_update_event, lle); LLE_WUNLOCK(lle); #ifdef DIAGNOSTICS log(LOG_INFO, "ifaddr cache = %p is deleted\n", lle); |