summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSusant Sahani <ssahani@vmware.com>2020-02-27 12:40:57 +0100
committerYu Watanabe <watanabe.yu+github@gmail.com>2020-03-01 00:16:51 +0900
commit5ead5352244530a854d4bbd430c30fa8faa0d30b (patch)
treea9a7cd9d03f43c3791eb059c27d99213abb8832f
parentc4ad7f83ec60edcd91b6acbceb1d54335d78ccca (diff)
downloadsystemd-5ead5352244530a854d4bbd430c30fa8faa0d30b.tar.gz
network: Introduce method to generate EUI-64 addresses
-rw-r--r--src/network/networkd-address.c18
-rw-r--r--src/network/networkd-address.h2
2 files changed, 20 insertions, 0 deletions
diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c
index 6244f75201..1567bd7ee9 100644
--- a/src/network/networkd-address.c
+++ b/src/network/networkd-address.c
@@ -20,6 +20,24 @@
#define ADDRESSES_PER_LINK_MAX 2048U
#define STATIC_ADDRESSES_PER_NETWORK_MAX 1024U
+int generate_ipv6_eui_64_address(Link *link, struct in6_addr *ret) {
+ assert(link);
+ assert(ret);
+
+ /* see RFC4291 section 2.5.1 */
+ ret->s6_addr[8] = link->mac.ether_addr_octet[0];
+ ret->s6_addr[8] ^= 1 << 1;
+ ret->s6_addr[9] = link->mac.ether_addr_octet[1];
+ ret->s6_addr[10] = link->mac.ether_addr_octet[2];
+ ret->s6_addr[11] = 0xff;
+ ret->s6_addr[12] = 0xfe;
+ ret->s6_addr[13] = link->mac.ether_addr_octet[3];
+ ret->s6_addr[14] = link->mac.ether_addr_octet[4];
+ ret->s6_addr[15] = link->mac.ether_addr_octet[5];
+
+ return 0;
+}
+
int address_new(Address **ret) {
_cleanup_(address_freep) Address *address = NULL;
diff --git a/src/network/networkd-address.h b/src/network/networkd-address.h
index ad2412c75a..bd0485e0ab 100644
--- a/src/network/networkd-address.h
+++ b/src/network/networkd-address.h
@@ -66,6 +66,8 @@ bool address_is_ready(const Address *a);
int address_section_verify(Address *a);
int configure_ipv4_duplicate_address_detection(Link *link, Address *address);
+int generate_ipv6_eui_64_address(Link *link, struct in6_addr *ret);
+
DEFINE_NETWORK_SECTION_FUNCTIONS(Address, address_free);
extern const struct hash_ops address_hash_ops;