Page MenuHomeFreeBSD

D17100.id47858.diff
No OneTemporary

D17100.id47858.diff

Index: sys/net/if.c
===================================================================
--- sys/net/if.c
+++ sys/net/if.c
@@ -329,6 +329,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: sys/net/if_var.h
===================================================================
--- sys/net/if_var.h
+++ sys/net/if_var.h
@@ -431,6 +431,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: sys/netinet/in.c
===================================================================
--- sys/netinet/in.c
+++ 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: sys/netinet6/in6.c
===================================================================
--- sys/netinet6/in6.c
+++ 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

Mime Type
text/plain
Expires
Thu, Oct 1, 6:24 AM (2 h, 57 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
40001883
Default Alt Text
D17100.id47858.diff (2 KB)

Event Timeline