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;