derive ipv6 static lease from ipv4 if no hostid is given
[project/odhcpd.git] / src / dhcpv6-ia.c
index bdaa3da..e5a7c0b 100644 (file)
@@ -87,7 +87,12 @@ int setup_dhcpv6_ia_interface(struct interface *iface, bool enable)
 
                        a->clid_len = lease->duid_len;
                        a->length = 128;
-                       a->assigned = lease->hostid;
+                       if (lease->hostid) {
+                               a->assigned = lease->hostid;
+                       } else {
+                               uint32_t i4a = ntohl(lease->ipaddr.s_addr) & 0xff;
+                               a->assigned = ((i4a / 100) << 8) | (((i4a % 100) / 10) << 4) | (i4a % 10);
+                       }
                        odhcpd_urandom(a->key, sizeof(a->key));
                        memcpy(a->clid_data, lease->duid, a->clid_len);
                        memcpy(a->mac, lease->mac.ether_addr_octet, sizeof(a->mac));
@@ -552,10 +557,6 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status,
                if (a) {
                        uint32_t pref = 3600;
                        uint32_t valid = 3600;
-                       bool have_non_ula = false;
-                       for (size_t i = 0; i < iface->ia_addr_len; ++i)
-                               if ((iface->ia_addr[i].addr.s6_addr[0] & 0xfe) != 0xfc)
-                                       have_non_ula = true;
 
                        for (size_t i = 0; i < iface->ia_addr_len; ++i) {
                                bool match = true;
@@ -580,12 +581,6 @@ static size_t append_reply(uint8_t *buf, size_t buflen, uint16_t status,
                                                iface->ia_addr[i].preferred <= (uint32_t)now)
                                        continue;
 
-                               // ULA-deprecation compatibility workaround
-                               if ((iface->ia_addr[i].addr.s6_addr[0] & 0xfe) == 0xfc &&
-                                               a->length == 128 && have_non_ula &&
-                                               iface->deprecate_ula_if_public_avail)
-                                       continue;
-
                                if (prefix_pref > 86400)
                                        prefix_pref = 86400;