From a4c33103e90016bef5957bedd6a0954091741b80 Mon Sep 17 00:00:00 2001 From: Vincent Bernat Date: Mon, 31 Dec 2012 18:57:07 +0100 Subject: [PATCH] *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. --- src/daemon/interfaces-bsd.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) 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); -- 2.39.5