From: Yu Watanabe Date: Sat, 24 Aug 2024 20:50:27 +0000 (+0900) Subject: network/routing-policy-rule: introduce a generic conf-parser for [RoutingPolicyRule... X-Git-Tag: v257-rc1~629^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7f66a94ecfe5e7828ab193134f75d7d93f257f71;p=thirdparty%2Fsystemd.git network/routing-policy-rule: introduce a generic conf-parser for [RoutingPolicyRule] sectin This introduce config_parse_routing_policy_rule(), which wraps existing conf parsers. With this, we can drop many custom conf parsers for [RoutingPolicyRule], and can reuse generic conf parsers in conf-parser.[ch]. --- diff --git a/src/network/networkd-network-gperf.gperf b/src/network/networkd-network-gperf.gperf index 64601b8a0b5..23a9242fbb4 100644 --- a/src/network/networkd-network-gperf.gperf +++ b/src/network/networkd-network-gperf.gperf @@ -176,21 +176,21 @@ IPv6AddressLabel.Label, config_parse_address_label, Neighbor.Address, config_parse_neighbor_address, 0, 0 Neighbor.LinkLayerAddress, config_parse_neighbor_lladdr, 0, 0 Neighbor.MACAddress, config_parse_neighbor_lladdr, 0, 0 /* deprecated */ -RoutingPolicyRule.TypeOfService, config_parse_routing_policy_rule_tos, 0, 0 +RoutingPolicyRule.TypeOfService, config_parse_routing_policy_rule, ROUTING_POLICY_RULE_TOS, 0 RoutingPolicyRule.Priority, config_parse_routing_policy_rule_priority, 0, 0 RoutingPolicyRule.GoTo, config_parse_routing_policy_rule_goto, 0, 0 RoutingPolicyRule.Table, config_parse_routing_policy_rule_table, 0, 0 RoutingPolicyRule.FirewallMark, config_parse_routing_policy_rule_fwmark_mask, 0, 0 RoutingPolicyRule.From, config_parse_routing_policy_rule_prefix, 0, 0 RoutingPolicyRule.To, config_parse_routing_policy_rule_prefix, 0, 0 -RoutingPolicyRule.IncomingInterface, config_parse_routing_policy_rule_device, 0, 0 -RoutingPolicyRule.OutgoingInterface, config_parse_routing_policy_rule_device, 0, 0 -RoutingPolicyRule.IPProtocol, config_parse_routing_policy_rule_ip_protocol, 0, 0 +RoutingPolicyRule.IncomingInterface, config_parse_routing_policy_rule, ROUTING_POLICY_RULE_IIF, 0 +RoutingPolicyRule.OutgoingInterface, config_parse_routing_policy_rule, ROUTING_POLICY_RULE_OIF, 0 +RoutingPolicyRule.IPProtocol, config_parse_routing_policy_rule, ROUTING_POLICY_RULE_IP_PROTOCOL, 0 RoutingPolicyRule.SourcePort, config_parse_routing_policy_rule_port_range, 0, 0 RoutingPolicyRule.DestinationPort, config_parse_routing_policy_rule_port_range, 0, 0 -RoutingPolicyRule.InvertRule, config_parse_routing_policy_rule_invert, 0, 0 -RoutingPolicyRule.L3MasterDevice, config_parse_routing_policy_rule_l3mdev, 0, 0 -RoutingPolicyRule.Family, config_parse_routing_policy_rule_family, 0, 0 +RoutingPolicyRule.InvertRule, config_parse_routing_policy_rule, ROUTING_POLICY_RULE_INVERT, 0 +RoutingPolicyRule.L3MasterDevice, config_parse_routing_policy_rule, ROUTING_POLICY_RULE_L3MDEV, 0 +RoutingPolicyRule.Family, config_parse_routing_policy_rule, ROUTING_POLICY_RULE_FAMILY, 0 RoutingPolicyRule.User, config_parse_routing_policy_rule_uid_range, 0, 0 RoutingPolicyRule.SuppressInterfaceGroup, config_parse_routing_policy_rule_suppress, INT32_MAX, 0 RoutingPolicyRule.SuppressPrefixLength, config_parse_routing_policy_rule_suppress, 128, 0 diff --git a/src/network/networkd-routing-policy-rule.c b/src/network/networkd-routing-policy-rule.c index 6d6151de5ba..5f0bcd852dc 100644 --- a/src/network/networkd-routing-policy-rule.c +++ b/src/network/networkd-routing-policy-rule.c @@ -1349,42 +1349,6 @@ static int parse_fwmark_fwmask(const char *s, uint32_t *ret_fwmark, uint32_t *re return 0; } -int config_parse_routing_policy_rule_tos( - 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) { - - _cleanup_(routing_policy_rule_unref_or_set_invalidp) RoutingPolicyRule *rule = NULL; - Network *network = userdata; - int r; - - assert(filename); - assert(section); - assert(lvalue); - assert(rvalue); - assert(data); - - r = routing_policy_rule_new_static(network, filename, section_line, &rule); - if (r < 0) - return log_oom(); - - r = safe_atou8(rvalue, &rule->tos); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to parse RPDB rule TOS, ignoring: %s", rvalue); - return 0; - } - - TAKE_PTR(rule); - return 0; -} - int config_parse_routing_policy_rule_priority( const char *unit, const char *filename, @@ -1591,46 +1555,6 @@ int config_parse_routing_policy_rule_prefix( return 1; } -int config_parse_routing_policy_rule_device( - 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) { - - _cleanup_(routing_policy_rule_unref_or_set_invalidp) RoutingPolicyRule *rule = NULL; - Network *network = userdata; - int r; - - assert(filename); - assert(section); - assert(lvalue); - assert(rvalue); - assert(data); - - r = routing_policy_rule_new_static(network, filename, section_line, &rule); - if (r < 0) - return log_oom(); - - if (!ifname_valid(rvalue)) { - log_syntax(unit, LOG_WARNING, filename, line, 0, - "Invalid interface name '%s' in %s=, ignoring assignment.", rvalue, lvalue); - return 0; - } - - r = free_and_strdup(streq(lvalue, "IncomingInterface") ? &rule->iif : &rule->oif, rvalue); - if (r < 0) - return log_oom(); - - TAKE_PTR(rule); - return 0; -} - int config_parse_routing_policy_rule_port_range( const char *unit, const char *filename, @@ -1672,160 +1596,6 @@ int config_parse_routing_policy_rule_port_range( return 1; } -int config_parse_routing_policy_rule_ip_protocol( - 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) { - - _cleanup_(routing_policy_rule_unref_or_set_invalidp) RoutingPolicyRule *rule = NULL; - Network *network = userdata; - int r; - - assert(filename); - assert(section); - assert(lvalue); - assert(rvalue); - assert(data); - - r = routing_policy_rule_new_static(network, filename, section_line, &rule); - if (r < 0) - return log_oom(); - - r = parse_ip_protocol(rvalue); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to parse IP protocol '%s' for routing policy rule, ignoring: %m", rvalue); - return 0; - } - - rule->ipproto = r; - - TAKE_PTR(rule); - return 0; -} - -int config_parse_routing_policy_rule_invert( - 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) { - - _cleanup_(routing_policy_rule_unref_or_set_invalidp) RoutingPolicyRule *rule = NULL; - Network *network = userdata; - int r; - - assert(filename); - assert(section); - assert(lvalue); - assert(rvalue); - assert(data); - - r = routing_policy_rule_new_static(network, filename, section_line, &rule); - if (r < 0) - return log_oom(); - - r = parse_boolean(rvalue); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to parse RPDB rule invert, ignoring: %s", rvalue); - return 0; - } - - SET_FLAG(rule->flags, FIB_RULE_INVERT, r); - - TAKE_PTR(rule); - return 0; -} - -int config_parse_routing_policy_rule_l3mdev( - 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) { - - _cleanup_(routing_policy_rule_unref_or_set_invalidp) RoutingPolicyRule *rule = NULL; - Network *network = userdata; - int r; - - assert(filename); - assert(section); - assert(lvalue); - assert(rvalue); - assert(data); - - r = routing_policy_rule_new_static(network, filename, section_line, &rule); - if (r < 0) - return log_oom(); - - r = parse_boolean(rvalue); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to parse RPDB rule l3mdev, ignoring: %s", rvalue); - return 0; - } - - rule->l3mdev = r; - - TAKE_PTR(rule); - return 0; -} - -int config_parse_routing_policy_rule_family( - 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) { - - _cleanup_(routing_policy_rule_unref_or_set_invalidp) RoutingPolicyRule *rule = NULL; - Network *network = userdata; - AddressFamily a; - int r; - - assert(filename); - assert(section); - assert(lvalue); - assert(rvalue); - assert(data); - - r = routing_policy_rule_new_static(network, filename, section_line, &rule); - if (r < 0) - return log_oom(); - - a = routing_policy_rule_address_family_from_string(rvalue); - if (a < 0) { - log_syntax(unit, LOG_WARNING, filename, line, a, - "Invalid address family '%s', ignoring.", rvalue); - return 0; - } - - rule->address_family = a; - - TAKE_PTR(rule); - return 0; -} - int config_parse_routing_policy_rule_uid_range( const char *unit, const char *filename, @@ -1962,6 +1732,66 @@ int config_parse_routing_policy_rule_type( return 0; } +static DEFINE_CONFIG_PARSE_ENUM_WITH_DEFAULT( + config_parse_routing_policy_rule_family, + routing_policy_rule_address_family, + AddressFamily, + ADDRESS_FAMILY_NO, + "Invalid family"); + +typedef struct RoutingPolicyRuleConfParser { + ConfigParserCallback parser; + int ltype; + size_t offset; +} RoutingPolicyRuleConfParser; + +static RoutingPolicyRuleConfParser routing_policy_rule_conf_parser_table[_ROUTING_POLICY_RULE_CONF_PARSER_MAX] = { + [ROUTING_POLICY_RULE_IIF] = { .parser = config_parse_ifname, .ltype = 0, .offset = offsetof(RoutingPolicyRule, iif), }, + [ROUTING_POLICY_RULE_OIF] = { .parser = config_parse_ifname, .ltype = 0, .offset = offsetof(RoutingPolicyRule, oif), }, + [ROUTING_POLICY_RULE_FAMILY] = { .parser = config_parse_routing_policy_rule_family, .ltype = 0, .offset = offsetof(RoutingPolicyRule, address_family), }, + [ROUTING_POLICY_RULE_INVERT] = { .parser = config_parse_uint32_flag, .ltype = FIB_RULE_INVERT, .offset = offsetof(RoutingPolicyRule, flags), }, + [ROUTING_POLICY_RULE_IP_PROTOCOL] = { .parser = config_parse_ip_protocol, .ltype = 0, .offset = offsetof(RoutingPolicyRule, ipproto), }, + [ROUTING_POLICY_RULE_L3MDEV] = { .parser = config_parse_bool, .ltype = 0, .offset = offsetof(RoutingPolicyRule, l3mdev), }, + [ROUTING_POLICY_RULE_TOS] = { .parser = config_parse_uint8, .ltype = 0, .offset = offsetof(RoutingPolicyRule, tos), }, +}; + +int config_parse_routing_policy_rule( + 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) { + + _cleanup_(routing_policy_rule_unref_or_set_invalidp) RoutingPolicyRule *rule = NULL; + Network *network = ASSERT_PTR(userdata); + int r; + + assert(filename); + assert(ltype >= 0); + assert(ltype < _ROUTING_POLICY_RULE_CONF_PARSER_MAX); + + r = routing_policy_rule_new_static(network, filename, section_line, &rule); + if (r < 0) + return log_oom(); + + RoutingPolicyRuleConfParser *e = routing_policy_rule_conf_parser_table + ltype; + assert(e->parser); + assert(e->offset < sizeof(RoutingPolicyRule)); + + r = e->parser(unit, filename, line, section, section_line, lvalue, e->ltype, rvalue, + (uint8_t*) rule + e->offset, rule); + if (r <= 0) /* 0 means non-critical error, but the section will be ignored. */ + return r; + + TAKE_PTR(rule); + return 0; +} + #define log_rule_section(rule, fmt, ...) \ ({ \ const RoutingPolicyRule *_rule = (rule); \ diff --git a/src/network/networkd-routing-policy-rule.h b/src/network/networkd-routing-policy-rule.h index cefab3cd79f..71038b16ecc 100644 --- a/src/network/networkd-routing-policy-rule.h +++ b/src/network/networkd-routing-policy-rule.h @@ -77,18 +77,25 @@ void link_foreignize_routing_policy_rules(Link *link); DEFINE_NETWORK_CONFIG_STATE_FUNCTIONS(RoutingPolicyRule, routing_policy_rule); -CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_device); -CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_family); +typedef enum RoutingPolicyRuleConfParserType { + ROUTING_POLICY_RULE_IIF, + ROUTING_POLICY_RULE_OIF, + ROUTING_POLICY_RULE_FAMILY, + ROUTING_POLICY_RULE_INVERT, + ROUTING_POLICY_RULE_IP_PROTOCOL, + ROUTING_POLICY_RULE_L3MDEV, + ROUTING_POLICY_RULE_TOS, + _ROUTING_POLICY_RULE_CONF_PARSER_MAX, + _ROUTING_POLICY_RULE_CONF_PARSER_INVALID = -EINVAL, +} RoutingPolicyRuleConfParserType; + +CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule); CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_fwmark_mask); CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_goto); -CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_invert); -CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_ip_protocol); -CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_l3mdev); CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_port_range); CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_prefix); CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_priority); CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_suppress); CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_table); -CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_tos); CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_type); CONFIG_PARSER_PROTOTYPE(config_parse_routing_policy_rule_uid_range);