]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network/routing-policy-rule: introduce a generic conf-parser for [RoutingPolicyRule...
authorYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 24 Aug 2024 20:50:27 +0000 (05:50 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Sat, 24 Aug 2024 21:19:51 +0000 (06:19 +0900)
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].

src/network/networkd-network-gperf.gperf
src/network/networkd-routing-policy-rule.c
src/network/networkd-routing-policy-rule.h

index 64601b8a0b57423e41739b139609d80b52eb1b1a..23a9242fbb43f6368db1f46a2be52781b35afcac 100644 (file)
@@ -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
index 6d6151de5ba1c811b84b3f3501c812376ab44bf0..5f0bcd852dc25de6fc05c056bd432643803b420f 100644 (file)
@@ -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);                \
index cefab3cd79f82e53e8c88bd1566bd1a52001f959..71038b16eccc7aad3fceb90d621b6e1e6978b4cf 100644 (file)
@@ -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);