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.

Reply via email to