diff options
author | ru <ru@FreeBSD.org> | 2002-01-18 14:33:04 +0000 |
---|---|---|
committer | ru <ru@FreeBSD.org> | 2002-01-18 14:33:04 +0000 |
commit | 7bbde3fb1fe2ff7b5efd1426bdbd435faa950f70 (patch) | |
tree | 868a544aec0071521723bf9f4a0985c76b46ad04 /sys/net | |
parent | d254e724006714f3f20b2ea58624a58cc97d2874 (diff) | |
download | FreeBSD-src-7bbde3fb1fe2ff7b5efd1426bdbd435faa950f70.zip FreeBSD-src-7bbde3fb1fe2ff7b5efd1426bdbd435faa950f70.tar.gz |
Introduce an interface announcement message for the routing
socket so that routing daemons and other interested parties
know when an interface is attached/detached.
PR: kern/33747
Obtained from: NetBSD
MFC after: 2 weeks
Diffstat (limited to 'sys/net')
-rw-r--r-- | sys/net/if.c | 6 | ||||
-rw-r--r-- | sys/net/if.h | 15 | ||||
-rw-r--r-- | sys/net/route.h | 2 | ||||
-rw-r--r-- | sys/net/rtsock.c | 32 |
4 files changed, 55 insertions, 0 deletions
diff --git a/sys/net/if.c b/sys/net/if.c index 7ffb296..8310190 100644 --- a/sys/net/if.c +++ b/sys/net/if.c @@ -430,6 +430,9 @@ if_attach(ifp) TAILQ_INSERT_HEAD(&ifp->if_addrhead, ifa, ifa_link); } ifp->if_broadcastaddr = 0; /* reliably crash if used uninitialized */ + + /* Announce the interface. */ + rt_ifannouncemsg(ifp, IFAN_ARRIVAL); } /* @@ -511,6 +514,9 @@ if_detach(ifp) (void) rnh->rnh_walktree(rnh, if_rtdel, ifp); } + /* Announce that the interface is gone. */ + rt_ifannouncemsg(ifp, IFAN_DEPARTURE); + KNOTE(&ifp->if_klist, NOTE_EXIT); TAILQ_REMOVE(&ifnet, ifp, if_link); mtx_destroy(&ifp->if_snd.ifq_mtx); diff --git a/sys/net/if.h b/sys/net/if.h index 6cc5522..7370e12 100644 --- a/sys/net/if.h +++ b/sys/net/if.h @@ -197,6 +197,21 @@ struct ifma_msghdr { }; /* + * Message format announcing the arrival or departure of a network interface. + */ +struct if_announcemsghdr { + u_short ifan_msglen; /* to skip over non-understood messages */ + u_char ifan_version; /* future binary compatibility */ + u_char ifan_type; /* message type */ + u_short ifan_index; /* index for associated ifp */ + char ifan_name[IFNAMSIZ]; /* if name, e.g. "en0" */ + u_short ifan_what; /* what type of announcement */ +}; + +#define IFAN_ARRIVAL 0 /* interface arrival */ +#define IFAN_DEPARTURE 1 /* interface departure */ + +/* * Interface request structure used for socket * ioctl's. All interface ioctl's must have parameter * definitions which begin with ifr_name. The diff --git a/sys/net/route.h b/sys/net/route.h index d4de208..838915b 100644 --- a/sys/net/route.h +++ b/sys/net/route.h @@ -207,6 +207,7 @@ struct rt_msghdr { #define RTM_IFINFO 0xe /* iface going up/down etc. */ #define RTM_NEWMADDR 0xf /* mcast group membership being added to if */ #define RTM_DELMADDR 0x10 /* mcast group membership being deleted */ +#define RTM_IFANNOUNCE 0x11 /* iface arrival/departure */ /* * Bitmask values for rtm_inits and rmx_locks. @@ -277,6 +278,7 @@ struct ifmultiaddr; void route_init __P((void)); int rt_getifa __P((struct rt_addrinfo *)); +void rt_ifannouncemsg __P((struct ifnet *, int)); void rt_ifmsg __P((struct ifnet *)); void rt_missmsg __P((int, struct rt_addrinfo *, int, int)); void rt_newaddrmsg __P((int, struct ifaddr *, int, struct rtentry *)); diff --git a/sys/net/rtsock.c b/sys/net/rtsock.c index c55d765..88c9cc6 100644 --- a/sys/net/rtsock.c +++ b/sys/net/rtsock.c @@ -595,6 +595,10 @@ rt_msg1(type, rtinfo) len = sizeof(struct if_msghdr); break; + case RTM_IFANNOUNCE: + len = sizeof(struct if_announcemsghdr); + break; + default: len = sizeof(struct rt_msghdr); } @@ -861,6 +865,34 @@ rt_newmaddrmsg(cmd, ifma) } /* + * This is called to generate routing socket messages indicating + * network interface arrival and departure. + */ +void +rt_ifannouncemsg(ifp, what) + struct ifnet *ifp; + int what; +{ + struct if_announcemsghdr *ifan; + struct mbuf *m; + struct rt_addrinfo info; + + if (route_cb.any_count == 0) + return; + bzero((caddr_t)&info, sizeof(info)); + m = rt_msg1(RTM_IFANNOUNCE, &info); + if (m == NULL) + return; + ifan = mtod(m, struct if_announcemsghdr *); + ifan->ifan_index = ifp->if_index; + snprintf(ifan->ifan_name, sizeof(ifan->ifan_name), + "%s%d", ifp->if_name, ifp->if_unit); + ifan->ifan_what = what; + route_proto.sp_protocol = 0; + raw_input(m, &route_proto, &route_src, &route_dst); + } + +/* * This is used in dumping the kernel table via sysctl(). */ int |