From: Yu Watanabe Date: Sat, 13 Jan 2024 01:33:49 +0000 (+0900) Subject: network/route: reorder setter called in route_set_netlink_message() X-Git-Tag: v256-rc1~1136^2~2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=31b26dee4f3844a7f9db9936d9ed23a2fa4a8c05;p=thirdparty%2Fsystemd.git network/route: reorder setter called in route_set_netlink_message() Also, this renames 'req' -> 'm', and makes the function unconditionally set route type and route metric, and override type later if necessary. Should not change any effective behavior. Just refactoring. --- diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index e57eda01019..6c25043b27d 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -549,73 +549,88 @@ static void log_route_debug(const Route *route, const char *str, const Link *lin strna(proto), strna(scope), strna(route_type_to_string(route->type)), strna(flags)); } -static int route_set_netlink_message(const Route *route, sd_netlink_message *req, Link *link) { +static int route_set_netlink_message(const Route *route, sd_netlink_message *m, Link *link) { int r; assert(route); - assert(req); + assert(m); /* link may be NULL */ + /* rtmsg header (and relevant attributes) */ if (route->dst_prefixlen > 0) { - r = netlink_message_append_in_addr_union(req, RTA_DST, route->family, &route->dst); + r = netlink_message_append_in_addr_union(m, RTA_DST, route->family, &route->dst); if (r < 0) return r; - r = sd_rtnl_message_route_set_dst_prefixlen(req, route->dst_prefixlen); + r = sd_rtnl_message_route_set_dst_prefixlen(m, route->dst_prefixlen); if (r < 0) return r; } if (route->src_prefixlen > 0) { - r = netlink_message_append_in_addr_union(req, RTA_SRC, route->family, &route->src); + r = netlink_message_append_in_addr_union(m, RTA_SRC, route->family, &route->src); if (r < 0) return r; - r = sd_rtnl_message_route_set_src_prefixlen(req, route->src_prefixlen); + r = sd_rtnl_message_route_set_src_prefixlen(m, route->src_prefixlen); if (r < 0) return r; } - if (in_addr_is_set(route->family, &route->prefsrc)) { - r = netlink_message_append_in_addr_union(req, RTA_PREFSRC, route->family, &route->prefsrc); - if (r < 0) - return r; - } + r = sd_rtnl_message_route_set_tos(m, route->tos); + if (r < 0) + return r; - r = sd_rtnl_message_route_set_scope(req, route->scope); + r = sd_rtnl_message_route_set_scope(m, route->scope); if (r < 0) return r; - r = sd_rtnl_message_route_set_flags(req, route->flags & RTNH_F_ONLINK); + r = sd_rtnl_message_route_set_type(m, route->type); if (r < 0) return r; + r = sd_rtnl_message_route_set_flags(m, route->flags & ~RTNH_COMPARE_MASK); + if (r < 0) + return r; + + /* attributes */ + r = sd_netlink_message_append_u32(m, RTA_PRIORITY, route->priority); + if (r < 0) + return r; + + if (in_addr_is_set(route->family, &route->prefsrc)) { + r = netlink_message_append_in_addr_union(m, RTA_PREFSRC, route->family, &route->prefsrc); + if (r < 0) + return r; + } + if (route->table < 256) { - r = sd_rtnl_message_route_set_table(req, route->table); + r = sd_rtnl_message_route_set_table(m, route->table); if (r < 0) return r; } else { - r = sd_rtnl_message_route_set_table(req, RT_TABLE_UNSPEC); + r = sd_rtnl_message_route_set_table(m, RT_TABLE_UNSPEC); if (r < 0) return r; /* Table attribute to allow more than 256. */ - r = sd_netlink_message_append_u32(req, RTA_TABLE, route->table); + r = sd_netlink_message_append_u32(m, RTA_TABLE, route->table); if (r < 0) return r; } - r = sd_netlink_message_append_u8(req, RTA_PREF, route->pref); + r = sd_netlink_message_append_u8(m, RTA_PREF, route->pref); if (r < 0) return r; - r = sd_netlink_message_append_u32(req, RTA_PRIORITY, route->priority); + /* nexthops */ + r = route_nexthops_set_netlink_message(link, route, m); if (r < 0) return r; - /* nexthops */ - r = route_nexthops_set_netlink_message(link, route, req); + /* metrics */ + r = route_metric_set_netlink_message(&route->metric, m); if (r < 0) return r; @@ -640,7 +655,7 @@ static int route_remove_handler(sd_netlink *rtnl, sd_netlink_message *m, Link *l } int route_remove(Route *route) { - _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *req = NULL; + _cleanup_(sd_netlink_message_unrefp) sd_netlink_message *m = NULL; unsigned char type; Manager *manager; Link *link; @@ -655,12 +670,14 @@ int route_remove(Route *route) { log_route_debug(route, "Removing", link, manager); - r = sd_rtnl_message_new_route(manager->rtnl, &req, - RTM_DELROUTE, route->family, - route->protocol); + r = sd_rtnl_message_new_route(manager->rtnl, &m, RTM_DELROUTE, route->family, route->protocol); if (r < 0) return log_link_error_errno(link, r, "Could not create netlink message: %m"); + r = route_set_netlink_message(route, m, link); + if (r < 0) + return log_error_errno(r, "Could not fill netlink message: %m"); + if (route->family == AF_INET && route->nexthop_id > 0 && route->type == RTN_BLACKHOLE) /* When IPv4 route has nexthop id and the nexthop type is blackhole, even though kernel * sends RTM_NEWROUTE netlink message with blackhole type, kernel's internal route type @@ -672,15 +689,11 @@ int route_remove(Route *route) { else type = route->type; - r = sd_rtnl_message_route_set_type(req, type); + r = sd_rtnl_message_route_set_type(m, type); if (r < 0) return log_link_error_errno(link, r, "Could not set route type: %m"); - r = route_set_netlink_message(route, req, link); - if (r < 0) - return log_error_errno(r, "Could not fill netlink message: %m"); - - r = netlink_call_async(manager->rtnl, NULL, req, route_remove_handler, + r = netlink_call_async(manager->rtnl, NULL, m, route_remove_handler, link ? link_netlink_destroy_callback : NULL, link); if (r < 0) return log_link_error_errno(link, r, "Could not send netlink message: %m"); @@ -1011,10 +1024,6 @@ static int route_configure(const Route *route, uint32_t lifetime_sec, Link *link if (r < 0) return r; - r = sd_rtnl_message_route_set_type(m, route->type); - if (r < 0) - return r; - r = route_set_netlink_message(route, m, link); if (r < 0) return r; @@ -1025,11 +1034,6 @@ static int route_configure(const Route *route, uint32_t lifetime_sec, Link *link return r; } - /* metrics */ - r = route_metric_set_netlink_message(&route->metric, m); - if (r < 0) - return r; - return request_call_netlink_async(link->manager->rtnl, m, req); }