Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
147 changes: 95 additions & 52 deletions tests/saitests/py3/sai_qos_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2592,6 +2592,7 @@ def setUp(self):
self.pgs = [pg + 2 for pg in self.test_params['pgs']]
self.src_port_ids = self.test_params['src_port_ids']
self.src_port_ips = self.test_params['src_port_ips']
self.platform_asic = self.test_params['platform_asic']
print(self.src_port_ips, file=sys.stderr)
sys.stderr.flush()
# get counter names to query
Expand Down Expand Up @@ -2684,6 +2685,17 @@ def setUp(self):
def_vlan_mac = self.test_params.get('def_vlan_mac', None)
if is_dualtor and def_vlan_mac is not None:
self.dst_port_mac = def_vlan_mac
self.pkt_dst_mac = self.router_mac if self.router_mac != '' else self.dst_port_mac
# Collect destination ports that may be in a lag
if self.platform_asic and self.platform_asic == "broadcom-dnx":
dst_port_ids = []
self.src_dst = {}
for i in range(len(self.src_port_ids)):
dst_port = get_rx_port(self, 0, self.src_port_ids[i], self.pkt_dst_mac,
self.dst_port_ip, self.src_port_ips[i])
dst_port_ids.append(dst_port)
self.src_dst.update({self.src_port_ids[i]: dst_port})
self.uniq_dst_ports = list(set(dst_port_ids))

def tearDown(self):
sai_base_test.ThriftInterfaceDataPlane.tearDown(self)
Expand All @@ -2702,16 +2714,22 @@ def show_port_counter(self, asic_type, rx_base, tx_base, banner):
rx_curr, _ = sai_thrift_read_port_counters(self.src_client, asic_type, port_list['src'][srcPortId])
port_cnt_tbl.add_row([' src_port{}_id{}'.format(srcPortIdx, srcPortId)] +
[rx_curr[fieldIdx] for fieldIdx in port_counter_indexes])
port_cnt_tbl.add_row(['base dst_port_id{}'.format(self.dst_port_id)] + [tx_base[fieldIdx]
for fieldIdx in port_counter_indexes])
tx_curr, _ = sai_thrift_read_port_counters(self.dst_client, asic_type, port_list['dst'][self.dst_port_id])
port_cnt_tbl.add_row([' dst_port_id{}'.format(self.dst_port_id)] + [tx_curr[fieldIdx]
for fieldIdx in port_counter_indexes])
if self.platform_asic and self.platform_asic == "broadcom-dnx":
for dstPortIdx, dstPortId in enumerate(self.uniq_dst_ports):
port_cnt_tbl.add_row(['base dst_port{}_id{}'.format(dstPortIdx, dstPortId)] +
[tx_base[dstPortIdx][fieldIdx] for fieldIdx in port_counter_indexes])
tx_curr, _ = sai_thrift_read_port_counters(self.dst_client, asic_type, port_list['dst'][dstPortId])
port_cnt_tbl.add_row([' dst_port{}_id{}'.format(dstPortIdx, dstPortId)] +
[tx_curr[fieldIdx] for fieldIdx in port_counter_indexes])
else:
port_cnt_tbl.add_row(['base dst_port_id{}'.format(self.dst_port_id)] +
[tx_base[fieldIdx] for fieldIdx in port_counter_indexes])
tx_curr, _ = sai_thrift_read_port_counters(self.dst_client, asic_type, port_list['dst'][self.dst_port_id])
port_cnt_tbl.add_row([' dst_port_id{}'.format(self.dst_port_id)] +
[tx_curr[fieldIdx] for fieldIdx in port_counter_indexes])
sys.stderr.write('{}\n{}\n'.format(banner, port_cnt_tbl))

def runTest(self):
platform_asic = self.test_params['platform_asic']

