Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/net Provide a hook point called when ether_ifdetach is c...
details: https://anonhg.NetBSD.org/src/rev/3088c3b88fc4
branches: trunk
changeset: 1023873:3088c3b88fc4
user: yamaguchi <yamaguchi%NetBSD.org@localhost>
date: Thu Sep 30 03:54:04 2021 +0000
description:
Provide a hook point called when ether_ifdetach is called
diffstat:
sys/net/if_ether.h | 8 +++++++-
sys/net/if_ethersubr.c | 43 +++++++++++++++++++++++++++++++++++++++++--
2 files changed, 48 insertions(+), 3 deletions(-)
diffs (121 lines):
diff -r f53bff92275c -r 3088c3b88fc4 sys/net/if_ether.h
--- a/sys/net/if_ether.h Thu Sep 30 03:51:05 2021 +0000
+++ b/sys/net/if_ether.h Thu Sep 30 03:54:04 2021 +0000
@@ -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 @@
* 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_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 *);
diff -r f53bff92275c -r 3088c3b88fc4 sys/net/if_ethersubr.c
--- a/sys/net/if_ethersubr.c Thu Sep 30 03:51:05 2021 +0000
+++ b/sys/net/if_ethersubr.c Thu Sep 30 03:54:04 2021 +0000
@@ -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 @@
#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 @@
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 @@
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 @@
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 @@
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
Home |
Main Index |
Thread Index |
Old Index