]> git.ipfire.org Git - thirdparty/dhcpcd.git/commitdiff
When aliasing to an existing address, check it is already aliased.
authorRoy Marples <roy@marples.name>
Wed, 27 Jul 2016 15:39:29 +0000 (15:39 +0000)
committerRoy Marples <roy@marples.name>
Wed, 27 Jul 2016 15:39:29 +0000 (15:39 +0000)
Add debug to say which alias will use the address.
Fixes Solaris.

ipv4.c
ipv6.c

diff --git a/ipv4.c b/ipv4.c
index 8000cd41a89dd147c1f2bbb3501201755b8e0d52..9f20a6a48bb12975f772918b9fe296126e4312d4 100644 (file)
--- a/ipv4.c
+++ b/ipv4.c
@@ -947,7 +947,7 @@ find_lun:
        else
                snprintf(alias, sizeof(alias), "%s:%u", ia->iface->name, lun);
        TAILQ_FOREACH(iap, &state->addrs, next) {
-               if (iap->addr.s_addr == INADDR_ANY) {
+               if (iap->alias[0] != '\0' && iap->addr.s_addr == INADDR_ANY) {
                        /* No address assigned? Lets use it. */
                        strlcpy(ia->alias, iap->alias, sizeof(ia->alias));
                        if (repl)
@@ -979,7 +979,7 @@ ipv4_addaddr(struct interface *ifp, const struct in_addr *addr,
        struct ipv4_state *state;
        struct ipv4_addr *ia;
 #ifdef ALIAS_ADDR
-       int replaced;
+       int replaced, blank;
        struct ipv4_addr *replaced_ia;
 #endif
 
@@ -1012,11 +1012,15 @@ ipv4_addaddr(struct interface *ifp, const struct in_addr *addr,
            inet_ntoa(*addr), inet_ntocidr(*mask));
 
 #ifdef ALIAS_ADDR
+       blank = (ia->alias[0] == '\0');
        if ((replaced = ipv4_aliasaddr(ia, &replaced_ia)) == -1) {
                logger(ifp->ctx, LOG_ERR, "%s: ipv4_aliasaddr: %m", ifp->name);
                free(ia);
                return NULL;
        }
+       if (blank)
+               logger(ia->iface->ctx, LOG_DEBUG, "%s: aliased %s",
+                   ia->alias, ia->saddr);
 #endif
 
        logger(ifp->ctx, LOG_DEBUG, "%s: adding IP address %s broadcast %s",
diff --git a/ipv6.c b/ipv6.c
index 2af846021af8b4ca3171bea25df6ca2b3a70f964..12e5085fdcd77713d94c6017b17108556f332049 100644 (file)
--- a/ipv6.c
+++ b/ipv6.c
@@ -790,14 +790,15 @@ ipv6_aliasaddr(struct ipv6_addr *ia, struct ipv6_addr **repl)
 
        if (ia->alias[0] != '\0')
                return 0;
-
        state = IPV6_STATE(ia->iface);
 
        /* First find an existng address.
         * This can happen when dhcpcd restarts as ND and DHCPv6
         * maintain their own lists of addresses. */
        TAILQ_FOREACH(iap, &state->addrs, next) {
-               if (IN6_ARE_ADDR_EQUAL(&iap->addr, &ia->addr)) {
+               if (iap->alias[0] != '\0' &&
+                   IN6_ARE_ADDR_EQUAL(&iap->addr, &ia->addr))
+               {
                        strlcpy(ia->alias, iap->alias, sizeof(ia->alias));
                        return 0;
                }
@@ -810,6 +811,8 @@ find_unit:
        else
                snprintf(alias, sizeof(alias), "%s:%u", ia->iface->name, unit);
        TAILQ_FOREACH(iap, &state->addrs, next) {
+               if (iap->alias[0] == '\0')
+                       continue;
                if (IN6_IS_ADDR_UNSPECIFIED(&iap->addr)) {
                        /* No address assigned? Lets use it. */
                        strlcpy(ia->alias, iap->alias, sizeof(ia->alias));
@@ -840,11 +843,15 @@ ipv6_addaddr(struct ipv6_addr *ia, const struct timespec *now)
 {
        int r;
 #ifdef ALIAS_ADDR
-       int replaced;
+       int replaced, blank;
        struct ipv6_addr *replaced_ia;
 
+       blank = (ia->alias[0] == '\0');
        if ((replaced = ipv6_aliasaddr(ia, &replaced_ia)) == -1)
                return -1;
+       if (blank)
+               logger(ia->iface->ctx, LOG_DEBUG, "%s: aliased %s",
+                   ia->alias, ia->saddr);
 #endif
 
        if ((r = ipv6_addaddr1(ia, now)) == 0) {