the subject says it all really. this is necessary if you want to
stack vlans on trunks, and have trunk with a lower mtu than the
vlans on top of it.
eg, here i have a setup where most of the hosts connectivity is on a trunk
interface, but i want to talk iscsi on a subnet using jumbos:
bge0: flags=8b43<UP,BROADCAST,RUNNING,PROMISC,ALLMULTI,SIMPLEX,MULTICAST> mtu
1500
lladdr 00:14:4f:a9:34:90
priority: 0
trunk: trunkdev trunk45
media: Ethernet autoselect (1000baseT full-duplex)
status: active
bge1: flags=8b43<UP,BROADCAST,RUNNING,PROMISC,ALLMULTI,SIMPLEX,MULTICAST> mtu
1500
lladdr 00:14:4f:a9:34:90
priority: 0
trunk: trunkdev trunk45
media: Ethernet autoselect (none)
status: no carrier
trunk45: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
lladdr 00:14:4f:a9:34:90
priority: 0
trunk: trunkproto lacp
trunk id: [(8000,00:14:4f:a9:34:90,404C,0000,0000),
(8000,00:21:55:b1:2d:80,002D,0000,0000)]
trunkport bge1
trunkport bge0 active,collecting,distributing
groups: trunk egress
media: Ethernet autoselect
status: active
inet 192.168.0.1 netmask 0xffffff00 broadcast 192.168.0.255
vlan384: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 9000
lladdr 00:14:4f:a9:34:90
priority: 0
vlan: 384 parent interface: trunk45
groups: vlan
status: active
inet 172.23.94.7 netmask 0xffffffc0 broadcast 172.23.94.63
without this diff i cant raise the mtu on the vlan interface without
raising it on the trunk first.
the caveat with this is trunk doesnt know if a sub interface (eg,
vlan) is using a jumbo mtu, so cant/wont check if adding a trunk
port will lower the hardmtu and upset things.
thoughts?
Index: if_trunk.c
===================================================================
RCS file: /cvs/src/sys/net/if_trunk.c,v
retrieving revision 1.99
diff -u -p -r1.99 if_trunk.c
--- if_trunk.c 15 May 2015 10:15:13 -0000 1.99
+++ if_trunk.c 26 May 2015 03:02:09 -0000
@@ -315,11 +315,18 @@ trunk_port_create(struct trunk_softc *tr
printf("%s: first port, setting trunk mtu %u\n",
tr->tr_ifname, ifp->if_mtu);
tr->tr_ac.ac_if.if_mtu = ifp->if_mtu;
- tr->tr_ac.ac_if.if_hardmtu = ifp->if_mtu;
- } else if (tr->tr_ac.ac_if.if_mtu != ifp->if_mtu) {
- printf("%s: adding %s failed, MTU %u != %u\n", tr->tr_ifname,
- ifp->if_xname, ifp->if_mtu, tr->tr_ac.ac_if.if_mtu);
- return (EINVAL);
+ tr->tr_ac.ac_if.if_hardmtu = ifp->if_hardmtu;
+ } else {
+ u_int hardmtu = MIN(ifp->if_hardmtu,
+ tr->tr_ac.ac_if.if_hardmtu);
+
+ if (tr->tr_ac.ac_if.if_mtu > hardmtu) {
+ printf("%s: adding %s failed, MTU %u > hard MTU%u\n",
+ tr->tr_ifname, ifp->if_xname,
+ tr->tr_ac.ac_if.if_mtu, ifp->if_hardmtu);
+ return (EINVAL);
+ }
+ tr->tr_ac.ac_if.if_hardmtu = hardmtu;
}
if ((error = ifpromisc(ifp, 1)) != 0)