diff options
author | Yu Watanabe <watanabe.yu+github@gmail.com> | 2024-08-24 21:58:14 +0200 |
---|---|---|
committer | Yu Watanabe <watanabe.yu+github@gmail.com> | 2024-08-24 23:18:46 +0200 |
commit | f7a1e57e1f864c2aa6d77838d3ce3ea6d89be3c6 (patch) | |
tree | 3bad9348ecda9fa87269745f290dd8d7052f1785 | |
parent | conf-parser: introduce config_parse_uint32_flag() (diff) | |
download | systemd-f7a1e57e1f864c2aa6d77838d3ce3ea6d89be3c6.tar.xz systemd-f7a1e57e1f864c2aa6d77838d3ce3ea6d89be3c6.zip |
conf-parser: move config_parse_ip_protocol() from network/netdev/fou-tunnel.c
The function is generic enough. Currently it is used at only one place.
But it will be used at another place.
-rw-r--r-- | src/network/netdev/fou-tunnel.c | 41 | ||||
-rw-r--r-- | src/network/netdev/fou-tunnel.h | 1 | ||||
-rw-r--r-- | src/network/netdev/netdev-gperf.gperf | 2 | ||||
-rw-r--r-- | src/shared/conf-parser.c | 37 | ||||
-rw-r--r-- | src/shared/conf-parser.h | 1 |
5 files changed, 39 insertions, 43 deletions
diff --git a/src/network/netdev/fou-tunnel.c b/src/network/netdev/fou-tunnel.c index bddee5e98c..969a4e6de6 100644 --- a/src/network/netdev/fou-tunnel.c +++ b/src/network/netdev/fou-tunnel.c @@ -142,47 +142,6 @@ static int netdev_fou_tunnel_create(NetDev *netdev) { return 0; } -int config_parse_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) { - - assert(filename); - assert(section); - assert(lvalue); - assert(rvalue); - - uint8_t *proto = ASSERT_PTR(data); - int r; - - r = parse_ip_protocol_full(rvalue, /* relaxed= */ true); - if (r < 0) { - log_syntax(unit, LOG_WARNING, filename, line, r, - "Failed to parse '%s=%s', ignoring: %m", - lvalue, rvalue); - return 0; - } - - if (r > UINT8_MAX) { - /* linux/fou.h defines the netlink field as one byte, so we need to reject - * protocols numbers that don't fit in one byte. */ - log_syntax(unit, LOG_WARNING, filename, line, r, - "Invalid '%s=%s', allowed range is 0..255, ignoring.", - lvalue, rvalue); - return 0; - } - - *proto = r; - return 0; -} - int config_parse_fou_tunnel_address( const char *unit, const char *filename, diff --git a/src/network/netdev/fou-tunnel.h b/src/network/netdev/fou-tunnel.h index 72cb315e5f..1dd2e3b927 100644 --- a/src/network/netdev/fou-tunnel.h +++ b/src/network/netdev/fou-tunnel.h @@ -38,5 +38,4 @@ const char* fou_encap_type_to_string(FooOverUDPEncapType d) _const_; FooOverUDPEncapType fou_encap_type_from_string(const char *d) _pure_; CONFIG_PARSER_PROTOTYPE(config_parse_fou_encap_type); -CONFIG_PARSER_PROTOTYPE(config_parse_ip_protocol); CONFIG_PARSER_PROTOTYPE(config_parse_fou_tunnel_address); diff --git a/src/network/netdev/netdev-gperf.gperf b/src/network/netdev/netdev-gperf.gperf index 03a4791ee4..be010665c5 100644 --- a/src/network/netdev/netdev-gperf.gperf +++ b/src/network/netdev/netdev-gperf.gperf @@ -99,7 +99,7 @@ Tunnel.ERSPANHardwareId, config_parse_erspan_hwid, Tunnel.SerializeTunneledPackets, config_parse_tristate, 0, offsetof(Tunnel, gre_erspan_sequence) Tunnel.ISATAP, config_parse_tristate, 0, offsetof(Tunnel, isatap) Tunnel.External, config_parse_bool, 0, offsetof(Tunnel, external) -FooOverUDP.Protocol, config_parse_ip_protocol, 0, offsetof(FouTunnel, fou_protocol) +FooOverUDP.Protocol, config_parse_ip_protocol, /* relax = */ true, offsetof(FouTunnel, fou_protocol) FooOverUDP.Encapsulation, config_parse_fou_encap_type, 0, offsetof(FouTunnel, fou_encap_type) FooOverUDP.Port, config_parse_ip_port, 0, offsetof(FouTunnel, port) FooOverUDP.PeerPort, config_parse_ip_port, 0, offsetof(FouTunnel, peer_port) diff --git a/src/shared/conf-parser.c b/src/shared/conf-parser.c index ac0df88b4d..c4633fc52f 100644 --- a/src/shared/conf-parser.c +++ b/src/shared/conf-parser.c @@ -24,6 +24,7 @@ #include "hostname-util.h" #include "id128-util.h" #include "in-addr-util.h" +#include "ip-protocol-list.h" #include "log.h" #include "macro.h" #include "missing_network.h" @@ -2082,3 +2083,39 @@ int config_parse_timezone( return free_and_strdup_warn(tz, rvalue); } + +int config_parse_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) { + + uint8_t *proto = ASSERT_PTR(data); + int r; + + r = isempty(rvalue) ? 0 : parse_ip_protocol_full(rvalue, /* relaxed= */ ltype); + if (r < 0) { + log_syntax(unit, LOG_WARNING, filename, line, r, + "Failed to parse '%s=%s', ignoring: %m", + lvalue, rvalue); + return 0; + } + + if (r > UINT8_MAX) { + /* linux/fib_rules.h and linux/fou.h define the netlink field as one byte, so we need to + * reject protocols numbers that don't fit in one byte. */ + log_syntax(unit, LOG_WARNING, filename, line, r, + "Invalid '%s=%s', allowed range is 0..255, ignoring.", + lvalue, rvalue); + return 0; + } + + *proto = r; + return 1; /* done. */ +} diff --git a/src/shared/conf-parser.h b/src/shared/conf-parser.h index ad40c6224c..937bdc73ed 100644 --- a/src/shared/conf-parser.h +++ b/src/shared/conf-parser.h @@ -290,6 +290,7 @@ CONFIG_PARSER_PROTOTYPE(config_parse_pid); CONFIG_PARSER_PROTOTYPE(config_parse_sec_fix_0); CONFIG_PARSER_PROTOTYPE(config_parse_timezone); CONFIG_PARSER_PROTOTYPE(config_parse_calendar); +CONFIG_PARSER_PROTOTYPE(config_parse_ip_protocol); typedef enum Disabled { DISABLED_CONFIGURATION, |