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@mellanox.com Signed-off-by: Ido Schimmel idosch@mellanox.com --- v1->v2: * No change. --- 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:
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@mellanox.com Signed-off-by: Ido Schimmel idosch@mellanox.com --- v1->v2: * No change. --- 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:
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@mellanox.com Signed-off-by: Ido Schimmel idosch@mellanox.com --- v1->v2: * No change. --- 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:
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@mellanox.com Signed-off-by: Ido Schimmel idosch@mellanox.com --- v1->v2: * Rebase correctly on top of Ondrej's patch. --- lnst/Controller/Machine.py | 6 ++++++ lnst/Controller/Task.py | 6 ++++++ lnst/Slave/InterfaceManager.py | 8 ++++++++ lnst/Slave/NetTestSlave.py | 18 ++++++++++++++++++ 4 files changed, 38 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..ba57c07 100644 --- a/lnst/Slave/NetTestSlave.py +++ b/lnst/Slave/NetTestSlave.py @@ -794,6 +794,24 @@ class SlaveMethods: self._if_manager.wait_interface_init() return True
+ 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): def __init__(self, addr): super(ServerHandler, self).__init__()
Wed, Jan 20, 2016 at 05:10:35PM CET, idosch@mellanox.com wrote:
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@mellanox.com Signed-off-by: Ido Schimmel idosch@mellanox.com
set applied, thanks!
lnst-developers@lists.fedorahosted.org