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;