]> git.ipfire.org Git - thirdparty/hostap.git/commitdiff
BSD: Add support for route(4) message filtering
authorRoy Marples <roy@marples.name>
Wed, 18 Sep 2019 11:50:36 +0000 (12:50 +0100)
committerJouni Malinen <j@w1.fi>
Thu, 19 Sep 2019 09:16:49 +0000 (12:16 +0300)
hostapd is only interested in RTM_IEEE80211.
wpa_supplicant is only interested in RTM_IEEE80211, RTM_IFINFO and
RTM_IFANNOUNCE.

This supports the NetBSD RO_MSGFILTER interface and the alternative
DragonFlyBSD/OpenBSD interface ROUTE_MSGFILTER.

Signed-off-by: Roy Marples <roy@marples.name>
src/drivers/driver_bsd.c

index 82ca0612eefa00b53e4f194bd2aabc80fc84a6b1..8667ee519592a971ed6bb017fb4f104044f7dad8 100644 (file)
@@ -1661,6 +1661,17 @@ static void *
 bsd_global_init(void *ctx)
 {
        struct bsd_driver_global *global;
+#if defined(RO_MSGFILTER) || defined(ROUTE_MSGFILTER)
+       unsigned char msgfilter[] = {
+               RTM_IEEE80211,
+#ifndef HOSTAPD
+               RTM_IFINFO, RTM_IFANNOUNCE,
+#endif
+       };
+#endif
+#ifdef ROUTE_MSGFILTER
+       unsigned int i, msgfilter_mask;
+#endif
 
        global = os_zalloc(sizeof(*global));
        if (global == NULL)
@@ -1683,6 +1694,21 @@ bsd_global_init(void *ctx)
                goto fail;
        }
 
+#if defined(RO_MSGFILTER)
+       if (setsockopt(global->route, PF_ROUTE, RO_MSGFILTER,
+           &msgfilter, sizeof(msgfilter)) < 0)
+               wpa_printf(MSG_ERROR, "socket[PF_ROUTE,RO_MSGFILTER]: %s",
+                          strerror(errno));
+#elif defined(ROUTE_MSGFILTER)
+       msgfilter_mask = 0;
+       for (i = 0; i < (sizeof(msgfilter) / sizeof(msgfilter[0])); i++)
+               msgfilter_mask |= ROUTE_FILTER(msgfilter[i]);
+       if (setsockopt(global->route, PF_ROUTE, ROUTE_MSGFILTER,
+           &msgfilter_mask, sizeof(msgfilter_mask)) < 0)
+               wpa_printf(MSG_ERROR, "socket[PF_ROUTE,ROUTE_MSGFILTER]: %s",
+                          strerror(errno));
+#endif
+
        global->event_buf_len = rtbuf_len();
        global->event_buf = os_malloc(global->event_buf_len);
        if (global->event_buf == NULL) {