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

Reply via email to