diff options
| author | Roy Marples <roy@marples.name> | 2017-04-05 16:31:16 +0100 |
|---|---|---|
| committer | Roy Marples <roy@marples.name> | 2017-04-05 16:31:16 +0100 |
| commit | 5d3160047d1e6ee0e700b634445a547f07a40ae6 (patch) | |
| tree | 1c575fd7ead52e884d93df51bf4f127c56b3849a /src/if-bsd.c | |
| parent | e084ec1854cbe614a4d4fdf96a64840c4a478597 (diff) | |
| download | dhcpcd-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.c | 22 |
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; } |
