From: Yu Watanabe Date: Fri, 1 Oct 2021 08:58:38 +0000 (+0900) Subject: network: make generate_ipv6_eui_64_address() take prefix X-Git-Tag: v250-rc1~552^2~15 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=00f1261d397f3147b65898526318fc3ca16dc9e6;p=thirdparty%2Fsystemd.git network: make generate_ipv6_eui_64_address() take prefix Also, rename the function. --- diff --git a/src/network/networkd-address-generation.c b/src/network/networkd-address-generation.c index 55ee8931d06..191a89dfd93 100644 --- a/src/network/networkd-address-generation.c +++ b/src/network/networkd-address-generation.c @@ -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); diff --git a/src/network/networkd-address-generation.h b/src/network/networkd-address-generation.h index 573fc72dc43..5f67019d95a 100644 --- a/src/network/networkd-address-generation.h +++ b/src/network/networkd-address-generation.h @@ -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); diff --git a/src/network/networkd-dhcp6.c b/src/network/networkd-dhcp6.c index 9ea253b2ac5..c6911e14a05 100644 --- a/src/network/networkd-dhcp6.c +++ b/src/network/networkd-dhcp6.c @@ -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; diff --git a/src/network/networkd-radv.c b/src/network/networkd-radv.c index 82b8e8bf3bb..dabd91c0f9a 100644 --- a/src/network/networkd-radv.c +++ b/src/network/networkd-radv.c @@ -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);