rtsock: subscribe to ifnet eventhandlers instead of direct calls.
Stop treating rtsock as a "special" consumer and use already-provided ifaddr arrival/departure notifications. MFC after: 2 weeks Test Plan: ``` 21:05 [0] m@devel0 route -n monitor -> ifconfig vtnet0.2 create got message of size 24 on Tue Aug 9 21:05:44 2022 RTM_IFANNOUNCE: interface arrival/departure: len 24, if# 3, what: arrival got message of size 168 on Tue Aug 9 21:05:54 2022 RTM_IFINFO: iface status change: len 168, if# 3, link: up, flags:<BROADCAST,RUNNING,SIMPLEX,MULTICAST> -> ifconfig vtnet0.2 destroy got message of size 24 on Tue Aug 9 21:05:54 2022 RTM_IFANNOUNCE: interface arrival/departure: len 24, if# 3, what: departure ``` Reviewed By: glebius Differential Revision: https://reviews.freebsd.org/D36095 MFC after: 2 weeks
This commit is contained in:
parent
693f88c9da
commit
d8b42ddcac
@ -957,9 +957,6 @@ if_attach_internal(struct ifnet *ifp, bool vmove)
|
||||
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 @@ if_detach_internal(struct ifnet *ifp, bool vmove)
|
||||
#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);
|
||||
@ -2773,8 +2768,6 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
|
||||
*/
|
||||
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);
|
||||
@ -2804,8 +2797,6 @@ ifhwioctl(u_long cmd, struct ifnet *ifp, caddr_t data, struct thread *td)
|
||||
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;
|
||||
|
||||
|
@ -415,7 +415,6 @@ struct ifmultiaddr;
|
||||
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);
|
||||
|
@ -207,6 +207,7 @@ static int sysctl_ifmalist(int af, struct walkarg *w);
|
||||
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,
|
||||
@ -272,6 +273,20 @@ VNET_SYSUNINIT(vnet_rts_uninit, SI_SUB_PROTO_DOMAIN, SI_ORDER_THIRD,
|
||||
vnet_rts_uninit, 0);
|
||||
#endif
|
||||
|
||||
static void
|
||||
rts_handle_ifnet_arrival(void *arg __unused, struct ifnet *ifp)
|
||||
{
|
||||
rt_ifannouncemsg(ifp, IFAN_ARRIVAL);
|
||||
}
|
||||
EVENTHANDLER_DEFINE(ifnet_arrival_event, rts_handle_ifnet_arrival, NULL, 0);
|
||||
|
||||
static void
|
||||
rts_handle_ifnet_departure(void *arg __unused, struct ifnet *ifp)
|
||||
{
|
||||
rt_ifannouncemsg(ifp, IFAN_DEPARTURE);
|
||||
}
|
||||
EVENTHANDLER_DEFINE(ifnet_departure_event, rts_handle_ifnet_departure, NULL, 0);
|
||||
|
||||
static void
|
||||
rts_append_data(struct socket *so, struct mbuf *m)
|
||||
{
|
||||
@ -2112,7 +2127,7 @@ rt_ieee80211msg(struct ifnet *ifp, int what, void *data, size_t data_len)
|
||||
* 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;
|
||||
|
Loading…
Reference in New Issue
Block a user