From: Ido Schimmel <idosch(a)mellanox.com>
We can already enable the 'lldpad' daemon from a recipe, but in order to
do anything meaningful with it we need to be able to enable it on an
interface.
Add the if.enable_lldp() method that does just that. During recipe
tear down (graceful or not) make sure that any LLDP-enabled interface is
initialized to default settings. This is done for Ethernet devices only,
as they are the only ones that can be configured using 'lldptool'.
Signed-off-by: Ido Schimmel <idosch(a)mellanox.com>
---
lnst/Controller/Machine.py | 3 +++
lnst/Controller/Task.py | 3 +++
lnst/Slave/InterfaceManager.py | 4 ++++
lnst/Slave/NetConfigDevice.py | 20 ++++++++++++++++++++
lnst/Slave/NetTestSlave.py | 8 ++++++++
5 files changed, 38 insertions(+)
diff --git a/lnst/Controller/Machine.py b/lnst/Controller/Machine.py
index 138c841..4f1afff 100644
--- a/lnst/Controller/Machine.py
+++ b/lnst/Controller/Machine.py
@@ -986,6 +986,9 @@ class Interface(object):
return self._machine._rpc_call_x(self._netns, "get_ethtool_stats",
self._id)
+ def enable_lldp(self):
+ return self._machine._rpc_call_x(self._netns, "enable_lldp", self._id)
+
class StaticInterface(Interface):
""" Static interface
diff --git a/lnst/Controller/Task.py b/lnst/Controller/Task.py
index 26aa54e..bbb31d6 100644
--- a/lnst/Controller/Task.py
+++ b/lnst/Controller/Task.py
@@ -713,6 +713,9 @@ class InterfaceAPI(object):
def get_ethtool_stats(self):
return self._if.get_ethtool_stats()
+ def enable_lldp(self):
+ return self._if.enable_lldp()
+
class ModuleAPI(object):
""" An API class representing a module. """
diff --git a/lnst/Slave/InterfaceManager.py b/lnst/Slave/InterfaceManager.py
index 612d04a..332d927 100644
--- a/lnst/Slave/InterfaceManager.py
+++ b/lnst/Slave/InterfaceManager.py
@@ -770,3 +770,7 @@ class Device(object):
stat, count = line.split(':')
d[stat.strip()] = int(count)
return d
+
+ def enable_lldp(self):
+ self._conf.enable_lldp()
+ exec_cmd("lldptool -i %s -L adminStatus=rxtx" % self._name)
diff --git a/lnst/Slave/NetConfigDevice.py b/lnst/Slave/NetConfigDevice.py
index 960ff07..2c1a78c 100644
--- a/lnst/Slave/NetConfigDevice.py
+++ b/lnst/Slave/NetConfigDevice.py
@@ -83,6 +83,9 @@ class NetConfigDeviceGeneric(object):
if self._cleanupcmd:
exec_cmd(self._cleanupcmd, die_on_err=False)
+ def enable_lldp(self):
+ pass
+
class NetConfigDeviceEth(NetConfigDeviceGeneric):
def configure(self):
config = self._dev_config
@@ -98,6 +101,23 @@ class NetConfigDeviceEth(NetConfigDeviceGeneric):
exec_cmd("ethtool -s %s autoneg on" % config["name"])
if "netem_cmd" in config:
exec_cmd(config["netem_cmd"].replace("add",
"del"))
+ if "lldp" in config:
+ self.deconfigure_lldp()
+
+ def enable_lldp(self):
+ self._dev_config["lldp"] = True
+
+ def deconfigure_lldp(self):
+ config = self._dev_config
+ up2tc_def = ','.join(["{}:0".format(x) for x in range(8)])
+ tsa_def = ','.join(["{}:strict".format(x) for x in range(8)])
+ exec_cmd("lldptool -i %s -V ETS-CFG -T up2tc=%s" %
(config["name"],
+ up2tc_def))
+ exec_cmd("lldptool -i %s -V ETS-CFG -T tsa=%s" %
(config["name"],
+ tsa_def))
+ exec_cmd("lldptool -i %s -V PFC -T enabled=none" %
config["name"])
+ exec_cmd("lldptool -i %s -L adminStatus=disabled" %
config["name"])
+
class NetConfigDeviceLoopback(NetConfigDeviceGeneric):
def configure(self):
diff --git a/lnst/Slave/NetTestSlave.py b/lnst/Slave/NetTestSlave.py
index 9b130b3..8f1e222 100644
--- a/lnst/Slave/NetTestSlave.py
+++ b/lnst/Slave/NetTestSlave.py
@@ -931,6 +931,14 @@ class SlaveMethods:
return False
return dev.get_ethtool_stats()
+ def enable_lldp(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
+ dev.enable_lldp()
+ return True
+
class ServerHandler(ConnectionHandler):
def __init__(self, addr):
super(ServerHandler, self).__init__()
--
2.7.4