network/route: introduce route_get_link() and use it in log_route_debug()
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 13 Jan 2024 06:39:06 +0000 (15:39 +0900)
committerLuca Boccassi <luca.boccassi@gmail.com>
Tue, 16 Jan 2024 12:35:58 +0000 (12:35 +0000)
No functional change, just refactoring and preparation for later
commits.

src/network/networkd-route.c

index ed40af3ac68653e5ea0d54a51317f14e7415b3d1..48b8af2f06054e61c42e7a3c544a2207b43fadcf 100644 (file)
@@ -293,6 +293,25 @@ int route_get(Manager *manager, Link *link, const Route *in, Route **ret) {
         return 0;
 }
 
+static int route_get_link(Manager *manager, const Route *route, Link **ret) {
+        int r;
+
+        assert(manager);
+        assert(route);
+
+        if (route->nexthop_id != 0) {
+                NextHop *nh;
+
+                r = nexthop_get_by_id(manager, route->nexthop_id, &nh);
+                if (r < 0)
+                        return r;
+
+                return link_get_by_index(manager, nh->ifindex, ret);
+        }
+
+        return route_nexthop_get_link(manager, NULL, &route->nexthop, ret);
+}
+
 int route_dup(const Route *src, Route **ret) {
         _cleanup_(route_freep) Route *dest = NULL;
         int r;
@@ -510,20 +529,21 @@ void link_mark_routes(Link *link, NetworkConfigSource source) {
         }
 }
 
-static void log_route_debug(const Route *route, const char *str, const Link *link, const Manager *manager) {
+static void log_route_debug(const Route *route, const char *str, Manager *manager) {
         _cleanup_free_ char *state = NULL, *nexthop = NULL, *prefsrc = NULL,
                 *table = NULL, *scope = NULL, *proto = NULL, *flags = NULL;
         const char *dst, *src;
+        Link *link = NULL;
 
         assert(route);
         assert(str);
         assert(manager);
 
-        /* link may be NULL. */
-
         if (!DEBUG_LOGGING)
                 return;
 
+        (void) route_get_link(manager, route, &link);
+
         (void) network_config_state_to_string_alloc(route->state, &state);
 
         dst = in_addr_is_set(route->family, &route->dst) || route->dst_prefixlen > 0 ?
@@ -654,7 +674,7 @@ int route_remove(Route *route) {
         link = route->link;
         manager = route->manager ?: link->manager;
 
-        log_route_debug(route, "Removing", link, manager);
+        log_route_debug(route, "Removing", manager);
 
         r = sd_rtnl_message_new_route(manager->rtnl, &req,
                                       RTM_DELROUTE, route->family,
@@ -961,7 +981,7 @@ static int route_setup_timer(Route *route, const struct rta_cacheinfo *cacheinfo
         if (r < 0)
                 return log_link_warning_errno(route->link, r, "Failed to configure expiration timer for route, ignoring: %m");
 
-        log_route_debug(route, "Configured expiration timer for", route->link, manager);
+        log_route_debug(route, "Configured expiration timer for", manager);
         return 1;
 }
 
@@ -999,14 +1019,11 @@ static int route_configure(const Route *route, uint32_t lifetime_sec, Link *link
         int r;
 
         assert(route);
-        assert(IN_SET(route->family, AF_INET, AF_INET6));
         assert(link);
         assert(link->manager);
-        assert(link->manager->rtnl);
-        assert(link->ifindex > 0);
         assert(req);
 
-        log_route_debug(route, "Configuring", link, link->manager);
+        log_route_debug(route, "Configuring", link->manager);
 
         r = sd_rtnl_message_new_route(link->manager->rtnl, &m, RTM_NEWROUTE, route->family, route->protocol);
         if (r < 0)
@@ -1188,7 +1205,7 @@ int link_request_route(
                         route_free(route);
         }
 
-        log_route_debug(existing, "Requesting", link, link->manager);
+        log_route_debug(existing, "Requesting", link->manager);
         r = link_queue_request_safe(link, REQUEST_TYPE_ROUTE,
                                     existing, NULL,
                                     route_hash_func,
@@ -1229,7 +1246,7 @@ static int link_request_static_route(Link *link, Route *route) {
                 return link_request_route(link, route, false, &link->static_route_messages,
                                           static_route_handler, NULL);
 
-        log_route_debug(route, "Requesting", link, link->manager);
+        log_route_debug(route, "Requesting", link->manager);
         return link_queue_request_safe(link, REQUEST_TYPE_ROUTE,
                                        route, NULL, route_hash_func, route_compare_func,
                                        route_process_request,
@@ -1350,7 +1367,7 @@ static int process_route_one(
                 if (!route) {
                         if (!manager->manage_foreign_routes) {
                                 route_enter_configured(tmp);
-                                log_route_debug(tmp, "Ignoring received", link, manager);
+                                log_route_debug(tmp, "Ignoring received", manager);
                                 return 0;
                         }
 
@@ -1369,7 +1386,7 @@ static int process_route_one(
                         route->flags = tmp->flags;
 
                 route_enter_configured(route);
-                log_route_debug(route, is_new ? "Received new" : "Received remembered", link, manager);
+                log_route_debug(route, is_new ? "Received new" : "Received remembered", manager);
 
                 (void) route_setup_timer(route, cacheinfo);
 
@@ -1379,14 +1396,14 @@ static int process_route_one(
                 if (route) {
                         route_enter_removed(route);
                         if (route->state == 0) {
-                                log_route_debug(route, "Forgetting", link, manager);
+                                log_route_debug(route, "Forgetting", manager);
                                 route_free(route);
                         } else
-                                log_route_debug(route, "Removed", link, manager);
+                                log_route_debug(route, "Removed", manager);
                 } else
                         log_route_debug(tmp,
                                         manager->manage_foreign_routes ? "Kernel removed unknown" : "Ignoring received",
-                                        link, manager);
+                                        manager);
 
                 break;