struct geneve_config {
bool collect_md;
+ bool dualstack;
bool use_udp6_rx_checksums;
bool ttl_inherit;
bool gro_hint;
static int geneve_open(struct net_device *dev)
{
struct geneve_dev *geneve = netdev_priv(dev);
- bool metadata = geneve->cfg.collect_md;
+ bool dualstack = geneve->cfg.dualstack;
bool ipv4, ipv6;
int ret = 0;
- ipv6 = geneve->cfg.info.mode & IP_TUNNEL_INFO_IPV6 || metadata;
- ipv4 = !ipv6 || metadata;
+ ipv6 = geneve->cfg.info.mode & IP_TUNNEL_INFO_IPV6 || dualstack;
+ ipv4 = !ipv6 || dualstack;
#if IS_ENABLED(CONFIG_IPV6)
if (ipv6) {
ret = geneve_sock_add(geneve, true);
struct ip_tunnel_info *info = &cfg->info;
int attrtype;
+ if (data[IFLA_GENEVE_COLLECT_METADATA]) {
+ if (changelink) {
+ attrtype = IFLA_GENEVE_COLLECT_METADATA;
+ goto change_notsup;
+ }
+
+ cfg->collect_md = true;
+ cfg->dualstack = true;
+ }
+
if (data[IFLA_GENEVE_REMOTE] && data[IFLA_GENEVE_REMOTE6]) {
NL_SET_ERR_MSG(extack,
"Cannot specify both IPv4 and IPv6 Remote addresses");
cfg->port_max = ntohs(p->high);
}
- if (data[IFLA_GENEVE_COLLECT_METADATA]) {
- if (changelink) {
- attrtype = IFLA_GENEVE_COLLECT_METADATA;
- goto change_notsup;
- }
- cfg->collect_md = true;
- }
-
if (data[IFLA_GENEVE_UDP_CSUM]) {
if (changelink) {
attrtype = IFLA_GENEVE_UDP_CSUM;
.use_udp6_rx_checksums = false,
.ttl_inherit = false,
.collect_md = false,
+ .dualstack = false,
.port_min = 1,
.port_max = USHRT_MAX,
};
.use_udp6_rx_checksums = true,
.ttl_inherit = false,
.collect_md = true,
+ .dualstack = true,
.port_min = 1,
.port_max = USHRT_MAX,
};