in ptf/saiqueue.py [0:0]
def runTest(self):
print("DWRR Bandwidth Distribution Test")
# Create configuration
# 1. QoS map configuration for egress port to redirect traffic
# on queues.
# DSCP -> TC egress, PORT 25 (sender)
map_list = []
dscp_list = [0, 1, 2, 3, 4, 5, 6, 7]
tc_list = [0, 1, 2, 3, 4, 5, 6, 7]
for traffic_class, dscp in zip(tc_list, dscp_list):
dscp_to_tc = sai_thrift_qos_map_t(
key=sai_thrift_qos_map_params_t(dscp=dscp),
value=sai_thrift_qos_map_params_t(tc=traffic_class))
map_list.append(dscp_to_tc)
qos_map_list = sai_thrift_qos_map_list_t(
count=len(map_list),
maplist=map_list)
indirect_qos_map = sai_thrift_create_qos_map(
self.client,
type=SAI_QOS_MAP_TYPE_DSCP_TO_TC,
map_to_value_list=qos_map_list)
status = sai_thrift_set_port_attribute(
self.client,
self.port25,
qos_dscp_to_tc_map=indirect_qos_map)
self.assertEqual(status, SAI_STATUS_SUCCESS)
# TC -> Queue on egress, PORT 25 (sender)
map_list2 = []
egress_queue_indices = []
# Port 25 queue list (sender)
port25_attr = sai_thrift_get_port_attribute(
self.client,
self.port25,
qos_number_of_queues=True,
qos_queue_list=self.q_list)
num_queues = port25_attr["qos_number_of_queues"]
queue_id_list_port25 = port25_attr["qos_queue_list"].idlist
# Port 26 queue list (receiver)
port26_attr = sai_thrift_get_port_attribute(
self.client,
self.port26,
qos_queue_list=self.q_list)
queue_id_list_port26 = port26_attr["qos_queue_list"].idlist
for i in tc_list:
egress_queue_attr = sai_thrift_get_queue_attribute(
self.client,
port25_attr["qos_queue_list"].idlist[i],
index=True)
queue_index = egress_queue_attr["index"]
egress_queue_indices.append(queue_index)
tc_to_queue = sai_thrift_qos_map_t(
key=sai_thrift_qos_map_params_t(tc=i),
value=sai_thrift_qos_map_params_t(queue_index=queue_index))
map_list2.append(tc_to_queue)
# Clear statistics for each queue in PORT25
clear_counter(
self, sai_thrift_clear_queue_stats, queue_id_list_port25[i])
# Clear statistics for each queue in PORT26
clear_counter(
self, sai_thrift_clear_queue_stats, queue_id_list_port26[i])
qos_map_list2 = sai_thrift_qos_map_list_t(
count=len(map_list2),
maplist=map_list2)
target_qos_map = sai_thrift_create_qos_map(
self.client,
type=SAI_QOS_MAP_TYPE_TC_TO_QUEUE,
map_to_value_list=qos_map_list2)
status = sai_thrift_set_port_attribute(
self.client,
self.port25,
qos_tc_to_queue_map=target_qos_map)
self.assertEqual(status, SAI_STATUS_SUCCESS)
# 2. Create scheduler's structre
# Scheduler profiles for queues
schedulers = []
weight = 8
for queue in range(0, int(num_queues / 2)):
sched = sai_thrift_create_scheduler(
self.client,
meter_type=SAI_METER_TYPE_PACKETS,
scheduling_type=SAI_SCHEDULING_TYPE_DWRR,
scheduling_weight=weight)
self.assertTrue(sched != 0)
schedulers.append(sched)
weight //= 2
# Scheduler profile for port shape
shaper = sai_thrift_create_scheduler(
self.client,
meter_type=SAI_METER_TYPE_PACKETS,
scheduling_type=SAI_SCHEDULING_TYPE_DWRR,
max_bandwidth_rate=750)
self.assertTrue(shaper != 0)
status = sai_thrift_set_port_attribute(
self.client,
self.port26,
qos_scheduler_profile_id=shaper)
self.assertEqual(status, SAI_STATUS_SUCCESS)
# 3. Create queue's structure
for queue in range(0, num_queues):
# weights for: queue.0 = 8, queue.1 = 4, queue.2 = 2
if num_queues < 3:
status = sai_thrift_set_queue_attribute(
self.client,
queue_id_list_port26[queue],
scheduler_profile_id=schedulers[queue % 3])
# weights for others: queue.x = 1
else:
status = sai_thrift_set_queue_attribute(
self.client,
queue_id_list_port26[queue],
scheduler_profile_id=schedulers[3])
self.assertEqual(status, SAI_STATUS_SUCCESS)
print("\tConfiguration completed")
# Build packets with different type of service
pkts = []
exp_pkts = []
for i in range(0, num_queues):
tos = i << 2
pkt = simple_tcp_packet(eth_dst=ROUTER_MAC,
eth_src="00:00:00:00:00:22",
ip_dst="172.16.1.1",
ip_src="192.168.0.1",
ip_id=105,
ip_tos=tos,
ip_ttl=64)
pkts.append(pkt)
exp_pkt = simple_tcp_packet(eth_dst="00:11:22:33:44:55",
eth_src=ROUTER_MAC,
ip_dst="172.16.1.1",
ip_src="192.168.0.1",
ip_id=105,
ip_tos=tos,
ip_ttl=63)
exp_pkts.append(exp_pkt)
try:
print("\tSending 19 packets PORT25 -> PORT26")
rec_pkt = 0
congestion_rate = 2
pkt_cnt = congestion_rate * num_queues
for _ in range(0, congestion_rate):
for i in range(0, num_queues):
send_packet(self, self.dev_port25, pkts[i])
# To increase packet rate, disable verification
# verify_packet(self, exp_pkts[i], self.dev_port26)
rec_pkt += 1
send_packet(self, self.dev_port25, pkts[2])
print("\tChecking if received packet number equals sent one")
print("Expected: {}, Received: {}".format(pkt_cnt, rec_pkt))
self.assertTrue(rec_pkt == pkt_cnt)
print("\tPackets received on PORT26")
print("\tDelay for statistics read")
time.sleep(5)
print("\tChecking received packets on particular queues")
exp_pkt_num = 8
for queue in range(0, num_queues):
time.sleep(5)
q_stats = query_counter(
self, sai_thrift_get_queue_stats,
queue_id_list_port26[queue])
rec_pkt_num = q_stats["SAI_QUEUE_STAT_PACKETS"]
print("Queue:", queue)
print("Received no. packets:", rec_pkt_num)
print("Expected no. packets:", exp_pkt_num)
# self.assertTrue(rec_pkt_num == exp_pkt_num)
if exp_pkt_num != 1:
exp_pkt_num //= 2
print("\tThe packet distribution is correct.")
print("\tTest completed successfully")
finally:
stats = query_counter(
self, sai_thrift_get_queue_stats_ext,
queue_id_list_port26[0],
SAI_STATS_MODE_READ_AND_CLEAR)
cnt = stats["SAI_QUEUE_STAT_PACKETS"]
self.assertEqual(cnt, 2)
stats = query_counter(
self, sai_thrift_get_queue_stats,
queue_id_list_port26[0])
cnt = stats["SAI_QUEUE_STAT_PACKETS"]
self.assertEqual(cnt, 0)
print("\tTest completed successfully")
status = sai_thrift_set_port_attribute(
self.client,
self.port26,
qos_scheduler_profile_id=0)
self.assertEqual(status, SAI_STATUS_SUCCESS)
sai_thrift_remove_scheduler(self.client, shaper)
status = sai_thrift_set_port_attribute(
self.client,
self.port25,
qos_tc_to_queue_map=0)
self.assertEqual(status, SAI_STATUS_SUCCESS)
status = sai_thrift_set_port_attribute(
self.client,
self.port25,
qos_dscp_to_tc_map=0)
self.assertEqual(status, SAI_STATUS_SUCCESS)
sai_thrift_remove_qos_map(self.client, indirect_qos_map)
sai_thrift_remove_qos_map(self.client, target_qos_map)
for queue in range(0, num_queues):
status = sai_thrift_set_queue_attribute(
self.client,
queue_id_list_port26[queue],
scheduler_profile_id=0)
self.assertEqual(status, SAI_STATUS_SUCCESS)
for i in range(0, int(num_queues / 2)):
sai_thrift_remove_scheduler(self.client, schedulers[i])