]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: automatically set NLM_F_REPLACE flag 18554/head
authorYu Watanabe <watanabe.yu+github@gmail.com>
Tue, 9 Feb 2021 16:20:37 +0000 (01:20 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 11 Feb 2021 16:50:14 +0000 (01:50 +0900)
The difference between sd_rtnl_message_new_addr() and
sd_rtnl_message_new_addr_update() is only whether NLM_F_REPLACE flag
will be set or not.

If an address is already assigned, then we need to set NLM_F_REPLACE
flag, otherwise, address_configure() will be fail.

This makes address_configure() judge whether we should use the flag or
not.

src/network/networkd-address.c
src/network/networkd-address.h
src/network/networkd-dhcp4.c
src/network/networkd-dhcp6.c
src/network/networkd-ipv4ll.c
src/network/networkd-ndisc.c

index 505851bafa28415345d7040b089a75c042286fef..d7fbb6eac53a828e66c6c8a080f9bbcfb4ecf7d3 100644 (file)
@@ -805,12 +805,12 @@ int address_configure(
                 const Address *address,
                 Link *link,
                 link_netlink_message_handler_t callback,
-                bool update,
                 Address **ret) {
 
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
         Address *acquired_address, *a;
         uint32_t flags;
+        bool update;
         int r;
 
         assert(address);
@@ -833,6 +833,8 @@ int address_configure(
         if (acquired_address)
                 address = acquired_address;
 
+        update = address_get(link, address, NULL) >= 0;
+
         log_address_debug(address, update ? "Updating" : "Configuring", link);
 
         if (update)
@@ -994,14 +996,14 @@ static int address_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link)
         return 1;
 }
 
-static int static_address_configure(const Address *address, Link *link, bool update) {
+static int static_address_configure(const Address *address, Link *link) {
         Address *ret;
         int r;
 
         assert(address);
         assert(link);
 
-        r = address_configure(address, link, address_handler, update, &ret);
+        r = address_configure(address, link, address_handler, &ret);
         if (r < 0)
                 return log_link_warning_errno(link, r, "Could not configure static address: %m");
 
@@ -1036,10 +1038,7 @@ int link_set_addresses(Link *link) {
         }
 
         ORDERED_HASHMAP_FOREACH(ad, link->network->addresses_by_section) {
-                bool update;
-
-                update = address_get(link, ad, NULL) > 0;
-                r = static_address_configure(ad, link, update);
+                r = static_address_configure(ad, link);
                 if (r < 0)
                         return r;
         }
@@ -1063,7 +1062,7 @@ int link_set_addresses(Link *link) {
                         return log_link_warning_errno(link, r, "Could not generate EUI64 address: %m");
 
                 address->family = AF_INET6;
-                r = static_address_configure(address, link, true);
+                r = static_address_configure(address, link);
                 if (r < 0)
                         return r;
         }
index 4764766996f735b613a2dcf700b84c8bdd918929..7c2d0db3d07f6a0a1adc31176a2c54ed4056eb60 100644 (file)
@@ -49,7 +49,7 @@ typedef struct Address {
 int address_new(Address **ret);
 Address *address_free(Address *address);
 int address_get(Link *link, const Address *in, Address **ret);
-int address_configure(const Address *address, Link *link, link_netlink_message_handler_t callback, bool update, Address **ret);
+int address_configure(const Address *address, Link *link, link_netlink_message_handler_t callback, Address **ret);
 int address_remove(const Address *address, Link *link, link_netlink_message_handler_t callback);
 bool address_equal(const Address *a1, const Address *a2);
 bool address_is_ready(const Address *a);
index bbdd31a93d99616dfe0c4205d436220003c1b86e..1559e0cfd850aa34b50bce96ae6330e195f047c2 100644 (file)
@@ -870,7 +870,7 @@ static int dhcp4_update_address(Link *link, bool announce) {
 
         /* allow reusing an existing address and simply update its lifetime
          * in case it already exists */
-        r = address_configure(addr, link, dhcp4_address_handler, true, &ret);
+        r = address_configure(addr, link, dhcp4_address_handler, &ret);
         if (r < 0)
                 return log_link_error_errno(link, r, "Failed to set DHCPv4 address: %m");
 
index e643a92247dc561e9baedc041bf1f9a7ad0d8bf5..451b55234541f14172860453790cdda01c896c70 100644 (file)
@@ -391,7 +391,7 @@ static int dhcp6_set_pd_address(
         address->cinfo.ifa_valid = lifetime_valid;
         SET_FLAG(address->flags, IFA_F_MANAGETEMPADDR, link->network->dhcp6_pd_manage_temporary_address);
 
-        r = address_configure(address, link, dhcp6_pd_address_handler, true, &ret);
+        r = address_configure(address, link, dhcp6_pd_address_handler, &ret);
         if (r < 0)
                 return log_link_error_errno(link, r, "Failed to set DHCPv6 delegated prefix address: %m");
 
@@ -1034,7 +1034,7 @@ static int dhcp6_update_address(
 
         log_dhcp6_address(link, addr, &buffer);
 
-        r = address_configure(addr, link, dhcp6_address_handler, true, &ret);
+        r = address_configure(addr, link, dhcp6_address_handler, &ret);
         if (r < 0)
                 return log_link_error_errno(link, r, "Failed to set DHCPv6 address %s/%u: %m",
                                             strnull(buffer), addr->prefixlen);
index 7e1c1ac16eae6c558c81a7f506573688563676d5..65266633e3b01f40da887c9cbfd8bff900daae87 100644 (file)
@@ -92,7 +92,7 @@ static int ipv4ll_address_claimed(sd_ipv4ll *ll, Link *link) {
         ll_addr->broadcast.s_addr = ll_addr->in_addr.in.s_addr | htobe32(0xfffffffflu >> ll_addr->prefixlen);
         ll_addr->scope = RT_SCOPE_LINK;
 
-        r = address_configure(ll_addr, link, ipv4ll_address_handler, false, NULL);
+        r = address_configure(ll_addr, link, ipv4ll_address_handler, NULL);
         if (r < 0)
                 return r;
 
index bcde253909edc947e2e6a4302d51a370a8d35a0d..47b35bd543e6e1dd6c4b2de5c2cac383f0969ad8 100644 (file)
@@ -434,7 +434,7 @@ static int ndisc_address_configure(Address *address, Link *link, sd_ndisc_router
         assert(link);
         assert(rt);
 
-        r = address_configure(address, link, ndisc_address_handler, true, &ret);
+        r = address_configure(address, link, ndisc_address_handler, &ret);
         if (r < 0)
                 return log_link_error_errno(link, r, "Failed to set NDisc SLAAC address: %m");