Add a function that returns the ifstat (relative statistic, being set to 0
on every read) for cpu hits (packets that went on slow path).
Can be used only on devices that support this ifstat extension.
Signed-off-by: Nogah Frankel <nogahf(a)mellanox.com>
Reviewed-by: Yotam Gigi <yotamg(a)mellanox.com>
---
lnst/Controller/Machine.py | 5 +++++
lnst/Controller/Task.py | 3 +++
lnst/Slave/InterfaceManager.py | 29 +++++++++++++++++++++++++++++
lnst/Slave/NetTestSlave.py | 7 +++++++
4 files changed, 44 insertions(+)
diff --git a/lnst/Controller/Machine.py b/lnst/Controller/Machine.py
index a6a3165..1836f71 100644
--- a/lnst/Controller/Machine.py
+++ b/lnst/Controller/Machine.py
@@ -783,6 +783,11 @@ class Interface(object):
self._id)
return stats
+ def link_cpu_ifstat(self):
+ stats = self._machine._rpc_call_x(self._netns, "link_cpu_ifstat",
+ self._id)
+ return stats
+
def set_addresses(self, ips):
self._addresses = ips
self._machine._rpc_call_x(self._netns, "set_addresses",
diff --git a/lnst/Controller/Task.py b/lnst/Controller/Task.py
index 10b937d..70293a5 100644
--- a/lnst/Controller/Task.py
+++ b/lnst/Controller/Task.py
@@ -610,6 +610,9 @@ class InterfaceAPI(object):
def link_stats(self):
return self._if.link_stats()
+ def link_cpu_ifstat(self):
+ return self._if.link_cpu_ifstat()
+
def set_link_up(self):
return self._if.set_link_up()
diff --git a/lnst/Slave/InterfaceManager.py b/lnst/Slave/InterfaceManager.py
index e6399b3..e28682f 100644
--- a/lnst/Slave/InterfaceManager.py
+++ b/lnst/Slave/InterfaceManager.py
@@ -705,6 +705,35 @@ class Device(object):
"tx_collsns": tx_stats[5]})
return stats
+ def link_cpu_ifstat(self):
+ stats = {"devname": self._name,
+ "hwaddr": self._hwaddr}
+ try:
+ out, _ = exec_cmd("ifstat -x c %s" % self._name)
+ except:
+ return {}
+ lines = iter(out.split("\n"))
+ line_first = ""
+ line_decond = ""
+ for line in lines:
+ if (len(line.split()) == 0):
+ continue
+ if (line.split()[0] == self._name):
+ break
+ else:
+ return {}
+ stats_data = line.split()[1:]
+ for i in range(len(stats_data)):
+ stats_data[i] = stats_data[i].replace("K", "000")
+ stats_data[i] = stats_data[i].replace("M", "000000")
+
+ stats_data = map(int, stats_data)
+ stats["rx_packets"] = stats_data[0]
+ stats["tx_packets"] = stats_data[2]
+ stats["rx_bytes"] = stats_data[4]
+ stats["tx_bytes"] = stats_data[6]
+ return stats
+
def set_addresses(self, ips):
self._conf.set_addresses(ips)
exec_cmd("ip addr flush %s" % self._name)
diff --git a/lnst/Slave/NetTestSlave.py b/lnst/Slave/NetTestSlave.py
index af80f55..cdcf951 100644
--- a/lnst/Slave/NetTestSlave.py
+++ b/lnst/Slave/NetTestSlave.py
@@ -194,6 +194,13 @@ class SlaveMethods:
return {}
return dev.get_if_data()
+ def link_cpu_ifstat(self, if_id):
+ dev = self._if_manager.get_mapped_device(if_id)
+ if dev is None:
+ logging.error("Device with id '%s' not found." % if_id)
+ return {}
+ return dev.link_cpu_ifstat()
+
def link_stats(self, if_id):
dev = self._if_manager.get_mapped_device(if_id)
if dev is None:
--
2.4.3