When a netdev is member in a bridge it's possible for the user to
specify whether the FDB should be populated with entries pointing to the
device.
Add the set_br_learning() method, which configures learning.
Acked-by: Jiri Pirko <jiri(a)mellanox.com>
Signed-off-by: Ido Schimmel <idosch(a)mellanox.com>
---
lnst/Controller/Machine.py | 4 ++++
lnst/Controller/Task.py | 3 +++
lnst/Slave/BridgeTool.py | 15 +++++++++++++++
lnst/Slave/NetTestSlave.py | 9 +++++++++
4 files changed, 31 insertions(+)
diff --git a/lnst/Controller/Machine.py b/lnst/Controller/Machine.py
index 755a2dd..4de0a35 100644
--- a/lnst/Controller/Machine.py
+++ b/lnst/Controller/Machine.py
@@ -788,6 +788,10 @@ class Interface(object):
def get_br_fdbs(self):
return self._machine._rpc_call_x(self._netns, "get_br_fdbs", self._id)
+ def set_br_learning(self, br_learning_info):
+ self._machine._rpc_call_x(self._netns, "set_br_learning", self._id,
+ br_learning_info)
+
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 40f531b..46a885f 100644
--- a/lnst/Controller/Task.py
+++ b/lnst/Controller/Task.py
@@ -566,6 +566,9 @@ class InterfaceAPI(object):
def get_br_fdbs(self):
return self._if.get_br_fdbs()
+ def set_br_learning(_self, on=True, self=False, master=False):
+ _self._if.set_br_learning({"on": on, "self": self,
"master": master})
+
def set_speed(self, speed):
return self._if.set_speed(speed)
diff --git a/lnst/Slave/BridgeTool.py b/lnst/Slave/BridgeTool.py
index b17d246..fba630e 100644
--- a/lnst/Slave/BridgeTool.py
+++ b/lnst/Slave/BridgeTool.py
@@ -87,3 +87,18 @@ class BridgeTool:
"self": self, "master": master,
"offload": offload}
br_fdb_info_list.append(br_fdb_info)
return br_fdb_info_list
+
+ def _set_link(self, attr, br_link_info):
+ cmd = "bridge link set dev %s %s" % (self._dev_name, attr)
+ if br_link_info["on"]:
+ cmd += " on"
+ else:
+ cmd += " off"
+ if br_link_info["self"]:
+ cmd += " self"
+ if br_link_info["master"]:
+ cmd += " master"
+ exec_cmd(cmd)
+
+ def set_learning(self, br_learning_info):
+ return self._set_link("learning", br_learning_info)
diff --git a/lnst/Slave/NetTestSlave.py b/lnst/Slave/NetTestSlave.py
index 5569f07..327d34f 100644
--- a/lnst/Slave/NetTestSlave.py
+++ b/lnst/Slave/NetTestSlave.py
@@ -745,6 +745,15 @@ class SlaveMethods:
brt = BridgeTool(dev.get_name())
return brt.get_fdbs()
+ def set_br_learning(self, if_id, br_learning_info):
+ 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())
+ brt.set_learning(br_learning_info)
+ return True
+
def set_speed(self, if_id, speed):
dev = self._if_manager.get_mapped_device(if_id)
if dev is not None:
--
2.4.10
Show replies by date
When a netdev is member in a bridge it's possible for the user to
specify whether FDB entries learned on the port in hardware should be
synced with the software bridge FDB.
Add the set_br_learning_sync() method, which configures learning sync.
Acked-by: Jiri Pirko <jiri(a)mellanox.com>
Signed-off-by: Ido Schimmel <idosch(a)mellanox.com>
---
lnst/Controller/Machine.py | 4 ++++
lnst/Controller/Task.py | 4 ++++
lnst/Slave/BridgeTool.py | 3 +++
lnst/Slave/NetTestSlave.py | 9 +++++++++
4 files changed, 20 insertions(+)
diff --git a/lnst/Controller/Machine.py b/lnst/Controller/Machine.py
index 4de0a35..2213f03 100644
--- a/lnst/Controller/Machine.py
+++ b/lnst/Controller/Machine.py
@@ -792,6 +792,10 @@ class Interface(object):
self._machine._rpc_call_x(self._netns, "set_br_learning", self._id,
br_learning_info)
+ def set_br_learning_sync(self, br_learning_sync_info):
+ self._machine._rpc_call_x(self._netns, "set_br_learning_sync",
self._id,
+ br_learning_sync_info)
+
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 46a885f..80e6e1b 100644
--- a/lnst/Controller/Task.py
+++ b/lnst/Controller/Task.py
@@ -569,6 +569,10 @@ class InterfaceAPI(object):
def set_br_learning(_self, on=True, self=False, master=False):
_self._if.set_br_learning({"on": on, "self": self,
"master": master})
+ def set_br_learning_sync(_self, on=True, self=False, master=False):
+ _self._if.set_br_learning_sync({"on": on, "self": self,
+ "master": master})
+
def set_speed(self, speed):
return self._if.set_speed(speed)
diff --git a/lnst/Slave/BridgeTool.py b/lnst/Slave/BridgeTool.py
index fba630e..71f80cd 100644
--- a/lnst/Slave/BridgeTool.py
+++ b/lnst/Slave/BridgeTool.py
@@ -102,3 +102,6 @@ class BridgeTool:
def set_learning(self, br_learning_info):
return self._set_link("learning", br_learning_info)
+
+ def set_learning_sync(self, br_learning_sync_info):
+ return self._set_link("learning_sync", br_learning_sync_info)
diff --git a/lnst/Slave/NetTestSlave.py b/lnst/Slave/NetTestSlave.py
index 327d34f..830dc00 100644
--- a/lnst/Slave/NetTestSlave.py
+++ b/lnst/Slave/NetTestSlave.py
@@ -754,6 +754,15 @@ class SlaveMethods:
brt.set_learning(br_learning_info)
return True
+ def set_br_learning_sync(self, if_id, br_learning_sync_info):
+ 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())
+ brt.set_learning_sync(br_learning_sync_info)
+ return True
+
def set_speed(self, if_id, speed):
dev = self._if_manager.get_mapped_device(if_id)
if dev is not None:
--
2.4.10
When a netdev is member in a bridge it's possible for the user to
specify whether unicast packets for which there is no matching FDB entry
should be flooded through the port or not.
Add the set_br_flooding() method, which configures flooding.
Acked-by: Jiri Pirko <jiri(a)mellanox.com>
Signed-off-by: Ido Schimmel <idosch(a)mellanox.com>
---
lnst/Controller/Machine.py | 4 ++++
lnst/Controller/Task.py | 3 +++
lnst/Slave/BridgeTool.py | 3 +++
lnst/Slave/NetTestSlave.py | 9 +++++++++
4 files changed, 19 insertions(+)
diff --git a/lnst/Controller/Machine.py b/lnst/Controller/Machine.py
index 2213f03..36f5e9b 100644
--- a/lnst/Controller/Machine.py
+++ b/lnst/Controller/Machine.py
@@ -796,6 +796,10 @@ class Interface(object):
self._machine._rpc_call_x(self._netns, "set_br_learning_sync",
self._id,
br_learning_sync_info)
+ def set_br_flooding(self, br_flooding_info):
+ self._machine._rpc_call_x(self._netns, "set_br_flooding", self._id,
+ br_flooding_info)
+
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 80e6e1b..9054471 100644
--- a/lnst/Controller/Task.py
+++ b/lnst/Controller/Task.py
@@ -573,6 +573,9 @@ class InterfaceAPI(object):
_self._if.set_br_learning_sync({"on": on, "self": self,
"master": master})
+ def set_br_flooding(_self, on=True, self=False, master=False):
+ _self._if.set_br_flooding({"on": on, "self": self,
"master": master})
+
def set_speed(self, speed):
return self._if.set_speed(speed)
diff --git a/lnst/Slave/BridgeTool.py b/lnst/Slave/BridgeTool.py
index 71f80cd..fea9201 100644
--- a/lnst/Slave/BridgeTool.py
+++ b/lnst/Slave/BridgeTool.py
@@ -105,3 +105,6 @@ class BridgeTool:
def set_learning_sync(self, br_learning_sync_info):
return self._set_link("learning_sync", br_learning_sync_info)
+
+ def set_flooding(self, br_flooding_info):
+ return self._set_link("flood", br_flooding_info)
diff --git a/lnst/Slave/NetTestSlave.py b/lnst/Slave/NetTestSlave.py
index 830dc00..1908bfe 100644
--- a/lnst/Slave/NetTestSlave.py
+++ b/lnst/Slave/NetTestSlave.py
@@ -763,6 +763,15 @@ class SlaveMethods:
brt.set_learning_sync(br_learning_sync_info)
return True
+ def set_br_flooding(self, if_id, br_flooding_info):
+ 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())
+ brt.set_flooding(br_flooding_info)
+ return True
+
def set_speed(self, if_id, speed):
dev = self._if_manager.get_mapped_device(if_id)
if dev is not None:
--
2.4.10
It is useful for driver authors to be able to add or remove net devices
from certain master devices, so allow a user to do that from inside a
task.
This is currently only supported by bridge and team.
Acked-by: Jiri Pirko <jiri(a)mellanox.com>
Signed-off-by: Ido Schimmel <idosch(a)mellanox.com>
---
lnst/Controller/Machine.py | 6 ++++++
lnst/Controller/Task.py | 6 ++++++
lnst/Slave/InterfaceManager.py | 8 ++++++++
lnst/Slave/NetTestSlave.py | 17 +++++++++++++++++
4 files changed, 37 insertions(+)
diff --git a/lnst/Controller/Machine.py b/lnst/Controller/Machine.py
index 36f5e9b..9fdbaba 100644
--- a/lnst/Controller/Machine.py
+++ b/lnst/Controller/Machine.py
@@ -806,6 +806,12 @@ class Interface(object):
def set_autoneg(self):
self._machine._rpc_call_x(self._netns, "set_autoneg", self._id)
+ def slave_add(self, if_id):
+ self._machine._rpc_call_x(self._netns, "slave_add", self._id, if_id)
+
+ def slave_del(self, if_id):
+ self._machine._rpc_call_x(self._netns, "slave_del", self._id, if_id)
+
class StaticInterface(Interface):
""" Static interface
diff --git a/lnst/Controller/Task.py b/lnst/Controller/Task.py
index 9054471..21d4fb3 100644
--- a/lnst/Controller/Task.py
+++ b/lnst/Controller/Task.py
@@ -582,6 +582,12 @@ class InterfaceAPI(object):
def set_autoneg(self):
return self._if.set_autoneg()
+ def slave_add(self, slave_id):
+ return self._if.slave_add(slave_id)
+
+ def slave_del(self, slave_id):
+ return self._if.slave_del(slave_id)
+
class ModuleAPI(object):
""" An API class representing a module. """
diff --git a/lnst/Slave/InterfaceManager.py b/lnst/Slave/InterfaceManager.py
index 144f5a7..edeb5bc 100644
--- a/lnst/Slave/InterfaceManager.py
+++ b/lnst/Slave/InterfaceManager.py
@@ -550,3 +550,11 @@ class Device(object):
def set_autoneg(self):
exec_cmd("ethtool -s %s autoneg on" % self._name)
+
+ def slave_add(self, if_id):
+ if self._conf != None:
+ self._conf.slave_add(if_id)
+
+ def slave_del(self, if_id):
+ if self._conf != None:
+ self._conf.slave_del(if_id)
diff --git a/lnst/Slave/NetTestSlave.py b/lnst/Slave/NetTestSlave.py
index 1908bfe..3d74fa6 100644
--- a/lnst/Slave/NetTestSlave.py
+++ b/lnst/Slave/NetTestSlave.py
@@ -792,6 +792,23 @@ class SlaveMethods:
def wait_interface_init(self):
self._if_manager.wait_interface_init()
+
+ def slave_add(self, if_id, slave_id):
+ dev = self._if_manager.get_mapped_device(if_id)
+ if dev is not None:
+ dev.slave_add(slave_id)
+ else:
+ logging.error("Device with id '%s' not found." % if_id)
+ return False
+ return True
+
+ def slave_del(self, if_id, slave_id):
+ dev = self._if_manager.get_mapped_device(if_id)
+ if dev is not None:
+ dev.slave_del(slave_id)
+ else:
+ logging.error("Device with id '%s' not found." % if_id)
+ return False
return True
class ServerHandler(ConnectionHandler):
--
2.4.10