def test_portstat_clear(duthosts, enum_rand_one_per_hwsku_frontend_hostname, command): duthost = duthosts[enum_rand_one_per_hwsku_frontend_hostname] wait(30, 'Wait for DUT to receive/send some packets') before_portstat = parse_portstat(duthost.command('portstat')['stdout_lines']) pytest_assert(before_portstat, 'No parsed command output') duthost.command(command) wait(1, 'Wait for portstat counters to refresh') after_portstat = parse_portstat(duthost.command('portstat')['stdout_lines']) pytest_assert(after_portstat, 'No parsed command output') """ Assert only when rx/tx count is no smaller than COUNT_THRES because DUT may send or receive some packets during test after port status are clear """ COUNT_THRES = 10 for intf in before_portstat: rx_ok_before = int(before_portstat[intf]['rx_ok'].replace(',','')) rx_ok_after = int(after_portstat[intf]['rx_ok'].replace(',','')) tx_ok_before = int(before_portstat[intf]['tx_ok'].replace(',','')) tx_ok_after = int(after_portstat[intf]['tx_ok'].replace(',','')) if int(rx_ok_before >= COUNT_THRES): pytest_assert(rx_ok_before >= rx_ok_after, 'Value of RX_OK after clear should be lesser') if int(tx_ok_before >= COUNT_THRES): pytest_assert(tx_ok_before >= tx_ok_after, 'Value of TX_OK after clear should be lesser')
def test_portstat_display_all(duthosts, enum_rand_one_per_hwsku_frontend_hostname, command): duthost = duthosts[enum_rand_one_per_hwsku_frontend_hostname] base_portstat = parse_portstat(duthost.command('portstat')['stdout_lines']) all_portstats = parse_portstat(duthost.command(command)['stdout_lines']) pytest_assert(base_portstat and all_portstats, 'No parsed command output') logger.info('Verify the all number of columns is greater than the base number of columns') for intf in all_portstats.keys(): pytest_assert(len(all_portstats[intf].keys()) > len(base_portstat[intf].keys()))
def test_drop_ip_packet_with_wrong_0xffff_chksum(self, duthost, ptfadapter, common_param): # GIVEN a random normal ip packet, and manually modify checksum to 0xffff # WHEN send the packet to DUT # THEN DUT should drop it and add drop count (peer_ip_ifaces_pair, ptf_port_idx, pc_ports_map, ptf_indices) = common_param pkt = testutils.simple_ip_packet( eth_dst=duthost.facts["router_mac"], eth_src=ptfadapter.dataplane.get_mac(0, ptf_port_idx), ip_src=peer_ip_ifaces_pair[0][0], ip_dst=peer_ip_ifaces_pair[1][0]) pkt.payload.chksum = 0xffff out_ifaces = TestIPPacket.parse_interfaces( duthost.command("show ip route %s" % peer_ip_ifaces_pair[1][0])["stdout_lines"], pc_ports_map) duthost.command("portstat -c") ptfadapter.dataplane.flush() testutils.send(ptfadapter, ptf_port_idx, pkt, self.PKT_NUM) time.sleep(5) portstat_out = parse_portstat(duthost.command("portstat")["stdout_lines"]) rx_ok = int(portstat_out[peer_ip_ifaces_pair[0][1][0]]["rx_ok"].replace(",", "")) rx_drp = int(portstat_out[peer_ip_ifaces_pair[0][1][0]]["rx_drp"].replace(",", "")) tx_ok = TestIPPacket.sum_portstat_ifaces_counts(portstat_out, out_ifaces, "tx_ok") tx_drp = TestIPPacket.sum_portstat_ifaces_counts(portstat_out, out_ifaces, "tx_drp") pytest_assert(self.PKT_NUM_MIN <= rx_ok <= self.PKT_NUM_MAX, "rx_ok unexpected") pytest_assert(self.PKT_NUM_MIN <= rx_drp <= self.PKT_NUM_MAX, "rx_drp unexpected") pytest_assert(tx_ok <= self.PKT_NUM_ZERO, "tx_ok unexpected") pytest_assert(tx_drp <= self.PKT_NUM_ZERO, "tx_drp unexpected")
def test_forward_ip_packet_recomputed_0xffff_chksum(self, duthost, ptfadapter, common_param): # GIVEN a ip packet, after forwarded(ttl-1) by DUT, # it's checksum will be 0xffff after wrongly incrementally recomputed # ref to https://datatracker.ietf.org/doc/html/rfc1624 # HC' = HC(0xff00) + m(0x7a2f) + ~m'(~0x792f)= 0xffff # WHEN send the packet to DUT # THEN DUT recompute new checksum correctly and forward packet as expected. (peer_ip_ifaces_pair, ptf_port_idx, pc_ports_map, ptf_indices) = common_param pkt = testutils.simple_ip_packet( eth_dst=duthost.facts["router_mac"], eth_src=ptfadapter.dataplane.get_mac(0, ptf_port_idx), pktlen=1246, ip_src="10.250.40.40", ip_dst="10.156.190.188", ip_proto=47, ip_tos=0x84, ip_id=0, ip_ihl=5, ip_ttl=122, ) pkt.payload.flags = 2 exp_pkt = pkt.copy() exp_pkt.payload.ttl = 121 exp_pkt.payload.chksum = 0x0001 exp_pkt = mask.Mask(exp_pkt) exp_pkt.set_do_not_care_scapy(packet.Ether, 'dst') exp_pkt.set_do_not_care_scapy(packet.Ether, 'src') out_ifaces = TestIPPacket.parse_interfaces(duthost.command("show ip route 10.156.190.188")["stdout_lines"], pc_ports_map) out_ptf_indices = map(lambda iface: ptf_indices[iface], out_ifaces) duthost.command("portstat -c") ptfadapter.dataplane.flush() testutils.send(ptfadapter, ptf_port_idx, pkt, self.PKT_NUM) time.sleep(5) match_cnt = testutils.count_matched_packets_all_ports(ptfadapter, exp_pkt, ports=out_ptf_indices) portstat_out = parse_portstat(duthost.command("portstat")["stdout_lines"]) rx_ok = int(portstat_out[peer_ip_ifaces_pair[0][1][0]]["rx_ok"].replace(",", "")) rx_drp = int(portstat_out[peer_ip_ifaces_pair[0][1][0]]["rx_drp"].replace(",", "")) tx_ok = TestIPPacket.sum_portstat_ifaces_counts(portstat_out, out_ifaces, "tx_ok") tx_drp = TestIPPacket.sum_portstat_ifaces_counts(portstat_out, out_ifaces, "tx_drp") pytest_assert(match_cnt == self.PKT_NUM, "Packet lost") pytest_assert(self.PKT_NUM_MIN <= rx_ok <= self.PKT_NUM_MAX, "rx_ok unexpected") pytest_assert(self.PKT_NUM_MIN <= tx_ok <= self.PKT_NUM_MAX, "tx_ok unexpected") pytest_assert(rx_drp <= self.PKT_NUM_ZERO, "rx_drp unexpected") pytest_assert(tx_drp <= self.PKT_NUM_ZERO, "tx_drp unexpected")
def test_forward_ip_packet_with_0xffff_chksum_drop(self, duthost, ptfadapter, common_param): # GIVEN a ip packet with checksum 0x0000(compute from scratch) # WHEN manually set checksum as 0xffff and send the packet to DUT # THEN DUT should drop packet with 0xffff and add drop count (peer_ip_ifaces_pair, ptf_port_idx, pc_ports_map, ptf_indices) = common_param pkt = testutils.simple_ip_packet( eth_dst=duthost.facts["router_mac"], eth_src=ptfadapter.dataplane.get_mac(0, ptf_port_idx), pktlen=1246, ip_src="10.250.136.195", ip_dst="10.156.94.34", ip_proto=47, ip_tos=0x84, ip_id=0, ip_ihl=5, ip_ttl=121, ) pkt.payload.flags = 2 pkt.payload.chksum = 0xffff exp_pkt = pkt.copy() exp_pkt.payload.ttl = 120 exp_pkt.payload.chksum = 0x0100 exp_pkt = mask.Mask(exp_pkt) exp_pkt.set_do_not_care_scapy(packet.Ether, 'dst') exp_pkt.set_do_not_care_scapy(packet.Ether, 'src') out_ifaces = TestIPPacket.parse_interfaces(duthost.command("show ip route 10.156.94.34")["stdout_lines"], pc_ports_map) out_ptf_indices = map(lambda iface: ptf_indices[iface], out_ifaces) duthost.command("portstat -c") ptfadapter.dataplane.flush() testutils.send(ptfadapter, ptf_port_idx, pkt, self.PKT_NUM) time.sleep(5) match_cnt = testutils.count_matched_packets_all_ports(ptfadapter, exp_pkt, ports=out_ptf_indices) portstat_out = parse_portstat(duthost.command("portstat")["stdout_lines"]) rx_ok = int(portstat_out[peer_ip_ifaces_pair[0][1][0]]["rx_ok"].replace(",", "")) rx_drp = int(portstat_out[peer_ip_ifaces_pair[0][1][0]]["rx_drp"].replace(",", "")) tx_ok = TestIPPacket.sum_portstat_ifaces_counts(portstat_out, out_ifaces, "tx_ok") tx_drp = TestIPPacket.sum_portstat_ifaces_counts(portstat_out, out_ifaces, "tx_drp") pytest_assert(match_cnt == 0, "Packet not dropped") pytest_assert(self.PKT_NUM_MIN <= rx_ok <= self.PKT_NUM_MAX, "rx_ok unexpected") pytest_assert(self.PKT_NUM_MIN <= rx_drp <= self.PKT_NUM_MAX, "rx_drp unexpected") pytest_assert(tx_drp <= self.PKT_NUM_ZERO, "tx_drp unexpected") pytest_assert(tx_ok <= self.PKT_NUM_ZERO, "tx_ok unexpected")
def test_forward_normal_ip_packet(self, duthost, ptfadapter, common_param): # GIVEN a random normal ip packet # WHEN send the packet to DUT # THEN DUT should forward it as normal ip packet, nothing change but ttl-1 (peer_ip_ifaces_pair, ptf_port_idx, pc_ports_map, ptf_indices) = common_param pkt = testutils.simple_ip_packet( eth_dst=duthost.facts["router_mac"], eth_src=ptfadapter.dataplane.get_mac(0, ptf_port_idx), ip_src=peer_ip_ifaces_pair[0][0], ip_dst=peer_ip_ifaces_pair[1][0]) exp_pkt = pkt.copy() exp_pkt.payload.ttl = pkt.payload.ttl - 1 exp_pkt = mask.Mask(exp_pkt) exp_pkt.set_do_not_care_scapy(packet.Ether, 'dst') exp_pkt.set_do_not_care_scapy(packet.Ether, 'src') out_ifaces = TestIPPacket.parse_interfaces( duthost.command("show ip route %s" % peer_ip_ifaces_pair[1][0])["stdout_lines"], pc_ports_map) out_ptf_indices = map(lambda iface: ptf_indices[iface], out_ifaces) duthost.command("portstat -c") ptfadapter.dataplane.flush() testutils.send(ptfadapter, ptf_port_idx, pkt, self.PKT_NUM) time.sleep(5) match_cnt = testutils.count_matched_packets_all_ports(ptfadapter, exp_pkt, ports=out_ptf_indices) portstat_out = parse_portstat(duthost.command("portstat")["stdout_lines"]) rx_ok = int(portstat_out[peer_ip_ifaces_pair[0][1][0]]["rx_ok"].replace(",", "")) rx_drp = int(portstat_out[peer_ip_ifaces_pair[0][1][0]]["rx_drp"].replace(",", "")) tx_ok = TestIPPacket.sum_portstat_ifaces_counts(portstat_out, out_ifaces, "tx_ok") tx_drp = TestIPPacket.sum_portstat_ifaces_counts(portstat_out, out_ifaces, "tx_drp") pytest_assert(match_cnt == self.PKT_NUM, "Packet lost") pytest_assert(self.PKT_NUM_MIN <= rx_ok <= self.PKT_NUM_MAX, "rx_ok unexpected") pytest_assert(self.PKT_NUM_MIN <= tx_ok <= self.PKT_NUM_MAX, "tx_ok unexpected") pytest_assert(rx_drp <= self.PKT_NUM_ZERO, "rx_drp unexpected") pytest_assert(tx_drp <= self.PKT_NUM_ZERO, "tx_drp unexpected")