summaryrefslogtreecommitdiffstats
path: root/src/network/networkd-route-util.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/network/networkd-route-util.c')
-rw-r--r--src/network/networkd-route-util.c28
1 files changed, 18 insertions, 10 deletions
diff --git a/src/network/networkd-route-util.c b/src/network/networkd-route-util.c
index fde7dfa5d4..b7e07f4662 100644
--- a/src/network/networkd-route-util.c
+++ b/src/network/networkd-route-util.c
@@ -58,8 +58,11 @@ bool link_find_default_gateway(Link *link, int family, Route **gw) {
Route *route;
assert(link);
+ assert(link->manager);
- SET_FOREACH(route, link->routes) {
+ SET_FOREACH(route, link->manager->routes) {
+ if (route->nexthop.ifindex != link->ifindex)
+ continue;
if (!route_exists(route))
continue;
if (family != AF_UNSPEC && route->family != family)
@@ -119,12 +122,7 @@ int manager_find_uplink(Manager *m, int family, Link *exclude, Link **ret) {
if (!gw)
return -ENOENT;
- if (ret) {
- assert(gw->link);
- *ret = gw->link;
- }
-
- return 0;
+ return link_get_by_index(m, gw->nexthop.ifindex, ret);
}
bool gateway_is_ready(Link *link, bool onlink, int family, const union in_addr_union *gw) {
@@ -143,7 +141,9 @@ bool gateway_is_ready(Link *link, bool onlink, int family, const union in_addr_u
if (family == AF_INET6 && in6_addr_is_link_local(&gw->in6))
return true;
- SET_FOREACH(route, link->routes) {
+ SET_FOREACH(route, link->manager->routes) {
+ if (route->nexthop.ifindex != link->ifindex)
+ continue;
if (!route_exists(route))
continue;
if (!route_lifetime_is_valid(route))
@@ -187,10 +187,14 @@ static int link_address_is_reachable_internal(
Route *route, *found = NULL;
assert(link);
+ assert(link->manager);
assert(IN_SET(family, AF_INET, AF_INET6));
assert(address);
- SET_FOREACH(route, link->routes) {
+ SET_FOREACH(route, link->manager->routes) {
+ if (route->nexthop.ifindex != link->ifindex)
+ continue;
+
if (!route_exists(route))
continue;
@@ -304,7 +308,11 @@ int manager_address_is_reachable(
return 0;
}
- r = link_get_address(found->link, found->family, &found->prefsrc, 0, &a);
+ r = link_get_by_index(manager, found->nexthop.ifindex, &link);
+ if (r < 0)
+ return r;
+
+ r = link_get_address(link, found->family, &found->prefsrc, 0, &a);
if (r < 0)
return r;