Adding add_route() and del_route APIs allowing inserting and removing routes from the Slave's routing-table.
This patch supports enable_multicast() and disable_multicast() APIs which add local routes for all MC groups to go via a device. This will allow a device to send Multicast traffic and IGMP join requests. The disable_multicast() remote the local routes.
This patch will be follow with "Contoller: Adding route management" patch which will remember new routes and destory them at "deconfigure" stage.
Signed-off-by: Elad Raz eladr@mellanox.com Signed-off-by: Jiri Pirko jiri@mellanox.com --- lnst/Controller/Machine.py | 8 ++++++++ lnst/Controller/Task.py | 6 ++++++ lnst/Slave/InterfaceManager.py | 6 ++++++ lnst/Slave/NetTestSlave.py | 16 ++++++++++++++++ 4 files changed, 36 insertions(+)
diff --git a/lnst/Controller/Machine.py b/lnst/Controller/Machine.py index 8b9fa0f..5363d1c 100644 --- a/lnst/Controller/Machine.py +++ b/lnst/Controller/Machine.py @@ -695,6 +695,14 @@ class Interface(object): self._machine._rpc_call_x(self._netns, "set_addresses", self._id, ips)
+ def add_route(self, dest): + self._machine._rpc_call_x(self._netns, "add_route", + self._id, dest) + + def del_route(self, dest): + self._machine._rpc_call_x(self._netns, "del_route", + self._id, dest) + def update_from_slave(self): if_data = self._machine._rpc_call_x(self._netns, "get_if_data", self._id) diff --git a/lnst/Controller/Task.py b/lnst/Controller/Task.py index b1a17be..68be1bf 100644 --- a/lnst/Controller/Task.py +++ b/lnst/Controller/Task.py @@ -549,6 +549,12 @@ class InterfaceAPI(object): def set_addresses(self, ips): self._if.set_addresses(ips)
+ def enable_multicast(self): + self._if.add_route("224.0.0.0/4") + + def disable_multicast(self): + self._if.del_route("224.0.0.0/4") + def destroy(self): self._host._remove_iface(self)
diff --git a/lnst/Slave/InterfaceManager.py b/lnst/Slave/InterfaceManager.py index 6ddbe52..c4b9e59 100644 --- a/lnst/Slave/InterfaceManager.py +++ b/lnst/Slave/InterfaceManager.py @@ -553,6 +553,12 @@ class Device(object): for address in ips: exec_cmd("ip addr add %s dev %s" % (address, self._name))
+ def add_route(self, dest): + exec_cmd("ip route add %s dev %s" % (dest, self._name)) + + def del_route(self, dest): + exec_cmd("ip route del %s dev %s" % (dest, self._name)) + def set_netns(self, netns): self._netns = netns return diff --git a/lnst/Slave/NetTestSlave.py b/lnst/Slave/NetTestSlave.py index 5eeb30c..bcc7c3c 100644 --- a/lnst/Slave/NetTestSlave.py +++ b/lnst/Slave/NetTestSlave.py @@ -201,6 +201,22 @@ class SlaveMethods: dev.set_addresses(ips) return True
+ def add_route(self, if_id, dest): + dev = self._if_manager.get_mapped_device(if_id) + if dev is None: + logging.error("Device with id '%s' not found." % if_id) + return False + dev.add_route(dest) + return True + + def del_route(self, if_id, dest): + dev = self._if_manager.get_mapped_device(if_id) + if dev is None: + logging.error("Device with id '%s' not found." % if_id) + return False + dev.del_route(dest) + return True + def set_device_up(self, if_id): dev = self._if_manager.get_mapped_device(if_id) dev.up()