]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
network/address-label: introduce generic conf parser for [IPv6AddressLabel] section
authorYu Watanabe <watanabe.yu+github@gmail.com>
Wed, 28 Aug 2024 04:57:05 +0000 (13:57 +0900)
committerYu Watanabe <watanabe.yu+github@gmail.com>
Fri, 6 Sep 2024 01:34:53 +0000 (10:34 +0900)
This also
- renames n -> label,
- use log_syntax_parse_error().

No functional change, just refactoring.

src/network/networkd-address-label.c
src/network/networkd-address-label.h
src/network/networkd-gperf.gperf
src/network/networkd-network-gperf.gperf

index 3ac0cca72ebae034afeaf5fab4ad17210d90544f..454516f7b9c237c5a6e233d7c2373a9b3a09c3fd 100644 (file)
@@ -336,7 +336,7 @@ void manager_drop_invalid_address_labels(Manager *manager) {
         drop_invalid_address_labels(manager->address_labels_by_section);
 }
 
-int config_parse_address_label_prefix(
+static int config_parse_ipv6_address_label_prefix(
                 const char *unit,
                 const char *filename,
                 unsigned line,
@@ -348,35 +348,20 @@ int config_parse_address_label_prefix(
                 void *data,
                 void *userdata) {
 
-        _cleanup_(address_label_free_or_set_invalidp) AddressLabel *n = NULL;
-        Manager *manager = ltype ? userdata : NULL;
-        Network *network = ltype ? NULL : userdata;
+        AddressLabel *label = ASSERT_PTR(userdata);
         unsigned char prefixlen;
         union in_addr_union a;
         int r;
 
-        assert(filename);
-        assert(section);
-        assert(lvalue);
-        assert(rvalue);
-        assert(userdata);
-
-        r = address_label_new_static(manager, network, filename, section_line, &n);
-        if (r < 0)
-                return log_oom();
-
         if (isempty(rvalue)) {
-                n->prefix_set = false;
-                TAKE_PTR(n);
-                return 0;
+                label->prefix_set = false;
+                return 1;
         }
 
         r = in_addr_prefix_from_string(rvalue, AF_INET6, &a, &prefixlen);
-        if (r < 0) {
-                log_syntax(unit, LOG_WARNING, filename, line, r,
-                           "Invalid prefix for address label, ignoring assignment: %s", rvalue);
-                return 0;
-        }
+        if (r < 0)
+                return log_syntax_parse_error(unit, filename, line, r, lvalue, rvalue);
+
         if (in6_addr_is_ipv4_mapped_address(&a.in6) && prefixlen > 96) {
                 /* See ip6addrlbl_alloc() in net/ipv6/addrlabel.c of kernel. */
                 log_syntax(unit, LOG_WARNING, filename, line, 0,
@@ -385,14 +370,13 @@ int config_parse_address_label_prefix(
                 return 0;
         }
 
-        n->prefix = a.in6;
-        n->prefixlen = prefixlen;
-        n->prefix_set = true;
-        TAKE_PTR(n);
-        return 0;
+        label->prefix = a.in6;
+        label->prefixlen = prefixlen;
+        label->prefix_set = true;
+        return 1;
 }
 
-int config_parse_address_label(
+static int config_parse_ipv6_address_label(
                 const char *unit,
                 const char *filename,
                 unsigned line,
@@ -404,40 +388,67 @@ int config_parse_address_label(
                 void *data,
                 void *userdata) {
 
-        _cleanup_(address_label_free_or_set_invalidp) AddressLabel *n = NULL;
-        Manager *manager = ltype ? userdata : NULL;
-        Network *network = ltype ? NULL : userdata;
-        uint32_t k;
+        uint32_t k, *label = ASSERT_PTR(data);
         int r;
 
-        assert(filename);
-        assert(section);
-        assert(lvalue);
-        assert(rvalue);
-        assert(userdata);
-
-        r = address_label_new_static(manager, network, filename, section_line, &n);
-        if (r < 0)
-                return log_oom();
-
         if (isempty(rvalue)) {
-                n->label = UINT32_MAX;
-                TAKE_PTR(n);
-                return 0;
+                *label = UINT32_MAX;
+                return 1;
         }
 
         r = safe_atou32(rvalue, &k);
-        if (r < 0) {
-                log_syntax(unit, LOG_WARNING, filename, line, r, "Failed to parse address label, ignoring: %s", rvalue);
-                return 0;
-        }
+        if (r < 0)
+                return log_syntax_parse_error(unit, filename, line, r, lvalue, rvalue);
 
         if (k == UINT32_MAX) {
                 log_syntax(unit, LOG_WARNING, filename, line, 0, "Address label is invalid, ignoring: %s", rvalue);
                 return 0;
         }
 
-        n->label = k;
-        TAKE_PTR(n);
+        *label = k;
+        return 1;
+}
+
+int config_parse_ipv6_address_label_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[_IPV6_ADDRESS_LABEL_CONF_PARSER_MAX] = {
+                [IPV6_ADDRESS_LABEL]        = { .parser = config_parse_ipv6_address_label,        .ltype = 0, .offset = offsetof(AddressLabel, label), },
+                [IPV6_ADDRESS_LABEL_PREFIX] = { .parser = config_parse_ipv6_address_label_prefix, .ltype = 0, .offset = 0,                             },
+        };
+
+        _cleanup_(address_label_free_or_set_invalidp) AddressLabel *label = NULL;
+        Manager *manager = NULL;
+        Network *network = NULL;
+        int r;
+
+        assert(filename);
+
+        if (FLAGS_SET(ltype, IPV6_ADDRESS_LABEL_BY_MANAGER))
+                manager = ASSERT_PTR(userdata);
+        else
+                network = ASSERT_PTR(userdata);
+
+        ltype &= IPV6_ADDRESS_LABEL_SECTION_MASK;
+
+        r = address_label_new_static(manager, network, filename, section_line, &label);
+        if (r < 0)
+                return log_oom();
+
+        r = config_section_parse(table, ELEMENTSOF(table),
+                                 unit, filename, line, section, section_line, lvalue, ltype, rvalue, label);
+        if (r <= 0)
+                return r;
+
+        TAKE_PTR(label);
         return 0;
 }
index d2165719c37346cfaf2dc9e0e524e925bf891475..f0c7943545aedf6f5a94ed36dec0d838abe76fd7 100644 (file)
@@ -30,5 +30,16 @@ void manager_drop_invalid_address_labels(Manager *manager);
 int link_request_static_address_labels(Link *link);
 int manager_request_static_address_labels(Manager *manager);
 
-CONFIG_PARSER_PROTOTYPE(config_parse_address_label);
-CONFIG_PARSER_PROTOTYPE(config_parse_address_label_prefix);
+typedef enum IPv6AddressLabelConfParserType {
+        IPV6_ADDRESS_LABEL,
+        IPV6_ADDRESS_LABEL_PREFIX,
+        _IPV6_ADDRESS_LABEL_CONF_PARSER_MAX,
+        _IPV6_ADDRESS_LABEL_CONF_PARSER_INVALID = -EINVAL,
+
+        IPV6_ADDRESS_LABEL_BY_MANAGER           = 1 << 16,
+        IPV6_ADDRESS_LABEL_SECTION_MASK         = IPV6_ADDRESS_LABEL_BY_MANAGER - 1,
+} IPv6AddressLabelConfParserType;
+
+assert_cc(IPV6_ADDRESS_LABEL_BY_MANAGER >= _IPV6_ADDRESS_LABEL_CONF_PARSER_MAX);
+
+CONFIG_PARSER_PROTOTYPE(config_parse_ipv6_address_label_section);
index 8b64b3af305ab4ab3a2e151fe37a958dd36b2fd0..5894f4523cff3761435bcf2847927cba7036cd53 100644 (file)
@@ -34,8 +34,8 @@ Network.IPv6Forwarding,                  config_parse_tristate,
 Network.IPv6PrivacyExtensions,           config_parse_ipv6_privacy_extensions,   0,          offsetof(Manager, ipv6_privacy_extensions)
 Network.UseDomains,                      config_parse_use_domains,               0,          offsetof(Manager, use_domains)
 IPv6AcceptRA.UseDomains,                 config_parse_use_domains,               0,          offsetof(Manager, ndisc_use_domains)
-IPv6AddressLabel.Prefix,                 config_parse_address_label_prefix,      1,          0
-IPv6AddressLabel.Label,                  config_parse_address_label,             1,          0
+IPv6AddressLabel.Prefix,                 config_parse_ipv6_address_label_section, IPV6_ADDRESS_LABEL_BY_MANAGER | IPV6_ADDRESS_LABEL_PREFIX, 0
+IPv6AddressLabel.Label,                  config_parse_ipv6_address_label_section, IPV6_ADDRESS_LABEL_BY_MANAGER | IPV6_ADDRESS_LABEL,        0
 DHCPv4.UseDomains,                       config_parse_use_domains,               0,          offsetof(Manager, dhcp_use_domains)
 DHCPv4.DUIDType,                         config_parse_duid_type,                 0,          offsetof(Manager, dhcp_duid)
 DHCPv4.DUIDRawData,                      config_parse_duid_rawdata,              0,          offsetof(Manager, dhcp_duid)
index a84de4ca7fca99abc10a31d7adf64be8fed8c5e7..e39c617500f71b2f68aa0c9256810f2014317139 100644 (file)
@@ -171,8 +171,8 @@ Address.Scope,                               config_parse_address_scope,
 Address.RouteMetric,                         config_parse_address_route_metric,                        0,                             0
 Address.NetLabel,                            config_parse_address_netlabel,                            0,                             0
 Address.NFTSet,                              config_parse_address_ip_nft_set,                          NFT_SET_PARSE_NETWORK,         0
-IPv6AddressLabel.Prefix,                     config_parse_address_label_prefix,                        0,                             0
-IPv6AddressLabel.Label,                      config_parse_address_label,                               0,                             0
+IPv6AddressLabel.Prefix,                     config_parse_ipv6_address_label_section,                  IPV6_ADDRESS_LABEL_PREFIX,     0
+IPv6AddressLabel.Label,                      config_parse_ipv6_address_label_section,                  IPV6_ADDRESS_LABEL,            0
 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 */