margin = self.test_params.get('margin')
if not margin:
margin = 0
Expand All @@ -2725,15 +2743,24 @@ def runTest(self):
# queue_counters value is not of our interest here
recv_counters_bases = [sai_thrift_read_port_counters(self.src_client, self.asic_type, port_list['src'][sid])[
0] for sid in self.src_port_ids]
xmit_counters_base, _ = sai_thrift_read_port_counters(
self.dst_client, self.asic_type, port_list['dst'][self.dst_port_id])
if self.platform_asic and self.platform_asic == "broadcom-dnx":
xmit_counters_bases = [sai_thrift_read_port_counters(self.dst_client, self.asic_type,
port_list['dst'][did])[0]
for did in self.uniq_dst_ports]
else:
xmit_counters_base, _ = sai_thrift_read_port_counters(self.dst_client,
self.asic_type, port_list['dst'][self.dst_port_id])

# For TH3, some packets stay in egress memory and doesn't show up in shared buffer or leakout
if 'pkts_num_egr_mem' in list(self.test_params.keys()):
pkts_num_egr_mem = int(self.test_params['pkts_num_egr_mem'])

# Pause egress of dut xmit port
self.sai_thrift_port_tx_disable(self.dst_client, self.asic_type, [self.dst_port_id])
if self.platform_asic and self.platform_asic == "broadcom-dnx":
# Disable all dst ports
self.sai_thrift_port_tx_disable(self.dst_client, self.asic_type, self.uniq_dst_ports)
else:
self.sai_thrift_port_tx_disable(self.dst_client, self.asic_type, [self.dst_port_id])

try:
# send packets to leak out
Expand Down Expand Up @@ -2777,14 +2804,14 @@ def runTest(self):
pkt_cnt = pkts_num_trig_pfc // self.pkt_size_factor
send_packet(
self, self.src_port_ids[sidx_dscp_pg_tuples[i][0]], pkt, int(pkt_cnt))
if platform_asic != "broadcom-dnx":
if self.platform_asic != "broadcom-dnx":
time.sleep(8) # wait pfc counter refresh and show the counters
self.show_port_counter(self.asic_type, recv_counters_bases, xmit_counters_base,
'To fill service pool, send {} pkt with DSCP {} PG {} from src_port{}'
' to dst_port'.format(pkt_cnt, sidx_dscp_pg_tuples[i][1],
sidx_dscp_pg_tuples[i][2], sidx_dscp_pg_tuples[i][0]))

if platform_asic and platform_asic == "broadcom-dnx":
if self.platform_asic and self.platform_asic == "broadcom-dnx":
time.sleep(8) # wait pfc counter refresh and show the counters
for i in range(0, self.pgs_num):
if self.pkts_num_trig_pfc:
Expand All @@ -2793,10 +2820,11 @@ def runTest(self):
pkts_num_trig_pfc = self.pkts_num_trig_pfc_shp[i]

pkt_cnt = pkts_num_trig_pfc // self.pkt_size_factor
self.show_port_counter(self.asic_type, recv_counters_bases, xmit_counters_base,
'To fill service pool, send {} pkt with DSCP {} PG {} from src_port{}'
' to dst_port'.format(pkt_cnt, sidx_dscp_pg_tuples[i][1],
sidx_dscp_pg_tuples[i][2], sidx_dscp_pg_tuples[i][0]))
self.show_port_counter(self.asic_type, recv_counters_bases, xmit_counters_bases,
'To fill service pool, send {} pkt with DSCP {} PG {} from'
' src_port{} to dst_port'.format(pkt_cnt, sidx_dscp_pg_tuples[i][1],
sidx_dscp_pg_tuples[i][2],
sidx_dscp_pg_tuples[i][0]))

print("Service pool almost filled", file=sys.stderr)
sys.stderr.flush()
Expand Down Expand Up @@ -2833,18 +2861,24 @@ def runTest(self):
recv_counters, _ = sai_thrift_read_port_counters(
self.src_client, self.asic_type, port_list['src'][self.src_port_ids[sidx_dscp_pg_tuples[i][0]]])

