Now that rad(8) is able to advertise a MTU I think it would be nice to
have slaacctl(8) show this advertisement. The patch below touches both
sbin/slaacd and usr.sbin/slaacctl. The addition to sbin/slaacd/engine.c
makes sure that MTU RA messages are parsed, and that the result is made
available. BTW running slaacd in the foreground already enables one to
see the advertised MTU, see debug_log_ra().
The addition to usr.sbin/slaacctl/slaacctl.c enables one to view the
advertised MTU.

$ slaacctl show interface iwn0 
iwn0:
         index:   2 running: yes privacy: yes
        lladdr: 60:67:20:60:44:70
         inet6: fe80::abc2:230e:d3d9:b321%iwn0
        Router Advertisement from fe80::a562:1f47:a75c:a5fc%iwn0
                received: 2018-07-22 07:20:15; 18s ago
                Cur Hop Limit:   0, M: 0, O: 0, Router Lifetime:  1800s
                Default Router Preference: Medium
                Reachable Time:         0ms, Retrans Timer:         0ms
                MTU: 1480 bytes
                ...
                ...

Any opinions?


diff --git sbin/slaacd/engine.c sbin/slaacd/engine.c
index 961e1b115b6..7e1e6eb5850 100644
--- sbin/slaacd/engine.c
+++ sbin/slaacd/engine.c
@@ -156,6 +156,7 @@ struct radv {
        uint16_t                         router_lifetime; /* in seconds */
        uint32_t                         reachable_time; /* in milliseconds */
        uint32_t                         retrans_time; /* in milliseconds */
+       uint32_t                         mtu;
        LIST_HEAD(, radv_prefix)         prefixes;
        uint32_t                         rdns_lifetime;
        LIST_HEAD(, radv_rdns)           rdns_servers;
@@ -832,6 +833,7 @@ send_interface_info(struct slaacd_iface *iface, pid_t pid)
                cei_ra.router_lifetime = ra->router_lifetime;
                cei_ra.reachable_time = ra->reachable_time;
                cei_ra.retrans_time = ra->retrans_time;
+               cei_ra.mtu = ra->mtu;
                engine_imsg_compose_frontend(IMSG_CTL_SHOW_INTERFACE_INFO_RA,
                    pid, &cei_ra, sizeof(cei_ra));
 
@@ -1125,6 +1127,7 @@ parse_ra(struct slaacd_iface *iface, struct imsg_ra *ra)
        while ((size_t)len >= sizeof(struct nd_opt_hdr)) {
                struct nd_opt_hdr *nd_opt_hdr = (struct nd_opt_hdr *)p;
                struct nd_opt_prefix_info *prf;
+               struct nd_opt_mtu *mtu;
                struct nd_opt_rdnss *rdnss;
                struct nd_opt_dnssl *dnssl;
                struct in6_addr *in6;
@@ -1232,6 +1235,13 @@ parse_ra(struct slaacd_iface *iface, struct imsg_ra *ra)
                case ND_OPT_SOURCE_LINKADDR:
                case ND_OPT_TARGET_LINKADDR:
                case ND_OPT_MTU:
+                       if (nd_opt_hdr->nd_opt_len != 1) {
+                               log_warnx("invalid ND_OPT_MTU: len != 1");
+                               goto err;
+                       }
+                       mtu = (struct nd_opt_mtu*) nd_opt_hdr;
+                       radv->mtu = ntohl(mtu->nd_opt_mtu_mtu);
+                       break;
                case ND_OPT_ROUTE_INFO:
 #if 0
                        log_debug("\tOption: %u (len: %u) not implemented",
diff --git sbin/slaacd/slaacd.h sbin/slaacd/slaacd.h
index 910be91e687..33e85909ce9 100644
--- sbin/slaacd/slaacd.h
+++ sbin/slaacd/slaacd.h
@@ -109,6 +109,7 @@ struct ctl_engine_info_ra {
        uint16_t                 router_lifetime;       /* in seconds */
        uint32_t                 reachable_time;        /* in milliseconds */
        uint32_t                 retrans_time;          /* in milliseconds */
+       uint32_t                 mtu;
 };
 
 struct ctl_engine_info_ra_prefix {
diff --git usr.sbin/slaacctl/slaacctl.c usr.sbin/slaacctl/slaacctl.c
index 5b2a22f12e6..97b460aee08 100644
--- usr.sbin/slaacctl/slaacctl.c
+++ usr.sbin/slaacctl/slaacctl.c
@@ -228,6 +228,8 @@ show_interface_msg(struct imsg *imsg)
                printf("\t\tDefault Router Preference: %s\n", cei_ra->rpref);
                printf("\t\tReachable Time: %9ums, Retrans Timer: %9ums\n",
                    cei_ra->reachable_time, cei_ra->retrans_time);
+               if (cei_ra->mtu)
+                       printf("\t\tMTU: %u bytes\n", cei_ra->mtu);
                break;
        case IMSG_CTL_SHOW_INTERFACE_INFO_RA_PREFIX:
                cei_ra_prefix = imsg->data;

Reply via email to