[lxc-devel] [lxd/master] Support GVRP on macvlan Networks

TimRots on Github <lxc-bot@linuxcontainers.org> TimRots on Github <lxc-bot@linuxcontainers.org>
Tue Jan 12 23:09:08 UTC 2021


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 364 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20210112/afbabd74/attachment.bin>
-------------- next part --------------
From 274d307a71bddc084f0d6f4a86bb99d8d6f1f41a Mon Sep 17 00:00:00 2001
From: Tim Rots <tim.rots at protonmail.ch>
Date: Wed, 13 Jan 2021 00:07:32 +0100
Subject: [PATCH] Support GVRP on macvlan Networks

Fixes #8318

Signed-off-by: Tim Rots <tim.rots at protonmail.ch>
---
 lxd/device/device_utils_network.go |  8 ++++++--
 lxd/device/nic_macvlan.go          |  7 ++++---
 lxd/network/driver_physical.go     |  2 +-
 lxd/network/network_utils.go       | 10 ++++++++--
 4 files changed, 19 insertions(+), 8 deletions(-)

diff --git a/lxd/device/device_utils_network.go b/lxd/device/device_utils_network.go
index 80aa53262f..6e89fa673d 100644
--- a/lxd/device/device_utils_network.go
+++ b/lxd/device/device_utils_network.go
@@ -101,9 +101,13 @@ func networkRemoveInterfaceIfNeeded(state *state.State, nic string, current inst
 }
 
 // networkCreateVlanDeviceIfNeeded creates a VLAN device if doesn't already exist.
-func networkCreateVlanDeviceIfNeeded(state *state.State, parent string, vlanDevice string, vlanID string) (string, error) {
+func networkCreateVlanDeviceIfNeeded(state *state.State, parent string, vlanDevice string, vlanID string, gvrp string) (string, error) {
 	if vlanID != "" {
-		created, err := network.VLANInterfaceCreate(parent, vlanDevice, vlanID)
+
+		if gvrp != "" {
+			gvrp = "gvrp on"
+		}
+		created, err := network.VLANInterfaceCreate(parent, vlanDevice, vlanID, gvrp)
 		if err != nil {
 			return "", err
 		}
diff --git a/lxd/device/nic_macvlan.go b/lxd/device/nic_macvlan.go
index c389eb2d51..4f33874034 100644
--- a/lxd/device/nic_macvlan.go
+++ b/lxd/device/nic_macvlan.go
@@ -36,13 +36,14 @@ func (d *nicMACVLAN) validateConfig(instConf instance.ConfigReader) error {
 		"maas.subnet.ipv4",
 		"maas.subnet.ipv6",
 		"boot.priority",
+		"gvrp",
 	}
 
 	// Check that if network proeperty is set that conflicting keys are not present.
 	if d.config["network"] != "" {
 		requiredFields = append(requiredFields, "network")
 
-		bannedKeys := []string{"nictype", "parent", "mtu", "vlan", "maas.subnet.ipv4", "maas.subnet.ipv6"}
+		bannedKeys := []string{"nictype", "parent", "mtu", "vlan", "maas.subnet.ipv4", "maas.subnet.ipv6", "gvrp"}
 		for _, bannedKey := range bannedKeys {
 			if d.config[bannedKey] != "" {
 				return fmt.Errorf("Cannot use %q property in conjunction with %q property", bannedKey, "network")
@@ -70,7 +71,7 @@ func (d *nicMACVLAN) validateConfig(instConf instance.ConfigReader) error {
 		d.config["parent"] = netConfig["parent"]
 
 		// Copy certain keys verbatim from the network's settings.
-		inheritKeys := []string{"mtu", "vlan", "maas.subnet.ipv4", "maas.subnet.ipv6"}
+		inheritKeys := []string{"mtu", "vlan", "maas.subnet.ipv4", "maas.subnet.ipv6", "gvrp"}
 		for _, inheritKey := range inheritKeys {
 			if _, found := netConfig[inheritKey]; found {
 				d.config[inheritKey] = netConfig[inheritKey]
@@ -125,7 +126,7 @@ func (d *nicMACVLAN) Start() (*deviceConfig.RunConfig, error) {
 	saveData["host_name"] = network.RandomDevName("mac")
 
 	// Create VLAN parent device if needed.
-	statusDev, err := networkCreateVlanDeviceIfNeeded(d.state, d.config["parent"], actualParentName, d.config["vlan"])
+	statusDev, err := networkCreateVlanDeviceIfNeeded(d.state, d.config["parent"], actualParentName, d.config["vlan"], d.config["gvrp"])
 	if err != nil {
 		return nil, err
 	}
diff --git a/lxd/network/driver_physical.go b/lxd/network/driver_physical.go
index 57c654b507..f24695a112 100644
--- a/lxd/network/driver_physical.go
+++ b/lxd/network/driver_physical.go
@@ -152,7 +152,7 @@ func (n *physical) Start() error {
 	defer revert.Fail()
 
 	hostName := GetHostDevice(n.config["parent"], n.config["vlan"])
-	created, err := VLANInterfaceCreate(n.config["parent"], hostName, n.config["vlan"])
+	created, err := VLANInterfaceCreate(n.config["parent"], hostName, n.config["vlan"], n.config["gvrp"])
 	if err != nil {
 		return err
 	}
diff --git a/lxd/network/network_utils.go b/lxd/network/network_utils.go
index fb488b212d..4e7f40d76c 100644
--- a/lxd/network/network_utils.go
+++ b/lxd/network/network_utils.go
@@ -1023,7 +1023,7 @@ func parseIPRanges(ipRangesList string, allowedNets ...*net.IPNet) ([]*shared.IP
 
 // VLANInterfaceCreate creates a VLAN interface on parent interface (if needed).
 // Returns boolean indicating if VLAN interface was created.
-func VLANInterfaceCreate(parent string, vlanDevice string, vlanID string) (bool, error) {
+func VLANInterfaceCreate(parent string, vlanDevice string, vlanID string, gvrp string) (bool, error) {
 	if vlanID == "" {
 		return false, nil
 	}
@@ -1032,6 +1032,12 @@ func VLANInterfaceCreate(parent string, vlanDevice string, vlanID string) (bool,
 		return false, nil
 	}
 
+	// set optional gvrp flag
+	gvrpOptionString := ""
+	if gvrp != "" {
+		gvrpOptionString := "gvrp on"
+	}
+
 	// Bring the parent interface up so we can add a vlan to it.
 	_, err := shared.RunCommand("ip", "link", "set", "dev", parent, "up")
 	if err != nil {
@@ -1039,7 +1045,7 @@ func VLANInterfaceCreate(parent string, vlanDevice string, vlanID string) (bool,
 	}
 
 	// Add VLAN interface on top of parent.
-	_, err = shared.RunCommand("ip", "link", "add", "link", parent, "name", vlanDevice, "up", "type", "vlan", "id", vlanID)
+	_, err = shared.RunCommand("ip", "link", "add", "link", parent, "name", vlanDevice, "up", "type", "vlan", "id", vlanID, gvrpOptionString)
 	if err != nil {
 		return false, errors.Wrapf(err, "Failed to create VLAN interface %q on %q", vlanDevice, parent)
 	}


More information about the lxc-devel mailing list