if platform_asic != "broadcom-dnx":
if self.platform_asic != "broadcom-dnx":
time.sleep(8) # wait pfc counter refresh
self.show_port_counter(
self.asic_type, recv_counters_bases, xmit_counters_base,
'To trigger PFC, send {} pkt with DSCP {} PG {} from src_port{} to dst_port'
.format(pkt_cnt, sidx_dscp_pg_tuples[i][1], sidx_dscp_pg_tuples[i][2], sidx_dscp_pg_tuples[i][0]))
self.show_port_counter(self.asic_type, recv_counters_bases, xmit_counters_base,
'To trigger PFC, send {} pkt with DSCP {} PG {} from src_port{} to dst_port'
.format(pkt_cnt, sidx_dscp_pg_tuples[i][1], sidx_dscp_pg_tuples[i][2],
sidx_dscp_pg_tuples[i][0]))
if self.platform_asic and self.platform_asic == "broadcom-dnx":
self.show_port_counter(self.asic_type, recv_counters_bases, xmit_counters_bases,
'To trigger PFC, send {} pkt with DSCP {} PG {} from src_port{} to dst_port'
.format(pkt_cnt, sidx_dscp_pg_tuples[i][1], sidx_dscp_pg_tuples[i][2],
sidx_dscp_pg_tuples[i][0]))

if pkt_cnt == 10:
sys.exit("Too many pkts needed to trigger pfc: %d" %
(pkt_cnt))
assert (recv_counters[sidx_dscp_pg_tuples[i][2]] >
recv_counters_bases[sidx_dscp_pg_tuples[i][0]][sidx_dscp_pg_tuples[i][2]])
if self.platform_asic and self.platform_asic == "broadcom-dnx":
self.sai_thrift_port_tx_enable(self.dst_client, self.asic_type, self.uniq_dst_ports)
sys.exit("Too many pkts needed to trigger pfc: %d" % (pkt_cnt))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same as above

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

done

assert(recv_counters[sidx_dscp_pg_tuples[i][2]] >
recv_counters_bases[sidx_dscp_pg_tuples[i][0]][sidx_dscp_pg_tuples[i][2]])
print("%d packets for sid: %d, pg: %d to trigger pfc" % (
pkt_cnt, self.src_port_ids[sidx_dscp_pg_tuples[i][0]], sidx_dscp_pg_tuples[i][2] - 2),
file=sys.stderr)
Expand Down Expand Up @@ -2885,23 +2919,13 @@ def runTest(self):
send_packet(
self, self.src_port_ids[sidx_dscp_pg_tuples[i][0]], pkt, pkt_cnt)
# allow enough time for the dut to sync up the counter values in counters_db
if platform_asic != "broadcom-dnx":
if self.platform_asic != "broadcom-dnx":
time.sleep(8)
self.show_port_counter(self.asic_type, recv_counters_bases, xmit_counters_base,
'To fill headroom pool, send {} pkt with DSCP {} PG {} from src_port{} '
'to dst_port'.format(pkt_cnt, sidx_dscp_pg_tuples[i][1],
sidx_dscp_pg_tuples[i][2], sidx_dscp_pg_tuples[i][0]))

if platform_asic and platform_asic == "broadcom-dnx":
time.sleep(8)
for i in range(0, self.pgs_num):
pkt_cnt = self.pkts_num_hdrm_full // self.pkt_size_factor if i != self.pgs_num - 1 \
else self.pkts_num_hdrm_partial // self.pkt_size_factor
self.show_port_counter(self.asic_type, recv_counters_bases, xmit_counters_base,
'To fill headroom pool, send {} pkt with DSCP {} PG {} from src_port{}'
' to dst_port'.format(pkt_cnt, sidx_dscp_pg_tuples[i][1],
sidx_dscp_pg_tuples[i][2], sidx_dscp_pg_tuples[i][0]))

recv_counters, _ = sai_thrift_read_port_counters(
self.src_client, self.asic_type, port_list['src'][self.src_port_ids[sidx_dscp_pg_tuples[i][0]]])
# assert no ingress drop
Expand Down Expand Up @@ -2930,9 +2954,18 @@ def runTest(self):
print("pkts sent: %d, lower bound: %d, actual headroom pool watermark: %d, upper_bound: %d" % (
wm_pkt_num, expected_wm, hdrm_pool_wm, upper_bound_wm), file=sys.stderr)
if 'innovium' not in self.asic_type:
assert (expected_wm <= hdrm_pool_wm)
assert (hdrm_pool_wm <= upper_bound_wm)

