From 44085d63f04127cbd2f15c11e672de4d024d91b2 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 7 Oct 2022 14:17:13 +0900 Subject: [PATCH 1/2] network: drop unnecessary call of ndisc_vacuum() After the commit 773024685b37170395a11716f8e4ad99d3580455, DNS servers or domains are dropped when their lifefime become zero. Hence, it is not necessary to try to them when writing state file. Of course, because of the accuracy of the timer event source or priority of event sources, a possibility is introduced that a DNS server or domain with zero lifetime is stored in the state file. However, such entry will be dropped soon when the timer event source is triggered. Hence, that should not cause any real issues. --- src/network/networkd-ndisc.c | 21 --------------------- src/network/networkd-ndisc.h | 1 - src/network/networkd-state-file.c | 3 --- 3 files changed, 25 deletions(-) diff --git a/src/network/networkd-ndisc.c b/src/network/networkd-ndisc.c index 95722e24ef..f31735b6ec 100644 --- a/src/network/networkd-ndisc.c +++ b/src/network/networkd-ndisc.c @@ -1175,27 +1175,6 @@ int ndisc_stop(Link *link) { } -void ndisc_vacuum(Link *link) { - NDiscRDNSS *r; - NDiscDNSSL *d; - usec_t now_usec; - - assert(link); - assert(link->manager); - - /* Removes all RDNSS and DNSSL entries whose validity time has passed */ - - assert_se(sd_event_now(link->manager->event, CLOCK_BOOTTIME, &now_usec) >= 0); - - SET_FOREACH(r, link->ndisc_rdnss) - if (r->lifetime_usec < now_usec) - free(set_remove(link->ndisc_rdnss, r)); - - SET_FOREACH(d, link->ndisc_dnssl) - if (d->lifetime_usec < now_usec) - free(set_remove(link->ndisc_dnssl, d)); -} - void ndisc_flush(Link *link) { assert(link); diff --git a/src/network/networkd-ndisc.h b/src/network/networkd-ndisc.h index b696db9df1..6ccc1295d0 100644 --- a/src/network/networkd-ndisc.h +++ b/src/network/networkd-ndisc.h @@ -41,7 +41,6 @@ void network_adjust_ipv6_accept_ra(Network *network); int ndisc_start(Link *link); int ndisc_stop(Link *link); -void ndisc_vacuum(Link *link); void ndisc_flush(Link *link); int link_request_ndisc(Link *link); diff --git a/src/network/networkd-state-file.c b/src/network/networkd-state-file.c index 502da1afb2..4932184991 100644 --- a/src/network/networkd-state-file.c +++ b/src/network/networkd-state-file.c @@ -540,9 +540,6 @@ int link_save(Link *link) { /************************************************************/ - /* Make sure to flush out old entries before we use the NDisc data */ - ndisc_vacuum(link); - fputs("DNS=", f); if (link->n_dns != UINT_MAX) link_save_dns(link, f, link->dns, link->n_dns, NULL); From b3fac19f1b5f589fe1213b57ca19c06348480f67 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Fri, 7 Oct 2022 14:32:10 +0900 Subject: [PATCH 2/2] network: free timer event source for NDisc when link is freed Though, it should be already freed already freed in link_stop_engines() -> ndisc_stop(). Just for safety. --- src/network/networkd-link.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index 69d5eb9d1b..00e4e451ef 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -151,6 +151,7 @@ static void link_free_engines(Link *link) { return; link->dhcp_server = sd_dhcp_server_unref(link->dhcp_server); + link->dhcp_client = sd_dhcp_client_unref(link->dhcp_client); link->dhcp_lease = sd_dhcp_lease_unref(link->dhcp_lease); link->dhcp4_6rd_tunnel_name = mfree(link->dhcp4_6rd_tunnel_name); @@ -158,12 +159,15 @@ static void link_free_engines(Link *link) { link->lldp_rx = sd_lldp_rx_unref(link->lldp_rx); link->lldp_tx = sd_lldp_tx_unref(link->lldp_tx); - ndisc_flush(link); - link->ipv4ll = sd_ipv4ll_unref(link->ipv4ll); + link->dhcp6_client = sd_dhcp6_client_unref(link->dhcp6_client); link->dhcp6_lease = sd_dhcp6_lease_unref(link->dhcp6_lease); + link->ndisc = sd_ndisc_unref(link->ndisc); + link->ndisc_expire = sd_event_source_disable_unref(link->ndisc_expire); + ndisc_flush(link); + link->radv = sd_radv_unref(link->radv); }