From 469fd84866b57091674c3ceeea87066e3b0fa1c9 Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Thu, 9 May 2019 21:36:35 +0530 Subject: [PATCH 1/3] sd-netlink: Add supprt for geneve properties IFLA_GENEVE_TTL_INHERIT and IFLA_GENEVE_DF --- src/libsystemd/sd-netlink/netlink-types.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/libsystemd/sd-netlink/netlink-types.c b/src/libsystemd/sd-netlink/netlink-types.c index 192033fd69..c847c37338 100644 --- a/src/libsystemd/sd-netlink/netlink-types.c +++ b/src/libsystemd/sd-netlink/netlink-types.c @@ -301,6 +301,8 @@ static const NLType rtnl_link_info_data_geneve_types[] = { [IFLA_GENEVE_UDP_ZERO_CSUM6_TX] = { .type = NETLINK_TYPE_U8 }, [IFLA_GENEVE_UDP_ZERO_CSUM6_RX] = { .type = NETLINK_TYPE_U8 }, [IFLA_GENEVE_LABEL] = { .type = NETLINK_TYPE_U32 }, + [IFLA_GENEVE_TTL_INHERIT] = { .type = NETLINK_TYPE_U8 }, + [IFLA_GENEVE_DF] = { .type = NETLINK_TYPE_U8 }, }; static const NLType rtnl_link_info_data_can_types[] = { From aac350192b37f4ae5523a99260d59ee6b5515226 Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Thu, 9 May 2019 21:37:46 +0530 Subject: [PATCH 2/3] networkd: Geneve add support configure IP don't fragment --- man/systemd.netdev.xml | 8 +++++++- src/network/netdev/geneve.c | 17 +++++++++++++++++ src/network/netdev/geneve.h | 13 +++++++++++++ src/network/netdev/netdev-gperf.gperf | 1 + test/fuzz/fuzz-netdev-parser/directives.netdev | 1 + 5 files changed, 39 insertions(+), 1 deletion(-) diff --git a/man/systemd.netdev.xml b/man/systemd.netdev.xml index 416874fbaf..454878d680 100644 --- a/man/systemd.netdev.xml +++ b/man/systemd.netdev.xml @@ -764,7 +764,13 @@ Specifies the flow label to use in outgoing packets. - + + + IPDoNotFragment= + + Accepts the same key in [VXLAN] section. + + diff --git a/src/network/netdev/geneve.c b/src/network/netdev/geneve.c index 0fb09961d6..fee596e582 100644 --- a/src/network/netdev/geneve.c +++ b/src/network/netdev/geneve.c @@ -10,6 +10,7 @@ #include "geneve.h" #include "netlink-util.h" #include "parse-util.h" +#include "string-table.h" #include "string-util.h" #include "strv.h" #include "missing.h" @@ -18,6 +19,15 @@ #define GENEVE_FLOW_LABEL_MAX_MASK 0xFFFFFU #define DEFAULT_GENEVE_DESTINATION_PORT 6081 +static const char* const geneve_df_table[_NETDEV_GENEVE_DF_MAX] = { + [NETDEV_GENEVE_DF_NO] = "no", + [NETDEV_GENEVE_DF_YES] = "yes", + [NETDEV_GENEVE_DF_INHERIT] = "inherit", +}; + +DEFINE_STRING_TABLE_LOOKUP_WITH_BOOLEAN(geneve_df, GeneveDF, NETDEV_GENEVE_DF_YES); +DEFINE_CONFIG_PARSE_ENUM(config_parse_geneve_df, geneve_df, GeneveDF, "Failed to parse Geneve IPDoNotFragment= setting"); + /* callback for geneve netdev's created without a backing Link */ static int geneve_netdev_create_handler(sd_netlink *rtnl, sd_netlink_message *m, NetDev *netdev) { int r; @@ -126,6 +136,12 @@ static int netdev_geneve_create(NetDev *netdev) { return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_LABEL attribute: %m"); } + if (v->geneve_df != _NETDEV_GENEVE_DF_INVALID) { + r = sd_netlink_message_append_u8(m, IFLA_GENEVE_DF, v->geneve_df); + if (r < 0) + return log_netdev_error_errno(netdev, r, "Could not append IFLA_GENEVE_DF attribute: %m"); + } + r = sd_netlink_message_close_container(m); if (r < 0) return log_netdev_error_errno(netdev, r, "Could not append IFLA_INFO_DATA attribute: %m"); @@ -280,6 +296,7 @@ static void geneve_init(NetDev *netdev) { assert(v); v->id = GENEVE_VID_MAX + 1; + v->geneve_df = _NETDEV_GENEVE_DF_INVALID; v->dest_port = DEFAULT_GENEVE_DESTINATION_PORT; v->udpcsum = false; v->udp6zerocsumtx = false; diff --git a/src/network/netdev/geneve.h b/src/network/netdev/geneve.h index c201981e02..5f2f27c9bb 100644 --- a/src/network/netdev/geneve.h +++ b/src/network/netdev/geneve.h @@ -10,6 +10,14 @@ typedef struct Geneve Geneve; #define GENEVE_VID_MAX (1u << 24) - 1 +typedef enum GeneveDF { + NETDEV_GENEVE_DF_NO = GENEVE_DF_UNSET, + NETDEV_GENEVE_DF_YES = GENEVE_DF_SET, + NETDEV_GENEVE_DF_INHERIT = GENEVE_DF_INHERIT, + _NETDEV_GENEVE_DF_MAX, + _NETDEV_GENEVE_DF_INVALID = -1 +} GeneveDF; + struct Geneve { NetDev meta; @@ -27,12 +35,17 @@ struct Geneve { bool udp6zerocsumtx; bool udp6zerocsumrx; + GeneveDF geneve_df; union in_addr_union remote; }; DEFINE_NETDEV_CAST(GENEVE, Geneve); extern const NetDevVTable geneve_vtable; +const char *geneve_df_to_string(GeneveDF d) _const_; +GeneveDF geneve_df_from_string(const char *d) _pure_; + 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); diff --git a/src/network/netdev/netdev-gperf.gperf b/src/network/netdev/netdev-gperf.gperf index e2c994e971..2a7ea9692f 100644 --- a/src/network/netdev/netdev-gperf.gperf +++ b/src/network/netdev/netdev-gperf.gperf @@ -135,6 +135,7 @@ GENEVE.UDP6ZeroChecksumRx, config_parse_bool, GENEVE.UDP6ZeroCheckSumTx, config_parse_bool, 0, offsetof(Geneve, udp6zerocsumtx) GENEVE.UDP6ZeroChecksumTx, config_parse_bool, 0, offsetof(Geneve, udp6zerocsumtx) GENEVE.DestinationPort, config_parse_ip_port, 0, offsetof(Geneve, dest_port) +GENEVE.IPDoNotFragment, config_parse_geneve_df, 0, offsetof(Geneve, geneve_df) GENEVE.FlowLabel, config_parse_geneve_flow_label, 0, 0 MACsec.Port, config_parse_macsec_port, 0, 0 MACsec.Encrypt, config_parse_tristate, 0, offsetof(MACsec, encrypt) diff --git a/test/fuzz/fuzz-netdev-parser/directives.netdev b/test/fuzz/fuzz-netdev-parser/directives.netdev index f2189e1ccf..0b332a6e7a 100644 --- a/test/fuzz/fuzz-netdev-parser/directives.netdev +++ b/test/fuzz/fuzz-netdev-parser/directives.netdev @@ -32,6 +32,7 @@ FlowLabel= UDP6ZeroChecksumRx= Remote= UDP6ZeroCheckSumRx= +IPDoNotFragment= [Bridge] ForwardDelaySec= HelloTimeSec= From 328184d1fce13ff0345b3fbecbac6714eef86fbf Mon Sep 17 00:00:00 2001 From: Susant Sahani Date: Fri, 10 May 2019 15:11:47 +0530 Subject: [PATCH 3/3] networkd: Geneve Allow TTL to be zero. Also verify VNI is set --- man/systemd.netdev.xml | 6 ++++-- src/network/netdev/geneve.c | 8 ++++---- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/man/systemd.netdev.xml b/man/systemd.netdev.xml index 454878d680..21c7ba8270 100644 --- a/man/systemd.netdev.xml +++ b/man/systemd.netdev.xml @@ -713,7 +713,7 @@ Id= - Specifies the Virtual Network Identifier (VNI) to use. Ranges [0-16777215]. + Specifies the Virtual Network Identifier (VNI) to use. Ranges [0-16777215]. This field is mandatory. @@ -731,7 +731,9 @@ TTL= - Specifies the TTL value to use in outgoing packets. Ranges [1-255]. + 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 + /proc/sys/net/ipv4/ip_default_ttl. diff --git a/src/network/netdev/geneve.c b/src/network/netdev/geneve.c index fee596e582..1b1cd2fc9e 100644 --- a/src/network/netdev/geneve.c +++ b/src/network/netdev/geneve.c @@ -278,10 +278,10 @@ static int netdev_geneve_verify(NetDev *netdev, const char *filename) { assert(v); assert(filename); - if (v->ttl == 0) { - log_warning("Invalid Geneve TTL value '0' configured in '%s'. Ignoring", filename); - return -EINVAL; - } + if (v->id > GENEVE_VID_MAX) + return log_netdev_warning_errno(netdev, SYNTHETIC_ERRNO(EINVAL), + "%s: Geneve without valid VNI (or Virtual Network Identifier) configured. Ignoring.", + filename); return 0; }