summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYu Watanabe <watanabe.yu+github@gmail.com>2021-05-07 04:37:58 +0900
committerYu Watanabe <watanabe.yu+github@gmail.com>2021-05-12 10:39:12 +0900
commitd94e8ba02193a2739d3ed8f7df293384b16a98c3 (patch)
tree3a55a2dd00bc2dcdad23b6b492472b20df2e4f61
parent884a63d76e43dadf86ab10d08826a15298885829 (diff)
downloadsystemd-d94e8ba02193a2739d3ed8f7df293384b16a98c3.tar.gz
network: introduce manager_address_is_reachable()
The function will be used in later commits.
-rw-r--r--src/network/networkd-route.c40
-rw-r--r--src/network/networkd-route.h1
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);