Merge pull request #12520 from ssahani/geneve

networkd: Geneve add DF feature and allow TTL to bechosen by kernel
This commit is contained in:
Yu Watanabe 2019-05-10 19:47:19 +02:00 committed by GitHub
commit cd43199671
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 49 additions and 7 deletions

View file

@ -713,7 +713,7 @@
<varlistentry>
<term><varname>Id=</varname></term>
<listitem>
<para>Specifies the Virtual Network Identifier (VNI) to use. Ranges [0-16777215].</para>
<para>Specifies the Virtual Network Identifier (VNI) to use. Ranges [0-16777215]. This field is mandatory.</para>
</listitem>
</varlistentry>
<varlistentry>
@ -731,7 +731,9 @@
<varlistentry>
<term><varname>TTL=</varname></term>
<listitem>
<para>Specifies the TTL value to use in outgoing packets. Ranges [1-255].</para>
<para>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
<filename>/proc/sys/net/ipv4/ip_default_ttl</filename>.</para>
</listitem>
</varlistentry>
<varlistentry>
@ -764,7 +766,13 @@
<listitem>
<para>Specifies the flow label to use in outgoing packets.</para>
</listitem>
</varlistentry>
</varlistentry>
<varlistentry>
<term><varname>IPDoNotFragment=</varname></term>
<listitem>
<para>Accepts the same key in <literal>[VXLAN]</literal> section.</para>
</listitem>
</varlistentry>
</variablelist>
</refsect1>
<refsect1>

View file

@ -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[] = {

View file

@ -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");
@ -262,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;
}
@ -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;

View file

@ -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);

View file

@ -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)

View file

@ -32,6 +32,7 @@ FlowLabel=
UDP6ZeroChecksumRx=
Remote=
UDP6ZeroCheckSumRx=
IPDoNotFragment=
[Bridge]
ForwardDelaySec=
HelloTimeSec=