diff options
author | Susant Sahani <susant@redhat.com> | 2017-04-25 16:06:50 +0530 |
---|---|---|
committer | Susant Sahani <susant@redhat.com> | 2017-04-26 16:00:44 +0530 |
commit | 95b74ef6ea03632e050cddd99db8b42f30e6e824 (patch) | |
tree | e6d0e68ac29dfb9aac2ea2256a2dc5bfd0eac729 /src/network/networkd-network.c | |
parent | 30746d6088ccfec802972fd5ee12a1e945a0f69b (diff) |
networkd: add support for address label
IPv6 address labels are used for address selection; they are described in RFC 3484.
Precedence is managed by userspace, and only the label itself is stored in the kernel.
enp0s25.network
[Match]
Name=enp0s25
[Network]
DHCP=yes
Address = 2001:db8:f00:baa::b
[AddressLabel]
Label=199
Prefix=2001:db8:41::/64
[AddressLabel]
Label=11
Prefix=2001:db8:31::/64
[AddressLabel]
Label=123
Prefix=2001:db8:21::/64
[AddressLabel]
Label=124
Prefix=2001:db8:11::/64
[sus@maximus label]$ ip addrlabel list
prefix ::1/128 label 0
prefix ::/96 label 3
prefix ::ffff:0.0.0.0/96 label 4
prefix 2001:db8:41::/64 dev enp0s25 label 199
prefix 2001:db8:31::/64 dev enp0s25 label 11
prefix 2001:db8:21::/64 dev enp0s25 label 123
prefix 2001:db8:11::/64 dev enp0s25 label 124
prefix 2001::/32 label 6
prefix 2001:10::/28 label 7
prefix 3ffe::/16 label 12
prefix 2002::/16 label 2
prefix fec0::/10 label 11
prefix fc00::/7 label 5
prefix ::/0 label 1
Diffstat (limited to 'src/network/networkd-network.c')
-rw-r--r-- | src/network/networkd-network.c | 11 |
1 files changed, 11 insertions, 0 deletions
diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index dd29b4ca48..0c0e661909 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -114,6 +114,7 @@ static int network_load_one(Manager *manager, const char *filename) { LIST_HEAD_INIT(network->static_routes); LIST_HEAD_INIT(network->static_fdb_entries); LIST_HEAD_INIT(network->ipv6_proxy_ndp_addresses); + LIST_HEAD_INIT(network->address_labels); network->stacked_netdevs = hashmap_new(&string_hash_ops); if (!network->stacked_netdevs) @@ -131,6 +132,10 @@ static int network_load_one(Manager *manager, const char *filename) { if (!network->fdb_entries_by_section) return log_oom(); + network->address_labels_by_section = hashmap_new(&network_config_hash_ops); + if (!network->address_labels_by_section) + return log_oom(); + network->filename = strdup(filename); if (!network->filename) return log_oom(); @@ -192,6 +197,7 @@ static int network_load_one(Manager *manager, const char *filename) { "Link\0" "Network\0" "Address\0" + "IPv6AddressLabel\0" "Route\0" "DHCP\0" "DHCPv4\0" /* compat */ @@ -271,6 +277,7 @@ void network_free(Network *network) { Address *address; FdbEntry *fdb_entry; IPv6ProxyNDPAddress *ipv6_proxy_ndp_address; + AddressLabel *label; Iterator i; if (!network) @@ -318,9 +325,13 @@ void network_free(Network *network) { while ((ipv6_proxy_ndp_address = network->ipv6_proxy_ndp_addresses)) ipv6_proxy_ndp_address_free(ipv6_proxy_ndp_address); + while ((label = network->address_labels)) + address_label_free(label); + hashmap_free(network->addresses_by_section); hashmap_free(network->routes_by_section); hashmap_free(network->fdb_entries_by_section); + hashmap_free(network->address_labels_by_section); if (network->manager) { if (network->manager->networks) |