mirror of
https://github.com/systemd/systemd
synced 2024-09-16 06:43:18 +00:00
Merge pull request #18455 from yuwata/network-change-link-state-only-when-new-address-or-route-will-be-assigned
network: change link state only when new address or route will be assigned
This commit is contained in:
commit
b2af6d66fb
|
@ -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) {
|
||||
|
|
|
@ -137,7 +137,7 @@ static int dhcp6_pd_remove_old(Link *link, bool force) {
|
|||
assert(link);
|
||||
assert(link->manager);
|
||||
|
||||
if (!force && (link->dhcp6_pd_address_messages != 0 || link->dhcp6_pd_route_configured != 0))
|
||||
if (!force && (link->dhcp6_pd_address_messages != 0 || link->dhcp6_pd_route_messages != 0))
|
||||
return 0;
|
||||
|
||||
if (set_isempty(link->dhcp6_pd_addresses_old) && set_isempty(link->dhcp6_pd_routes_old))
|
||||
|
@ -281,6 +281,8 @@ static int dhcp6_set_pd_route(Link *link, const union in_addr_union *prefix, con
|
|||
r = route_configure(route, link, dhcp6_pd_route_handler, &ret);
|
||||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Failed to set DHCPv6 prefix route: %m");
|
||||
if (r > 0)
|
||||
link->dhcp6_pd_route_configured = false;
|
||||
|
||||
link->dhcp6_pd_route_messages++;
|
||||
|
||||
|
@ -394,6 +396,8 @@ static int dhcp6_set_pd_address(
|
|||
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");
|
||||
if (r > 0)
|
||||
link->dhcp6_pd_address_configured = false;
|
||||
|
||||
link->dhcp6_pd_address_messages++;
|
||||
|
||||
|
@ -576,8 +580,6 @@ static int dhcp6_pd_prepare(Link *link) {
|
|||
if (!link_dhcp6_pd_is_enabled(link))
|
||||
return 0;
|
||||
|
||||
link->dhcp6_pd_address_configured = false;
|
||||
link->dhcp6_pd_route_configured = false;
|
||||
link->dhcp6_pd_prefixes_assigned = true;
|
||||
|
||||
while ((address = set_steal_first(link->dhcp6_pd_addresses))) {
|
||||
|
@ -816,6 +818,8 @@ static int dhcp6_set_unreachable_route(Link *link, const union in_addr_union *ad
|
|||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Failed to set unreachable route for DHCPv6 delegated subnet %s/%u: %m",
|
||||
strna(buf), prefixlen);
|
||||
if (r > 0)
|
||||
link->dhcp6_route_configured = false;
|
||||
|
||||
link->dhcp6_route_messages++;
|
||||
|
||||
|
@ -1038,6 +1042,8 @@ static int dhcp6_update_address(
|
|||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Failed to set DHCPv6 address %s/%u: %m",
|
||||
strnull(buffer), addr->prefixlen);
|
||||
if (r > 0)
|
||||
link->dhcp6_address_configured = false;
|
||||
|
||||
link->dhcp6_address_messages++;
|
||||
|
||||
|
@ -1103,9 +1109,6 @@ static int dhcp6_lease_ip_acquired(sd_dhcp6_client *client, Link *link) {
|
|||
Route *rt;
|
||||
int r;
|
||||
|
||||
link->dhcp6_address_configured = false;
|
||||
link->dhcp6_route_configured = false;
|
||||
|
||||
while ((a = set_steal_first(link->dhcp6_addresses))) {
|
||||
r = set_ensure_put(&link->dhcp6_addresses_old, &address_hash_ops, a);
|
||||
if (r < 0)
|
||||
|
|
|
@ -343,6 +343,8 @@ static int ndisc_route_configure(Route *route, Link *link, sd_ndisc_router *rt)
|
|||
r = route_configure(route, link, ndisc_route_handler, &ret);
|
||||
if (r < 0)
|
||||
return log_link_error_errno(link, r, "Failed to set NDisc route: %m");
|
||||
if (r > 0)
|
||||
link->ndisc_routes_configured = false;
|
||||
|
||||
link->ndisc_routes_messages++;
|
||||
|
||||
|
@ -437,6 +439,8 @@ static int ndisc_address_configure(Address *address, Link *link, sd_ndisc_router
|
|||
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");
|
||||
if (r > 0)
|
||||
link->ndisc_addresses_configured = false;
|
||||
|
||||
link->ndisc_addresses_messages++;
|
||||
|
||||
|
@ -1213,9 +1217,6 @@ static int ndisc_router_handler(Link *link, sd_ndisc_router *rt) {
|
|||
return 0;
|
||||
}
|
||||
|
||||
link->ndisc_addresses_configured = false;
|
||||
link->ndisc_routes_configured = false;
|
||||
|
||||
SET_FOREACH(na, link->ndisc_addresses)
|
||||
if (IN6_ARE_ADDR_EQUAL(&na->router, &router.in6))
|
||||
na->marked = true;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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,8 @@ int route_configure(
|
|||
Route **ret) {
|
||||
|
||||
_cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL;
|
||||
int r;
|
||||
int r, k = 0;
|
||||
Route *nr;
|
||||
|
||||
assert(link);
|
||||
assert(link->manager);
|
||||
|
@ -1163,14 +1165,9 @@ int route_configure(
|
|||
return log_link_error_errno(link, r, "Could not append RTA_MULTIPATH attribute: %m");
|
||||
|
||||
if (ordered_set_isempty(route->multipath_routes)) {
|
||||
Route *nr;
|
||||
|
||||
r = route_add_and_setup_timer(link, route, NULL, &nr);
|
||||
if (r < 0)
|
||||
return r;
|
||||
|
||||
if (ret)
|
||||
*ret = nr;
|
||||
k = route_add_and_setup_timer(link, route, NULL, &nr);
|
||||
if (k < 0)
|
||||
return k;
|
||||
} else {
|
||||
MultipathRoute *m;
|
||||
|
||||
|
@ -1180,6 +1177,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 +1189,10 @@ int route_configure(
|
|||
|
||||
link_ref(link);
|
||||
|
||||
return 0;
|
||||
if (ret)
|
||||
*ret = nr;
|
||||
|
||||
return k;
|
||||
}
|
||||
|
||||
static int route_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *link) {
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue