From 02ed00ae762831251da91d52738134116486c6c3 Mon Sep 17 00:00:00 2001 From: Marcelo Date: Mon, 28 Apr 2025 17:13:30 +0200 Subject: [PATCH] Delete vlan default GW interface Del command cleans up default vlan interface Signed-off-by: Marcelo --- plugins/main/bridge/bridge.go | 15 +++++++++++++++ plugins/main/bridge/bridge_test.go | 26 +++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/plugins/main/bridge/bridge.go b/plugins/main/bridge/bridge.go index a8a10f7c6..13295a43e 100644 --- a/plugins/main/bridge/bridge.go +++ b/plugins/main/bridge/bridge.go @@ -788,6 +788,21 @@ func cmdDel(args *skel.CmdArgs) error { return ipamDel() } + // remove the vlan default GW interface + if isLayer3 && n.IsDefaultGW && n.Vlan != 0 { + var linkNotFoundError netlink.LinkNotFoundError + + name := fmt.Sprintf("%s.%d", n.BrName, n.Vlan) + vlanIface, err := netlinksafe.LinkByName(name) + if err == nil { + if err = netlink.LinkDel(vlanIface); err != nil { + return err + } + } else if !errors.As(err, &linkNotFoundError) { + return err + } + } + // There is a netns so try to clean up. Delete can be called multiple times // so don't return an error if the device is already removed. // If the device isn't there then don't try to clean up IP masq either. diff --git a/plugins/main/bridge/bridge_test.go b/plugins/main/bridge/bridge_test.go index 50a4f15f2..4618e19b9 100644 --- a/plugins/main/bridge/bridge_test.go +++ b/plugins/main/bridge/bridge_test.go @@ -885,6 +885,14 @@ func (tester *testerV10x) cmdDelTest(tc testCase, dataDir string) { link, err := netlinksafe.LinkByName(tester.vethName) Expect(err).To(HaveOccurred()) Expect(link).To(BeNil()) + + if !tc.isLayer2 && tc.vlan != 0 { + // Make sure vlan link exists + vlanLink, err := netlinksafe.LinkByName(fmt.Sprintf("%s.%d", BRNAME, tc.vlan)) + Expect(err).To(HaveOccurred()) + Expect(vlanLink).To(BeNil()) + } + return nil }) Expect(err).NotTo(HaveOccurred()) @@ -1219,6 +1227,14 @@ func (tester *testerV04x) cmdDelTest(tc testCase, dataDir string) { link, err := netlinksafe.LinkByName(tester.vethName) Expect(err).To(HaveOccurred()) Expect(link).To(BeNil()) + + if !tc.isLayer2 && tc.vlan != 0 { + // Make sure vlan link exists + vlanLink, err := netlinksafe.LinkByName(fmt.Sprintf("%s.%d", BRNAME, tc.vlan)) + Expect(err).To(HaveOccurred()) + Expect(vlanLink).To(BeNil()) + } + return nil }) Expect(err).NotTo(HaveOccurred()) @@ -1440,7 +1456,7 @@ func (tester *testerV03x) cmdAddTest(tc testCase, dataDir string) (types.Result, func (tester *testerV03x) cmdCheckTest(_ testCase, _ *Net, _ string) { } -func (tester *testerV03x) cmdDelTest(_ testCase, _ string) { +func (tester *testerV03x) cmdDelTest(tc testCase, _ string) { err := tester.testNS.Do(func(ns.NetNS) error { defer GinkgoRecover() @@ -1470,6 +1486,14 @@ func (tester *testerV03x) cmdDelTest(_ testCase, _ string) { link, err := netlinksafe.LinkByName(tester.vethName) Expect(err).To(HaveOccurred()) Expect(link).To(BeNil()) + + if !tc.isLayer2 && tc.vlan != 0 { + // Make sure vlan link exists + vlanLink, err := netlinksafe.LinkByName(fmt.Sprintf("%s.%d", BRNAME, tc.vlan)) + Expect(err).To(HaveOccurred()) + Expect(vlanLink).To(BeNil()) + } + return nil }) Expect(err).NotTo(HaveOccurred())