On Sun 22/07/2018 07:27, Björn Ketelaars wrote:
> 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.

New diff as tb@ found a mistake in the first one affecting
ND_OPT_REDIRECTED_HEADER, ND_OPT_SOURCE_LINKADDR and
ND_OPT_TARGET_LINKADDR as well.


diff --git sbin/slaacd/engine.c sbin/slaacd/engine.c
index 961e1b115b6..2e114cdaf0b 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;
@@ -1227,11 +1230,18 @@ parse_ra(struct slaacd_iface *iface, struct imsg_ra *ra)
 
                        LIST_INSERT_HEAD(&radv->dnssls, ra_dnssl, entries);
 
+                       break;
+               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_REDIRECTED_HEADER:
                case ND_OPT_SOURCE_LINKADDR:
                case ND_OPT_TARGET_LINKADDR:
-               case ND_OPT_MTU:
                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