diff options
Diffstat (limited to 'drivers/net/vxlan.c')
| -rw-r--r-- | drivers/net/vxlan.c | 38 | 
1 files changed, 12 insertions, 26 deletions
diff --git a/drivers/net/vxlan.c b/drivers/net/vxlan.c index 4bfeb9765c55..e7d16687538b 100644 --- a/drivers/net/vxlan.c +++ b/drivers/net/vxlan.c @@ -2780,14 +2780,15 @@ static int vxlan_dev_configure(struct net *src_net, struct net_device *dev,  	struct net_device *lowerdev = NULL;  	if (conf->flags & VXLAN_F_GPE) { -		if (conf->flags & ~VXLAN_F_ALLOWED_GPE) -			return -EINVAL;  		/* For now, allow GPE only together with COLLECT_METADATA.  		 * This can be relaxed later; in such case, the other side  		 * of the PtP link will have to be provided.  		 */ -		if (!(conf->flags & VXLAN_F_COLLECT_METADATA)) +		if ((conf->flags & ~VXLAN_F_ALLOWED_GPE) || +		    !(conf->flags & VXLAN_F_COLLECT_METADATA)) { +			pr_info("unsupported combination of extensions\n");  			return -EINVAL; +		}  		vxlan_raw_setup(dev);  	} else { @@ -2840,6 +2841,9 @@ static int vxlan_dev_configure(struct net *src_net, struct net_device *dev,  			dev->mtu = lowerdev->mtu - (use_ipv6 ? VXLAN6_HEADROOM : VXLAN_HEADROOM);  		needed_headroom = lowerdev->hard_header_len; +	} else if (vxlan_addr_multicast(&dst->remote_ip)) { +		pr_info("multicast destination requires interface to be specified\n"); +		return -EINVAL;  	}  	if (conf->mtu) { @@ -2872,8 +2876,10 @@ static int vxlan_dev_configure(struct net *src_net, struct net_device *dev,  		     tmp->cfg.saddr.sa.sa_family == AF_INET6) == use_ipv6 &&  		    tmp->cfg.dst_port == vxlan->cfg.dst_port &&  		    (tmp->flags & VXLAN_F_RCV_FLAGS) == -		    (vxlan->flags & VXLAN_F_RCV_FLAGS)) -		return -EEXIST; +		    (vxlan->flags & VXLAN_F_RCV_FLAGS)) { +			pr_info("duplicate VNI %u\n", be32_to_cpu(conf->vni)); +			return -EEXIST; +		}  	}  	dev->ethtool_ops = &vxlan_ethtool_ops; @@ -2907,7 +2913,6 @@ static int vxlan_newlink(struct net *src_net, struct net_device *dev,  			 struct nlattr *tb[], struct nlattr *data[])  {  	struct vxlan_config conf; -	int err;  	memset(&conf, 0, sizeof(conf)); @@ -3016,26 +3021,7 @@ static int vxlan_newlink(struct net *src_net, struct net_device *dev,  	if (tb[IFLA_MTU])  		conf.mtu = nla_get_u32(tb[IFLA_MTU]); -	err = vxlan_dev_configure(src_net, dev, &conf); -	switch (err) { -	case -ENODEV: -		pr_info("ifindex %d does not exist\n", conf.remote_ifindex); -		break; - -	case -EPERM: -		pr_info("IPv6 is disabled via sysctl\n"); -		break; - -	case -EEXIST: -		pr_info("duplicate VNI %u\n", be32_to_cpu(conf.vni)); -		break; - -	case -EINVAL: -		pr_info("unsupported combination of extensions\n"); -		break; -	} - -	return err; +	return vxlan_dev_configure(src_net, dev, &conf);  }  static void vxlan_dellink(struct net_device *dev, struct list_head *head)  |