Module Name: src Committed By: yamaguchi Date: Thu Sep 30 03:23:48 UTC 2021
Modified Files: src/sys/net: if.c if.h Log Message: Provide a hook point called at change of link state To generate a diff of this commit: cvs rdiff -u -r1.491 -r1.492 src/sys/net/if.c cvs rdiff -u -r1.293 -r1.294 src/sys/net/if.h Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/net/if.c diff -u src/sys/net/if.c:1.491 src/sys/net/if.c:1.492 --- src/sys/net/if.c:1.491 Thu Sep 30 03:15:25 2021 +++ src/sys/net/if.c Thu Sep 30 03:23:48 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if.c,v 1.491 2021/09/30 03:15:25 yamaguchi Exp $ */ +/* $NetBSD: if.c,v 1.492 2021/09/30 03:23:48 yamaguchi Exp $ */ /*- * Copyright (c) 1999, 2000, 2001, 2008 The NetBSD Foundation, Inc. @@ -90,7 +90,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.491 2021/09/30 03:15:25 yamaguchi Exp $"); +__KERNEL_RCSID(0, "$NetBSD: if.c,v 1.492 2021/09/30 03:23:48 yamaguchi Exp $"); #if defined(_KERNEL_OPT) #include "opt_inet.h" @@ -122,6 +122,7 @@ __KERNEL_RCSID(0, "$NetBSD: if.c,v 1.491 #include <sys/module_hook.h> #include <sys/compat_stub.h> #include <sys/msan.h> +#include <sys/hook.h> #include <net/if.h> #include <net/if_dl.h> @@ -631,8 +632,13 @@ static void if_getindex(ifnet_t *ifp) { bool hitlimit = false; + char xnamebuf[HOOKNAMSIZ]; ifp->if_index_gen = index_gen++; + snprintf(xnamebuf, sizeof(xnamebuf), + "%s-lshk", ifp->if_xname); + ifp->if_linkstate_hooks = simplehook_create(IPL_NET, + xnamebuf); ifp->if_index = if_index; if (ifindex2ifnet == NULL) { @@ -1533,6 +1539,8 @@ restart: ifp->if_ioctl_lock = NULL; mutex_obj_free(ifp->if_snd.ifq_lock); if_stats_fini(ifp); + KASSERT(!simplehook_has_hooks(ifp->if_linkstate_hooks)); + simplehook_destroy(ifp->if_linkstate_hooks); splx(s); @@ -2412,6 +2420,8 @@ if_link_state_change_process(struct ifne lagg_linkstate_changed(ifp); #endif + simplehook_dohooks(ifp->if_linkstate_hooks); + DOMAIN_FOREACH(dp) { if (dp->dom_if_link_state_change != NULL) dp->dom_if_link_state_change(ifp, link_state); @@ -2459,6 +2469,23 @@ out: KERNEL_UNLOCK_UNLESS_NET_MPSAFE(); } +void * +if_linkstate_change_establish(struct ifnet *ifp, void (*fn)(void *), void *arg) +{ + khook_t *hk; + + hk = simplehook_establish(ifp->if_linkstate_hooks, fn, arg); + + return (void *)hk; +} + +void +if_linkstate_change_disestablish(struct ifnet *ifp, void *vhook, kmutex_t *lock) +{ + + simplehook_disestablish(ifp->if_linkstate_hooks, vhook, lock); +} + /* * Used to mark addresses on an interface as DETATCHED or TENTATIVE * and thus start Duplicate Address Detection without changing the Index: src/sys/net/if.h diff -u src/sys/net/if.h:1.293 src/sys/net/if.h:1.294 --- src/sys/net/if.h:1.293 Thu Sep 30 03:15:25 2021 +++ src/sys/net/if.h Thu Sep 30 03:23:48 2021 @@ -1,4 +1,4 @@ -/* $NetBSD: if.h,v 1.293 2021/09/30 03:15:25 yamaguchi Exp $ */ +/* $NetBSD: if.h,v 1.294 2021/09/30 03:23:48 yamaguchi Exp $ */ /*- * Copyright (c) 1999, 2000, 2001 The NetBSD Foundation, Inc. @@ -85,6 +85,7 @@ #include <sys/socket.h> #include <sys/queue.h> #include <sys/mutex.h> +#include <sys/hook.h> #include <net/dlt.h> #include <net/pfil.h> @@ -432,6 +433,7 @@ typedef struct ifnet { /* XXX should be protocol independent */ LIST_HEAD(, in6_multi) if_multiaddrs; /* 6: */ + khook_list_t *if_linkstate_hooks; /* :: */ #endif } ifnet_t; @@ -1243,6 +1245,11 @@ void loopinit(void); int looutput(struct ifnet *, struct mbuf *, const struct sockaddr *, const struct rtentry *); +void * if_linkstate_change_establish(struct ifnet *, + void (*)(void *), void *); +void if_linkstate_change_disestablish(struct ifnet *, + void *, kmutex_t *); + /* * These are exported because they're an easy way to tell if * an interface is going away without having to burn a flag.