netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Jiri Benc <jbenc@redhat.com>
To: Jarod Wilson <jarod@redhat.com>
Cc: linux-kernel@vger.kernel.org, netdev@vger.kernel.org,
	Nicolas Dichtel <nicolas.dichtel@6wind.com>,
	Hannes Frederic Sowa <hannes@stressinduktion.org>,
	Tom Herbert <tom@herbertland.com>,
	Daniel Borkmann <daniel@iogearbox.net>,
	Alexander Duyck <alexander.h.duyck@intel.com>,
	Paolo Abeni <pabeni@redhat.com>,
	WANG Cong <xiyou.wangcong@gmail.com>,
	Roopa Prabhu <roopa@cumulusnetworks.com>,
	Pravin B Shelar <pshelar@ovn.org>,
	Sabrina Dubroca <sd@queasysnail.net>,
	Patrick McHardy <kaber@trash.net>,
	Stephen Hemminger <stephen@networkplumber.org>,
	Pravin Shelar <pshelar@nicira.com>
Subject: Re: [PATCH net-next 4/6] net: use core MTU range checking in core net infra
Date: Wed, 19 Oct 2016 14:17:03 +0200	[thread overview]
Message-ID: <20161019141703.01ff8850@griffin> (raw)
In-Reply-To: <20161019023333.15760-5-jarod@redhat.com>

