From: Susant Sahani Date: Sat, 11 May 2019 02:38:57 +0000 (+0530) Subject: networkd: Geneve add support for inherit for TTL X-Git-Tag: v243-rc1~453 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=d70c9bbd6ca598365b14c2004ea3ab6a5c3b3aad;p=thirdparty%2Fsystemd.git networkd: Geneve add support for inherit for TTL --- diff --git a/man/systemd.netdev.xml b/man/systemd.netdev.xml index 0143bfb1c60..42632a6540e 100644 --- a/man/systemd.netdev.xml +++ b/man/systemd.netdev.xml @@ -731,8 +731,8 @@ TTL= - Specifies the TTL value to use in outgoing packets. Takes a number in the range 0-255. - When unset or set to 0, the kernel's default will be used meaning that packets TTL will be set from + Accepts the same key in [VXLAN] section except when unset or + set to 0, the kernel's default will be used meaning that packets TTL will be set from /proc/sys/net/ipv4/ip_default_ttl. diff --git a/src/network/netdev/geneve.c b/src/network/netdev/geneve.c index 1b1cd2fc9e4..3dc8f083cc6 100644 --- a/src/network/netdev/geneve.c +++ b/src/network/netdev/geneve.c @@ -102,7 +102,11 @@ static int netdev_geneve_create(NetDev *netdev) { return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_REMOTE/IFLA_GENEVE_REMOTE6 attribute: %m"); } - if (v->ttl > 0) { + if (v->inherit) { + r = sd_netlink_message_append_u8(m, IFLA_GENEVE_TTL_INHERIT, 1); + if (r < 0) + return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_TTL_INHERIT attribute: %m"); + } else { r = sd_netlink_message_append_u8(m, IFLA_GENEVE_TTL, v->ttl); if (r < 0) return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_TTL attribute: %m"); @@ -271,6 +275,47 @@ int config_parse_geneve_flow_label(const char *unit, return 0; } +int config_parse_geneve_ttl(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) { + Geneve *v = userdata; + unsigned f; + int r; + + assert(filename); + assert(lvalue); + assert(rvalue); + assert(data); + + if (streq(rvalue, "inherit")) + v->inherit = true; + else { + r = safe_atou(rvalue, &f); + if (r < 0) { + log_syntax(unit, LOG_ERR, filename, line, r, + "Failed to parse Geneve TTL '%s', ignoring assignment: %m", rvalue); + return 0; + } + + if (f > 255) { + log_syntax(unit, LOG_ERR, filename, line, 0, + "Invalid Geneve TTL '%s'. TTL must be <= 255. Ignoring assignment.", rvalue); + return 0; + } + + v->ttl = f; + } + + return 0; +} + static int netdev_geneve_verify(NetDev *netdev, const char *filename) { Geneve *v = GENEVE(netdev); diff --git a/src/network/netdev/geneve.h b/src/network/netdev/geneve.h index 5f2f27c9bb3..32f7f038ba0 100644 --- a/src/network/netdev/geneve.h +++ b/src/network/netdev/geneve.h @@ -34,6 +34,7 @@ struct Geneve { bool udpcsum; bool udp6zerocsumtx; bool udp6zerocsumrx; + bool inherit; GeneveDF geneve_df; union in_addr_union remote; @@ -49,3 +50,4 @@ CONFIG_PARSER_PROTOTYPE(config_parse_geneve_vni); CONFIG_PARSER_PROTOTYPE(config_parse_geneve_address); CONFIG_PARSER_PROTOTYPE(config_parse_geneve_flow_label); CONFIG_PARSER_PROTOTYPE(config_parse_geneve_df); +CONFIG_PARSER_PROTOTYPE(config_parse_geneve_ttl); diff --git a/src/network/netdev/netdev-gperf.gperf b/src/network/netdev/netdev-gperf.gperf index 8f43088f13d..e18d746befc 100644 --- a/src/network/netdev/netdev-gperf.gperf +++ b/src/network/netdev/netdev-gperf.gperf @@ -128,7 +128,7 @@ VXLAN.IPDoNotFragment, config_parse_df, GENEVE.Id, config_parse_geneve_vni, 0, offsetof(Geneve, id) GENEVE.Remote, config_parse_geneve_address, 0, offsetof(Geneve, remote) GENEVE.TOS, config_parse_uint8, 0, offsetof(Geneve, tos) -GENEVE.TTL, config_parse_uint8, 0, offsetof(Geneve, ttl) +GENEVE.TTL, config_parse_geneve_ttl, 0, offsetof(Geneve, ttl) GENEVE.UDPChecksum, config_parse_bool, 0, offsetof(Geneve, udpcsum) GENEVE.UDP6ZeroCheckSumRx, config_parse_bool, 0, offsetof(Geneve, udp6zerocsumrx) GENEVE.UDP6ZeroChecksumRx, config_parse_bool, 0, offsetof(Geneve, udp6zerocsumrx)