summaryrefslogtreecommitdiffstats
path: root/sys
diff options
context:
space:
mode:
authorru <ru@FreeBSD.org>2002-01-18 14:33:04 +0000
committerru <ru@FreeBSD.org>2002-01-18 14:33:04 +0000
commit7bbde3fb1fe2ff7b5efd1426bdbd435faa950f70 (patch)
tree868a544aec0071521723bf9f4a0985c76b46ad04 /sys
parentd254e724006714f3f20b2ea58624a58cc97d2874 (diff)
downloadFreeBSD-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')
-rw-r--r--sys/net/if.c6
-rw-r--r--sys/net/if.h15
-rw-r--r--sys/net/route.h2
-rw-r--r--sys/net/rtsock.c32
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
OpenPOWER on IntegriCloud