From 8c15388073d54f9bf85b53342269fcd0a002e805 Mon Sep 17 00:00:00 2001 From: Roy Marples Date: Wed, 27 Jul 2016 15:39:29 +0000 Subject: [PATCH] When aliasing to an existing address, check it is already aliased. Add debug to say which alias will use the address. Fixes Solaris. --- ipv4.c | 8 ++++++-- ipv6.c | 13 ++++++++++--- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/ipv4.c b/ipv4.c index 8000cd41..9f20a6a4 100644 --- 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 2af84602..12e5085f 100644 --- 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) { -- 2.47.3