diff mbox series

BSD: Add support for route(4) message filtering.

Message ID aef35602-dcb2-2427-7791-ae481758a748@marples.name
State Accepted
Headers show
Series BSD: Add support for route(4) message filtering. | expand

Commit Message

Roy Marples Sept. 18, 2019, 11:50 a.m. UTC
hostap 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>

Comments

Jouni Malinen Sept. 21, 2019, 12:47 p.m. UTC | #1
On Wed, Sep 18, 2019 at 12:50:36PM +0100, Roy Marples wrote:
>     hostap 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.

Thanks, applied.
diff mbox series

Patch

diff --git a/src/drivers/driver_bsd.c b/src/drivers/driver_bsd.c
index 82ca0612e..8667ee519 100644
--- a/src/drivers/driver_bsd.c
+++ b/src/drivers/driver_bsd.c
@@ -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) {