assert(expected_wm <= hdrm_pool_wm)
assert(hdrm_pool_wm <= upper_bound_wm)
if self.platform_asic and self.platform_asic == "broadcom-dnx":
time.sleep(8)
for i in range(0, self.pgs_num):
pkt_cnt = self.pkts_num_hdrm_full // self.pkt_size_factor if i != self.pgs_num - 1 \
else self.pkts_num_hdrm_partial // self.pkt_size_factor
self.show_port_counter(self.asic_type, recv_counters_bases, xmit_counters_bases,
'To fill headroom pool, send {} pkt with DSCP {} PG {} from'
' src_port{} to dst_port'.format(pkt_cnt, sidx_dscp_pg_tuples[i][1],
sidx_dscp_pg_tuples[i][2],
sidx_dscp_pg_tuples[i][0]))
print("all but the last pg hdrms filled", file=sys.stderr)
sys.stderr.flush()

Expand All @@ -2945,28 +2978,35 @@ def runTest(self):
# allow enough time for the dut to sync up the counter values in counters_db
time.sleep(8)

self.show_port_counter(
self.asic_type, recv_counters_bases, xmit_counters_base,
'To fill last PG and trigger ingress drop, send {} pkt with DSCP {} PG {} from src_port{} to dst_port'
.format(pkt_cnt, sidx_dscp_pg_tuples[i][1], sidx_dscp_pg_tuples[i][2], sidx_dscp_pg_tuples[i][0]))
if self.platform_asic and self.platform_asic == "broadcom-dnx":
self.show_port_counter(self.asic_type, recv_counters_bases, xmit_counters_bases,
'To fill last PG and trigger ingress drop, send {} pkt with DSCP {} PG {}'
' from src_port{} to dst_port'.format(pkt_cnt, sidx_dscp_pg_tuples[i][1],
sidx_dscp_pg_tuples[i][2],
sidx_dscp_pg_tuples[i][0]))
else:
self.show_port_counter(self.asic_type, recv_counters_bases, xmit_counters_base,
'To fill last PG and trigger ingress drop, send {} pkt with DSCP {} PG {}'
' from src_port{} to dst_port'.format(pkt_cnt, sidx_dscp_pg_tuples[i][1],
sidx_dscp_pg_tuples[i][2],
sidx_dscp_pg_tuples[i][0]))

recv_counters, _ = sai_thrift_read_port_counters(
self.src_client, self.asic_type, port_list['src'][self.src_port_ids[sidx_dscp_pg_tuples[i][0]]])
if platform_asic and platform_asic == "broadcom-dnx":
logging.info(
"On J2C+ don't support port level drop counters - so ignoring this step for now")
if self.platform_asic and self.platform_asic == "broadcom-dnx":
logging.info("On J2C+ don't support port level drop counters - so ignoring this step for now")
else:
# assert ingress drop
for cntr in self.ingress_counters:
assert(recv_counters[cntr] > recv_counters_bases[sidx_dscp_pg_tuples[i][0]][cntr])

# assert no egress drop at the dut xmit port
xmit_counters, _ = sai_thrift_read_port_counters(
self.dst_client, self.asic_type, port_list['dst'][self.dst_port_id])
if self.platform_asic != "broadcom-dnx":
xmit_counters, _ = sai_thrift_read_port_counters(self.dst_client, self.asic_type,
port_list['dst'][self.dst_port_id])

if platform_asic and platform_asic == "broadcom-dnx":
logging.info(
"On J2C+ don't support port level drop counters - so ignoring this step for now")
if self.platform_asic and self.platform_asic == "broadcom-dnx":
logging.info("On J2C+ don't support port level drop counters - so ignoring this step for now")
else:
for cntr in self.egress_counters:
assert (xmit_counters[cntr] == xmit_counters_base[cntr])
Expand All @@ -2990,7 +3030,10 @@ def runTest(self):
sys.stderr.flush()

finally:
self.sai_thrift_port_tx_enable(self.dst_client, self.asic_type, [self.dst_port_id])
if self.platform_asic and self.platform_asic == "broadcom-dnx":
self.sai_thrift_port_tx_enable(self.dst_client, self.asic_type, self.uniq_dst_ports)
else:
self.sai_thrift_port_tx_enable(self.dst_client, self.asic_type, [self.dst_port_id])


class SharedResSizeTest(sai_base_test.ThriftInterfaceDataPlane):
Expand Down