From cf305c8458cae4b1abd647fa9c4a38390a26ab5b Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Mon, 23 Sep 2024 04:09:33 +0900 Subject: [PATCH] network/route-metric: merge conf parsers for route metric This introduces a generic [Route] section parser, then embed conf parsers for route metric into it. --- src/network/networkd-network-gperf.gperf | 18 ++-- src/network/networkd-route-metric.c | 116 +++++++---------------- src/network/networkd-route-metric.h | 8 +- src/network/networkd-route.c | 48 ++++++++++ src/network/networkd-route.h | 15 +++ 5 files changed, 105 insertions(+), 100 deletions(-) diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 26b22ffd9e9..a25370d85cd 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -209,15 +209,15 @@ Route.Protocol, config_parse_route_protocol, Route.Type, config_parse_route_type, 0, 0 Route.MultiPathRoute, config_parse_multipath_route, 0, 0 Route.NextHop, config_parse_route_nexthop, 0, 0 -Route.MTUBytes, config_parse_route_metric_mtu, RTAX_MTU, 0 -Route.TCPAdvertisedMaximumSegmentSize, config_parse_route_metric_advmss, RTAX_ADVMSS, 0 -Route.HopLimit, config_parse_route_metric_hop_limit, RTAX_HOPLIMIT, 0 -Route.InitialCongestionWindow, config_parse_route_metric_tcp_window, RTAX_INITCWND, 0 -Route.TCPRetransmissionTimeoutSec, config_parse_route_metric_tcp_rto, RTAX_RTO_MIN, 0 -Route.InitialAdvertisedReceiveWindow, config_parse_route_metric_tcp_window, RTAX_INITRWND, 0 -Route.QuickAck, config_parse_route_metric_boolean, RTAX_QUICKACK, 0 -Route.TCPCongestionControlAlgorithm, config_parse_route_metric_tcp_congestion, RTAX_CC_ALGO, 0 -Route.FastOpenNoCookie, config_parse_route_metric_boolean, RTAX_FASTOPEN_NO_COOKIE, 0 +Route.MTUBytes, config_parse_route_section, ROUTE_METRIC_MTU, 0 +Route.TCPAdvertisedMaximumSegmentSize, config_parse_route_section, ROUTE_METRIC_ADVMSS, 0 +Route.HopLimit, config_parse_route_section, ROUTE_METRIC_HOPLIMIT, 0 +Route.InitialCongestionWindow, config_parse_route_section, ROUTE_METRIC_INITCWND, 0 +Route.TCPRetransmissionTimeoutSec, config_parse_route_section, ROUTE_METRIC_RTO_MIN, 0 +Route.InitialAdvertisedReceiveWindow, config_parse_route_section, ROUTE_METRIC_INITRWND, 0 +Route.QuickAck, config_parse_route_section, ROUTE_METRIC_QUICKACK, 0 +Route.TCPCongestionControlAlgorithm, config_parse_route_section, ROUTE_METRIC_CC_ALGO, 0 +Route.FastOpenNoCookie, config_parse_route_section, ROUTE_METRIC_FASTOPEN_NO_COOKIE, 0 Route.TTLPropagate, config_parse_warn_compat, DISABLED_LEGACY, 0 NextHop.Id, config_parse_nexthop_section, NEXTHOP_ID, 0 NextHop.Gateway, config_parse_nexthop_section, NEXTHOP_GATEWAY, 0 diff --git a/src/network/networkd-route-metric.c b/src/network/networkd-route-metric.c index 39afb35b200..409e403ff14 100644 --- a/src/network/networkd-route-metric.c +++ b/src/network/networkd-route-metric.c @@ -217,7 +217,7 @@ int route_metric_read_netlink_message(RouteMetric *metric, sd_netlink_message *m return 0; } -static int config_parse_route_metric_advmss_impl( +static int config_parse_route_metric_advmss( const char *unit, const char *filename, unsigned line, @@ -249,7 +249,7 @@ static int config_parse_route_metric_advmss_impl( return 1; } -static int config_parse_route_metric_hop_limit_impl( +static int config_parse_route_metric_hop_limit( const char *unit, const char *filename, unsigned line, @@ -311,7 +311,7 @@ int config_parse_tcp_window( return 1; } -static int config_parse_route_metric_tcp_rto_impl( +static int config_parse_route_metric_tcp_rto( const char *unit, const char *filename, unsigned line, @@ -344,7 +344,7 @@ static int config_parse_route_metric_tcp_rto_impl( return 1; } -static int config_parse_route_metric_boolean_impl( +static int config_parse_route_metric_boolean( const char *unit, const char *filename, unsigned line, @@ -369,70 +369,7 @@ static int config_parse_route_metric_boolean_impl( return 1; } -#define DEFINE_CONFIG_PARSE_ROUTE_METRIC(name, parser) \ - int config_parse_route_metric_##name( \ - const char *unit, \ - const char *filename, \ - unsigned line, \ - const char *section, \ - unsigned section_line, \ - const char *lvalue, \ - int ltype, \ - const char *rvalue, \ - void *data, \ - void *userdata) { \ - \ - Network *network = ASSERT_PTR(userdata); \ - _cleanup_(route_unref_or_set_invalidp) Route *route = NULL; \ - uint16_t attr_type = ltype; \ - int r; \ - \ - assert(filename); \ - assert(section); \ - assert(lvalue); \ - assert(rvalue); \ - \ - r = route_new_static(network, filename, section_line, &route); \ - if (r == -ENOMEM) \ - return log_oom(); \ - if (r < 0) { \ - log_syntax(unit, LOG_WARNING, filename, line, r, \ - "Failed to allocate route, ignoring assignment: %m"); \ - return 0; \ - } \ - \ - if (isempty(rvalue)) { \ - route_metric_unset(&route->metric, attr_type); \ - TAKE_PTR(route); \ - return 0; \ - } \ - \ - uint32_t k; \ - r = parser(unit, filename, line, section, section_line, \ - lvalue, /* ltype = */ 0, rvalue, \ - &k, userdata); \ - if (r <= 0) \ - return r; \ - \ - if (route_metric_set_full( \ - &route->metric, \ - attr_type, \ - k, \ - /* force = */ true) < 0) \ - return log_oom(); \ - \ - TAKE_PTR(route); \ - return 0; \ - } - -DEFINE_CONFIG_PARSE_ROUTE_METRIC(mtu, config_parse_mtu); -DEFINE_CONFIG_PARSE_ROUTE_METRIC(advmss, config_parse_route_metric_advmss_impl); -DEFINE_CONFIG_PARSE_ROUTE_METRIC(hop_limit, config_parse_route_metric_hop_limit_impl); -DEFINE_CONFIG_PARSE_ROUTE_METRIC(tcp_window, config_parse_tcp_window); -DEFINE_CONFIG_PARSE_ROUTE_METRIC(tcp_rto, config_parse_route_metric_tcp_rto_impl); -DEFINE_CONFIG_PARSE_ROUTE_METRIC(boolean, config_parse_route_metric_boolean_impl); - -int config_parse_route_metric_tcp_congestion( +int config_parse_route_metric( const char *unit, const char *filename, unsigned line, @@ -444,27 +381,38 @@ int config_parse_route_metric_tcp_congestion( void *data, void *userdata) { - Network *network = ASSERT_PTR(userdata); - _cleanup_(route_unref_or_set_invalidp) Route *route = NULL; + static const ConfigSectionParser table[__RTAX_MAX] = { + [RTAX_MTU] = { .parser = config_parse_mtu, .ltype = 0, .offset = 0, }, + [RTAX_ADVMSS] = { .parser = config_parse_route_metric_advmss, .ltype = 0, .offset = 0, }, + [RTAX_HOPLIMIT] = { .parser = config_parse_route_metric_hop_limit, .ltype = 0, .offset = 0, }, + [RTAX_INITCWND] = { .parser = config_parse_tcp_window, .ltype = 0, .offset = 0, }, + [RTAX_RTO_MIN] = { .parser = config_parse_route_metric_tcp_rto, .ltype = 0, .offset = 0, }, + [RTAX_INITRWND] = { .parser = config_parse_tcp_window, .ltype = 0, .offset = 0, }, + [RTAX_QUICKACK] = { .parser = config_parse_route_metric_boolean, .ltype = 0, .offset = 0, }, + [RTAX_FASTOPEN_NO_COOKIE] = { .parser = config_parse_route_metric_boolean, .ltype = 0, .offset = 0, }, + }; + + Route *route = ASSERT_PTR(userdata); int r; - assert(filename); - assert(rvalue); - - r = route_new_static(network, filename, section_line, &route); - if (r == -ENOMEM) - return log_oom(); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, - "Failed to allocate route, ignoring assignment: %m"); - return 0; + if (isempty(rvalue)) { + route_metric_unset(&route->metric, ltype); + TAKE_PTR(route); + return 1; } - r = config_parse_string(unit, filename, line, section, section_line, lvalue, 0, - rvalue, &route->metric.tcp_congestion_control_algo, userdata); + uint32_t k; + r = config_section_parse(table, ELEMENTSOF(table), + unit, filename, line, section, section_line, lvalue, ltype, rvalue, &k); if (r <= 0) return r; - TAKE_PTR(route); - return 0; + if (route_metric_set_full( + &route->metric, + ltype, + k, + /* force = */ true) < 0) + return log_oom(); + + return 1; } diff --git a/src/network/networkd-route-metric.h b/src/network/networkd-route-metric.h index 212f9079cba..c85eef58b34 100644 --- a/src/network/networkd-route-metric.h +++ b/src/network/networkd-route-metric.h @@ -37,11 +37,5 @@ uint32_t route_metric_get(const RouteMetric *metric, uint16_t attr); int route_metric_set_netlink_message(const RouteMetric *metric, sd_netlink_message *m); int route_metric_read_netlink_message(RouteMetric *metric, sd_netlink_message *message); -CONFIG_PARSER_PROTOTYPE(config_parse_route_metric_mtu); -CONFIG_PARSER_PROTOTYPE(config_parse_route_metric_advmss); -CONFIG_PARSER_PROTOTYPE(config_parse_route_metric_hop_limit); -CONFIG_PARSER_PROTOTYPE(config_parse_route_metric_tcp_window); -CONFIG_PARSER_PROTOTYPE(config_parse_route_metric_tcp_rto); -CONFIG_PARSER_PROTOTYPE(config_parse_route_metric_boolean); -CONFIG_PARSER_PROTOTYPE(config_parse_route_metric_tcp_congestion); +CONFIG_PARSER_PROTOTYPE(config_parse_route_metric); CONFIG_PARSER_PROTOTYPE(config_parse_tcp_window); diff --git a/src/network/networkd-route.c b/src/network/networkd-route.c index 859a3cf4cd8..29627683917 100644 --- a/src/network/networkd-route.c +++ b/src/network/networkd-route.c @@ -1977,6 +1977,54 @@ int config_parse_route_type( return 0; } +int config_parse_route_section( + const char *unit, + const char *filename, + unsigned line, + const char *section, + unsigned section_line, + const char *lvalue, + int ltype, + const char *rvalue, + void *data, + void *userdata) { + + static const ConfigSectionParser table[_ROUTE_CONF_PARSER_MAX] = { + [ROUTE_METRIC_MTU] = { .parser = config_parse_route_metric, .ltype = RTAX_MTU, .offset = 0, }, + [ROUTE_METRIC_ADVMSS] = { .parser = config_parse_route_metric, .ltype = RTAX_ADVMSS, .offset = 0, }, + [ROUTE_METRIC_HOPLIMIT] = { .parser = config_parse_route_metric, .ltype = RTAX_HOPLIMIT, .offset = 0, }, + [ROUTE_METRIC_INITCWND] = { .parser = config_parse_route_metric, .ltype = RTAX_INITCWND, .offset = 0, }, + [ROUTE_METRIC_RTO_MIN] = { .parser = config_parse_route_metric, .ltype = RTAX_RTO_MIN, .offset = 0, }, + [ROUTE_METRIC_INITRWND] = { .parser = config_parse_route_metric, .ltype = RTAX_INITRWND, .offset = 0, }, + [ROUTE_METRIC_QUICKACK] = { .parser = config_parse_route_metric, .ltype = RTAX_QUICKACK, .offset = 0, }, + [ROUTE_METRIC_CC_ALGO] = { .parser = config_parse_string, .ltype = 0, .offset = offsetof(Route, metric.tcp_congestion_control_algo), }, + [ROUTE_METRIC_FASTOPEN_NO_COOKIE] = { .parser = config_parse_route_metric, .ltype = RTAX_FASTOPEN_NO_COOKIE, .offset = 0, }, + }; + + _cleanup_(route_unref_or_set_invalidp) Route *route = NULL; + Network *network = ASSERT_PTR(userdata); + int r; + + assert(filename); + + r = route_new_static(network, filename, section_line, &route); + if (r == -ENOMEM) + return log_oom(); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Failed to allocate route, ignoring assignment: %m"); + return 0; + } + + r = config_section_parse(table, ELEMENTSOF(table), + unit, filename, line, section, section_line, lvalue, ltype, rvalue, route); + if (r <= 0) + return r; + + TAKE_PTR(route); + return 0; +} + int route_section_verify(Route *route) { int r; diff --git a/src/network/networkd-route.h b/src/network/networkd-route.h index 744cad2f1a5..a4638db01f0 100644 --- a/src/network/networkd-route.h +++ b/src/network/networkd-route.h @@ -126,6 +126,21 @@ int route_section_verify(Route *route); DEFINE_NETWORK_CONFIG_STATE_FUNCTIONS(Route, route); void manager_mark_routes(Manager *manager, Link *link, NetworkConfigSource source); +typedef enum RouteConfParserType { + ROUTE_METRIC_MTU, + ROUTE_METRIC_ADVMSS, + ROUTE_METRIC_HOPLIMIT, + ROUTE_METRIC_INITCWND, + ROUTE_METRIC_RTO_MIN, + ROUTE_METRIC_INITRWND, + ROUTE_METRIC_QUICKACK, + ROUTE_METRIC_CC_ALGO, + ROUTE_METRIC_FASTOPEN_NO_COOKIE, + _ROUTE_CONF_PARSER_MAX, + _ROUTE_CONF_PARSER_INVALID = -EINVAL, +} RouteConfParserType; + +CONFIG_PARSER_PROTOTYPE(config_parse_route_section); CONFIG_PARSER_PROTOTYPE(config_parse_preferred_src); CONFIG_PARSER_PROTOTYPE(config_parse_destination); CONFIG_PARSER_PROTOTYPE(config_parse_route_priority); -- 2.47.3