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:
parent
c532abb158
commit
a3ebf71751
1 changed files with 26 additions and 0 deletions
|
@ -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) {
|
||||||
|
|
Loading…
Reference in a new issue