]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: drop list of static address labels
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 29 Sep 2020 16:20:43 +0000 (01:20 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 6 Oct 2020 17:44:42 +0000 (02:44 +0900)
[IPv6AddressLabel] sections are managed by both LIST and Hashmap.
Let's drop list, as they store the completely same information.

src/network/networkd-address-label.c
src/network/networkd-address-label.h
src/network/networkd-link.c
src/network/networkd-network.c
src/network/networkd-network.h

index 0d53aa90429b333d7ebaa232160498130f2df03a..6c3c0409a90257179e323b3be3123d7efdef0699 100644 (file)
@@ -16,16 +16,11 @@ void address_label_free(AddressLabel *label) {
                 return;
 
         if (label->network) {
-                LIST_REMOVE(labels, label->network->address_labels, label);
-                assert(label->network->n_address_labels > 0);
-                label->network->n_address_labels--;
-
-                if (label->section) {
-                        hashmap_remove(label->network->address_labels_by_section, label->section);
-                        network_config_section_free(label->section);
-                }
+                assert(label->section);
+                hashmap_remove(label->network->address_labels_by_section, label->section);
         }
 
+        network_config_section_free(label->section);
         free(label);
 }
 
@@ -36,19 +31,17 @@ static int address_label_new_static(Network *network, const char *filename, unsi
 
         assert(network);
         assert(ret);
-        assert(!!filename == (section_line > 0));
-
-        if (filename) {
-                r = network_config_section_new(filename, section_line, &n);
-                if (r < 0)
-                        return r;
+        assert(filename);
+        assert(section_line > 0);
 
-                label = hashmap_get(network->address_labels_by_section, n);
-                if (label) {
-                        *ret = TAKE_PTR(label);
+        r = network_config_section_new(filename, section_line, &n);
+        if (r < 0)
+                return r;
 
-                        return 0;
-                }
+        label = hashmap_get(network->address_labels_by_section, n);
+        if (label) {
+                *ret = TAKE_PTR(label);
+                return 0;
         }
 
         label = new(AddressLabel, 1);
@@ -57,25 +50,18 @@ static int address_label_new_static(Network *network, const char *filename, unsi
 
         *label = (AddressLabel) {
                 .network = network,
+                .section = TAKE_PTR(n),
         };
 
-        LIST_APPEND(labels, network->address_labels, label);
-        network->n_address_labels++;
-
-        if (filename) {
-                label->section = TAKE_PTR(n);
-
-                r = hashmap_ensure_allocated(&network->address_labels_by_section, &network_config_hash_ops);
-                if (r < 0)
-                        return r;
+        r = hashmap_ensure_allocated(&network->address_labels_by_section, &network_config_hash_ops);
+        if (r < 0)
+                return r;
 
-                r = hashmap_put(network->address_labels_by_section, label->section, label);
-                if (r < 0)
-                        return r;
-        }
+        r = hashmap_put(network->address_labels_by_section, label->section, label);
+        if (r < 0)
+                return r;
 
         *ret = TAKE_PTR(label);
-
         return 0;
 }
 
index 595072a17e6fc5992e9076e1e6536b319becd951..5e02dee246589cf1ed08d2eaf1c1486849ab1ab5 100644 (file)
@@ -25,8 +25,6 @@ struct AddressLabel {
         uint32_t label;
 
         union in_addr_union in_addr;
-
-        LIST_FIELDS(AddressLabel, labels);
 };
 
 void address_label_free(AddressLabel *label);
index 9aebe745654d21b41bb363ebfa8c0138253ac008..dc12a9694c10675b19f48dca595c92b8fed53487 100644 (file)
@@ -1322,7 +1322,7 @@ static int link_request_set_addresses(Link *link) {
                                 return r;
                 }
 
-        LIST_FOREACH(labels, label, link->network->address_labels) {
+        HASHMAP_FOREACH(label, link->network->address_labels_by_section) {
                 r = address_label_configure(label, link, NULL, false);
                 if (r < 0)
                         return log_link_warning_errno(link, r, "Could not set address label: %m");
index 0591b23e0926e5cbb940c39d5650bd714a597004..b170f7aa353d3f77768dc1614511bc0bfbe2d159 100644 (file)
@@ -152,7 +152,7 @@ static int network_resolve_stacked_netdevs(Network *network) {
 
 int network_verify(Network *network) {
         RoutePrefix *route_prefix, *route_prefix_next;
-        AddressLabel *label, *label_next;
+        AddressLabel *label;
         Address *address, *address_next;
         Prefix *prefix, *prefix_next;
         Route *route, *route_next;
@@ -310,7 +310,7 @@ int network_verify(Network *network) {
 
         network_verify_neighbors(network);
 
-        LIST_FOREACH_SAFE(labels, label, label_next, network->address_labels)
+        HASHMAP_FOREACH(label, network->address_labels_by_section)
                 if (section_is_invalid(label->section))
                         address_label_free(label);
 
@@ -640,7 +640,6 @@ failure:
 static Network *network_free(Network *network) {
         IPv6ProxyNDPAddress *ipv6_proxy_ndp_address;
         RoutePrefix *route_prefix;
-        AddressLabel *label;
         FdbEntry *fdb_entry;
         MdbEntry *mdb_entry;
         Address *address;
@@ -717,9 +716,6 @@ static Network *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);
-
         while ((prefix = network->static_prefixes))
                 prefix_free(prefix);
 
@@ -732,7 +728,7 @@ static Network *network_free(Network *network) {
         hashmap_free(network->fdb_entries_by_section);
         hashmap_free(network->mdb_entries_by_section);
         hashmap_free_with_destructor(network->neighbors_by_section, neighbor_free);
-        hashmap_free(network->address_labels_by_section);
+        hashmap_free_with_destructor(network->address_labels_by_section, address_label_free);
         hashmap_free(network->prefixes_by_section);
         hashmap_free(network->route_prefixes_by_section);
         hashmap_free_with_destructor(network->rules_by_section, routing_policy_rule_free);
@@ -868,7 +864,7 @@ bool network_has_static_ipv6_configurations(Network *network) {
                 if (neighbor->family == AF_INET6)
                         return true;
 
-        if (!LIST_IS_EMPTY(network->address_labels))
+        if (!hashmap_isempty(network->address_labels_by_section))
                 return true;
 
         if (!LIST_IS_EMPTY(network->static_prefixes))
index acc4378771b1f76f54b4e5e738c83bce6a4d2ae0..4f05b92b3e9a90805e13a714274f67b7d5ad81c2 100644 (file)
@@ -287,7 +287,6 @@ struct Network {
         LIST_HEAD(FdbEntry, static_fdb_entries);
         LIST_HEAD(MdbEntry, static_mdb_entries);
         LIST_HEAD(IPv6ProxyNDPAddress, ipv6_proxy_ndp_addresses);
-        LIST_HEAD(AddressLabel, address_labels);
         LIST_HEAD(Prefix, static_prefixes);
         LIST_HEAD(RoutePrefix, static_route_prefixes);
 
@@ -296,7 +295,6 @@ struct Network {
         unsigned n_static_fdb_entries;
         unsigned n_static_mdb_entries;
         unsigned n_ipv6_proxy_ndp_addresses;
-        unsigned n_address_labels;
         unsigned n_static_prefixes;
         unsigned n_static_route_prefixes;