Module Name: src
Committed By: yamaguchi
Date: Thu Sep 30 03:54:04 UTC 2021
Modified Files:
src/sys/net: if_ether.h if_ethersubr.c
Log Message:
Provide a hook point called when ether_ifdetach is called
To generate a diff of this commit:
cvs rdiff -u -r1.86 -r1.87 src/sys/net/if_ether.h
cvs rdiff -u -r1.296 -r1.297 src/sys/net/if_ethersubr.c
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_ether.h
diff -u src/sys/net/if_ether.h:1.86 src/sys/net/if_ether.h:1.87
--- src/sys/net/if_ether.h:1.86 Sun Feb 14 19:35:37 2021
+++ src/sys/net/if_ether.h Thu Sep 30 03:54:04 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ether.h,v 1.86 2021/02/14 19:35:37 roy Exp $ */
+/* $NetBSD: if_ether.h,v 1.87 2021/09/30 03:54:04 yamaguchi Exp $ */
/*
* Copyright (c) 1982, 1986, 1993
@@ -198,6 +198,8 @@ struct ethercom {
* being added or removed.
*/
ether_vlancb_t ec_vlan_cb;
+ /* Hooks called at the beginning of detach of this interface */
+ khook_list_t *ec_ifdetach_hooks;
kmutex_t *ec_lock;
/* Flags used only by the kernel */
int ec_flags;
@@ -385,6 +387,10 @@ void ether_ifattach(struct ifnet *, cons
void ether_ifdetach(struct ifnet *);
int ether_mediachange(struct ifnet *);
void ether_mediastatus(struct ifnet *, struct ifmediareq *);
+void * ether_ifdetachhook_establish(struct ifnet *,
+ void (*)(void *), void *arg);
+void ether_ifdetachhook_disestablish(struct ifnet *,
+ void *, kmutex_t *);
char *ether_sprintf(const uint8_t *);
char *ether_snprintf(char *, size_t, const uint8_t *);
Index: src/sys/net/if_ethersubr.c
diff -u src/sys/net/if_ethersubr.c:1.296 src/sys/net/if_ethersubr.c:1.297
--- src/sys/net/if_ethersubr.c:1.296 Thu Sep 30 03:51:05 2021
+++ src/sys/net/if_ethersubr.c Thu Sep 30 03:54:04 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: if_ethersubr.c,v 1.296 2021/09/30 03:51:05 yamaguchi Exp $ */
+/* $NetBSD: if_ethersubr.c,v 1.297 2021/09/30 03:54:04 yamaguchi Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@@ -61,7 +61,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.296 2021/09/30 03:51:05 yamaguchi Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_ethersubr.c,v 1.297 2021/09/30 03:54:04 yamaguchi Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@@ -90,6 +90,7 @@ __KERNEL_RCSID(0, "$NetBSD: if_ethersubr
#include <sys/rndsource.h>
#include <sys/cpu.h>
#include <sys/kmem.h>
+#include <sys/hook.h>
#include <net/if.h>
#include <net/netisr.h>
@@ -1012,6 +1013,7 @@ void
ether_ifattach(struct ifnet *ifp, const uint8_t *lla)
{
struct ethercom *ec = (struct ethercom *)ifp;
+ char xnamebuf[HOOKNAMSIZ];
ifp->if_type = IFT_ETHER;
ifp->if_hdrlen = ETHER_HDR_LEN;
@@ -1031,6 +1033,9 @@ ether_ifattach(struct ifnet *ifp, const
ec->ec_flags = 0;
ifp->if_broadcastaddr = etherbroadcastaddr;
bpf_attach(ifp, DLT_EN10MB, sizeof(struct ether_header));
+ snprintf(xnamebuf, sizeof(xnamebuf),
+ "%s-ether_ifdetachhooks", ifp->if_xname);
+ ec->ec_ifdetach_hooks = simplehook_create(IPL_NET, xnamebuf);
#ifdef MBUFTRACE
mowner_init_owner(&ec->ec_tx_mowner, ifp->if_xname, "tx");
mowner_init_owner(&ec->ec_rx_mowner, ifp->if_xname, "rx");
@@ -1057,6 +1062,10 @@ ether_ifdetach(struct ifnet *ifp)
ifp->if_ioctl = __FPTRCAST(int (*)(struct ifnet *, u_long, void *),
enxio);
+ simplehook_dohooks(ec->ec_ifdetach_hooks);
+ KASSERT(!simplehook_has_hooks(ec->ec_ifdetach_hooks));
+ simplehook_destroy(ec->ec_ifdetach_hooks);
+
#if NBRIDGE > 0
if (ifp->if_bridge)
bridge_ifdetach(ifp);
@@ -1089,6 +1098,36 @@ ether_ifdetach(struct ifnet *ifp)
MOWNER_DETACH(&ec->ec_tx_mowner);
}
+void *
+ether_ifdetachhook_establish(struct ifnet *ifp,
+ void (*fn)(void *), void *arg)
+{
+ struct ethercom *ec;
+ khook_t *hk;
+
+ if (ifp->if_type != IFT_ETHER)
+ return NULL;
+
+ ec = (struct ethercom *)ifp;
+ hk = simplehook_establish(ec->ec_ifdetach_hooks,
+ fn, arg);
+
+ return (void *)hk;
+}
+
+void
+ether_ifdetachhook_disestablish(struct ifnet *ifp,
+ void *vhook, kmutex_t *lock)
+{
+ struct ethercom *ec;
+
+ if (vhook == NULL)
+ return;
+
+ ec = (struct ethercom *)ifp;
+ simplehook_disestablish(ec->ec_ifdetach_hooks, vhook, lock);
+}
+
#if 0
/*
* This is for reference. We have a table-driven version