From: Jiri Pirko <jiri(a)mellanox.com>
Kernel exposes an interface primary used by bridge to work with internal
VLAN implementation. However, other devices (for example SR-IOV drivers)
implement this as well making this not bridge-specific.
Allow task to query device bridge VLAN settings. This is implemented
simply by calling "bridge" utility. This may be later on changed to
pyroute2 implementation, alas it does not implement PF_BRIDGE Netlink
at the moment.
Signed-off-by: Jiri Pirko <jiri(a)mellanox.com>
---
lnst/Controller/Machine.py | 3 +++
lnst/Controller/Task.py | 3 +++
lnst/Slave/BridgeTool.py | 17 +++++++++++++++++
lnst/Slave/NetTestSlave.py | 8 ++++++++
4 files changed, 31 insertions(+)
diff --git a/lnst/Controller/Machine.py b/lnst/Controller/Machine.py
index 9a1d914..6a17a08 100644
--- a/lnst/Controller/Machine.py
+++ b/lnst/Controller/Machine.py
@@ -771,6 +771,9 @@ class Interface(object):
self._machine._rpc_call_x(self._netns, "del_br_vlan",
self._id, br_vlan_info)
+ def get_br_vlans(self):
+ return self._machine._rpc_call_x(self._netns, "get_br_vlans",
self._id)
+
def add_br_fdb(self, br_fdb_info):
self._machine._rpc_call_x(self._netns, "add_br_fdb",
self._id, br_fdb_info)
diff --git a/lnst/Controller/Task.py b/lnst/Controller/Task.py
index eb35a33..5786ed3 100644
--- a/lnst/Controller/Task.py
+++ b/lnst/Controller/Task.py
@@ -546,6 +546,9 @@ class InterfaceAPI(object):
"untagged": untagged,
"self": self, "master": master})
+ def get_br_vlans(self):
+ return self._if.get_br_vlans()
+
def add_br_fdb(_self, hwaddr, self=False, master=False, vlan_tci=None):
_self._if.add_br_fdb({"hwaddr": hwaddr, "self": self,
"master": master,
"vlan_id": vlan_tci})
diff --git a/lnst/Slave/BridgeTool.py b/lnst/Slave/BridgeTool.py
index 1d87cd9..368b475 100644
--- a/lnst/Slave/BridgeTool.py
+++ b/lnst/Slave/BridgeTool.py
@@ -11,6 +11,7 @@ jiri(a)mellanox.com (Jiri Pirko)
"""
from lnst.Common.ExecCmd import exec_cmd
+import re
class BridgeTool:
def __init__(self, dev_name):
@@ -35,6 +36,22 @@ class BridgeTool:
def del_vlan(self, br_vlan_info):
return self._add_del_vlan("del", br_vlan_info)
+ def get_vlans(self):
+ output = exec_cmd("bridge vlan show dev %s" % self._dev_name,
+ die_on_err=False)[0]
+ br_vlan_info_list = []
+ for line in output.split("\n"):
+ match = re.match(r'.*\s+(\d+)', line)
+ if match:
+ vlan_id = int(match.groups()[0])
+ pvid = True if re.match(r'.*\s+PVID', line) else False
+ untagged = True if re.match(r'.*\s+Egress Untagged', line) \
+ else False
+ br_vlan_info = {"vlan_id": vlan_id, "pvid": pvid,
+ "untagged": untagged}
+ br_vlan_info_list.append(br_vlan_info)
+ return br_vlan_info_list
+
def _add_del_fdb(self, op, br_fdb_info):
cmd = "bridge fdb %s %s dev %s" % (op,
br_fdb_info["hwaddr"],
self._dev_name)
diff --git a/lnst/Slave/NetTestSlave.py b/lnst/Slave/NetTestSlave.py
index b257b50..4bfa445 100644
--- a/lnst/Slave/NetTestSlave.py
+++ b/lnst/Slave/NetTestSlave.py
@@ -711,6 +711,14 @@ class SlaveMethods:
brt.del_vlan(br_vlan_info)
return True
+ def get_br_vlans(self, if_id):
+ dev = self._if_manager.get_mapped_device(if_id)
+ if not dev:
+ logging.error("Device with id '%s' not found." % if_id)
+ return False
+ brt = BridgeTool(dev.get_name())
+ return brt.get_vlans()
+
def add_br_fdb(self, if_id, br_fdb_info):
dev = self._if_manager.get_mapped_device(if_id)
if not dev:
--
2.4.3