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.