[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