Fix wrong address pool being advertised
[project/odhcpd.git] / src / dhcpv6-ia.c
index 4d68258..b1931ef 100644 (file)
@@ -233,7 +233,7 @@ void dhcpv6_write_statefile(void)
 
                                        struct in6_addr addr;
                                        for (size_t i = 0; i < iface->ia_addr_len; ++i) {
 
                                        struct in6_addr addr;
                                        for (size_t i = 0; i < iface->ia_addr_len; ++i) {
-                                               if (iface->ia_addr[i].prefix > 64)
+                                               if (iface->ia_addr[i].prefix > 96)
                                                        continue;
 
                                                addr = iface->ia_addr[i].addr;
                                                        continue;
 
                                                addr = iface->ia_addr[i].addr;
@@ -451,7 +451,6 @@ static void update(struct interface *iface)
                if (addr[i].prefix > minprefix)
                        minprefix = addr[i].prefix;
 
                if (addr[i].prefix > minprefix)
                        minprefix = addr[i].prefix;
 
-               addr[i].addr.s6_addr32[2] = 0;
                addr[i].addr.s6_addr32[3] = 0;
 
                if (addr[i].preferred < UINT32_MAX - now)
                addr[i].addr.s6_addr32[3] = 0;
 
                if (addr[i].preferred < UINT32_MAX - now)
@@ -604,7 +603,7 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status,
                                uint32_t prefix_pref = iface->ia_addr[i].preferred - now;
                                uint32_t prefix_valid = iface->ia_addr[i].valid - now;
 
                                uint32_t prefix_pref = iface->ia_addr[i].preferred - now;
                                uint32_t prefix_valid = iface->ia_addr[i].valid - now;
 
-                               if (iface->ia_addr[i].prefix > 64 ||
+                               if (iface->ia_addr[i].prefix > 96 ||
                                                iface->ia_addr[i].preferred <= (uint32_t)now)
                                        continue;
 
                                                iface->ia_addr[i].preferred <= (uint32_t)now)
                                        continue;
 
@@ -712,7 +711,7 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status,
                                bool found = false;
                                if (a) {
                                        for (size_t i = 0; i < iface->ia_addr_len; ++i) {
                                bool found = false;
                                if (a) {
                                        for (size_t i = 0; i < iface->ia_addr_len; ++i) {
-                                               if (iface->ia_addr[i].prefix > 64 ||
+                                               if (iface->ia_addr[i].prefix > 96 ||
                                                                iface->ia_addr[i].preferred <= (uint32_t)now)
                                                        continue;
 
                                                                iface->ia_addr[i].preferred <= (uint32_t)now)
                                                        continue;
 
@@ -720,13 +719,13 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status,
                                                if (ia->type == htons(DHCPV6_OPT_IA_PD)) {
                                                        addr.s6_addr32[1] |= htonl(a->assigned);
 
                                                if (ia->type == htons(DHCPV6_OPT_IA_PD)) {
                                                        addr.s6_addr32[1] |= htonl(a->assigned);
 
-                                                       if (IN6_ARE_ADDR_EQUAL(&p->addr, &addr) &&
+                                                       if (!memcmp(&p->addr, &addr, sizeof(addr)) &&
                                                                        p->prefix == a->length)
                                                                found = true;
                                                } else {
                                                        addr.s6_addr32[3] = htonl(a->assigned);
 
                                                                        p->prefix == a->length)
                                                                found = true;
                                                } else {
                                                        addr.s6_addr32[3] = htonl(a->assigned);
 
-                                                       if (IN6_ARE_ADDR_EQUAL(&n->addr, &addr))
+                                                       if (!memcmp(&n->addr, &addr, sizeof(addr)))
                                                                found = true;
                                                }
                                        }
                                                                found = true;
                                                }
                                        }