Skip to contentSkip to conversation

New: Cannot set larger mtu on vlan then on underlying untagged device

Bugme-new Applied Andrew Morton 3 participants 4 messages Jun 9, 2009 – Jul 20, 2009 1 message not in the archive

Subsystems (2)
lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]/

#1 lore raw

(switched to email. Please respond via emailed reply-to-all, not via the bugzilla web interface).

Quoted 81 lines · On Sat, 6 Jun 2009 17:43:46 GMT [email protected] wrote:

http://bugzilla.kernel.org/show_bug.cgi?id=13467

           Summary: Cannot set larger mtu on vlan then on underlying
                    untagged device
           Product: Networking
           Version: 2.5
    Kernel Version: 2.6.27.24-170.2.68.fc10.i686
          Platform: All
        OS/Version: Linux
              Tree: Fedora
            Status: NEW
          Severity: normal
          Priority: P1
         Component: Other
        AssignedTo: [email protected]
        ReportedBy: [email protected]
        Regression: No

I want to create vlan interface which uses jumbo frames while underlying network device is still using standerd 1500 bytes frames. So I tried:

tkepczyx-mobl1:~# ip link show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP
qlen 100
    link/ether 00:0d:60:79:e0:9d brd ff:ff:ff:ff:ff:ff
tkepczyx-mobl1:~# vconfig add eth0 12
Added VLAN with VID == 12 to IF -:eth0:-
tkepczyx-mobl1:~# ip link set dev eth0.12 mtu 9000
RTNETLINK answers: Numerical result out of range

So I made sure that eth0 supports 9000 bytes mtu:

tkepczyx-mobl1:~# ip link set dev eth0 mtu 9000
tkepczyx-mobl1:~# ip link show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP
qlen 100
    link/ether 00:0d:60:79:e0:9d brd ff:ff:ff:ff:ff:ff

It apparently does. So I gave it another try:

tkepczyx-mobl1:~# ip link set dev eth0.12 mtu 9000
tkepczyx-mobl1:~# ip link show dev eth0.12
4: eth0.12@eth0: <BROADCAST,MULTICAST> mtu 9000 qdisc noop state DOWN
    link/ether 00:0d:60:79:e0:9d brd ff:ff:ff:ff:ff:ff

Now it worked. So lets decrease mtu on eth0:

tkepczyx-mobl1:~# ip link set dev eth0 mtu 1500
tkepczyx-mobl1:~# ip link show dev eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP
qlen 100
    link/ether 00:0d:60:79:e0:9d brd ff:ff:ff:ff:ff:ff
tkepczyx-mobl1:~# ip link show dev eth0.12
4: eth0.12@eth0: <BROADCAST,MULTICAST> mtu 9000 qdisc noop state DOWN
    link/ether 00:0d:60:79:e0:9d brd ff:ff:ff:ff:ff:ff

It also worked.
Now - if there is a reason which prevents me to increase mtu on vlan over mtu on underlyng device, the very same reason should have prevented me from decreasing mtu on underlying eth0 below mtu on eth0.12 vlan. This is a fault.

I started digging a bit in sources and there is one thing which rings a bell:
vlan_dev_change_mtu function in net/8021q/vlan_dev.c:

static int vlan_dev_change_mtu(struct net_device *dev, int new_mtu)

{
        /* TODO: gotta make sure the underlying layer can handle it,
         * maybe an IFF_VLAN_CAPABLE flag for devices?
         */
        if (vlan_dev_info(dev)->real_dev->mtu < new_mtu)
                return -ERANGE;

        dev->mtu = new_mtu;

        return 0;
}

My guess is that check in if() statement above is against currently configured mtu while it probably should check what physically device can transmit.

#2 lore raw
Quoted 3 lines · Andrew Morton
Quoted 3 lines

Summary: Cannot set larger mtu on vlan then on underlying
untagged device

Please try this patch.

vlan: Propagate physical MTU changes

When the physical MTU changes we want to ensure that all existing VLAN device MTUs do not exceed the new underlying MTU. This patch adds that propagation.

net/8021q/vlan.c +13 -0
index fe64908..6d37b7e 100644
@@ -468,6 +468,19 @@ static int vlan_device_event(struct notifier_block *unused, unsigned long event,
 		}
 		break;
 
+	case NETDEV_CHANGEMTU:
+		for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {
+			vlandev = vlan_group_get_device(grp, i);
+			if (!vlandev)
+				continue;
+
+			if (vlandev->mtu <= dev->mtu)
+				continue;
+
+			dev_set_mtu(vlandev, dev->mtu);
+		}
+		break;
+
 	case NETDEV_FEAT_CHANGE:
 		/* Propagate device features to underlying device */
 		for (i = 0; i < VLAN_GROUP_ARRAY_LEN; i++) {

Cheers,

Signature · 4 lines
Visit Openswan at http://www.openswan.org/
Email: Herbert Xu ~{PmV>HI~} <[email protected]>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
maintainer
#3 lore raw

From: Herbert Xu <[email protected]>
Date: Mon, 6 Jul 2009 18:19:50 +0800

Quoted 7 lines
Quoted 3 lines · Andrew Morton
Quoted 3 lines

Summary: Cannot set larger mtu on vlan then on underlying
untagged device

Please try this patch.

Quoted 7 lines

vlan: Propagate physical MTU changes

When the physical MTU changes we want to ensure that all existing VLAN device MTUs do not exceed the new underlying MTU. This patch adds that propagation.

Please can we have some test results for this patch? It's been more than a week since this patch and request for testing was posted.

Thanks.