From: Ido Schimmel <idosch(a)mellanox.com>
Unlike PAUSE frames, PFC frames are sent for specific flows, thereby
allowing both lossless and lossy traffic to go through the port.
As with PAUSE frames, bridge two ports with two different speeds and
send 40M UDP packets using pktgen through the fast port. Enable PFC for
a specific flow and make sure no packets were lost by reading the
ethtool counters.
Signed-off-by: Ido Schimmel <idosch(a)mellanox.com>
---
recipes/switchdev/qos-004-pfc.py | 95 +++++++++++++++++++++++++++++++++++++++
recipes/switchdev/qos-004-pfc.xml | 22 +++++++++
2 files changed, 117 insertions(+)
create mode 100644 recipes/switchdev/qos-004-pfc.py
create mode 100644 recipes/switchdev/qos-004-pfc.xml
diff --git a/recipes/switchdev/qos-004-pfc.py b/recipes/switchdev/qos-004-pfc.py
new file mode 100644
index 0000000..ce77971
--- /dev/null
+++ b/recipes/switchdev/qos-004-pfc.py
@@ -0,0 +1,95 @@
+"""
+Copyright 2016 Mellanox Technologies. All rights reserved.
+Licensed under the GNU General Public License, version 2 as
+published by the Free Software Foundation; see COPYING for details.
+"""
+
+__author__ = """
+idosch(a)mellanox.com (Ido Schimmel)
+"""
+
+from lnst.Controller.Task import ctl
+from TestLib import TestLib
+from random import randint
+from time import sleep
+
+def get_stats(tl, rx_if, tx_if, prio):
+ return tl.get_rx_prio_stats(rx_if, prio), tl.get_tx_prio_stats(tx_if, prio)
+
+def do_task(ctl, hosts, ifaces, aliases):
+ m1, m2, sw = hosts
+ m1_if1, m2_if1, sw_if1, sw_if2 = ifaces
+
+ m1_if1.reset(ip=["192.168.101.10/24", "2002::1/64"])
+ m2_if1.reset(ip=["192.168.101.11/24", "2002::2/64"])
+
+ sw_if1.set_speed(int(aliases["speed_hi"]))
+ sw_if2.set_speed(int(aliases["speed_lo"]))
+
+ sleep(30)
+
+ sw.create_bridge(slaves=[sw_if1, sw_if2], options={"vlan_filtering": 1})
+ sw_if1.add_br_vlan(10)
+ sw_if2.add_br_vlan(10)
+
+ # Packets can only stay in the headroom if the egress quotas
+ # of the egress port are set to the maximum.
+ tl = TestLib(ctl, aliases)
+ tl.devlink_port_etc_quota_max_set(sw_if2, 0)
+
+ # All the traffic should be directed to the same TC at egress.
+ sw.enable_service("lldpad")
+ sw_if2.enable_lldp()
+ tl.lldp_ets_default_set(sw_if2, willing=False)
+
+ m2.enable_service("lldpad")
+ m2_if1.enable_lldp()
+ tl.lldp_ets_default_set(m2_if1)
+
+ sw_if1.enable_lldp()
+ tl.lldp_pfc_set(sw_if1, [], willing=False)
+ tl.lldp_ets_default_set(sw_if1, willing=False)
+
+ m1.enable_service("lldpad")
+ m1_if1.enable_lldp()
+ tl.lldp_pfc_set(m1_if1, [])
+ tl.lldp_ets_default_set(m1_if1)
+
+ tl.ping_simple(m1_if1, m2_if1)
+
+ packet_count = 40 * 10 ** 6
+ prio = randint(1, 7)
+ # Make sure we get packet loss without PFC frames.
+ _, tx_stats_t0 = get_stats(tl, sw_if1, sw_if2, prio)
+ tl.pktgen(m1_if1, m2_if1, m1_if1.get_mtu(), vlan_id=10, vlan_p=prio,
+ count=packet_count)
+ _, tx_stats_t1 = get_stats(tl, sw_if1, sw_if2, prio)
+ tl.check_stats(sw_if1, tx_stats_t1 - tx_stats_t0, packet_count,
+ "tx prio {}".format(prio), fail=True)
+
+ for prio in range(1, 8):
+ tl.lldp_ets_up2tc_set(sw_if1, [(prio, prio)])
+ tl.lldp_pfc_set(sw_if1, [prio], willing=False, delay=32768)
+ sleep(5)
+
+ rx_stats_t0, tx_stats_t0 = get_stats(tl, sw_if1, sw_if2, prio)
+ tl.pktgen(m1_if1, m2_if1, m1_if1.get_mtu(), vlan_id=10, vlan_p=prio,
+ count=packet_count)
+ rx_stats_t1, tx_stats_t1 = get_stats(tl, sw_if1, sw_if2, prio)
+
+ tl.check_stats(sw_if1, rx_stats_t1 - rx_stats_t0, packet_count,
+ "rx prio {}".format(prio))
+ tl.check_stats(sw_if2, tx_stats_t1 - tx_stats_t0, packet_count,
+ "tx prio {}".format(prio))
+
+ tl.lldp_pfc_set(sw_if1, [], willing=False)
+ tl.lldp_ets_up2tc_set(sw_if1, [(prio, 0)])
+
+do_task(ctl, [ctl.get_host("machine1"),
+ ctl.get_host("machine2"),
+ ctl.get_host("switch")],
+ [ctl.get_host("machine1").get_interface("if1"),
+ ctl.get_host("machine2").get_interface("if1"),
+ ctl.get_host("switch").get_interface("if1"),
+ ctl.get_host("switch").get_interface("if2")],
+ ctl.get_aliases())
diff --git a/recipes/switchdev/qos-004-pfc.xml b/recipes/switchdev/qos-004-pfc.xml
new file mode 100644
index 0000000..0fa34db
--- /dev/null
+++ b/recipes/switchdev/qos-004-pfc.xml
@@ -0,0 +1,22 @@
+<lnstrecipe
xmlns:xi="http://www.w3.org/2003/XInclude">
+ <xi:include href="default_aliases.xml" />
+ <network>
+ <host id="machine1">
+ <interfaces>
+ <eth id="if1" label="A" />
+ </interfaces>
+ </host>
+ <host id="machine2">
+ <interfaces>
+ <eth id="if1" label="B" />
+ </interfaces>
+ </host>
+ <host id="switch">
+ <interfaces>
+ <eth id="if1" label="A" />
+ <eth id="if2" label="B" />
+ </interfaces>
+ </host>
+ </network>
+ <task python="qos-004-pfc.py" />
+</lnstrecipe>
--
2.7.4