]> git.ipfire.org Git - thirdparty/lldpd.git/commitdiff
*bsd: listen on PF_ROUTE socket to get interface changes
authorVincent Bernat <bernat@luffy.cx>
Mon, 31 Dec 2012 17:57:07 +0000 (18:57 +0100)
committerVincent Bernat <bernat@luffy.cx>
Mon, 31 Dec 2012 17:57:07 +0000 (18:57 +0100)
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

index c157aa2cbee7c184cff6d24a512ca06142286d12..aeedf9e57ecc2c4beec3a450da4950bc41042d45 100644 (file)
@@ -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);