Add functions to set mcast flood on\off on an interface that is a bridge
slave. Add a similar support to set mrouter port state.
Mcast flood flag decides whether multicast packets should be flooded to a
port when multicast snooping is disabled. Default is on.
Mrouter port state can be fixed on, fixed off or learning, where the later
indicates that the mrouter state should be learned according to IGMP
queries. If a port is set to be mrouter port, all multicast packets will be
flooded to it, when multicast snooping is enabled.
Signed-off-by: Nogah Frankel <nogahf(a)mellanox.com>
Reviewed-by: Yotam Gigi <yotamg(a)mellanox.com>
---
lnst/Controller/Machine.py | 7 +++++++
lnst/Controller/Task.py | 6 ++++++
lnst/Slave/InterfaceManager.py | 13 +++++++++++++
lnst/Slave/NetTestSlave.py | 18 ++++++++++++++++++
4 files changed, 44 insertions(+)
diff --git a/lnst/Controller/Machine.py b/lnst/Controller/Machine.py
index fe196ad..7077018 100644
--- a/lnst/Controller/Machine.py
+++ b/lnst/Controller/Machine.py
@@ -966,6 +966,13 @@ class Interface(object):
self._machine._rpc_call_x(self._netns, "set_br_state", self._id,
br_state_info)
+ def set_mcast_flood(self, on):
+ self._machine._rpc_call_x(self._netns, "set_mcast_flood", self._id,
on)
+
+ def set_mcast_router(self, state):
+ self._machine._rpc_call_x(self._netns, "set_mcast_router", self._id,
+ state)
+
def set_speed(self, speed):
self._machine._rpc_call_x(self._netns, "set_speed", self._id, speed)
diff --git a/lnst/Controller/Task.py b/lnst/Controller/Task.py
index b5080d2..daf52ab 100644
--- a/lnst/Controller/Task.py
+++ b/lnst/Controller/Task.py
@@ -700,6 +700,12 @@ class InterfaceAPI(object):
def set_br_state(_self, state, self=False, master=False):
_self._if.set_br_state({"state": state, "self": self,
"master": master})
+ def set_mcast_flood(self, on):
+ return self._if.set_mcast_flood(on)
+
+ def set_mcast_router(self, state):
+ return self._if.set_mcast_router(state)
+
def set_speed(self, speed):
return self._if.set_speed(speed)
diff --git a/lnst/Slave/InterfaceManager.py b/lnst/Slave/InterfaceManager.py
index b21c962..e6399b3 100644
--- a/lnst/Slave/InterfaceManager.py
+++ b/lnst/Slave/InterfaceManager.py
@@ -797,3 +797,16 @@ class Device(object):
def set_pause_off(self):
exec_cmd("ethtool -A %s rx off tx off autoneg off" % self._name,
die_on_err=False)
+
+ def set_mcast_flood(self, on = True):
+ cmd = "ip link set dev %s type bridge_slave mcast_flood " % self._name
+ if on:
+ cmd += "on"
+ else:
+ cmd += "off"
+ exec_cmd(cmd)
+
+ def set_mcast_router(self, state):
+ cmd = "ip link set dev %s type bridge_slave mcast_router %d" % \
+ (self._name, state)
+ exec_cmd(cmd)
diff --git a/lnst/Slave/NetTestSlave.py b/lnst/Slave/NetTestSlave.py
index ddbfe72..8a39f90 100644
--- a/lnst/Slave/NetTestSlave.py
+++ b/lnst/Slave/NetTestSlave.py
@@ -1031,6 +1031,24 @@ class SlaveMethods:
return False
return True
+ def set_mcast_flood(self, if_id, on):
+ dev = self._if_manager.get_mapped_device(if_id)
+ if dev is not None:
+ dev.set_mcast_flood(on)
+ else:
+ logging.error("Device with id '%s' not found." % if_id)
+ return False
+ return True
+
+ def set_mcast_router(self, if_id, state):
+ dev = self._if_manager.get_mapped_device(if_id)
+ if dev is not None:
+ dev.set_mcast_router(state)
+ else:
+ logging.error("Device with id '%s' not found." % if_id)
+ return False
+ return True
+
class ServerHandler(ConnectionHandler):
def __init__(self, addr):
super(ServerHandler, self).__init__()
--
2.4.3