From 25a9bd72ef05e1ccb14ad9c974585df01251153a Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 11 Apr 2025 10:56:12 +0900 Subject: [PATCH 1/7] network: use dns_name_hash_ops_free in dnssec negative trust anchors --- src/network/networkd-dns.c | 4 ++-- src/network/networkd-link-bus.c | 7 +++---- src/network/networkd-link.c | 2 +- src/network/networkd-network.c | 2 +- 4 files changed, 7 insertions(+), 8 deletions(-) diff --git a/src/network/networkd-dns.c b/src/network/networkd-dns.c index a8164912dc..bc3bc65c20 100644 --- a/src/network/networkd-dns.c +++ b/src/network/networkd-dns.c @@ -281,7 +281,7 @@ int config_parse_dnssec_negative_trust_anchors( assert(rvalue); if (isempty(rvalue)) { - *nta = set_free_free(*nta); + *nta = set_free(*nta); return 0; } @@ -306,7 +306,7 @@ int config_parse_dnssec_negative_trust_anchors( continue; } - r = set_ensure_consume(nta, &dns_name_hash_ops, TAKE_PTR(w)); + r = set_ensure_consume(nta, &dns_name_hash_ops_free, TAKE_PTR(w)); if (r < 0) return log_oom(); } diff --git a/src/network/networkd-link-bus.c b/src/network/networkd-link-bus.c index 27ee855181..dfecd76d22 100644 --- a/src/network/networkd-link-bus.c +++ b/src/network/networkd-link-bus.c @@ -479,7 +479,7 @@ int bus_link_method_set_dnssec(sd_bus_message *message, void *userdata, sd_bus_e } int bus_link_method_set_dnssec_negative_trust_anchors(sd_bus_message *message, void *userdata, sd_bus_error *error) { - _cleanup_set_free_free_ Set *ns = NULL; + _cleanup_set_free_ Set *ns = NULL; _cleanup_strv_free_ char **ntas = NULL; Link *l = ASSERT_PTR(userdata); int r; @@ -502,7 +502,7 @@ int bus_link_method_set_dnssec_negative_trust_anchors(sd_bus_message *message, v return sd_bus_error_setf(error, SD_BUS_ERROR_INVALID_ARGS, "Invalid negative trust anchor domain: %s", *i); } - ns = set_new(&dns_name_hash_ops); + ns = set_new(&dns_name_hash_ops_free); if (!ns) return -ENOMEM; @@ -523,8 +523,7 @@ int bus_link_method_set_dnssec_negative_trust_anchors(sd_bus_message *message, v if (r == 0) return 1; /* Polkit will call us back */ - set_free_free(l->dnssec_negative_trust_anchors); - l->dnssec_negative_trust_anchors = TAKE_PTR(ns); + set_free_and_replace(l->dnssec_negative_trust_anchors, ns); r = link_save_and_clean_full(l, /* also_save_manager = */ true); if (r < 0) diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 8a8c41eaac..fdb9e52a81 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -231,7 +231,7 @@ void link_dns_settings_clear(Link *link) { link->dnssec_mode = _DNSSEC_MODE_INVALID; link->dns_over_tls_mode = _DNS_OVER_TLS_MODE_INVALID; - link->dnssec_negative_trust_anchors = set_free_free(link->dnssec_negative_trust_anchors); + link->dnssec_negative_trust_anchors = set_free(link->dnssec_negative_trust_anchors); } static void link_free_engines(Link *link) { diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 00851243b5..db36893d95 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -752,7 +752,7 @@ static Network *network_free(Network *network) { free(network->dns); ordered_set_free(network->search_domains); ordered_set_free(network->route_domains); - set_free_free(network->dnssec_negative_trust_anchors); + set_free(network->dnssec_negative_trust_anchors); /* DHCP server */ free(network->dhcp_server_relay_agent_circuit_id); From 6d1a69d0f08d06a4252b46a8923b5e859eff1b02 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 11 Apr 2025 11:04:16 +0900 Subject: [PATCH 2/7] network: use in6_addr_hash_ops_free in Network.ipv6_proxy_ndp_addresses This also one adjustment to network_adjust_ipv6_proxy_ndp(). --- src/network/networkd-ipv6-proxy-ndp.c | 14 +++++++++----- src/network/networkd-network.c | 7 +------ 2 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/network/networkd-ipv6-proxy-ndp.c b/src/network/networkd-ipv6-proxy-ndp.c index edd369a9e7..03c16c50c0 100644 --- a/src/network/networkd-ipv6-proxy-ndp.c +++ b/src/network/networkd-ipv6-proxy-ndp.c @@ -22,7 +22,13 @@ void network_adjust_ipv6_proxy_ndp(Network *network) { log_once(LOG_WARNING, "%s: IPv6 proxy NDP addresses are set, but IPv6 is not supported by kernel, " "Ignoring IPv6 proxy NDP addresses.", network->filename); - network->ipv6_proxy_ndp_addresses = set_free_free(network->ipv6_proxy_ndp_addresses); + network->ipv6_proxy_ndp_addresses = set_free(network->ipv6_proxy_ndp_addresses); + return; + } + + if (network->ipv6_proxy_ndp == 0) { + log_warning("%s: IPv6ProxyNDP= is disabled. Ignoring IPv6ProxyNDPAddress=.", network->filename); + network->ipv6_proxy_ndp_addresses = set_free(network->ipv6_proxy_ndp_addresses); } } @@ -149,7 +155,7 @@ int config_parse_ipv6_proxy_ndp_address( assert(rvalue); if (isempty(rvalue)) { - network->ipv6_proxy_ndp_addresses = set_free_free(network->ipv6_proxy_ndp_addresses); + network->ipv6_proxy_ndp_addresses = set_free(network->ipv6_proxy_ndp_addresses); return 0; } @@ -170,11 +176,9 @@ int config_parse_ipv6_proxy_ndp_address( if (!address) return log_oom(); - r = set_ensure_put(&network->ipv6_proxy_ndp_addresses, &in6_addr_hash_ops, address); + r = set_ensure_consume(&network->ipv6_proxy_ndp_addresses, &in6_addr_hash_ops_free, TAKE_PTR(address)); if (r < 0) return log_oom(); - if (r > 0) - TAKE_PTR(address); return 0; } diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index db36893d95..0a45df5c8e 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -291,11 +291,6 @@ int network_verify(Network *network) { if (network->keep_configuration < 0) network->keep_configuration = KEEP_CONFIGURATION_NO; - if (network->ipv6_proxy_ndp == 0 && !set_isempty(network->ipv6_proxy_ndp_addresses)) { - log_warning("%s: IPv6ProxyNDP= is disabled. Ignoring IPv6ProxyNDPAddress=.", network->filename); - network->ipv6_proxy_ndp_addresses = set_free_free(network->ipv6_proxy_ndp_addresses); - } - r = network_drop_invalid_addresses(network); if (r < 0) return r; /* network_drop_invalid_addresses() logs internally. */ @@ -828,7 +823,7 @@ static Network *network_free(Network *network) { hashmap_free_with_destructor(network->stacked_netdevs, netdev_unref); /* static configs */ - set_free_free(network->ipv6_proxy_ndp_addresses); + set_free(network->ipv6_proxy_ndp_addresses); ordered_hashmap_free(network->addresses_by_section); hashmap_free(network->routes_by_section); ordered_hashmap_free(network->nexthops_by_section); From 32b5deb1b23fcb5fcc4aef4a5e4554fdd18e6806 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 11 Apr 2025 11:13:26 +0900 Subject: [PATCH 3/7] network/ndisc: replace set_free_free() with set_free() They uses in_addr_prefix_hash_ops_free, hence set_free() is enough. --- src/network/networkd-ndisc.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index a510252183..f0065befd5 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -89,11 +89,11 @@ void network_adjust_ndisc(Network *network) { /* When RouterAllowList=, PrefixAllowList= or RouteAllowList= are specified, then * RouterDenyList=, PrefixDenyList= or RouteDenyList= are ignored, respectively. */ if (!set_isempty(network->ndisc_allow_listed_router)) - network->ndisc_deny_listed_router = set_free_free(network->ndisc_deny_listed_router); + network->ndisc_deny_listed_router = set_free(network->ndisc_deny_listed_router); if (!set_isempty(network->ndisc_allow_listed_prefix)) - network->ndisc_deny_listed_prefix = set_free_free(network->ndisc_deny_listed_prefix); + network->ndisc_deny_listed_prefix = set_free(network->ndisc_deny_listed_prefix); if (!set_isempty(network->ndisc_allow_listed_route_prefix)) - network->ndisc_deny_listed_route_prefix = set_free_free(network->ndisc_deny_listed_route_prefix); + network->ndisc_deny_listed_route_prefix = set_free(network->ndisc_deny_listed_route_prefix); } static int ndisc_check_ready(Link *link); From d3af116afd8e19d0162c096e35ca25dc0f0c8939 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 13 Apr 2025 00:11:01 +0900 Subject: [PATCH 4/7] network,udev: use hash_ops with destructor to manage SR-IOV configs --- src/network/networkd-network.c | 2 +- src/shared/netif-sriov.c | 33 ++++++++++++++++++++------------- src/shared/netif-sriov.h | 3 --- src/udev/net/link-config.c | 2 +- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 0a45df5c8e..3b05cf170c 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -836,7 +836,7 @@ static Network *network_free(Network *network) { hashmap_free_with_destructor(network->pref64_prefixes_by_section, prefix64_free); hashmap_free(network->rules_by_section); hashmap_free_with_destructor(network->dhcp_static_leases_by_section, dhcp_static_lease_free); - ordered_hashmap_free_with_destructor(network->sr_iov_by_section, sr_iov_free); + ordered_hashmap_free(network->sr_iov_by_section); hashmap_free(network->qdiscs_by_section); hashmap_free(network->tclasses_by_section); diff --git a/src/shared/netif-sriov.c b/src/shared/netif-sriov.c index 20e175edcd..fc851689b0 100644 --- a/src/shared/netif-sriov.c +++ b/src/shared/netif-sriov.c @@ -9,6 +9,25 @@ #include "stdio-util.h" #include "string-util.h" +static SRIOV* sr_iov_free(SRIOV *sr_iov) { + if (!sr_iov) + return NULL; + + if (sr_iov->sr_iov_by_section && sr_iov->section) + ordered_hashmap_remove(sr_iov->sr_iov_by_section, sr_iov->section); + + config_section_free(sr_iov->section); + + return mfree(sr_iov); +} + +DEFINE_SECTION_CLEANUP_FUNCTIONS(SRIOV, sr_iov_free); + +DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR( + sr_iov_hash_ops_by_section, + ConfigSection, config_section_hash_func, config_section_compare_func, + SRIOV, sr_iov_free); + static int sr_iov_new(SRIOV **ret) { SRIOV *sr_iov; @@ -57,7 +76,7 @@ static int sr_iov_new_static(OrderedHashmap **sr_iov_by_section, const char *fil if (r < 0) return r; - r = ordered_hashmap_ensure_put(sr_iov_by_section, &config_section_hash_ops, n, sr_iov); + r = ordered_hashmap_ensure_put(sr_iov_by_section, &sr_iov_hash_ops_by_section, n, sr_iov); if (r < 0) return r; @@ -68,18 +87,6 @@ static int sr_iov_new_static(OrderedHashmap **sr_iov_by_section, const char *fil return 0; } -SRIOV *sr_iov_free(SRIOV *sr_iov) { - if (!sr_iov) - return NULL; - - if (sr_iov->sr_iov_by_section && sr_iov->section) - ordered_hashmap_remove(sr_iov->sr_iov_by_section, sr_iov->section); - - config_section_free(sr_iov->section); - - return mfree(sr_iov); -} - void sr_iov_hash_func(const SRIOV *sr_iov, struct siphash *state) { assert(sr_iov); assert(state); diff --git a/src/shared/netif-sriov.h b/src/shared/netif-sriov.h index ee769575e5..4e0b19bf3b 100644 --- a/src/shared/netif-sriov.h +++ b/src/shared/netif-sriov.h @@ -32,7 +32,6 @@ typedef struct SRIOV { struct ether_addr mac; } SRIOV; -SRIOV *sr_iov_free(SRIOV *sr_iov); void sr_iov_hash_func(const SRIOV *sr_iov, struct siphash *state); int sr_iov_compare_func(const SRIOV *s1, const SRIOV *s2); int sr_iov_set_netlink_message(SRIOV *sr_iov, sd_netlink_message *req); @@ -40,8 +39,6 @@ int sr_iov_get_num_vfs(sd_device *device, uint32_t *ret); int sr_iov_set_num_vfs(sd_device *device, uint32_t num_vfs, OrderedHashmap *sr_iov_by_section); int sr_iov_drop_invalid_sections(uint32_t num_vfs, OrderedHashmap *sr_iov_by_section); -DEFINE_SECTION_CLEANUP_FUNCTIONS(SRIOV, sr_iov_free); - CONFIG_PARSER_PROTOTYPE(config_parse_sr_iov_uint32); CONFIG_PARSER_PROTOTYPE(config_parse_sr_iov_boolean); CONFIG_PARSER_PROTOTYPE(config_parse_sr_iov_link_state); diff --git a/src/udev/net/link-config.c b/src/udev/net/link-config.c index 2ae0f693ee..1e15bc4b8a 100644 --- a/src/udev/net/link-config.c +++ b/src/udev/net/link-config.c @@ -75,7 +75,7 @@ static LinkConfig* link_config_free(LinkConfig *config) { erase_and_free(config->wol_password); cpu_set_free(config->rps_cpu_mask); - ordered_hashmap_free_with_destructor(config->sr_iov_by_section, sr_iov_free); + ordered_hashmap_free(config->sr_iov_by_section); return mfree(config); } From 10d786458c85f98a0de999167ebe4d0f8ecf8c1e Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 13 Apr 2025 02:34:16 +0900 Subject: [PATCH 5/7] network/radv: use hash_ops with destructor for managing prefixes --- src/network/networkd-network.c | 6 +++--- src/network/networkd-radv.c | 33 ++++++++++++++++++++++++--------- src/network/networkd-radv.h | 4 ---- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 3b05cf170c..3ae87e939a 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -831,9 +831,9 @@ static Network *network_free(Network *network) { hashmap_free_with_destructor(network->bridge_mdb_entries_by_section, bridge_mdb_free); ordered_hashmap_free(network->neighbors_by_section); hashmap_free(network->address_labels_by_section); - hashmap_free_with_destructor(network->prefixes_by_section, prefix_free); - hashmap_free_with_destructor(network->route_prefixes_by_section, route_prefix_free); - hashmap_free_with_destructor(network->pref64_prefixes_by_section, prefix64_free); + hashmap_free(network->prefixes_by_section); + hashmap_free(network->route_prefixes_by_section); + hashmap_free(network->pref64_prefixes_by_section); hashmap_free(network->rules_by_section); hashmap_free_with_destructor(network->dhcp_static_leases_by_section, dhcp_static_lease_free); ordered_hashmap_free(network->sr_iov_by_section); diff --git a/src/network/networkd-radv.c b/src/network/networkd-radv.c index 570f9d6087..5e838028f2 100644 --- a/src/network/networkd-radv.c +++ b/src/network/networkd-radv.c @@ -35,7 +35,7 @@ bool link_radv_enabled(Link *link) { return link->network->router_prefix_delegation; } -Prefix* prefix_free(Prefix *prefix) { +static Prefix* prefix_free(Prefix *prefix) { if (!prefix) return NULL; @@ -52,6 +52,11 @@ Prefix* prefix_free(Prefix *prefix) { DEFINE_SECTION_CLEANUP_FUNCTIONS(Prefix, prefix_free); +DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR( + prefix_hash_ops_by_section, + ConfigSection, config_section_hash_func, config_section_compare_func, + Prefix, prefix_free); + static int prefix_new_static(Network *network, const char *filename, unsigned section_line, Prefix **ret) { _cleanup_(config_section_freep) ConfigSection *n = NULL; _cleanup_(prefix_freep) Prefix *prefix = NULL; @@ -87,7 +92,7 @@ static int prefix_new_static(Network *network, const char *filename, unsigned se .prefix.preferred_until = USEC_INFINITY, }; - r = hashmap_ensure_put(&network->prefixes_by_section, &config_section_hash_ops, prefix->section, prefix); + r = hashmap_ensure_put(&network->prefixes_by_section, &prefix_hash_ops_by_section, prefix->section, prefix); if (r < 0) return r; @@ -95,7 +100,7 @@ static int prefix_new_static(Network *network, const char *filename, unsigned se return 0; } -RoutePrefix* route_prefix_free(RoutePrefix *prefix) { +static RoutePrefix* route_prefix_free(RoutePrefix *prefix) { if (!prefix) return NULL; @@ -111,6 +116,11 @@ RoutePrefix* route_prefix_free(RoutePrefix *prefix) { DEFINE_SECTION_CLEANUP_FUNCTIONS(RoutePrefix, route_prefix_free); +DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR( + route_prefix_hash_ops_by_section, + ConfigSection, config_section_hash_func, config_section_compare_func, + RoutePrefix, route_prefix_free); + static int route_prefix_new_static(Network *network, const char *filename, unsigned section_line, RoutePrefix **ret) { _cleanup_(config_section_freep) ConfigSection *n = NULL; _cleanup_(route_prefix_freep) RoutePrefix *prefix = NULL; @@ -143,7 +153,7 @@ static int route_prefix_new_static(Network *network, const char *filename, unsig .route.valid_until = USEC_INFINITY, }; - r = hashmap_ensure_put(&network->route_prefixes_by_section, &config_section_hash_ops, prefix->section, prefix); + r = hashmap_ensure_put(&network->route_prefixes_by_section, &route_prefix_hash_ops_by_section, prefix->section, prefix); if (r < 0) return r; @@ -151,7 +161,7 @@ static int route_prefix_new_static(Network *network, const char *filename, unsig return 0; } -Prefix64* prefix64_free(Prefix64 *prefix) { +static Prefix64* prefix64_free(Prefix64 *prefix) { if (!prefix) return NULL; @@ -167,6 +177,11 @@ Prefix64* prefix64_free(Prefix64 *prefix) { DEFINE_SECTION_CLEANUP_FUNCTIONS(Prefix64, prefix64_free); +DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR( + prefix64_hash_ops_by_section, + ConfigSection, config_section_hash_func, config_section_compare_func, + Prefix64, prefix64_free); + static int prefix64_new_static(Network *network, const char *filename, unsigned section_line, Prefix64 **ret) { _cleanup_(config_section_freep) ConfigSection *n = NULL; _cleanup_(prefix64_freep) Prefix64 *prefix = NULL; @@ -199,7 +214,7 @@ static int prefix64_new_static(Network *network, const char *filename, unsigned .prefix64.valid_until = USEC_INFINITY, }; - r = hashmap_ensure_put(&network->pref64_prefixes_by_section, &config_section_hash_ops, prefix->section, prefix); + r = hashmap_ensure_put(&network->pref64_prefixes_by_section, &prefix64_hash_ops_by_section, prefix->section, prefix); if (r < 0) return r; @@ -809,9 +824,9 @@ void network_adjust_radv(Network *network) { } if (!FLAGS_SET(network->router_prefix_delegation, RADV_PREFIX_DELEGATION_STATIC)) { - network->prefixes_by_section = hashmap_free_with_destructor(network->prefixes_by_section, prefix_free); - network->route_prefixes_by_section = hashmap_free_with_destructor(network->route_prefixes_by_section, route_prefix_free); - network->pref64_prefixes_by_section = hashmap_free_with_destructor(network->pref64_prefixes_by_section, prefix64_free); + network->prefixes_by_section = hashmap_free(network->prefixes_by_section); + network->route_prefixes_by_section = hashmap_free(network->route_prefixes_by_section); + network->pref64_prefixes_by_section = hashmap_free(network->pref64_prefixes_by_section); } if (!network->router_prefix_delegation) diff --git a/src/network/networkd-radv.h b/src/network/networkd-radv.h index 3f0a374632..ed8ee216de 100644 --- a/src/network/networkd-radv.h +++ b/src/network/networkd-radv.h @@ -52,10 +52,6 @@ typedef struct Prefix64 { sd_ndisc_prefix64 prefix64; } Prefix64; -Prefix* prefix_free(Prefix *prefix); -RoutePrefix* route_prefix_free(RoutePrefix *prefix); -Prefix64* prefix64_free(Prefix64 *prefix); - void network_adjust_radv(Network *network); int link_request_radv_addresses(Link *link); From 5c6e6f5ad17ef7e9100ca8a97cdf4a12c9644e6a Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 13 Apr 2025 02:54:06 +0900 Subject: [PATCH 6/7] network/dhcp-server: use hash_ops with destructor for static lease --- src/network/networkd-dhcp-server-static-lease.c | 14 ++++++++++---- src/network/networkd-dhcp-server-static-lease.h | 1 - src/network/networkd-network.c | 2 +- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/network/networkd-dhcp-server-static-lease.c b/src/network/networkd-dhcp-server-static-lease.c index 8e7eec64d1..b8c7e4dde8 100644 --- a/src/network/networkd-dhcp-server-static-lease.c +++ b/src/network/networkd-dhcp-server-static-lease.c @@ -7,9 +7,7 @@ #include "networkd-network.h" #include "networkd-util.h" -DEFINE_SECTION_CLEANUP_FUNCTIONS(DHCPStaticLease, dhcp_static_lease_free); - -DHCPStaticLease *dhcp_static_lease_free(DHCPStaticLease *static_lease) { +static DHCPStaticLease* dhcp_static_lease_free(DHCPStaticLease *static_lease) { if (!static_lease) return NULL; @@ -21,6 +19,13 @@ DHCPStaticLease *dhcp_static_lease_free(DHCPStaticLease *static_lease) { return mfree(static_lease); } +DEFINE_SECTION_CLEANUP_FUNCTIONS(DHCPStaticLease, dhcp_static_lease_free); + +DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR( + static_lease_hash_ops_by_section, + ConfigSection, config_section_hash_func, config_section_compare_func, + DHCPStaticLease, dhcp_static_lease_free); + static int dhcp_static_lease_new(DHCPStaticLease **ret) { DHCPStaticLease *p; @@ -60,7 +65,8 @@ static int lease_new_static(Network *network, const char *filename, unsigned sec static_lease->network = network; static_lease->section = TAKE_PTR(n); - r = hashmap_ensure_put(&network->dhcp_static_leases_by_section, &config_section_hash_ops, static_lease->section, static_lease); + + r = hashmap_ensure_put(&network->dhcp_static_leases_by_section, &static_lease_hash_ops_by_section, static_lease->section, static_lease); if (r < 0) return r; diff --git a/src/network/networkd-dhcp-server-static-lease.h b/src/network/networkd-dhcp-server-static-lease.h index 9b8e78b90d..fe8e249d5a 100644 --- a/src/network/networkd-dhcp-server-static-lease.h +++ b/src/network/networkd-dhcp-server-static-lease.h @@ -19,7 +19,6 @@ typedef struct DHCPStaticLease { size_t client_id_size; } DHCPStaticLease; -DHCPStaticLease *dhcp_static_lease_free(DHCPStaticLease *lease); void network_drop_invalid_static_leases(Network *network); CONFIG_PARSER_PROTOTYPE(config_parse_dhcp_static_lease_address); diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index 3ae87e939a..d036e99ec3 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -835,7 +835,7 @@ static Network *network_free(Network *network) { hashmap_free(network->route_prefixes_by_section); hashmap_free(network->pref64_prefixes_by_section); hashmap_free(network->rules_by_section); - hashmap_free_with_destructor(network->dhcp_static_leases_by_section, dhcp_static_lease_free); + hashmap_free(network->dhcp_static_leases_by_section); ordered_hashmap_free(network->sr_iov_by_section); hashmap_free(network->qdiscs_by_section); hashmap_free(network->tclasses_by_section); From 1b25b88f826fa458e1f8a69fa1999636e6b73b40 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sun, 13 Apr 2025 03:03:29 +0900 Subject: [PATCH 7/7] network/bridge-fdb,mdb: use hash_ops with destructor --- src/network/networkd-bridge-fdb.c | 12 +++++++----- src/network/networkd-bridge-fdb.h | 2 -- src/network/networkd-bridge-mdb.c | 12 ++++++++---- src/network/networkd-bridge-mdb.h | 3 --- src/network/networkd-network.c | 4 ++-- 5 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/network/networkd-bridge-fdb.c b/src/network/networkd-bridge-fdb.c index 803e27cdae..9a455d8ba3 100644 --- a/src/network/networkd-bridge-fdb.c +++ b/src/network/networkd-bridge-fdb.c @@ -22,8 +22,7 @@ #define STATIC_BRIDGE_FDB_ENTRIES_PER_NETWORK_MAX 1024U -/* remove and FDB entry. */ -BridgeFDB *bridge_fdb_free(BridgeFDB *fdb) { +static BridgeFDB* bridge_fdb_free(BridgeFDB *fdb) { if (!fdb) return NULL; @@ -40,7 +39,11 @@ BridgeFDB *bridge_fdb_free(BridgeFDB *fdb) { DEFINE_SECTION_CLEANUP_FUNCTIONS(BridgeFDB, bridge_fdb_free); -/* create a new FDB entry or get an existing one. */ +DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR( + bridge_fdb_hash_ops_by_section, + ConfigSection, config_section_hash_func, config_section_compare_func, + BridgeFDB, bridge_fdb_free); + static int bridge_fdb_new_static( Network *network, const char *filename, @@ -83,13 +86,12 @@ static int bridge_fdb_new_static( .ntf_flags = NEIGHBOR_CACHE_ENTRY_FLAGS_SELF, }; - r = hashmap_ensure_put(&network->bridge_fdb_entries_by_section, &config_section_hash_ops, fdb->section, fdb); + r = hashmap_ensure_put(&network->bridge_fdb_entries_by_section, &bridge_fdb_hash_ops_by_section, fdb->section, fdb); if (r < 0) return r; /* return allocated FDB structure. */ *ret = TAKE_PTR(fdb); - return 0; } diff --git a/src/network/networkd-bridge-fdb.h b/src/network/networkd-bridge-fdb.h index b59d673d04..8bb50627cb 100644 --- a/src/network/networkd-bridge-fdb.h +++ b/src/network/networkd-bridge-fdb.h @@ -40,8 +40,6 @@ typedef struct BridgeFDB { int outgoing_ifindex; } BridgeFDB; -BridgeFDB *bridge_fdb_free(BridgeFDB *fdb); - void network_drop_invalid_bridge_fdb_entries(Network *network); int link_request_static_bridge_fdb(Link *link); diff --git a/src/network/networkd-bridge-mdb.c b/src/network/networkd-bridge-mdb.c index ba027bfa7c..45c271c848 100644 --- a/src/network/networkd-bridge-mdb.c +++ b/src/network/networkd-bridge-mdb.c @@ -10,13 +10,13 @@ #include "networkd-manager.h" #include "networkd-network.h" #include "networkd-queue.h" +#include "networkd-util.h" #include "string-util.h" #include "vlan-util.h" #define STATIC_BRIDGE_MDB_ENTRIES_PER_NETWORK_MAX 1024U -/* remove MDB entry. */ -BridgeMDB *bridge_mdb_free(BridgeMDB *mdb) { +static BridgeMDB* bridge_mdb_free(BridgeMDB *mdb) { if (!mdb) return NULL; @@ -32,7 +32,11 @@ BridgeMDB *bridge_mdb_free(BridgeMDB *mdb) { DEFINE_SECTION_CLEANUP_FUNCTIONS(BridgeMDB, bridge_mdb_free); -/* create a new MDB entry or get an existing one. */ +DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR( + bridge_mdb_hash_ops_by_section, + ConfigSection, config_section_hash_func, config_section_compare_func, + BridgeMDB, bridge_mdb_free); + static int bridge_mdb_new_static( Network *network, const char *filename, @@ -74,7 +78,7 @@ static int bridge_mdb_new_static( .type = _BRIDGE_MDB_ENTRY_TYPE_INVALID, }; - r = hashmap_ensure_put(&network->bridge_mdb_entries_by_section, &config_section_hash_ops, mdb->section, mdb); + r = hashmap_ensure_put(&network->bridge_mdb_entries_by_section, &bridge_mdb_hash_ops_by_section, mdb->section, mdb); if (r < 0) return r; diff --git a/src/network/networkd-bridge-mdb.h b/src/network/networkd-bridge-mdb.h index fe6d601879..3b565d7f67 100644 --- a/src/network/networkd-bridge-mdb.h +++ b/src/network/networkd-bridge-mdb.h @@ -5,7 +5,6 @@ #include "conf-parser.h" #include "in-addr-util.h" -#include "networkd-util.h" typedef struct Link Link; typedef struct Network Network; @@ -30,8 +29,6 @@ typedef struct BridgeMDB { uint16_t vlan_id; } BridgeMDB; -BridgeMDB *bridge_mdb_free(BridgeMDB *mdb); - void network_drop_invalid_bridge_mdb_entries(Network *network); int link_request_static_bridge_mdb(Link *link); diff --git a/src/network/networkd-network.c b/src/network/networkd-network.c index d036e99ec3..2a5f9eb900 100644 --- a/src/network/networkd-network.c +++ b/src/network/networkd-network.c @@ -827,8 +827,8 @@ static Network *network_free(Network *network) { ordered_hashmap_free(network->addresses_by_section); hashmap_free(network->routes_by_section); ordered_hashmap_free(network->nexthops_by_section); - hashmap_free_with_destructor(network->bridge_fdb_entries_by_section, bridge_fdb_free); - hashmap_free_with_destructor(network->bridge_mdb_entries_by_section, bridge_mdb_free); + hashmap_free(network->bridge_fdb_entries_by_section); + hashmap_free(network->bridge_mdb_entries_by_section); ordered_hashmap_free(network->neighbors_by_section); hashmap_free(network->address_labels_by_section); hashmap_free(network->prefixes_by_section);