[lxc-devel] [lxd/master] VM: Bridged TAP interface, host side "tap" name prefix

tomponline on Github lxc-bot at linuxcontainers.org
Mon Jan 20 11:58:14 UTC 2020


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200120/f0faa0d2/attachment.bin>
-------------- next part --------------
From 0b7c5b22b6c76b7e02a29b284c2f05ce263b977a Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 20 Jan 2020 11:56:26 +0000
Subject: [PATCH 1/2] lxd/device/device/utils/network: Adds host MTU support
 for VM tap devices

Also improves revert logic.

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/device/device_utils_network.go | 38 ++++++++++++++++++++++++++----
 1 file changed, 34 insertions(+), 4 deletions(-)

diff --git a/lxd/device/device_utils_network.go b/lxd/device/device_utils_network.go
index 02016faa24..29982b6b0c 100644
--- a/lxd/device/device_utils_network.go
+++ b/lxd/device/device_utils_network.go
@@ -13,8 +13,11 @@ import (
 	"strings"
 	"sync"
 
+	"github.com/pkg/errors"
+
 	deviceConfig "github.com/lxc/lxd/lxd/device/config"
 	"github.com/lxc/lxd/lxd/instance"
+	"github.com/lxc/lxd/lxd/revert"
 	"github.com/lxc/lxd/lxd/state"
 	"github.com/lxc/lxd/lxd/util"
 	"github.com/lxc/lxd/shared"
@@ -367,18 +370,45 @@ func networkCreateVethPair(hostName string, m deviceConfig.Device) (string, erro
 }
 
 // networkCreateTap creates and configures a TAP device.
-func networkCreateTap(hostName string) error {
+func networkCreateTap(hostName string, m deviceConfig.Device) error {
 	_, err := shared.RunCommand("ip", "tuntap", "add", "name", hostName, "mode", "tap")
 	if err != nil {
-		return fmt.Errorf("Failed to create the tap interfaces %s: %v", hostName, err)
+		return errors.Wrapf(err, "Failed to create the tap interfaces %s", hostName)
 	}
 
+	revert := revert.New()
+	defer revert.Fail()
+
 	_, err = shared.RunCommand("ip", "link", "set", "dev", hostName, "up")
 	if err != nil {
-		NetworkRemoveInterface(hostName)
-		return fmt.Errorf("Failed to bring up the tap interface %s: %v", hostName, err)
+		return errors.Wrapf(err, "Failed to bring up the tap interface %s", hostName)
+	}
+	revert.Add(func() { NetworkRemoveInterface(hostName) })
+
+	// Set the MTU on peer. If not specified and has parent, will inherit MTU from parent.
+	if m["mtu"] != "" {
+		MTU, err := strconv.ParseUint(m["mtu"], 10, 32)
+		if err != nil {
+			return errors.Wrapf(err, "Invalid MTU specified", err)
+		}
+
+		err = NetworkSetDevMTU(hostName, MTU)
+		if err != nil {
+			return errors.Wrapf(err, "Failed to set the MTU")
+		}
+	} else if m["parent"] != "" {
+		parentMTU, err := NetworkGetDevMTU(m["parent"])
+		if err != nil {
+			return errors.Wrapf(err, "Failed to get the parent MTU")
+		}
+
+		err = NetworkSetDevMTU(hostName, parentMTU)
+		if err != nil {
+			return errors.Wrapf(err, "Failed to set the MTU")
+		}
 	}
 
+	revert.Success()
 	return nil
 }
 

From a65c53d2522f48146e159e7061610372f669416b Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 20 Jan 2020 11:57:15 +0000
Subject: [PATCH 2/2] lxd/device/nic/bridged: Makes VM host side TAP interface
 name prefixed with "tap"

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/device/nic_bridged.go | 13 ++++++++-----
 1 file changed, 8 insertions(+), 5 deletions(-)

diff --git a/lxd/device/nic_bridged.go b/lxd/device/nic_bridged.go
index d34d7d6aeb..0428adbbd4 100644
--- a/lxd/device/nic_bridged.go
+++ b/lxd/device/nic_bridged.go
@@ -119,18 +119,21 @@ func (d *nicBridged) Start() (*deviceConfig.RunConfig, error) {
 
 	saveData := make(map[string]string)
 	saveData["host_name"] = d.config["host_name"]
-	if saveData["host_name"] == "" {
-		saveData["host_name"] = NetworkRandomDevName("veth")
-	}
 
-	var peerName string // Only used with containers, empty for VMs.
+	var peerName string
 
 	// Create veth pair and configure the peer end with custom hwaddr and mtu if supplied.
 	if d.inst.Type() == instancetype.Container {
+		if saveData["host_name"] == "" {
+			saveData["host_name"] = NetworkRandomDevName("veth")
+		}
 		peerName, err = networkCreateVethPair(saveData["host_name"], d.config)
 	} else if d.inst.Type() == instancetype.VM {
+		if saveData["host_name"] == "" {
+			saveData["host_name"] = NetworkRandomDevName("tap")
+		}
 		peerName = saveData["host_name"] // VMs use the host_name to link to the TAP FD.
-		err = networkCreateTap(saveData["host_name"])
+		err = networkCreateTap(saveData["host_name"], d.config)
 	}
 
 	if err != nil {


More information about the lxc-devel mailing list