BSD: Add support for route(4) message filtering

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>
This commit is contained in:
Roy Marples 2019-09-18 12:50:36 +01:00 committed by Jouni Malinen
parent c532abb158
commit a3ebf71751

View file

@ -1661,6 +1661,17 @@ static void *
bsd_global_init(void *ctx) bsd_global_init(void *ctx)
{ {
struct bsd_driver_global *global; 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)); global = os_zalloc(sizeof(*global));
if (global == NULL) if (global == NULL)
@ -1683,6 +1694,21 @@ bsd_global_init(void *ctx)
goto fail; 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_len = rtbuf_len();
global->event_buf = os_malloc(global->event_buf_len); global->event_buf = os_malloc(global->event_buf_len);
if (global->event_buf == NULL) { if (global->event_buf == NULL) {