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;