diff options
author | Susant Sahani <ssahani@vmware.com> | 2020-02-27 12:40:57 +0100 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2020-03-01 00:16:51 +0900 |
commit | 5ead5352244530a854d4bbd430c30fa8faa0d30b (patch) | |
tree | a9a7cd9d03f43c3791eb059c27d99213abb8832f | |
parent | c4ad7f83ec60edcd91b6acbceb1d54335d78ccca (diff) | |
download | systemd-5ead5352244530a854d4bbd430c30fa8faa0d30b.tar.gz |
network: Introduce method to generate EUI-64 addresses
-rw-r--r-- | src/network/networkd-address.c | 18 | ||||
-rw-r--r-- | src/network/networkd-address.h | 2 |
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; |