anyone? On Wed, Mar 17, 2021 at 06:24:58PM +0100, Florian Obser wrote: > RFC 8981 allows this and it reduces the amount of v6 addresses I have > on my laptop. > > OK? >
diff --git sbin/ifconfig/ifconfig.c sbin/ifconfig/ifconfig.c index 2c60e652675..527e6e02d1f 100644 --- sbin/ifconfig/ifconfig.c +++ sbin/ifconfig/ifconfig.c @@ -1579,8 +1579,11 @@ setautoconf(const char *cmd, int val) setifxflags("inet", val * IFXF_AUTOCONF4); break; case AF_INET6: - setifxflags("inet6", val * (IFXF_AUTOCONF6 | - IFXF_AUTOCONF6TEMP)); + if (val > 0) + setifxflags("inet6", (IFXF_AUTOCONF6 | + IFXF_AUTOCONF6TEMP)); + else + setifxflags("inet6", -IFXF_AUTOCONF6); break; default: errx(1, "autoconf not allowed for this address family"); diff --git sbin/slaacd/engine.c sbin/slaacd/engine.c index ed5ee83731a..fae8ce62e27 100644 --- sbin/slaacd/engine.c +++ sbin/slaacd/engine.c @@ -248,6 +248,7 @@ struct slaacd_iface { uint32_t if_index; uint32_t rdomain; int running; + int autoconf; int autoconfprivacy; int soii; struct ether_addr hw_address; @@ -786,6 +787,7 @@ send_interface_info(struct slaacd_iface *iface, pid_t pid) memset(&cei, 0, sizeof(cei)); cei.if_index = iface->if_index; cei.running = iface->running; + cei.autoconf = iface->autoconf; cei.autoconfprivacy = iface->autoconfprivacy; cei.soii = iface->soii; memcpy(&cei.hw_address, &iface->hw_address, sizeof(struct ether_addr)); @@ -1089,6 +1091,7 @@ engine_update_iface(struct imsg_ifinfo *imsg_ifinfo) iface->rdomain = imsg_ifinfo->rdomain; iface->running = imsg_ifinfo->running; iface->link_state = imsg_ifinfo->link_state; + iface->autoconf = imsg_ifinfo->autoconf; iface->autoconfprivacy = imsg_ifinfo->autoconfprivacy; iface->soii = imsg_ifinfo->soii; memcpy(&iface->hw_address, &imsg_ifinfo->hw_address, @@ -1107,6 +1110,11 @@ engine_update_iface(struct imsg_ifinfo *imsg_ifinfo) memcpy(&iface->ll_address, &imsg_ifinfo->ll_address, sizeof(struct sockaddr_in6)); + if (iface->autoconf != imsg_ifinfo->autoconf) { + iface->autoconf = imsg_ifinfo->autoconf; + need_refresh = 1; + } + if (iface->autoconfprivacy != imsg_ifinfo->autoconfprivacy) { iface->autoconfprivacy = imsg_ifinfo->autoconfprivacy; need_refresh = 1; @@ -1913,11 +1921,12 @@ update_iface_ra_prefix(struct slaacd_iface *iface, struct radv *ra, } } - if (!found && duplicate_found && iface->soii) { + if (!found && iface->autoconf && duplicate_found && iface->soii) { prefix->dad_counter++; log_debug("%s dad_counter: %d", __func__, prefix->dad_counter); gen_address_proposal(iface, ra, prefix, 0); - } else if (!found && (iface->soii || prefix->prefix_len <= 64)) + } else if (!found && iface->autoconf && (iface->soii || + prefix->prefix_len <= 64)) /* new proposal */ gen_address_proposal(iface, ra, prefix, 0); diff --git sbin/slaacd/frontend.c sbin/slaacd/frontend.c index 1a0c596914d..ca1208124c7 100644 --- sbin/slaacd/frontend.c +++ sbin/slaacd/frontend.c @@ -502,7 +502,7 @@ update_iface(uint32_t if_index, char* if_name) get_xflags(if_name)) == -1) return; - if (!(xflags & IFXF_AUTOCONF6)) + if (!(xflags & (IFXF_AUTOCONF6 | IFXF_AUTOCONF6TEMP))) return; if((ifrdomain = get_ifrdomain(if_name)) == -1) @@ -532,6 +532,7 @@ update_iface(uint32_t if_index, char* if_name) imsg_ifinfo.rdomain = ifrdomain; imsg_ifinfo.running = (flags & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING); + imsg_ifinfo.autoconf = (xflags & IFXF_AUTOCONF6); imsg_ifinfo.autoconfprivacy = (xflags & IFXF_AUTOCONF6TEMP); imsg_ifinfo.soii = !(xflags & IFXF_INET6_NOSOII); @@ -597,7 +598,7 @@ update_autoconf_addresses(uint32_t if_index, char* if_name) if ((xflags = get_xflags(if_name)) == -1) return; - if (!(xflags & IFXF_AUTOCONF6)) + if (!(xflags & (IFXF_AUTOCONF6 | IFXF_AUTOCONF6TEMP))) return; memset(&imsg_addrinfo, 0, sizeof(imsg_addrinfo)); @@ -796,7 +797,8 @@ handle_route_message(struct rt_msghdr *rtm, struct sockaddr **rti_info) &if_index, sizeof(if_index)); } else { xflags = get_xflags(if_name); - if (xflags == -1 || !(xflags & IFXF_AUTOCONF6)) { + if (xflags == -1 || !(xflags & (IFXF_AUTOCONF6 | + IFXF_AUTOCONF6TEMP))) { log_debug("RTM_IFINFO: %s(%d) no(longer) " "autoconf6", if_name, ifm->ifm_index); if_index = ifm->ifm_index; diff --git sbin/slaacd/slaacd.h sbin/slaacd/slaacd.h index 2f0830f8b59..8330a460828 100644 --- sbin/slaacd/slaacd.h +++ sbin/slaacd/slaacd.h @@ -87,6 +87,7 @@ enum rpref { struct ctl_engine_info { uint32_t if_index; int running; + int autoconf; int autoconfprivacy; int soii; struct ether_addr hw_address; @@ -189,6 +190,7 @@ struct imsg_ifinfo { int rdomain; int running; int link_state; + int autoconf; int autoconfprivacy; int soii; struct ether_addr hw_address; diff --git sys/net/if.c sys/net/if.c index 3e40c59d213..c6639c05e7e 100644 --- sys/net/if.c +++ sys/net/if.c @@ -1958,8 +1958,10 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p) NET_LOCK(); #ifdef INET6 - if (ISSET(ifr->ifr_flags, IFXF_AUTOCONF6) && - !ISSET(ifp->if_xflags, IFXF_AUTOCONF6)) { + if ((ISSET(ifr->ifr_flags, IFXF_AUTOCONF6) || + ISSET(ifr->ifr_flags, IFXF_AUTOCONF6TEMP)) && + !ISSET(ifp->if_xflags, IFXF_AUTOCONF6) && + !ISSET(ifp->if_xflags, IFXF_AUTOCONF6TEMP)) { error = in6_ifattach(ifp); if (error != 0) { NET_UNLOCK(); @@ -2026,7 +2028,9 @@ ifioctl(struct socket *so, u_long cmd, caddr_t data, struct proc *p) ((!ISSET(oif_xflags, IFXF_AUTOCONF4) && ISSET(ifp->if_xflags, IFXF_AUTOCONF4)) || (!ISSET(oif_xflags, IFXF_AUTOCONF6) && - ISSET(ifp->if_xflags, IFXF_AUTOCONF6)))) { + ISSET(ifp->if_xflags, IFXF_AUTOCONF6)) || + (!ISSET(oif_xflags, IFXF_AUTOCONF6TEMP) && + ISSET(ifp->if_xflags, IFXF_AUTOCONF6TEMP)))) { ifr->ifr_flags = ifp->if_flags | IFF_UP; cmd = SIOCSIFFLAGS; goto forceup; -- I'm not entirely sure you are real.