rtadvd(8) reimplements in userland what setsockopt(ROUTE_MSGFILTER) does, with the additional drawback that it is uselessly woken up for routing messages it doesn't care about.
The unreachable RTM_GET case in get_next_msg() can also go away. ok? Index: if.c =================================================================== RCS file: /cvs/src/usr.sbin/rtadvd/if.c,v retrieving revision 1.32 diff -u -p -r1.32 if.c --- if.c 30 Nov 2015 20:58:08 -0000 1.32 +++ if.c 30 Nov 2015 21:40:45 -0000 @@ -212,10 +212,9 @@ lladdropt_fill(struct sockaddr_dl *sdl, return; } -#define FILTER_MATCH(type, filter) ((0x1 << type) & filter) #define SIN6(s) ((struct sockaddr_in6 *)(s)) char * -get_next_msg(char *buf, char *lim, size_t *lenp, int filter) +get_next_msg(char *buf, char *lim, size_t *lenp) { struct rt_msghdr *rtm; struct ifa_msghdr *ifam; @@ -233,11 +232,8 @@ get_next_msg(char *buf, char *lim, size_ } if (rtm->rtm_version != RTM_VERSION) continue; - if (FILTER_MATCH(rtm->rtm_type, filter) == 0) - continue; switch (rtm->rtm_type) { - case RTM_GET: case RTM_ADD: case RTM_DELETE: if (rtm->rtm_tableid != 0) @@ -292,7 +288,6 @@ get_next_msg(char *buf, char *lim, size_ return (char *)rtm; } -#undef FILTER_MATCH struct in6_addr * get_addr(char *buf) Index: if.h =================================================================== RCS file: /cvs/src/usr.sbin/rtadvd/if.h,v retrieving revision 1.10 diff -u -p -r1.10 if.h --- if.h 30 Nov 2015 20:58:08 -0000 1.10 +++ if.h 30 Nov 2015 21:40:45 -0000 @@ -42,7 +42,7 @@ int if_getmtu(char *); int if_getflags(int, int); int lladdropt_length(struct sockaddr_dl *); void lladdropt_fill(struct sockaddr_dl *, struct nd_opt_hdr *); -char *get_next_msg(char *, char *, size_t *, int); +char *get_next_msg(char *, char *, size_t *); struct in6_addr *get_addr(char *); int get_rtm_ifindex(char *); int get_ifm_ifindex(char *); Index: rtadvd.c =================================================================== RCS file: /cvs/src/usr.sbin/rtadvd/rtadvd.c,v retrieving revision 1.60 diff -u -p -r1.60 rtadvd.c --- rtadvd.c 30 Nov 2015 20:58:08 -0000 1.60 +++ rtadvd.c 30 Nov 2015 21:40:45 -0000 @@ -348,12 +348,8 @@ rtmsg_input(void) for (next = msg; next < lim; next += len) { int oldifflags; - next = get_next_msg(next, lim, &len, - RTADV_TYPE2BITMASK(RTM_ADD) | - RTADV_TYPE2BITMASK(RTM_DELETE) | - RTADV_TYPE2BITMASK(RTM_NEWADDR) | - RTADV_TYPE2BITMASK(RTM_DELADDR) | - RTADV_TYPE2BITMASK(RTM_IFINFO)); + next = get_next_msg(next, lim, &len); + if (len == 0) break; type = rtmsg_type(next); @@ -1244,8 +1240,21 @@ sock_open(void) static void rtsock_open(void) { + unsigned int rtfilter; + if ((rtsock = socket(PF_ROUTE, SOCK_RAW, 0)) < 0) fatal("socket"); + + rtfilter = + ROUTE_FILTER(RTM_ADD) | + ROUTE_FILTER(RTM_DELETE) | + ROUTE_FILTER(RTM_NEWADDR) | + ROUTE_FILTER(RTM_DELADDR) | + ROUTE_FILTER(RTM_IFINFO); + + if (setsockopt(rtsock, PF_ROUTE, ROUTE_MSGFILTER, + &rtfilter, sizeof(rtfilter)) == -1) + fatal("setsockopt(ROUTE_MSGFILTER)"); } struct rainfo * -- jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF DDCC 0DFA 74AE 1524 E7EE