Hi, On Wed, Nov 25, 2020 at 6:36 PM Daniel Gröber <[email protected]> wrote: > > When a proto registers a prefix with an address which has bits outside the > netmask set this confuses the prefix-assignment code further down the line. > > For example if we have an interface with > > option ip6prefix fdff:ffff:ffff:ffff::1/48 > > and a couple with > > option ip6assign 64 > > then all these interfaces will be assigned fdff:ffff:ffff:ffff::1/64 which > is obviously wrong, they should at least have unique prefixes. > > What is happening here is that we simply OR the calculated assignment part > into the address in interface_set_prefix_address:961, like so: > > addr.addr.in6.s6_addr32[1] |= htonl(assignment->assigned); > > but we never masked the host address bits out of the address after parsing > it using inet_pton. To fix this we simply mask away the host bits in the > address before using it. This is fixed in netifd by commit https://git.openwrt.org/?p=project/netifd.git;a=commitdiff;h=645ceed0ed706b073edd6a0d5a2eb936208b48c9
Hans > > Signed-off-by: Daniel Gröber <[email protected]> > --- > interface-ip.c | 2 ++ > 1 file changed, 2 insertions(+) > > diff --git a/interface-ip.c b/interface-ip.c > index 6efc3c5..e8f2dbd 100644 > --- a/interface-ip.c > +++ b/interface-ip.c > @@ -1294,6 +1294,8 @@ interface_ip_add_device_prefix(struct interface *iface, > struct in6_addr *addr, > prefix->iface = iface; > INIT_LIST_HEAD(&prefix->assignments); > > + clear_if_addr((union if_addr *)&prefix->addr, prefix->length); > + > if (excl_addr) { > prefix->excl_addr = *excl_addr; > prefix->excl_length = excl_length; > -- > 2.20.1 > > > _______________________________________________ > openwrt-devel mailing list > [email protected] > https://lists.openwrt.org/mailman/listinfo/openwrt-devel _______________________________________________ openwrt-devel mailing list [email protected] https://lists.openwrt.org/mailman/listinfo/openwrt-devel
