From d9eee312a7232c83d7494139d4d1bc8831d57455 Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Thu, 4 Feb 2021 00:40:08 +0900 Subject: [PATCH] network: make address_configure() or friends return 1 when the address is new --- src/network/networkd-address.c | 15 ++++++----- src/network/networkd-neighbor.c | 7 +++-- src/network/networkd-nexthop.c | 7 ++--- src/network/networkd-route.c | 31 ++++++++++++---------- src/network/networkd-routing-policy-rule.c | 7 ++--- 5 files changed, 38 insertions(+), 29 deletions(-) diff --git a/src/network/networkd-address.c b/src/network/networkd-address.c index d7fbb6eac5..499aa5be0a 100644 --- a/src/network/networkd-address.c +++ b/src/network/networkd-address.c @@ -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) { diff --git a/src/network/networkd-neighbor.c b/src/network/networkd-neighbor.c index 22b716b14a..f54a2f9c99 100644 --- a/src/network/networkd-neighbor.c +++ b/src/network/networkd-neighbor.c @@ -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) { diff --git a/src/network/networkd-nexthop.c b/src/network/networkd-nexthop.c index ea9c252cc7..ab0562e9e8 100644 --- a/src/network/networkd-nexthop.c +++ b/src/network/networkd-nexthop.c @@ -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) { diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index ef977dac5c..5a908dbeb0 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -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) { diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c index 7802a1e55a..ed966f3c17 100644 --- a/src/network/networkd-routing-policy-rule.c +++ b/src/network/networkd-routing-policy-rule.c @@ -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) {