X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fnetwork%2Fnetworkd-link.c;h=9c93776097b17d991b72cc1a40a76a4167f5bedf;hb=428fd0a75873d63b9d567f9db7871551d1ee0d62;hp=d3777c885753e8f9276e9d2f54091f7d84903854;hpb=9505d3c6deda0452c22ab2ed47bca74b98d87a17;p=elogind.git diff --git a/src/network/networkd-link.c b/src/network/networkd-link.c index d3777c885..9c9377609 100644 --- a/src/network/networkd-link.c +++ b/src/network/networkd-link.c @@ -96,11 +96,18 @@ static int link_new(Manager *manager, sd_rtnl_message *message, Link **ret) { } static void link_free(Link *link) { + Address *address; + if (!link) return; assert(link->manager); + while ((address = link->addresses)) { + LIST_REMOVE(addresses, link->addresses, address); + address_free(address); + } + sd_dhcp_client_unref(link->dhcp_client); sd_dhcp_lease_unref(link->dhcp_lease); @@ -1715,7 +1722,9 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *use Link *link = NULL; uint16_t type; _cleanup_address_free_ Address *address = NULL; + Address *ad; char buf[INET6_ADDRSTRLEN]; + bool address_dropped = false; int r, ifindex; assert(rtnl); @@ -1784,15 +1793,33 @@ int link_rtnl_process_address(sd_rtnl *rtnl, sd_rtnl_message *message, void *use return 0; } + LIST_FOREACH(addresses, ad, link->addresses) { + if (address_equal(ad, address)) { + LIST_REMOVE(addresses, link->addresses, ad); + + address_free(ad); + + address_dropped = true; + + break; + } + } + switch (type) { case RTM_NEWADDR: - log_info_link(link, "added address: %s/%u", buf, - address->prefixlen); - break; + if (!address_dropped) + log_debug_link(link, "added address: %s/%u", buf, + address->prefixlen); + LIST_PREPEND(addresses, link->addresses, address); + address = NULL; + + break; case RTM_DELADDR: - log_info_link(link, "removed address: %s/%u", buf, - address->prefixlen); + if (address_dropped) + log_debug_link(link, "removed address: %s/%u", buf, + address->prefixlen); + break; default: assert_not_reached("Received invalid RTNL message type");