summaryrefslogtreecommitdiffstats
path: root/src/if-bsd.c
diff options
context:
space:
mode:
authorRoy Marples <roy@marples.name>2017-04-05 16:31:16 +0100
committerRoy Marples <roy@marples.name>2017-04-05 16:31:16 +0100
commit5d3160047d1e6ee0e700b634445a547f07a40ae6 (patch)
tree1c575fd7ead52e884d93df51bf4f127c56b3849a /src/if-bsd.c
parente084ec1854cbe614a4d4fdf96a64840c4a478597 (diff)
downloaddhcpcd-5d3160047d1e6ee0e700b634445a547f07a40ae6.tar.xz
if-bsd: support ROUTE_MSGFILTER socket option
This reduces needless context switching just to discard route(4) message types we're not interested in.
Diffstat (limited to 'src/if-bsd.c')
-rw-r--r--src/if-bsd.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/src/if-bsd.c b/src/if-bsd.c
index 504811db..eeb5a4b4 100644
--- a/src/if-bsd.c
+++ b/src/if-bsd.c
@@ -120,6 +120,9 @@ int
if_opensockets_os(struct dhcpcd_ctx *ctx)
{
struct priv *priv;
+#ifdef ROUTE_MSGFILTER
+ unsigned int msgfilter;
+#endif
if ((priv = malloc(sizeof(*priv))) == NULL)
return -1;
@@ -137,6 +140,25 @@ if_opensockets_os(struct dhcpcd_ctx *ctx)
#define SOCK_FLAGS (SOCK_CLOEXEC | SOCK_NONBLOCK)
ctx->link_fd = xsocket(PF_ROUTE, SOCK_RAW | SOCK_FLAGS, AF_UNSPEC);
#undef SOCK_FLAGS
+
+#ifdef ROUTE_MSGFILTER
+ msgfilter = ROUTE_FILTER(RTM_IFINFO)
+#ifdef RTM_IFANNOUNCE
+ | ROUTE_FILTER(RTM_IFANNOUNCE)
+#endif
+ | ROUTE_FILTER(RTM_ADD)
+ | ROUTE_FILTER(RTM_CHANGE)
+ | ROUTE_FILTER(RTM_DELETE)
+#ifdef RTM_CHGADDR
+ | ROUTE_FILTER(RTM_CHGADDR)
+#endif
+ | ROUTE_FILTER(RTM_DELADDR)
+ | ROUTE_FILTER(RTM_NEWADDR);
+ if (setsockopt(ctx->link_fd, PF_ROUTE, ROUTE_MSGFILTER,
+ &msgfilter, sizeof(msgfilter)) == -1)
+ syslog(LOG_ERR, "ROUTE_MSGFILTER: %m");
+#endif
+
return ctx->link_fd == -1 ? -1 : 0;
}