On Tue, 18 Oct 2016 22:33:31 -0400, Jarod Wilson wrote:
> --- a/drivers/net/vxlan.c
> +++ b/drivers/net/vxlan.c
> @@ -2367,43 +2367,31 @@ static void vxlan_set_multicast_list(struct net_device *dev)
>  {
>  }
>  
> -static int __vxlan_change_mtu(struct net_device *dev,
> -			      struct net_device *lowerdev,
> -			      struct vxlan_rdst *dst, int new_mtu, bool strict)
> +static int vxlan_change_mtu(struct net_device *dev, int new_mtu)
>  {
> -	int max_mtu = IP_MAX_MTU;
> -
> -	if (lowerdev)
> -		max_mtu = lowerdev->mtu;
> +	struct vxlan_dev *vxlan = netdev_priv(dev);
> +	struct vxlan_rdst *dst = &vxlan->default_dst;
> +	struct net_device *lowerdev = __dev_get_by_index(vxlan->net,
> +							 dst->remote_ifindex);
> +	bool use_ipv6 = false;
>  
>  	if (dst->remote_ip.sa.sa_family == AF_INET6)
> -		max_mtu -= VXLAN6_HEADROOM;
> -	else
> -		max_mtu -= VXLAN_HEADROOM;
> -
> -	if (new_mtu < 68)
> -		return -EINVAL;
> +		use_ipv6 = true;
>  
> -	if (new_mtu > max_mtu) {
> -		if (strict)
> +	/* We re-check this, because users *could* alter the mtu of the
> +	 * lower device after we've initialized dev->max_mtu.
> +	 */
> +	if (lowerdev) {
> +		dev->max_mtu = lowerdev->mtu -
> +			       (use_ipv6 ? VXLAN6_HEADROOM : VXLAN_HEADROOM);
> +		if (new_mtu > dev->max_mtu)
>  			return -EINVAL;
> -
> -		new_mtu = max_mtu;
>  	}
>  
>  	dev->mtu = new_mtu;
>  	return 0;
>  }

Sorry for the silly question, how does the min_mtu and max_mtu stuff
works? I noticed your patches but haven't looked in depth into them.

When the ndo_change_mtu callback is defined, is the dev->min_mtu and
dev->max_mtu checked first and if the desired mtu is not within range,
ndo_change_mtu is not called?

Or does ndo_change_mtu override the checks?

In either case, the code does not look correct. In the first case,
increasing of lowerdev MTU wouldn't allow increasing of vxlan MTU
without deleting and recreating the vxlan interface. In the second
case, you're missing check against the min_mtu.

>  
> -static int vxlan_change_mtu(struct net_device *dev, int new_mtu)
> -{
> -	struct vxlan_dev *vxlan = netdev_priv(dev);
> -	struct vxlan_rdst *dst = &vxlan->default_dst;
> -	struct net_device *lowerdev = __dev_get_by_index(vxlan->net,
> -							 dst->remote_ifindex);
> -	return __vxlan_change_mtu(dev, lowerdev, dst, new_mtu, true);
> -}
> -
>  static int vxlan_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)
>  {
>  	struct vxlan_dev *vxlan = netdev_priv(dev);
> @@ -2795,6 +2783,10 @@ static int vxlan_dev_configure(struct net *src_net, struct net_device *dev,
>  		vxlan_ether_setup(dev);
>  	}
>  
> +	/* MTU range: 68 - 65535 */
> +	dev->min_mtu = 68;
> +	dev->max_mtu = IP_MAX_MTU;
> +
>  	vxlan->net = src_net;
>  
>  	dst->remote_vni = conf->vni;
> @@ -2837,8 +2829,11 @@ static int vxlan_dev_configure(struct net *src_net, struct net_device *dev,
>  		}
>  #endif
>  
> -		if (!conf->mtu)
> -			dev->mtu = lowerdev->mtu - (use_ipv6 ? VXLAN6_HEADROOM : VXLAN_HEADROOM);
> +		if (!conf->mtu) {
> +			dev->mtu = lowerdev->mtu -
> +				   (use_ipv6 ? VXLAN6_HEADROOM : VXLAN_HEADROOM);
> +			dev->max_mtu = dev->mtu;
> +		}
>  
>  		needed_headroom = lowerdev->hard_header_len;
>  	} else if (vxlan_addr_multicast(&dst->remote_ip)) {
> @@ -2847,9 +2842,14 @@ static int vxlan_dev_configure(struct net *src_net, struct net_device *dev,
>  	}
>  
>  	if (conf->mtu) {
> -		err = __vxlan_change_mtu(dev, lowerdev, dst, conf->mtu, false);
> -		if (err)
> -			return err;
> +		if (lowerdev)
> +			dev->max_mtu = lowerdev->mtu;
> +		dev->max_mtu -= (use_ipv6 ? VXLAN6_HEADROOM : VXLAN_HEADROOM);
> +
> +		dev->mtu = conf->mtu;
> +
> +		if (conf->mtu > dev->max_mtu)
> +			dev->mtu = dev->max_mtu;
>  	}

You removed the check for min_mtu but it's needed here. The conf->mtu
value comes from the user space and can be anything.

>  
>  	if (use_ipv6 || conf->flags & VXLAN_F_COLLECT_METADATA)

 Jiri

  reply	other threads:[~2016-10-19 14:46 UTC|newest]

Thread overview: 69+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-10-19  2:33 [PATCH net-next 0/6] net: use core MTU range checking everywhere Jarod Wilson
2016-10-19  2:33 ` [PATCH net-next 1/6] net: use core MTU range checking in USB NIC drivers Jarod Wilson
2016-10-19  2:33 ` [PATCH net-next 2/6] net: use core MTU range checking in wireless drivers Jarod Wilson
2016-10-19  7:38   ` Johannes Berg
2016-10-19 14:27     ` Jarod Wilson
2016-10-19 14:28       ` Johannes Berg
2016-10-19  2:33 ` [PATCH net-next 3/6] net: use core MTU range checking in WAN drivers Jarod Wilson
2016-10-21 12:04   ` Krzysztof Hałasa
2016-10-19  2:33 ` [PATCH net-next 4/6] net: use core MTU range checking in core net infra Jarod Wilson
2016-10-19 12:17   ` Jiri Benc [this message]
2016-10-19 14:51     ` Jarod Wilson
2016-10-19 13:55   ` Sabrina Dubroca
2016-10-19 14:40     ` Jarod Wilson
2016-10-19 15:28       ` Sabrina Dubroca
2016-10-19 15:46         ` Jarod Wilson
2016-10-19  2:33 ` [PATCH net-next 5/6] net: use core MTU range checking in virt drivers Jarod Wilson
2016-10-19 13:06   ` Aaron Conole
2016-10-19 13:59   ` Michael S. Tsirkin
2016-10-19 14:03     ` Michael S. Tsirkin
2016-10-19 14:17       ` Jarod Wilson
2016-10-19 14:15     ` Jarod Wilson
2016-10-19 14:07   ` Haiyang Zhang via Virtualization
2016-10-19 14:23     ` Jarod Wilson
2016-10-19 22:21   ` Shrikrishna Khare
2016-10-19  2:33 ` [PATCH net-next 6/6] net: use core MTU range checking in misc drivers Jarod Wilson
2016-10-19 14:37   ` Robin Holt
2016-10-19 16:05   ` Sabrina Dubroca
2016-10-19 22:38     ` Stefan Richter
2016-10-20  3:16       ` Jarod Wilson
     [not found]         ` <20161020031641.GJ18569-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2016-10-22  9:36           ` Stefan Richter
2016-10-22 18:51             ` Stefan Richter
2016-10-19 19:10 ` [PATCH net-next 0/6] net: use core MTU range checking everywhere David Miller
2016-10-19 19:29   ` Jarod Wilson
2016-10-20 17:55 ` [PATCH net-next v2 0/9] " Jarod Wilson
2016-10-20 17:55   ` [PATCH net-next v2 1/9] ethernet: use net core MTU range checking in more drivers Jarod Wilson
2016-10-20 17:55   ` [PATCH net-next v2 2/9] net: use core MTU range checking in USB NIC drivers Jarod Wilson
2016-10-20 17:55   ` [PATCH net-next v2 3/9] net: use core MTU range checking in wireless drivers Jarod Wilson
2016-10-20 18:22     ` Johannes Berg
2016-10-20 18:38       ` David Miller
2016-10-20 17:55   ` [PATCH net-next v2 4/9] net: use core MTU range checking in WAN drivers Jarod Wilson
2016-10-20 17:55   ` [PATCH net-next v2 5/9] net: use core MTU range checking in core net infra Jarod Wilson
2016-10-20 17:55   ` [PATCH net-next v2 6/9] net: use core MTU range checking in virt drivers Jarod Wilson
2016-10-20 18:05     ` Haiyang Zhang
2016-10-20 20:12       ` Kershner, David A
2016-10-20 20:23     ` Michael S. Tsirkin
2016-10-21  2:37       ` Jarod Wilson
2016-10-21  3:36         ` Michael S. Tsirkin
2016-10-21 13:24           ` Aaron Conole
2016-10-21 10:09     ` Wei Liu
2016-10-20 17:55   ` [PATCH net-next v2 7/9] net: use core MTU range checking in misc drivers Jarod Wilson
2016-10-21  6:52     ` Rémi Denis-Courmont
2016-10-21 16:22     ` Sebastian Reichel
     [not found]     ` <20161020175524.6184-8-jarod-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2016-10-22  7:17       ` [net-next,v2,7/9] " Sven Eckelmann
2016-10-22 19:16     ` [PATCH net-next v2 7/9] " Stefan Richter
2016-10-22 19:27       ` Stefan Richter
2016-10-23  1:18         ` Jarod Wilson
2016-10-23 14:29           ` [PATCH net-next 1/2] firewire: net: fix maximum possible MTU Stefan Richter
2016-10-23 14:30             ` [PATCH net-next 2/2] firewire: net: set initial MTU = 1500 unconditionally, fix IPv6 on some CardBus cards Stefan Richter
2016-10-24  1:50               ` Jarod Wilson
2016-10-24 12:26                 ` [PATCH net-next 2/2 v2] " Stefan Richter
2016-10-25  3:05                   ` Jarod Wilson
2016-10-26 21:29               ` [PATCH net-next 2/2] " David Miller
2016-10-29 20:16               ` [PATCH net-next] firewire: net: really fix maximum possible MTU Stefan Richter
2016-10-30  3:01                 ` David Miller
2016-10-24  1:50             ` [PATCH net-next 1/2] firewire: net: " Jarod Wilson
2016-10-26 21:29             ` David Miller
2016-10-20 17:55   ` [PATCH net-next v2 8/9] s390/net: use net core MTU range checking Jarod Wilson
2016-10-20 17:55   ` [PATCH net-next v2 9/9] ipv4/6: use core net " Jarod Wilson
2016-10-20 18:53   ` [PATCH net-next v2 0/9] net: use core MTU range checking everywhere David Miller

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20161019141703.01ff8850@griffin \
    --to=jbenc@redhat.com \
    --cc=alexander.h.duyck@intel.com \
    --cc=daniel@iogearbox.net \
    --cc=hannes@stressinduktion.org \
    --cc=jarod@redhat.com \
    --cc=kaber@trash.net \
    --cc=linux-kernel@vger.kernel.org \
    --cc=netdev@vger.kernel.org \
    --cc=nicolas.dichtel@6wind.com \
    --cc=pabeni@redhat.com \
    --cc=pshelar@nicira.com \
    --cc=pshelar@ovn.org \
    --cc=roopa@cumulusnetworks.com \
    --cc=sd@queasysnail.net \
    --cc=stephen@networkplumber.org \
    --cc=tom@herbertland.com \
    --cc=xiyou.wangcong@gmail.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).