Index: sys/net/if.c =================================================================== --- sys/net/if.c +++ sys/net/if.c @@ -957,9 +957,6 @@ EVENTHANDLER_INVOKE(ifnet_arrival_event, ifp); if (IS_DEFAULT_VNET(curvnet)) devctl_notify("IFNET", ifp->if_xname, "ATTACH", NULL); - - /* Announce the interface. */ - rt_ifannouncemsg(ifp, IFAN_ARRIVAL); } static void @@ -1210,8 +1207,6 @@ #endif if_purgemaddrs(ifp); - /* Announce that the interface is gone. */ - rt_ifannouncemsg(ifp, IFAN_DEPARTURE); EVENTHANDLER_INVOKE(ifnet_departure_event, ifp); if (IS_DEFAULT_VNET(curvnet)) devctl_notify("IFNET", ifp->if_xname, "DETACH", NULL); @@ -2787,8 +2782,6 @@ */ ifp->if_flags |= IFF_RENAMING; - /* Announce the departure of the interface. */ - rt_ifannouncemsg(ifp, IFAN_DEPARTURE); EVENTHANDLER_INVOKE(ifnet_departure_event, ifp); if_printf(ifp, "changing name to '%s'\n", new_name); @@ -2818,8 +2811,6 @@ IF_ADDR_WUNLOCK(ifp); EVENTHANDLER_INVOKE(ifnet_arrival_event, ifp); - /* Announce the return of the interface. */ - rt_ifannouncemsg(ifp, IFAN_ARRIVAL); ifp->if_flags &= ~IFF_RENAMING; Index: sys/net/route.h =================================================================== --- sys/net/route.h +++ sys/net/route.h @@ -415,7 +415,6 @@ struct rib_head; void rt_ieee80211msg(struct ifnet *, int, void *, size_t); -void rt_ifannouncemsg(struct ifnet *, int); void rt_ifmsg(struct ifnet *); void rt_missmsg(int, struct rt_addrinfo *, int, int); void rt_missmsg_fib(int, struct rt_addrinfo *, int, int, int); Index: sys/net/rtsock.c =================================================================== --- sys/net/rtsock.c +++ sys/net/rtsock.c @@ -198,6 +198,7 @@ static void rt_getmetrics(const struct rtentry *rt, const struct nhop_object *nh, struct rt_metrics *out); static void rt_dispatch(struct mbuf *, sa_family_t); +static void rt_ifannouncemsg(struct ifnet *ifp, int what); static int handle_rtm_get(struct rt_addrinfo *info, u_int fibnum, struct rt_msghdr *rtm, struct rib_cmd_info *rc); static int update_rtm_from_rc(struct rt_addrinfo *info, @@ -263,6 +264,30 @@ vnet_rts_uninit, 0); #endif + +static void +rts_handle_ifnet_arrival(void *arg __unused, struct ifnet *ifp) +{ + rt_ifannouncemsg(ifp, IFAN_ARRIVAL); +} + +static void +rts_handle_ifnet_departure(void *arg __unused, struct ifnet *ifp) +{ + rt_ifannouncemsg(ifp, IFAN_DEPARTURE); +} + +static void +rts_init(void) +{ + EVENTHANDLER_REGISTER(ifnet_arrival_event, rts_handle_ifnet_arrival, + NULL, EVENTHANDLER_PRI_ANY); + EVENTHANDLER_REGISTER(ifnet_departure_event, rts_handle_ifnet_departure, + NULL, EVENTHANDLER_PRI_ANY); +} +SYSINIT(rts_init, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD, rts_init, 0); + + static int raw_input_rts_cb(struct mbuf *m, struct sockproto *proto, struct sockaddr *src, struct rawcb *rp) @@ -2169,7 +2194,7 @@ * This is called to generate routing socket messages indicating * network interface arrival and departure. */ -void +static void rt_ifannouncemsg(struct ifnet *ifp, int what) { struct mbuf *m;