svn commit: r339537 - in head: share/man/man9 sys/net sys/netinet sys/netinet6
Andrey V. Elsukov
ae at FreeBSD.org
Sun Oct 21 15:02:07 UTC 2018
Author: ae
Date: Sun Oct 21 15:02:06 2018
New Revision: 339537
URL: https://svnweb.freebsd.org/changeset/base/339537
Log:
Add ifaddr_event_ext event. It is similar to ifaddr_event, but the
handler receives the type of event IFADDR_EVENT_ADD/IFADDR_EVENT_DEL,
and the pointer to ifaddr. Also ifaddr_event now is implemented using
ifaddr_event_ext handler.
MFC after: 3 weeks
Sponsored by: Yandex LLC
Differential Revision: https://reviews.freebsd.org/D17100
Modified:
head/share/man/man9/EVENTHANDLER.9
head/sys/net/if.c
head/sys/net/if_var.h
head/sys/netinet/in.c
head/sys/netinet6/in6.c
Modified: head/share/man/man9/EVENTHANDLER.9
==============================================================================
--- head/share/man/man9/EVENTHANDLER.9 Sun Oct 21 14:48:40 2018 (r339536)
+++ head/share/man/man9/EVENTHANDLER.9 Sun Oct 21 15:02:06 2018 (r339537)
@@ -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 change has been made to an in
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
Modified: head/sys/net/if.c
==============================================================================
--- head/sys/net/if.c Sun Oct 21 14:48:40 2018 (r339536)
+++ head/sys/net/if.c Sun Oct 21 15:02:06 2018 (r339537)
@@ -328,6 +328,18 @@ static MALLOC_DEFINE(M_IFNET, "ifnet", "interface inte
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)
{
Modified: head/sys/net/if_var.h
==============================================================================
--- head/sys/net/if_var.h Sun Oct 21 14:48:40 2018 (r339536)
+++ head/sys/net/if_var.h Sun Oct 21 15:02:06 2018 (r339537)
@@ -432,6 +432,11 @@ EVENTHANDLER_DECLARE(iflladdr_event, iflladdr_event_ha
/* 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);
Modified: head/sys/netinet/in.c
==============================================================================
--- head/sys/netinet/in.c Sun Oct 21 14:48:40 2018 (r339536)
+++ head/sys/netinet/in.c Sun Oct 21 15:02:06 2018 (r339537)
@@ -520,7 +520,12 @@ in_aifaddr_ioctl(u_long cmd, caddr_t data, struct ifne
&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 @@ in_difaddr_ioctl(u_long cmd, caddr_t data, struct ifne
}
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);
Modified: head/sys/netinet6/in6.c
==============================================================================
--- head/sys/netinet6/in6.c Sun Oct 21 14:48:40 2018 (r339536)
+++ head/sys/netinet6/in6.c Sun Oct 21 15:02:06 2018 (r339537)
@@ -712,7 +712,8 @@ aifaddr_out:
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 @@ done:
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);
}
More information about the svn-src-all
mailing list