Thanks for the detailed report.

This diff makes rtadvd aware of route info messages on the listening
side, no functional change except that the error message goes away.
We just ignore the message since in that case there's no good reason to
try to validate the more specifics advertized by other routers.

ok?

Index: rtadvd.c
===================================================================
RCS file: /cvs/src/usr.sbin/rtadvd/rtadvd.c,v
retrieving revision 1.45
diff -u -p -r1.45 rtadvd.c
--- rtadvd.c    5 May 2013 14:25:52 -0000       1.45
+++ rtadvd.c    6 May 2014 14:21:42 -0000
@@ -121,6 +121,7 @@ union nd_opts {
 #define NDOPT_FLAG_MTU         (1 << 4)
 #define NDOPT_FLAG_RDNSS       (1 << 5)
 #define NDOPT_FLAG_DNSSL       (1 << 6)
+#define NDOPT_FLAG_ROUTE_INFO  (1 << 7)
 
 u_int32_t ndopt_flags[] = {
        [ND_OPT_SOURCE_LINKADDR]        = NDOPT_FLAG_SRCLINKADDR,
@@ -128,6 +129,7 @@ u_int32_t ndopt_flags[] = {
        [ND_OPT_PREFIX_INFORMATION]     = NDOPT_FLAG_PREFIXINFO,
        [ND_OPT_REDIRECTED_HEADER]      = NDOPT_FLAG_RDHDR,
        [ND_OPT_MTU]                    = NDOPT_FLAG_MTU,
+       [ND_OPT_ROUTE_INFO]             = NDOPT_FLAG_ROUTE_INFO,
        [ND_OPT_RDNSS]                  = NDOPT_FLAG_RDNSS,
        [ND_OPT_DNSSL]                  = NDOPT_FLAG_DNSSL,
 };
@@ -809,7 +811,8 @@ ra_input(int len, struct nd_router_adver
        if (nd6_options((struct nd_opt_hdr *)(ra + 1),
                        len - sizeof(struct nd_router_advert),
                        &ndopts, NDOPT_FLAG_SRCLINKADDR | NDOPT_FLAG_PREFIXINFO
-                       | NDOPT_FLAG_MTU | NDOPT_FLAG_RDNSS | 
NDOPT_FLAG_DNSSL)) {
+                       | NDOPT_FLAG_MTU | NDOPT_FLAG_ROUTE_INFO
+                       | NDOPT_FLAG_RDNSS | NDOPT_FLAG_DNSSL)) {
                log_warnx("ND option check failed for an RA from %s on %s",
                    inet_ntop(AF_INET6, &from->sin6_addr,
                        ntopbuf, INET6_ADDRSTRLEN),
@@ -1109,6 +1112,7 @@ nd6_options(struct nd_opt_hdr *hdr, int 
                }
 
                if (hdr->nd_opt_type > ND_OPT_MTU &&
+                   hdr->nd_opt_type != ND_OPT_ROUTE_INFO &&
                    hdr->nd_opt_type != ND_OPT_RDNSS &&
                    hdr->nd_opt_type != ND_OPT_DNSSL)
                {
@@ -1142,6 +1146,7 @@ nd6_options(struct nd_opt_hdr *hdr, int 
                case ND_OPT_SOURCE_LINKADDR:
                case ND_OPT_TARGET_LINKADDR:
                case ND_OPT_REDIRECTED_HEADER:
+               case ND_OPT_ROUTE_INFO:
                case ND_OPT_RDNSS:
                case ND_OPT_DNSSL:
                        break;  /* we don't care about these options */

-- 
jca | PGP : 0x1524E7EE / 5135 92C1 AD36 5293 2BDF  DDCC 0DFA 74AE 1524 E7EE

Reply via email to