While slaacd(8) doesn't receive router advertisements for interface in
a different rdomain it still touches those interfaces, i.e. removing
addresses.

OK

diff --git frontend.c frontend.c
index 8c6d48810e9..8f5894a77de 100644
--- frontend.c
+++ frontend.c
@@ -69,6 +69,7 @@ void           get_rtaddrs(int, struct sockaddr *, struct 
sockaddr **);
 void            icmp6_receive(int, short, void *);
 int             get_flags(char *);
 int             get_xflags(char *);
+int             get_ifrdomain(char *);
 void            get_lladdr(char *, struct ether_addr *, struct sockaddr_in6 *);
 void            send_solicitation(uint32_t);
 #ifndef        SMALL
@@ -480,14 +481,31 @@ get_xflags(char *if_name)
        return ifr.ifr_flags;
 }
 
+int
+get_ifrdomain(char *if_name)
+{
+       struct ifreq             ifr;
+
+       (void) strlcpy(ifr.ifr_name, if_name, sizeof(ifr.ifr_name));
+       if (ioctl(ioctlsock, SIOCGIFRDOMAIN, (caddr_t)&ifr) == -1) {
+               log_warn("SIOCGIFRDOMAIN");
+               return -1;
+       }
+       return ifr.ifr_rdomainid;
+}
+
 void
 update_iface(uint32_t if_index, char* if_name)
 {
        struct imsg_ifinfo       imsg_ifinfo;
-       int                      flags, xflags;
+       int                      flags, xflags, ifrdomain;
 
        if ((flags = get_flags(if_name)) == -1 || (xflags =
-           get_xflags(if_name)) == -1)
+           get_xflags(if_name)) == -1 || (ifrdomain = get_ifrdomain(if_name))
+           == -1)
+               return;
+
+       if (ifrdomain != getrtable())
                return;
 
        if (!(xflags & IFXF_AUTOCONF6))
@@ -520,9 +538,12 @@ update_autoconf_addresses(uint32_t if_index, char* if_name)
        struct sockaddr_in6     *sin6;
        struct imsg_link_state   imsg_link_state;
        time_t                   t;
-       int                      xflags;
+       int                      xflags, ifrdomain;
 
-       if ((xflags = get_xflags(if_name)) == -1)
+       if ((xflags = get_xflags(if_name)) == -1 || (ifrdomain =
+           get_ifrdomain(if_name)) == -1)
+               return;
+       if (ifrdomain != getrtable())
                return;
 
        if (!(xflags & IFXF_AUTOCONF6))




-- 
I'm not entirely sure you are real.

Reply via email to