From: Jörg Thalheim Date: Tue, 20 Dec 2016 19:27:06 +0000 (+0100) Subject: ndisc: ignore invalid SLAAC prefix lengths (#4923) X-Git-Tag: v233~300 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9f702d00d61a9d7bceeb07eced01427a85193021;p=thirdparty%2Fsystemd.git ndisc: ignore invalid SLAAC prefix lengths (#4923) - linux does not accept prefixes for SLAAC unequal to 64 bits: http://lxr.free-electrons.com/source/net/ipv6/addrconf.c#L2741 - when networkd tries export such a route to the kernel it will get -EINVAL and set the whole device into a failed state. - this patch will make networkd ignore such prefixes for SLAAC, but process other informations which may contain other prefixes. - Note that rfc4862 does not forbid prefix length != 64 bit --- diff --git a/src/libsystemd-network/ndisc-router.c b/src/libsystemd-network/ndisc-router.c index cf56c89d760..845a6b7c6c5 100644 --- a/src/libsystemd-network/ndisc-router.c +++ b/src/libsystemd-network/ndisc-router.c @@ -459,6 +459,7 @@ _public_ int sd_ndisc_router_prefix_get_preferred_lifetime(sd_ndisc_router *rt, _public_ int sd_ndisc_router_prefix_get_flags(sd_ndisc_router *rt, uint8_t *ret) { struct nd_opt_prefix_info *pi; + uint8_t flags; int r; assert_return(rt, -EINVAL); @@ -468,7 +469,14 @@ _public_ int sd_ndisc_router_prefix_get_flags(sd_ndisc_router *rt, uint8_t *ret) if (r < 0) return r; - *ret = pi->nd_opt_pi_flags_reserved; + flags = pi->nd_opt_pi_flags_reserved; + + if ((flags & ND_OPT_PI_FLAG_AUTO) && (pi->nd_opt_pi_prefix_len != 64)) { + log_ndisc("Invalid prefix length, ignoring prefix for stateless autoconfiguration."); + flags &= ~ND_OPT_PI_FLAG_AUTO; + } + + *ret = flags; return 0; }