Update MTU according to the latest value received. --- src/libsystemd-network/sd-icmp6-nd.c | 30 ++++++++++++++++++++++++++++++ src/systemd/sd-icmp6-nd.h | 2 ++ 2 files changed, 32 insertions(+)
diff --git a/src/libsystemd-network/sd-icmp6-nd.c b/src/libsystemd-network/sd-icmp6-nd.c index 35d5f5f..3501055 100644 --- a/src/libsystemd-network/sd-icmp6-nd.c +++ b/src/libsystemd-network/sd-icmp6-nd.c @@ -271,10 +271,24 @@ int sd_icmp6_nd_new(sd_icmp6_nd **ret) { return 0; } +int sd_icmp6_ra_get_mtu(sd_icmp6_nd *nd, uint32_t *mtu) { + assert_return(nd, -EINVAL); + assert_return(mtu, -EINVAL); + + if (!nd->link || !nd->link->mtu) + return -ENOMSG; + + *mtu = nd->link->mtu; + + return 0; +} + static int icmp6_ra_parse(sd_icmp6_nd *nd, struct nd_router_advert *ra, ssize_t len) { void *opt; struct nd_opt_hdr *opt_hdr; + struct nd_opt_mtu *opt_mtu; + uint32_t mtu; assert_return(nd, -EINVAL); assert_return(nd->link, -EINVAL); @@ -293,6 +307,22 @@ static int icmp6_ra_parse(sd_icmp6_nd *nd, struct nd_router_advert *ra, return -ENOMSG; switch (opt_hdr->nd_opt_type) { + case ND_OPT_MTU: + opt_mtu = opt; + + mtu = be32toh(opt_mtu->nd_opt_mtu_mtu); + + if (!nd->link->mtu || mtu < nd->link->mtu) { + if (mtu < IP6_MIN_MTU) + nd->link->mtu = IP6_MIN_MTU; + else + nd->link->mtu = mtu; + + log_icmp6_nd(nd, "Link MTU %d advertised %d", + nd->link->mtu, mtu); + } + + break; } diff --git a/src/systemd/sd-icmp6-nd.h b/src/systemd/sd-icmp6-nd.h index 73f91aa..73ebccf 100644 --- a/src/systemd/sd-icmp6-nd.h +++ b/src/systemd/sd-icmp6-nd.h @@ -51,6 +51,8 @@ sd_icmp6_nd *sd_icmp6_nd_ref(sd_icmp6_nd *nd); sd_icmp6_nd *sd_icmp6_nd_unref(sd_icmp6_nd *nd); int sd_icmp6_nd_new(sd_icmp6_nd **ret); +int sd_icmp6_ra_get_mtu(sd_icmp6_nd *nd, uint32_t *mtu); + int sd_icmp6_nd_stop(sd_icmp6_nd *nd); int sd_icmp6_router_solicitation_start(sd_icmp6_nd *nd); -- 2.1.4 _______________________________________________ systemd-devel mailing list systemd-devel@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/systemd-devel