]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network: introduce manager_address_is_reachable()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Thu, 6 May 2021 19:37:58 +0000 (04:37 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 12 May 2021 01:39:12 +0000 (10:39 +0900)
The function will be used in later commits.

src/network/networkd-route.c
src/network/networkd-route.h

index 2c19bf5c83faa4cf9bdfde6e1de7237574405e6f..e1dd93775f4164d6485b1284f91152d4b6708b31 100644 (file)
@@ -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;
index 08a90c57436d6ac572659096c35062bb1d71c1a8..1ad5a1b9935a4aa7216f963a2b2c3d45bfa75cba 100644 (file)
@@ -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);