summaryrefslogtreecommitdiffstats
path: root/usr.sbin/rtadvd/if.c
diff options
context:
space:
mode:
authorhrs <hrs@FreeBSD.org>2011-06-05 07:55:51 +0000
committerhrs <hrs@FreeBSD.org>2011-06-05 07:55:51 +0000
commitba519ba6ac678da65d1e741ea85e13f187cb0eee (patch)
tree01f49e6fb12cc166700399559ed824f32cbf1760 /usr.sbin/rtadvd/if.c
parentc471b1b104052433b565478e928f10a7718d7420 (diff)
downloadFreeBSD-src-ba519ba6ac678da65d1e741ea85e13f187cb0eee.zip
FreeBSD-src-ba519ba6ac678da65d1e741ea85e13f187cb0eee.tar.gz
Support dynamically-added/removed interfaces. The rtadvd(8) daemon detects an
interface addition/removal via RTM_IFANNOUNCE message and update the internal structure. TO BE FIXED: The advertising interface list still depends on the command line argument. The configuration file cannot be reloaded.
Diffstat (limited to 'usr.sbin/rtadvd/if.c')
-rw-r--r--usr.sbin/rtadvd/if.c13
1 files changed, 12 insertions, 1 deletions
diff --git a/usr.sbin/rtadvd/if.c b/usr.sbin/rtadvd/if.c
index f500feb..302c334 100644
--- a/usr.sbin/rtadvd/if.c
+++ b/usr.sbin/rtadvd/if.c
@@ -271,10 +271,17 @@ get_next_msg(char *buf, char *lim, int ifindex, size_t *lenp, int filter)
buf, lim, rtm);
break;
}
- if (FILTER_MATCH(rtm->rtm_type, filter) == 0) {
+ if (((struct rt_msghdr *)buf)->rtm_version != RTM_VERSION) {
+ syslog(LOG_WARNING,
+ "<%s> routing message version mismatch "
+ "(buf=%p lim=%p rtm=%p)", __func__,
+ buf, lim, rtm);
continue;
}
+ if (FILTER_MATCH(rtm->rtm_type, filter) == 0)
+ continue;
+
switch (rtm->rtm_type) {
case RTM_GET:
case RTM_ADD:
@@ -328,6 +335,7 @@ get_next_msg(char *buf, char *lim, int ifindex, size_t *lenp, int filter)
return (char *)rtm;
/* NOTREACHED */
case RTM_IFINFO:
+ case RTM_IFANNOUNCE:
/* found */
*lenp = rtm->rtm_msglen;
return (char *)rtm;
@@ -566,6 +574,9 @@ parse_iflist(struct if_msghdr ***ifmlist_p, char *buf, size_t bufsize)
void
init_iflist(void)
{
+ syslog(LOG_DEBUG,
+ "<%s> generate iflist.", __func__);
+
if (ifblock) {
free(ifblock);
ifblock_size = 0;
OpenPOWER on IntegriCloud