summaryrefslogtreecommitdiffstats
path: root/src/if-bsd.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2017-04-11 15:32:30 +0100
committerRoy Marples <roy@marples.name>2017-04-11 15:32:30 +0100
commitedf7ae1228379b960641c58ba372acb1675532e9 (patch)
tree1b641b5e29c93b3ee25e8f2112f796753f66570b /src/if-bsd.c
parent2db6ee98bdf633aeac2def316446776fe180e08a (diff)
downloaddhcpcd-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.c32
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;