From: Vincent Bernat Date: Mon, 31 Dec 2012 17:57:07 +0000 (+0100) Subject: *bsd: listen on PF_ROUTE socket to get interface changes X-Git-Tag: 0.7.0~17 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a4c33103e90016bef5957bedd6a0954091741b80;p=thirdparty%2Flldpd.git *bsd: listen on PF_ROUTE socket to get interface changes Only OpenBSD is able to filter messages. We could filter messages for FreeBSD and NetBSD after receiving them but we don't bother doing it. Any change will trigger a rescan of the interfaces. Since this cannot happen more than once per second, this should be OK for most people. --- diff --git a/src/daemon/interfaces-bsd.c b/src/daemon/interfaces-bsd.c index c157aa2c..aeedf9e5 100644 --- a/src/daemon/interfaces-bsd.c +++ b/src/daemon/interfaces-bsd.c @@ -730,6 +730,26 @@ interfaces_update(struct lldpd *cfg) ifbsd_macphy(cfg, hardware); } + if (cfg->g_iface_event == NULL) { + int s; + log_debug("interfaces", "subscribe to route socket notifications"); + if ((s = socket(PF_ROUTE, SOCK_RAW, 0)) < 0) { + log_warn("interfaces", "unable to open route socket"); + goto end; + } + +#ifdef ROUTE_MSGFILTER + unsigned int rtfilter; + rtfilter = ROUTE_FILTER(RTM_IFINFO); + if (setsockopt(s, PF_ROUTE, ROUTE_MSGFILTER, + &rtfilter, sizeof(rtfilter)) == -1) + log_warn("interfaces", "unable to set filter for interface updates"); +#endif + + if (levent_iface_subscribe(cfg, s) == -1) + close(s); + } + end: interfaces_free_devices(interfaces); interfaces_free_addresses(addresses);