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.

Reply via email to