]> git.ipfire.org Git - thirdparty/lxc.git/commitdiff
network: Restores phys device MTU on container shutdown
authorThomas Parrott <thomas.parrott@canonical.com>
Thu, 9 May 2019 15:40:08 +0000 (16:40 +0100)
committerChristian Brauner <christian.brauner@ubuntu.com>
Sat, 18 May 2019 09:53:51 +0000 (11:53 +0200)
The phys devices will now have their original MTUs recorded at start and restored at shutdown.

This is to protect the original phys device from having any container level MTU customisation being applied to the device once it is restored to the host.

Signed-off-by: Thomas Parrott <thomas.parrott@canonical.com>
src/lxc/network.c
src/lxc/network.h

index 0c367163ca3dc3d9c439617753e01352ace25a11..f717cf42166d54d17bbf7475dfa696a611d2139d 100644 (file)
@@ -355,7 +355,7 @@ static int instantiate_vlan(struct lxc_handler *handler, struct lxc_netdev *netd
 
 static int instantiate_phys(struct lxc_handler *handler, struct lxc_netdev *netdev)
 {
-       int err;
+       int err, mtu_orig = 0;
        unsigned int mtu = 0;
 
        if (netdev->link[0] == '\0') {
@@ -381,6 +381,15 @@ static int instantiate_phys(struct lxc_handler *handler, struct lxc_netdev *netd
         */
        netdev->priv.phys_attr.ifindex = netdev->ifindex;
 
+       /* Get original device MTU setting and store for restoration after container shutdown. */
+       mtu_orig = netdev_get_mtu(netdev->ifindex);
+       if (mtu_orig < 0) {
+               SYSERROR("Failed to get original mtu for interface \"%s\"", netdev->link);
+               return minus_one_set_errno(-mtu_orig);
+       }
+
+       netdev->priv.phys_attr.mtu = mtu_orig;
+
        if (netdev->mtu) {
                err = lxc_safe_uint(netdev->mtu, &mtu);
                if (err < 0) {
@@ -2626,11 +2635,22 @@ bool lxc_delete_network_priv(struct lxc_handler *handler)
                                WARN("Failed to rename interface with index %d "
                                     "from \"%s\" to its initial name \"%s\"",
                                     netdev->ifindex, netdev->name, netdev->link);
-                       else
+                       else {
                                TRACE("Renamed interface with index %d from "
                                      "\"%s\" to its initial name \"%s\"",
                                      netdev->ifindex, netdev->name,
                                      netdev->link);
+
+                               /* Restore original MTU */
+                               ret = lxc_netdev_set_mtu(netdev->link, netdev->priv.phys_attr.mtu);
+                               if (ret < 0) {
+                                       WARN("Failed to set interface \"%s\" to its initial mtu \"%d\"",
+                                               netdev->link, netdev->priv.phys_attr.mtu);
+                               } else {
+                                       TRACE("Restored interface \"%s\" to its initial mtu \"%d\"",
+                                               netdev->link, netdev->priv.phys_attr.mtu);
+                               }
+                       }
                        goto clear_ifindices;
                }
 
index ef1b41b897a3f76a3a82175851c3152e92782df3..45d31867e7b38e72496c8df99eb9e82c9d126846 100644 (file)
@@ -114,6 +114,7 @@ struct ifla_macvlan {
  */
 struct ifla_phys {
        int ifindex;
+       int mtu;
 };
 
 union netdev_p {