diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-05-07 04:37:58 +0900 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2021-05-12 10:39:12 +0900 |
commit | d94e8ba02193a2739d3ed8f7df293384b16a98c3 (patch) | |
tree | 3a55a2dd00bc2dcdad23b6b492472b20df2e4f61 | |
parent | 884a63d76e43dadf86ab10d08826a15298885829 (diff) | |
download | systemd-d94e8ba02193a2739d3ed8f7df293384b16a98c3.tar.gz |
network: introduce manager_address_is_reachable()
The function will be used in later commits.
-rw-r--r-- | src/network/networkd-route.c | 40 | ||||
-rw-r--r-- | src/network/networkd-route.h | 1 |
2 files changed, 41 insertions, 0 deletions
diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 2c19bf5c83..e1dd93775f 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -665,6 +665,46 @@ int link_has_route(Link *link, const Route *route) { return true; } +static bool route_address_is_reachable(const Route *route, int family, const union in_addr_union *address) { + assert(route); + assert(IN_SET(family, AF_INET, AF_INET6)); + assert(address); + + if (route->family != family) + return false; + + if (!in_addr_is_set(route->family, &route->dst)) + return false; + + return in_addr_prefix_intersect( + route->family, + &route->dst, + route->dst_prefixlen, + address, + FAMILY_ADDRESS_SIZE(family) * 8) > 0; +} + +bool manager_address_is_reachable(Manager *manager, int family, const union in_addr_union *address) { + Link *link; + + assert(manager); + assert(IN_SET(family, AF_INET, AF_INET6)); + assert(address); + + HASHMAP_FOREACH(link, manager->links) { + Route *route; + + SET_FOREACH(route, link->routes) + if (route_address_is_reachable(route, family, address)) + return true; + SET_FOREACH(route, link->routes_foreign) + if (route_address_is_reachable(route, family, address)) + return true; + } + + return false; +} + static void log_route_debug(const Route *route, const char *str, const Link *link, const Manager *m) { _cleanup_free_ char *dst = NULL, *src = NULL, *gw = NULL, *prefsrc = NULL, *table = NULL, *scope = NULL, *proto = NULL; diff --git a/src/network/networkd-route.h b/src/network/networkd-route.h index 08a90c5743..1ad5a1b993 100644 --- a/src/network/networkd-route.h +++ b/src/network/networkd-route.h @@ -76,6 +76,7 @@ int route_configure(const Route *route, Link *link, link_netlink_message_handler int route_remove(const Route *route, Manager *manager, Link *link, link_netlink_message_handler_t callback); int link_has_route(Link *link, const Route *route); +bool manager_address_is_reachable(Manager *manager, int family, const union in_addr_union *address); int link_set_routes(Link *link); int link_set_routes_with_gateway(Link *link); |