diff options
| author | Roy Marples <roy@marples.name> | 2017-04-11 15:32:30 +0100 |
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2017-04-11 15:32:30 +0100 |
| commit | edf7ae1228379b960641c58ba372acb1675532e9 (patch) | |
| tree | 1b641b5e29c93b3ee25e8f2112f796753f66570b /src/if-bsd.c | |
| parent | 2db6ee98bdf633aeac2def316446776fe180e08a (diff) | |
| download | dhcpcd-edf7ae1228379b960641c58ba372acb1675532e9.tar.xz | |
Use RO_MSGFILER on NetBSD to filter route(4) messages.
Adapt OpenBSD ROUTE_MSGFILTER code to use the NetBSD array for this.
Diffstat (limited to 'src/if-bsd.c')
| -rw-r--r-- | src/if-bsd.c | 32 |
1 files changed, 21 insertions, 11 deletions
diff --git a/src/if-bsd.c b/src/if-bsd.c index dbbf4c1e..89e0fae9 100644 --- a/src/if-bsd.c +++ b/src/if-bsd.c @@ -120,19 +120,21 @@ int if_opensockets_os(struct dhcpcd_ctx *ctx) { struct priv *priv; -#ifdef ROUTE_MSGFILTER - unsigned int msgfilter = ROUTE_FILTER(RTM_IFINFO) +#if defined(RO_MSGFILTER) || defined(ROUTE_MSGFILTER) + unsigned char msgfilter[] = { + RTM_IFINFO, #ifdef RTM_IFANNOUNCE - | ROUTE_FILTER(RTM_IFANNOUNCE) + RTM_IFANNOUNCE, #endif - | ROUTE_FILTER(RTM_ADD) - | ROUTE_FILTER(RTM_CHANGE) - | ROUTE_FILTER(RTM_DELETE) + RTM_ADD, RTM_CHANGE, RTM_DELETE, #ifdef RTM_CHGADDR - | ROUTE_FILTER(RTM_CHGADDR) + RTM_CHGADDR, +#endif + RTM_NEWADDR, RTM_DELADDR + }; +#ifdef ROUTE_MSGFILTER + unsigned int i, msgfilter_mask; #endif - | ROUTE_FILTER(RTM_DELADDR) - | ROUTE_FILTER(RTM_NEWADDR); #endif if ((priv = malloc(sizeof(*priv))) == NULL) @@ -152,10 +154,18 @@ if_opensockets_os(struct dhcpcd_ctx *ctx) ctx->link_fd = xsocket(PF_ROUTE, SOCK_RAW | SOCK_FLAGS, AF_UNSPEC); #undef SOCK_FLAGS -#ifdef ROUTE_MSGFILTER - if (setsockopt(ctx->link_fd, PF_ROUTE, ROUTE_MSGFILTER, +#if defined(RO_MSGFILTER) + if (setsockopt(ctx->link_fd, PF_ROUTE, RO_MSGFILTER, &msgfilter, sizeof(msgfilter)) == -1) logerr(__func__); +#elif defined(ROUTE_MSGFILTER) + /* Convert the array into a bitmask. */ + msgfilter_mask = 0; + for (i = 0; i < __arraycount(msgfilter); i++) + msgfilter_mask |= ROUTE_FILTER(msgfilter[i]); + if (setsockopt(ctx->link_fd, PF_ROUTE, ROUTE_MSGFILTER, + &msgfilter_mask, sizeof(msgfilter_mask)) == -1) + logerr(__func__); #endif return ctx->link_fd == -1 ? -1 : 0; |
