]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: make generate_ipv6_eui_64_address() take prefix
authorYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 1 Oct 2021 08:58:38 +0000 (17:58 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 6 Oct 2021 16:03:06 +0000 (01:03 +0900)
Also, rename the function.

src/network/networkd-address-generation.c
src/network/networkd-address-generation.h
src/network/networkd-dhcp6.c
src/network/networkd-radv.c

index 55ee8931d06e31dd5708aeb33b0cc3917273effa..191a89dfd931c2a691d5e0a5a6aa61811c790407 100644 (file)
@@ -37,30 +37,29 @@ typedef struct IPv6Token {
         struct in6_addr prefix;
 } IPv6Token;
 
-int generate_ipv6_eui_64_address(const Link *link, struct in6_addr *ret) {
+void generate_eui64_address(const Link *link, const struct in6_addr *prefix, struct in6_addr *ret) {
         assert(link);
+        assert(prefix);
         assert(ret);
 
-        if (link->iftype == ARPHRD_INFINIBAND) {
-                /* see RFC4391 section 8 */
-                memcpy(&ret->s6_addr[8], &link->hw_addr.infiniband[12], 8);
-                ret->s6_addr[8] ^= 1 << 1;
+        memcpy(ret->s6_addr, prefix, 8);
 
-                return 0;
+        if (link->iftype == ARPHRD_INFINIBAND)
+                /* Use last 8 byte. See RFC4391 section 8 */
+                memcpy(&ret->s6_addr[8], &link->hw_addr.infiniband[INFINIBAND_ALEN - 8], 8);
+        else {
+                /* see RFC4291 section 2.5.1 */
+                ret->s6_addr[8]  = link->hw_addr.ether.ether_addr_octet[0];
+                ret->s6_addr[9]  = link->hw_addr.ether.ether_addr_octet[1];
+                ret->s6_addr[10] = link->hw_addr.ether.ether_addr_octet[2];
+                ret->s6_addr[11] = 0xff;
+                ret->s6_addr[12] = 0xfe;
+                ret->s6_addr[13] = link->hw_addr.ether.ether_addr_octet[3];
+                ret->s6_addr[14] = link->hw_addr.ether.ether_addr_octet[4];
+                ret->s6_addr[15] = link->hw_addr.ether.ether_addr_octet[5];
         }
 
-        /* see RFC4291 section 2.5.1 */
-        ret->s6_addr[8]  = link->hw_addr.ether.ether_addr_octet[0];
         ret->s6_addr[8] ^= 1 << 1;
-        ret->s6_addr[9]  = link->hw_addr.ether.ether_addr_octet[1];
-        ret->s6_addr[10] = link->hw_addr.ether.ether_addr_octet[2];
-        ret->s6_addr[11] = 0xff;
-        ret->s6_addr[12] = 0xfe;
-        ret->s6_addr[13] = link->hw_addr.ether.ether_addr_octet[3];
-        ret->s6_addr[14] = link->hw_addr.ether.ether_addr_octet[4];
-        ret->s6_addr[15] = link->hw_addr.ether.ether_addr_octet[5];
-
-        return 0;
 }
 
 static bool stable_private_address_is_valid(const struct in6_addr *addr) {
@@ -176,21 +175,17 @@ int ndisc_router_generate_addresses(Link *link, struct in6_addr *address, uint8_
 
         /* fall back to EUI-64 if no tokens provided addresses */
         if (set_isempty(addresses)) {
-                _cleanup_free_ struct in6_addr *new_address = NULL;
+                struct in6_addr *addr;
 
-                new_address = newdup(struct in6_addr, address, 1);
-                if (!new_address)
+                addr = new(struct in6_addr, 1);
+                if (!addr)
                         return log_oom();
 
-                r = generate_ipv6_eui_64_address(link, new_address);
-                if (r < 0)
-                        return log_link_error_errno(link, r, "Failed to generate EUI64 address: %m");
+                generate_eui64_address(link, address, addr);
 
-                r = set_put(addresses, new_address);
+                r = set_consume(addresses, addr);
                 if (r < 0)
                         return log_link_error_errno(link, r, "Failed to store SLAAC address: %m");
-
-                TAKE_PTR(new_address);
         }
 
         *ret = TAKE_PTR(addresses);
index 573fc72dc4322c68fac7e045b95867786213fec2..5f67019d95a3fed088ea59411a0dc9b94d477177 100644 (file)
@@ -7,7 +7,7 @@
 
 typedef struct Link Link;
 
-int generate_ipv6_eui_64_address(const Link *link, struct in6_addr *ret);
+void generate_eui64_address(const Link *link, const struct in6_addr *prefix, struct in6_addr *ret);
 
 int ndisc_router_generate_addresses(Link *link, struct in6_addr *address, uint8_t prefixlen, Set **ret);
 
index 9ea253b2ac595f416fa64adba527c71782631fcc..c6911e14a05c34d4ee289f5bdb061b04cf099a52 100644 (file)
@@ -377,15 +377,11 @@ static int dhcp6_pd_request_address(
         if (r < 0)
                 return log_link_error_errno(link, r, "Failed to allocate address for DHCPv6 delegated prefix: %m");
 
-        address->in_addr.in6 = *prefix;
-
-        if (in6_addr_is_set(&link->network->dhcp6_pd_token))
+        if (in6_addr_is_set(&link->network->dhcp6_pd_token)) {
+                memcpy(address->in_addr.in6.s6_addr, prefix->s6_addr, 8);
                 memcpy(address->in_addr.in6.s6_addr + 8, link->network->dhcp6_pd_token.s6_addr + 8, 8);
-        else {
-                r = generate_ipv6_eui_64_address(link, &address->in_addr.in6);
-                if (r < 0)
-                        return log_link_warning_errno(link, r, "Failed to generate EUI64 address for acquired DHCPv6 delegated prefix: %m");
-        }
+        } else
+                generate_eui64_address(link, prefix, &address->in_addr.in6);
 
         address->source = NETWORK_CONFIG_SOURCE_DHCP6PD;
         address->prefixlen = 64;
index 82b8e8bf3bbfbef2af28fe5603894c52a9d65764..dabd91c0f9ae52692bd6321a2322496ef47f9cc5 100644 (file)
@@ -205,24 +205,25 @@ int link_request_radv_addresses(Link *link) {
 
         HASHMAP_FOREACH(p, link->network->prefixes_by_section) {
                 _cleanup_(address_freep) Address *address = NULL;
+                struct in6_addr prefix;
+                uint8_t prefixlen;
 
                 if (!p->assign)
                         continue;
 
-                r = address_new(&address);
-                if (r < 0)
-                        return log_oom();
-
-                r = sd_radv_prefix_get_prefix(p->radv_prefix, &address->in_addr.in6, &address->prefixlen);
+                r = sd_radv_prefix_get_prefix(p->radv_prefix, &prefix, &prefixlen);
                 if (r < 0)
                         return r;
 
-                r = generate_ipv6_eui_64_address(link, &address->in_addr.in6);
+                r = address_new(&address);
                 if (r < 0)
-                        return r;
+                        return log_oom();
+
+                generate_eui64_address(link, &prefix, &address->in_addr.in6);
 
                 address->source = NETWORK_CONFIG_SOURCE_STATIC;
                 address->family = AF_INET6;
+                address->prefixlen = prefixlen;
                 address->route_metric = p->route_metric;
 
                 r = link_request_static_address(link, TAKE_PTR(address), true);