The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/6078
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === It has come to my attention that there is a feature in LXD bridged NIC devices that will inherit the MTU of the parent device if not overriden using the `mtu` device property. This issue existed in at least LXD 3.15, but only during hot-plug, as LXD used liblxc's MTU inheritance feature for boot time setup. However in LXD 3.16 the boot-time and hot-plug device setup code was unified and this bug is now present also during boot-time setup.
From cac95d8390634ecdec6e16f2d0fdb70e3a979a1d Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Wed, 14 Aug 2019 12:19:50 +0100 Subject: [PATCH 1/2] device/device/utils/network: Add support for MTU inheriting from parent on bridged devices If custom mtu setting is not supplied, and parent is supplied, then MTU is inherited from parent device. Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- lxd/device/device_utils_network.go | 34 +++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/lxd/device/device_utils_network.go b/lxd/device/device_utils_network.go index 0596916789..dbf4c9501d 100644 --- a/lxd/device/device_utils_network.go +++ b/lxd/device/device_utils_network.go @@ -268,20 +268,22 @@ func NetworkAttachInterface(netName string, devName string) error { return nil } -// networkCreateVethPair creates and configures a veth pair. It accepts the name of the host side -// interface as a parameter and returns the peer interface name. +// networkCreateVethPair creates and configures a veth pair. It will set the hwaddr and mtu settings +// in the supplied config to the newly created peer interface. If mtu is not specified, but parent +// is supplied in config, then the MTU of the new peer interface will inherit the parent MTU. +// Accepts the name of the host side interface as a parameter and returns the peer interface name. func networkCreateVethPair(hostName string, m config.Device) (string, error) { peerName := NetworkRandomDevName("veth") _, err := shared.RunCommand("ip", "link", "add", "dev", hostName, "type", "veth", "peer", "name", peerName) if err != nil { - return "", fmt.Errorf("Failed to create the veth interfaces %s and %s: %s", hostName, peerName, err) + return "", fmt.Errorf("Failed to create the veth interfaces %s and %s: %v", hostName, peerName, err) } _, err = shared.RunCommand("ip", "link", "set", "dev", hostName, "up") if err != nil { NetworkRemoveInterface(hostName) - return "", fmt.Errorf("Failed to bring up the veth interface %s: %s", hostName, err) + return "", fmt.Errorf("Failed to bring up the veth interface %s: %v", hostName, err) } // Set the MAC address on peer. @@ -289,16 +291,32 @@ func networkCreateVethPair(hostName string, m config.Device) (string, error) { _, err := shared.RunCommand("ip", "link", "set", "dev", peerName, "address", m["hwaddr"]) if err != nil { NetworkRemoveInterface(peerName) - return "", fmt.Errorf("Failed to set the MAC address: %s", err) + return "", fmt.Errorf("Failed to set the MAC address: %v", err) } } - // Set the MTU on peer. + // Set the MTU on peer. If not specified and has parent, will inherit MTU from parent. if m["mtu"] != "" { - _, err := shared.RunCommand("ip", "link", "set", "dev", peerName, "mtu", m["mtu"]) + MTU, err := strconv.ParseUint(m["mtu"], 10, 32) + if err != nil { + return "", fmt.Errorf("Invalid MTU specified: %v", err) + + } + + err = NetworkSetDevMTU(peerName, MTU) + if err != nil { + NetworkRemoveInterface(peerName) + return "", fmt.Errorf("Failed to set the MTU: %v", err) + } + } else if m["parent"] != "" { + parentMTU, err := NetworkGetDevMTU(m["parent"]) + if err != nil { + return "", fmt.Errorf("Failed to get the parent MTU: %v", err) + } + err = NetworkSetDevMTU(peerName, parentMTU) if err != nil { NetworkRemoveInterface(peerName) - return "", fmt.Errorf("Failed to set the MTU: %s", err) + return "", fmt.Errorf("Failed to set the MTU: %v", err) } } From 550878119d5dd253f65af0f74538d3d2ad1559f8 Mon Sep 17 00:00:00 2001 From: Thomas Parrott <thomas.parr...@canonical.com> Date: Wed, 14 Aug 2019 12:20:45 +0100 Subject: [PATCH 2/2] test: Adds test for bridged parent MTU inheritance Signed-off-by: Thomas Parrott <thomas.parr...@canonical.com> --- test/suites/container_devices_nic_bridged.sh | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/test/suites/container_devices_nic_bridged.sh b/test/suites/container_devices_nic_bridged.sh index 7c1917f732..d531e7d9f0 100644 --- a/test/suites/container_devices_nic_bridged.sh +++ b/test/suites/container_devices_nic_bridged.sh @@ -257,6 +257,14 @@ test_container_devices_nic_bridged() { false fi + # Check that MTU is inherited from parent device when not specified on device. + lxc network set "${brName}" bridge.mtu "1405" + lxc config device unset "${ctName}" eth0 mtu + if ! lxc exec "${ctName}" -- grep "1405" /sys/class/net/eth0/mtu ; then + echo "mtu not inherited from parent" + false + fi + lxc network unset "${brName}" bridge.mtu # Add an external 3rd party route to the bridge interface and check that it and the container # routes remain when the network is reconfigured.
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel