Skip to content

Commit

Permalink
QoSHdrmPoolsize _tx_disable_enable for all destination ports in lag (s…
Browse files Browse the repository at this point in the history
…onic-net#11008)

* QoSHdrmPoolsize_collecting dst ports in lag for tx_disable_enable
  • Loading branch information
ansrajpu-git committed May 15, 2024
1 parent 9d72265 commit ebe0ea9
Showing 1 changed file with 94 additions and 43 deletions.
137 changes: 94 additions & 43 deletions tests/saitests/py3/sai_qos_tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -2439,6 +2439,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 @@ -2531,6 +2532,17 @@ def setUp(self):
def_vlan_mac = self.test_params.get('def_vlan_mac', None)
if is_dualtor and def_vlan_mac != 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 @@ -2544,15 +2556,24 @@ def show_port_counter(self, asic_type, rx_base, tx_base, banner):
for srcPortIdx, srcPortId in enumerate(self.src_port_ids):
port_cnt_tbl.add_row(['base src_port{}_id{}'.format(srcPortIdx, srcPortId)] + [rx_base[srcPortIdx][fieldIdx] for fieldIdx in port_counter_indexes])
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])
port_cnt_tbl.add_row([' src_port{}_id{}'.format(srcPortIdx, srcPortId)] +
[rx_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 @@ -2564,15 +2585,26 @@ def runTest(self):

# get a snapshot of counter values at recv and transmit ports
# 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])
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]
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 @@ -2616,14 +2648,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 @@ -2632,10 +2664,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 @@ -2672,16 +2705,22 @@ 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))
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))
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" % (
Expand Down Expand Up @@ -2724,23 +2763,12 @@ 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]))
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]]])
Expand Down Expand Up @@ -2768,7 +2796,16 @@ def runTest(self):
if 'innovium' not in self.asic_type:
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 @@ -2780,23 +2817,34 @@ 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":
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":
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:
Expand All @@ -2818,7 +2866,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

0 comments on commit ebe0ea9

Please sign in to comment.