Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F168001323
D17100.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D17100.diff
View Options
Index: head/share/man/man9/EVENTHANDLER.9
===================================================================
--- head/share/man/man9/EVENTHANDLER.9
+++ head/share/man/man9/EVENTHANDLER.9
@@ -23,7 +23,7 @@
.\" SUCH DAMAGE.
.\" $FreeBSD$
.\"
-.Dd September 6, 2018
+.Dd October 21, 2018
.Dt EVENTHANDLER 9
.Os
.Sh NAME
@@ -298,6 +298,8 @@
Callback invoked when an interfance has been removed from an interface group.
.It Vt ifaddr_event
Callbacks invoked when an address is set up on a network interface.
+.It Vt ifaddr_event_ext
+Callback invoked when an address has been added or removed from an interface.
.It Vt if_clone_event
Callbacks invoked when an interface is cloned.
.It Vt iflladdr_event
Index: head/sys/net/if.c
===================================================================
--- head/sys/net/if.c
+++ head/sys/net/if.c
@@ -328,6 +328,18 @@
MALLOC_DEFINE(M_IFADDR, "ifaddr", "interface address");
MALLOC_DEFINE(M_IFMADDR, "ether_multi", "link-level multicast address");
+/*
+ * Support for old ifaddr_event.
+ */
+static void
+ifaddr_event_compat(void *arg __unused, struct ifnet *ifp,
+ struct ifaddr *ifa __unused, int event __unused)
+{
+
+ EVENTHANDLER_INVOKE(ifaddr_event, ifp);
+}
+EVENTHANDLER_DEFINE(ifaddr_event_ext, ifaddr_event_compat, NULL, 0);
+
struct ifnet *
ifnet_byindex_locked(u_short idx)
{
Index: head/sys/net/if_var.h
===================================================================
--- head/sys/net/if_var.h
+++ head/sys/net/if_var.h
@@ -432,6 +432,11 @@
/* interface address change event */
typedef void (*ifaddr_event_handler_t)(void *, struct ifnet *);
EVENTHANDLER_DECLARE(ifaddr_event, ifaddr_event_handler_t);
+typedef void (*ifaddr_event_ext_handler_t)(void *, struct ifnet *,
+ struct ifaddr *, int);
+EVENTHANDLER_DECLARE(ifaddr_event_ext, ifaddr_event_ext_handler_t);
+#define IFADDR_EVENT_ADD 0
+#define IFADDR_EVENT_DEL 1
/* new interface arrival event */
typedef void (*ifnet_arrival_event_handler_t)(void *, struct ifnet *);
EVENTHANDLER_DECLARE(ifnet_arrival_event, ifnet_arrival_event_handler_t);
Index: head/sys/netinet/in.c
===================================================================
--- head/sys/netinet/in.c
+++ head/sys/netinet/in.c
@@ -520,7 +520,12 @@
&ii->ii_allhosts);
}
- EVENTHANDLER_INVOKE(ifaddr_event, ifp);
+ /*
+ * Note: we don't need extra reference for ifa, since we called
+ * with sx lock held, and ifaddr can not be deleted in concurrent
+ * thread.
+ */
+ EVENTHANDLER_INVOKE(ifaddr_event_ext, ifp, ifa, IFADDR_EVENT_ADD);
return (error);
@@ -643,7 +648,8 @@
}
IF_ADDR_WUNLOCK(ifp);
- EVENTHANDLER_INVOKE(ifaddr_event, ifp);
+ EVENTHANDLER_INVOKE(ifaddr_event_ext, ifp, &ia->ia_ifa,
+ IFADDR_EVENT_DEL);
ifa_free(&ia->ia_ifa); /* in_ifaddrhead */
return (0);
Index: head/sys/netinet6/in6.c
===================================================================
--- head/sys/netinet6/in6.c
+++ head/sys/netinet6/in6.c
@@ -712,7 +712,8 @@
ND6_WUNLOCK();
nd6_prefix_del(pr);
}
- EVENTHANDLER_INVOKE(ifaddr_event, ifp);
+ EVENTHANDLER_INVOKE(ifaddr_event_ext, ifp, &ia->ia_ifa,
+ IFADDR_EVENT_DEL);
break;
}
@@ -1456,7 +1457,10 @@
WITNESS_WARN(WARN_GIANTOK | WARN_SLEEPOK, NULL,
"Invoking IPv6 network device address event may sleep");
- EVENTHANDLER_INVOKE(ifaddr_event, ifp);
+ ifa_ref(&ia->ia_ifa);
+ EVENTHANDLER_INVOKE(ifaddr_event_ext, ifp, &ia->ia_ifa,
+ IFADDR_EVENT_ADD);
+ ifa_free(&ia->ia_ifa);
return (error);
}
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Wed, Aug 26, 8:47 PM (8 h, 1 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
37189547
Default Alt Text
D17100.diff (3 KB)
Attached To
Mode
D17100: Extend ifaddr_event to pass ifaddr and event type to handler
Attached
Detach File
Event Timeline
Log In to Comment