From adfd0191b4ad7e5bf60cdb635f55401297e3f1f8 Mon Sep 17 00:00:00 2001 From: Jipan Yang Date: Mon, 29 Jul 2019 18:06:02 -0700 Subject: [PATCH] Fix VLAN error introduced with new 4.9 kernel behavior Signed-off-by: Jipan Yang --- cfgmgr/vlanmgr.cpp | 12 ++++++++++-- tests/test_vlan.py | 8 ++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/cfgmgr/vlanmgr.cpp b/cfgmgr/vlanmgr.cpp index 3d39488aaa..fc5949252e 100644 --- a/cfgmgr/vlanmgr.cpp +++ b/cfgmgr/vlanmgr.cpp @@ -51,13 +51,19 @@ VlanMgr::VlanMgr(DBConnector *cfgDb, DBConnector *appDb, DBConnector *stateDb, c // The command should be generated as: // /bin/bash -c "/sbin/ip link del Bridge 2>/dev/null ; // /sbin/ip link add Bridge up type bridge && - // /sbin/bridge vlan del vid 1 dev Bridge self" + // /sbin/bridge vlan del vid 1 dev Bridge self; + // /sbin/ip link del dummy 2>/dev/null; + // /sbin/ip link add dummy type dummy && + // sbin/ip link set dummy master Bridge" const std::string cmds = std::string("") + BASH_CMD + " -c \"" + IP_CMD + " link del " + DOT1Q_BRIDGE_NAME + " 2>/dev/null; " + IP_CMD + " link add " + DOT1Q_BRIDGE_NAME + " up type bridge && " - + BRIDGE_CMD + " vlan del vid " + DEFAULT_VLAN_ID + " dev " + DOT1Q_BRIDGE_NAME + " self\""; + + BRIDGE_CMD + " vlan del vid " + DEFAULT_VLAN_ID + " dev " + DOT1Q_BRIDGE_NAME + " self; " + + IP_CMD + " link del dev dummy 2>/dev/null; " + + IP_CMD + " link add dummy type dummy && " + + IP_CMD + " link set dummy master " + DOT1Q_BRIDGE_NAME + "\""; std::string res; EXEC_WITH_ERROR_THROW(cmds, res); @@ -169,10 +175,12 @@ bool VlanMgr::addHostVlanMember(int vlan_id, const string &port_alias, const str // The command should be generated as: // /bin/bash -c "/sbin/ip link set {{port_alias}} master Bridge && + // /sbin/bridge vlan del vid 1 dev {{ port_alias }} && // /sbin/bridge vlan add vid {{vlan_id}} dev {{port_alias}} {{tagging_mode}}" const std::string cmds = std::string("") + BASH_CMD + " -c \"" + IP_CMD + " link set " + port_alias + " master " + DOT1Q_BRIDGE_NAME + " && " + + BRIDGE_CMD + " vlan del vid " + DEFAULT_VLAN_ID + " dev " + port_alias + " && " + BRIDGE_CMD + " vlan add vid " + std::to_string(vlan_id) + " dev " + port_alias + " " + tagging_cmd + "\""; std::string res; diff --git a/tests/test_vlan.py b/tests/test_vlan.py index aa0df6c122..95ebc8d3e4 100644 --- a/tests/test_vlan.py +++ b/tests/test_vlan.py @@ -155,6 +155,14 @@ def test_MultipleVlan(self, dvs, testlog): vlan_member_entries = tbl.getKeys() assert len(vlan_member_entries) == 0 + # member ports should have been detached from bridge master properly + exitcode, output = dvs.runcmd(['sh', '-c', "ip link show Ethernet20 | grep -w master"]) + assert exitcode != 0 + exitcode, output = dvs.runcmd(['sh', '-c', "ip link show Ethernet24 | grep -w master"]) + assert exitcode != 0 + exitcode, output = dvs.runcmd(['sh', '-c', "ip link show Ethernet28 | grep -w master"]) + assert exitcode != 0 + # remove vlans dvs.remove_vlan("18") dvs.remove_vlan("188")