]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: make address_configure() or friends return 1 when the address is new
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 3 Feb 2021 15:40:08 +0000 (00:40 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 12 Feb 2021 13:43:10 +0000 (22:43 +0900)
src/network/networkd-address.c
src/network/networkd-neighbor.c
src/network/networkd-nexthop.c
src/network/networkd-route.c
src/network/networkd-routing-policy-rule.c

index d7fbb6eac53a828e66c6c8a080f9bbcfb4ecf7d3..499aa5be0ab89f19d6dae4310fe687b621edb908 100644 (file)
@@ -326,6 +326,7 @@ static int address_add_foreign(Link *link, const Address *in, Address **ret) {
 }
 
 static int address_add(Link *link, const Address *in, Address **ret) {
+        bool is_new = false;
         Address *address;
         int r;
 
@@ -338,6 +339,7 @@ static int address_add(Link *link, const Address *in, Address **ret) {
                 r = address_add_internal(link, &link->addresses, in, &address);
                 if (r < 0)
                         return r;
+                is_new = true;
         } else if (r == 0) {
                 /* Take over a foreign address */
                 r = set_ensure_put(&link->addresses, &address_hash_ops, address);
@@ -353,8 +355,7 @@ static int address_add(Link *link, const Address *in, Address **ret) {
 
         if (ret)
                 *ret = address;
-
-        return 0;
+        return is_new;
 }
 
 static int address_update(Address *address, const Address *src) {
@@ -811,7 +812,7 @@ int address_configure(
         Address *acquired_address, *a;
         uint32_t flags;
         bool update;
-        int r;
+        int r, k;
 
         assert(address);
         assert(IN_SET(address->family, AF_INET, AF_INET6));
@@ -889,9 +890,9 @@ int address_configure(
         if (r < 0)
                 return log_link_error_errno(link, r, "Could not append IFA_CACHEINFO attribute: %m");
 
-        r = address_add(link, address, &a);
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not add address: %m");
+        k = address_add(link, address, &a);
+        if (k < 0)
+                return log_link_error_errno(link, k, "Could not add address: %m");
 
         r = address_set_masquerade(a, true);
         if (r < 0)
@@ -914,7 +915,7 @@ int address_configure(
         if (ret)
                 *ret = a;
 
-        return 1;
+        return k;
 }
 
 static int static_address_ready_callback(Address *address) {
index 22b716b14ae935fff9f2fd13d68d7bca2db7f779..f54a2f9c99f458744c9da432abb87b384b142e03 100644 (file)
@@ -170,6 +170,7 @@ static int neighbor_add_internal(Link *link, Set **neighbors, const Neighbor *in
 }
 
 static int neighbor_add(Link *link, const Neighbor *in, Neighbor **ret) {
+        bool is_new = false;
         Neighbor *neighbor;
         int r;
 
@@ -179,6 +180,7 @@ static int neighbor_add(Link *link, const Neighbor *in, Neighbor **ret) {
                 r = neighbor_add_internal(link, &link->neighbors, in, &neighbor);
                 if (r < 0)
                         return r;
+                is_new = true;
         } else if (r == 0) {
                 /* Neighbor is foreign, claim it as recognized */
                 r = set_ensure_put(&link->neighbors, &neighbor_hash_ops, neighbor);
@@ -188,12 +190,13 @@ static int neighbor_add(Link *link, const Neighbor *in, Neighbor **ret) {
                 set_remove(link->neighbors_foreign, neighbor);
         } else if (r == 1) {
                 /* Neighbor already exists */
+                ;
         } else
                 return r;
 
         if (ret)
                 *ret = neighbor;
-        return 0;
+        return is_new;
 }
 
 static int neighbor_add_foreign(Link *link, const Neighbor *in, Neighbor **ret) {
@@ -279,7 +282,7 @@ static int neighbor_configure(Neighbor *neighbor, Link *link) {
         if (r < 0)
                 return log_link_error_errno(link, r, "Could not add neighbor: %m");
 
-        return 0;
+        return r;
 }
 
 int link_set_neighbors(Link *link) {
index ea9c252cc7e6a9b4008386a0ae17014a54eb7fd7..ab0562e9e810e2656160666fb25177e9db32c2c0 100644 (file)
@@ -188,6 +188,7 @@ static int nexthop_add_foreign(Link *link, NextHop *in, NextHop **ret) {
 }
 
 static int nexthop_add(Link *link, NextHop *in, NextHop **ret) {
+        bool is_new = false;
         NextHop *nexthop;
         int r;
 
@@ -197,6 +198,7 @@ static int nexthop_add(Link *link, NextHop *in, NextHop **ret) {
                 r = nexthop_add_internal(link, &link->nexthops, in, &nexthop);
                 if (r < 0)
                         return r;
+                is_new = true;
         } else if (r == 0) {
                 /* Take over a foreign nexthop */
                 r = set_ensure_put(&link->nexthops, &nexthop_hash_ops, nexthop);
@@ -212,8 +214,7 @@ static int nexthop_add(Link *link, NextHop *in, NextHop **ret) {
 
         if (ret)
                 *ret = nexthop;
-
-        return 0;
+        return is_new;
 }
 
 static int nexthop_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
@@ -297,7 +298,7 @@ static int nexthop_configure(NextHop *nexthop, Link *link) {
         if (r < 0)
                 return log_link_error_errno(link, r, "Could not add nexthop: %m");
 
-        return 1;
+        return r;
 }
 
 int link_set_nexthop(Link *link) {
index ef977dac5c3a330b92e9bc963bc952a67280348e..5a908dbeb0f1c20b8b5b28af24fcb404e928fcc4 100644 (file)
@@ -549,6 +549,7 @@ static int route_add_foreign(Manager *manager, Link *link, const Route *in, Rout
 
 static int route_add(Manager *manager, Link *link, const Route *in, const MultipathRoute *m, Route **ret) {
         _cleanup_(route_freep) Route *tmp = NULL;
+        bool is_new = false;
         Route *route;
         int r;
 
@@ -572,6 +573,7 @@ static int route_add(Manager *manager, Link *link, const Route *in, const Multip
                 r = route_add_internal(manager, link, link ? &link->routes : &manager->routes, in, &route);
                 if (r < 0)
                         return r;
+                is_new = true;
         } else if (r == 0) {
                 /* Take over a foreign route */
                 if (link) {
@@ -595,8 +597,7 @@ static int route_add(Manager *manager, Link *link, const Route *in, const Multip
 
         if (ret)
                 *ret = route;
-
-        return 0;
+        return is_new;
 }
 
 static bool route_type_is_reject(const Route *route) {
@@ -949,15 +950,15 @@ static int route_expire_handler(sd_event_source *s, uint64_t usec, void *userdat
 static int route_add_and_setup_timer(Link *link, const Route *route, const MultipathRoute *m, Route **ret) {
         _cleanup_(sd_event_source_unrefp) sd_event_source *expire = NULL;
         Route *nr;
-        int r;
+        int r, k;
 
         assert(link);
         assert(route);
 
         if (route_type_is_reject(route))
-                r = route_add(link->manager, NULL, route, NULL, &nr);
+                k = route_add(link->manager, NULL, route, NULL, &nr);
         else if (!m || m->ifindex == 0 || m->ifindex == link->ifindex)
-                r = route_add(NULL, link, route, m, &nr);
+                k = route_add(NULL, link, route, m, &nr);
         else {
                 Link *link_gw;
 
@@ -965,10 +966,10 @@ static int route_add_and_setup_timer(Link *link, const Route *route, const Multi
                 if (r < 0)
                         return log_link_error_errno(link, r, "Failed to get link with ifindex %d: %m", m->ifindex);
 
-                r = route_add(NULL, link_gw, route, m, &nr);
+                k = route_add(NULL, link_gw, route, m, &nr);
         }
-        if (r < 0)
-                return log_link_error_errno(link, r, "Could not add route: %m");
+        if (k < 0)
+                return log_link_error_errno(link, k, "Could not add route: %m");
 
         /* TODO: drop expiration handling once it can be pushed into the kernel */
         if (nr->lifetime != USEC_INFINITY && !kernel_route_expiration_supported()) {
@@ -984,7 +985,7 @@ static int route_add_and_setup_timer(Link *link, const Route *route, const Multi
         if (ret)
                 *ret = nr;
 
-        return 0;
+        return k;
 }
 
 static int append_nexthop_one(const Route *route, const MultipathRoute *m, struct rtattr **rta, size_t offset) {
@@ -1075,7 +1076,7 @@ int route_configure(
                 Route **ret) {
 
         _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
-        int r;
+        int r, k = 0;
 
         assert(link);
         assert(link->manager);
@@ -1165,9 +1166,9 @@ int route_configure(
         if (ordered_set_isempty(route->multipath_routes)) {
                 Route *nr;
 
-                r = route_add_and_setup_timer(link, route, NULL, &nr);
-                if (r < 0)
-                        return r;
+                k = route_add_and_setup_timer(link, route, NULL, &nr);
+                if (k < 0)
+                        return k;
 
                 if (ret)
                         *ret = nr;
@@ -1180,6 +1181,8 @@ int route_configure(
                         r = route_add_and_setup_timer(link, route, m, NULL);
                         if (r < 0)
                                 return r;
+                        if (r > 0)
+                                k = 1;
                 }
         }
 
@@ -1190,7 +1193,7 @@ int route_configure(
 
         link_ref(link);
 
-        return 0;
+        return k;
 }
 
 static int route_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
index 7802a1e55aa380337e730df5ea68a172f306fae2..ed966f3c1731a3535a09f9a744075fbbeb579c6e 100644 (file)
@@ -326,6 +326,7 @@ static int routing_policy_rule_get(Manager *m, const RoutingPolicyRule *rule, Ro
 static int routing_policy_rule_add(Manager *m, const RoutingPolicyRule *in, int family, RoutingPolicyRule **ret) {
         _cleanup_(routing_policy_rule_freep) RoutingPolicyRule *rule = NULL;
         RoutingPolicyRule *existing;
+        bool is_new = false;
         int r;
 
         assert(m);
@@ -353,6 +354,7 @@ static int routing_policy_rule_add(Manager *m, const RoutingPolicyRule *in, int
 
                 rule->manager = m;
                 existing = TAKE_PTR(rule);
+                is_new = true;
         } else if (r == 0) {
                 /* Take over a foreign rule. */
                 r = set_ensure_put(&m->rules, &routing_policy_rule_hash_ops, existing);
@@ -369,8 +371,7 @@ static int routing_policy_rule_add(Manager *m, const RoutingPolicyRule *in, int
 
         if (ret)
                 *ret = existing;
-
-        return 0;
+        return is_new;
 }
 
 static int routing_policy_rule_consume_foreign(Manager *m, RoutingPolicyRule *rule) {
@@ -635,7 +636,7 @@ static int routing_policy_rule_configure_internal(const RoutingPolicyRule *rule,
         if (r < 0)
                 return log_link_error_errno(link, r, "Could not add rule: %m");
 
-        return 1;
+        return r;
 }
 
 static int routing_policy_rule_configure(const RoutingPolicyRule *rule, Link *link) {