From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by dpdk.org (Postfix) with ESMTP id 1A2502B9B for ; Fri, 20 Jan 2017 09:52:46 +0100 (CET) Received: from fmsmga001.fm.intel.com ([10.253.24.23]) by orsmga103.jf.intel.com with ESMTP; 20 Jan 2017 00:52:45 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.33,258,1477983600"; d="scan'208";a="1096610909" Received: from unknown (HELO dpdk-fedora20.icx.intel.com) ([10.240.176.135]) by fmsmga001.fm.intel.com with ESMTP; 20 Jan 2017 00:52:45 -0800 From: Peng Yuan To: dts@dpdk.org Cc: Peng Yuan Date: Fri, 20 Jan 2017 16:53:49 +0800 Message-Id: <1484902429-2165-1-git-send-email-yuan.peng@intel.com> X-Mailer: git-send-email 1.9.3 Subject: [dts] [PATCH] tests: add test_rx_checksum_valid_flags X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 20 Jan 2017 08:52:48 -0000 Signed-off-by: Peng Yuan diff --git a/tests/TestSuite_checksum_offload.py b/tests/TestSuite_checksum_offload.py index 7989c14..a3dd1fe 100644 --- a/tests/TestSuite_checksum_offload.py +++ b/tests/TestSuite_checksum_offload.py @@ -44,6 +44,7 @@ import utils from test_case import TestCase from pmd_output import PmdOutput + class TestChecksumOffload(TestCase): def set_up_all(self): @@ -58,7 +59,7 @@ class TestChecksumOffload(TestCase): self.pmdout = PmdOutput(self.dut) self.portMask = utils.create_mask([self.dut_ports[0]]) self.ports_socket = self.dut.get_numa_id(self.dut_ports[0]) - + def set_up(self): """ Run before each test case. @@ -81,6 +82,89 @@ class TestChecksumOffload(TestCase): self.dut.send_expect("csum set tcp sw %d" % port, "testpmd>") self.dut.send_expect("csum set sctp sw %d" % port, "testpmd>") + def get_chksum_values(self, packets_expected): + """ + Validate the checksum flags. + """ + tx_interface = self.tester.get_interface(self.tester.get_local_port(self.dut_ports[0])) + rx_interface = self.tester.get_interface(self.tester.get_local_port(self.dut_ports[0])) + + sniff_src = self.dut.get_mac_address(self.dut_ports[0]) + checksum_pattern = re.compile("chksum.*=.*(0x[0-9a-z]+)") + + chksum = dict() + + self.tester.send_expect("scapy", ">>> ") + + for packet_type in packets_expected.keys(): + self.tester.send_expect("p = %s" % packets_expected[packet_type], ">>>") + out = self.tester.send_expect("p.show2()", ">>>") + chksums = checksum_pattern.findall(out) + chksum[packet_type] = chksums + + self.tester.send_expect("exit()", "#") + + return chksum + + def checksum_valid_flags(self, chksum_expected, packets_sent, flag): + """ + Sends packets and check the checksum valid-flags. + """ + self.tester.scapy_foreground() + self.dut.send_expect("start", "testpmd>") + mac = self.dut.get_mac_address(self.dut_ports[0]) + tx_interface = self.tester.get_interface(self.tester.get_local_port(self.dut_ports[0])) + self.tester.scapy_foreground() + + for packet_type in packets_sent.keys(): + self.tester.scapy_append('sendp([%s], iface="%s")' % (packets_sent[packet_type], tx_interface)) + self.tester.scapy_execute() + out = self.dut.get_session_output(timeout=1) + lines = out.split("\r\n") + + # collect the checksum result + for line in lines: + line = line.strip() + if len(line) != 0 and line.startswith("rx"): + # IPv6 don't be checksum, so always show "GOOD" + if packet_type.startswith("IPv6"): + if "PKT_RX_L4_CKSUM" not in line: + self.verify(0, "There is no checksum flags appeared!") + else: + for item in line.split(): + item = item.strip() + if "PKT_RX_L4_CKSUM" in item: + flags, l4_chsum = item.split("=", 1) + name, value = l4_chsum.split("_CKSUM_", 1) + if (flag == 1): + self.verify(value == "GOOD", "Packet Rx L4 checksum valid-flags error!") + else: + self.verify(value == "BAD", "Packet Rx L4 checksum valid-flags error!") + else: + if "PKT_RX_L4_CKSUM" not in line: + self.verify(0, "There is no L4 checksum flags appeared!") + elif "PKT_RX_IP_CKSUM" not in line: + self.verify(0, "There is no IP checksum flags appeared!") + else: + for item in line.split(): + item = item.strip() + if "PKT_RX_L4_CKSUM" in item: + flags, l4_chsum = item.split("=", 1) + name, value = l4_chsum.split("_CKSUM_", 1) + if (flag == 1): + self.verify(value == "GOOD", "Packet Rx L4 checksum valid-flags error!") + else: + self.verify(value == "BAD", "Packet Rx L4 checksum valid-flags error!") + + elif(item.startswith("PKT_RX_IP_CKSUM")): + name, value = item.split("_CKSUM_", 1) + if (flag == 1): + self.verify(value == "GOOD", "Packet Rx IP checksum valid-flags error!") + else: + self.verify(value == "BAD", "Packet Rx IP checksum valid-flags error!") + + self.dut.send_expect("stop", "testpmd>") + def checksum_validate(self, packets_sent, packets_expected): """ Validate the checksum. @@ -101,7 +185,7 @@ class TestChecksumOffload(TestCase): out = self.tester.send_expect("p.show2()", ">>>") chksums = checksum_pattern.findall(out) chksum[packet_type] = chksums - + self.tester.send_expect("exit()", "#") self.tester.scapy_background() @@ -123,16 +207,16 @@ class TestChecksumOffload(TestCase): self.verify(len(packets_sent) == len(packets_received), "Unexpected Packets Drop") for packet_received in packets_received: - ip_checksum, tcp_checksum, udp_checksup, sctp_checksum = packet_received.split(';') + ip_checksum, tcp_checksum, udp_checksum, sctp_checksum = packet_received.split(';') packet_type = '' l4_checksum = '' if tcp_checksum != '??': packet_type = 'TCP' l4_checksum = tcp_checksum - elif udp_checksup != '??': + elif udp_checksum != '??': packet_type = 'UDP' - l4_checksum = udp_checksup + l4_checksum = udp_checksum elif sctp_checksum != '??': packet_type = 'SCTP' l4_checksum = sctp_checksum @@ -157,16 +241,16 @@ class TestChecksumOffload(TestCase): mac = self.dut.get_mac_address(self.dut_ports[0]) pktsChkErr = {'IP/UDP': 'Ether(dst="%s", src="52:00:00:00:00:00")/Dot1Q(vlan=1)/IP(chksum=0x0)/UDP(chksum=0xf)/("X"*46)' % mac, - 'IP/TCP': 'Ether(dst="%s", src="52:00:00:00:00:00")/Dot1Q(vlan=1)/IP(chksum=0x0)/TCP(chksum=0xf)/("X"*46)' % mac, - 'IP/SCTP': 'Ether(dst="%s", src="52:00:00:00:00:00")/Dot1Q(vlan=1)/IP(chksum=0x0)/SCTP(chksum=0xf)/("X"*48)' % mac, - 'IPv6/UDP': 'Ether(dst="%s", src="52:00:00:00:00:00")/Dot1Q(vlan=1)/IPv6(src="::1")/UDP(chksum=0xf)/("X"*46)' % mac, - 'IPv6/TCP': 'Ether(dst="%s", src="52:00:00:00:00:00")/Dot1Q(vlan=1)/IPv6(src="::1")/TCP(chksum=0xf)/("X"*46)' % mac} + 'IP/TCP': 'Ether(dst="%s", src="52:00:00:00:00:00")/Dot1Q(vlan=1)/IP(chksum=0x0)/TCP(chksum=0xf)/("X"*46)' % mac, + 'IP/SCTP': 'Ether(dst="%s", src="52:00:00:00:00:00")/Dot1Q(vlan=1)/IP(chksum=0x0)/SCTP(chksum=0xf)/("X"*48)' % mac, + 'IPv6/UDP': 'Ether(dst="%s", src="52:00:00:00:00:00")/Dot1Q(vlan=1)/IPv6(src="::1")/UDP(chksum=0xf)/("X"*46)' % mac, + 'IPv6/TCP': 'Ether(dst="%s", src="52:00:00:00:00:00")/Dot1Q(vlan=1)/IPv6(src="::1")/TCP(chksum=0xf)/("X"*46)' % mac} pkts = {'IP/UDP': 'Ether(dst="02:00:00:00:00:00", src="%s")/Dot1Q(vlan=1)/IP(src="127.0.0.1")/UDP()/("X"*46)' % mac, - 'IP/TCP': 'Ether(dst="02:00:00:00:00:00", src="%s")/Dot1Q(vlan=1)/IP(src="127.0.0.1")/TCP()/("X"*46)' % mac, - 'IP/SCTP': 'Ether(dst="02:00:00:00:00:00", src="%s")/Dot1Q(vlan=1)/IP(src="127.0.0.1")/SCTP()/("X"*48)' % mac, - 'IPv6/UDP': 'Ether(dst="02:00:00:00:00:00", src="%s")/Dot1Q(vlan=1)/IPv6(src="::1")/UDP()/("X"*46)' % mac, - 'IPv6/TCP': 'Ether(dst="02:00:00:00:00:00", src="%s")/Dot1Q(vlan=1)/IPv6(src="::1")/TCP()/("X"*46)' % mac} + 'IP/TCP': 'Ether(dst="02:00:00:00:00:00", src="%s")/Dot1Q(vlan=1)/IP(src="127.0.0.1")/TCP()/("X"*46)' % mac, + 'IP/SCTP': 'Ether(dst="02:00:00:00:00:00", src="%s")/Dot1Q(vlan=1)/IP(src="127.0.0.1")/SCTP()/("X"*48)' % mac, + 'IPv6/UDP': 'Ether(dst="02:00:00:00:00:00", src="%s")/Dot1Q(vlan=1)/IPv6(src="::1")/UDP()/("X"*46)' % mac, + 'IPv6/TCP': 'Ether(dst="02:00:00:00:00:00", src="%s")/Dot1Q(vlan=1)/IPv6(src="::1")/TCP()/("X"*46)' % mac} if self.kdriver == "fm10k": del pktsChkErr['IP/SCTP'] @@ -177,7 +261,50 @@ class TestChecksumOffload(TestCase): result = self.checksum_validate(pktsChkErr, pkts) self.dut.send_expect("stop", "testpmd>") self.verify(len(result) == 0, string.join(result.values(), ",")) + + def test_rx_checksum_valid_flags(self): + """ + Insert right and wrong IPv4/IPv6 UDP/TCP/SCTP checksum on the + transmit packet.Enable Checksum offload. + Verify the checksum valid-flags. + """ + mac = self.dut.get_mac_address(self.dut_ports[0]) + + pkts_ref = {'IP/UDP': 'Ether(dst="%s", src="52:00:00:00:00:00")/IP()/UDP()/("X"*46)' % mac, + 'IP/TCP': 'Ether(dst="%s", src="52:00:00:00:00:00")/IP(src="10.0.0.1")/TCP()/("X"*46)' % mac, + 'IP/SCTP': 'Ether(dst="%s", src="52:00:00:00:00:00")/IP(src="10.0.0.1")/SCTP()/("X"*48)' % mac, + 'IPv6/UDP': 'Ether(dst="%s", src="52:00:00:00:00:00")/IPv6(src="::1")/UDP()/("X"*46)' % mac, + 'IPv6/TCP': 'Ether(dst="%s", src="52:00:00:00:00:00")/IPv6(src="::1")/TCP()/("X"*46)' % mac} + + result = dict() + if self.kdriver == "fm10k": + del pkts['IP/SCTP'] + del pkts_ref['IP/SCTP'] + + self.checksum_enablehw(self.dut_ports[0]) + # get the packet checksum value + result = self.get_chksum_values(pkts_ref) + + # set the expected checksum values same with the actual values + pkts_good = {'IP/UDP': 'Ether(dst="%s", src="52:00:00:00:00:00")/IP(chksum=int(%s))/UDP(chksum=int(%s))/("X"*46)' % (mac, result['IP/UDP'][0], result['IP/UDP'][1]), + 'IP/TCP': 'Ether(dst="%s", src="52:00:00:00:00:00")/IP(src="10.0.0.1",chksum=int(%s))/TCP(chksum=int(%s))/("X"*46)' % (mac, result['IP/TCP'][0], result['IP/TCP'][1]), + 'IP/SCTP': 'Ether(dst="%s", src="52:00:00:00:00:00")/IP(src="10.0.0.1",chksum=int(%s))/SCTP(chksum=int(%s))/("X"*48)' % (mac, result['IP/SCTP'][0], result['IP/SCTP'][1]), + 'IPv6/UDP': 'Ether(dst="%s", src="52:00:00:00:00:00")/IPv6(src="::1")/UDP(chksum=int(%s))/("X"*46)' % (mac, result['IPv6/UDP'][0]), + 'IPv6/TCP': 'Ether(dst="%s", src="52:00:00:00:00:00")/IPv6(src="::1")/TCP(chksum=int(%s))/("X"*46)' % (mac, result['IPv6/TCP'][0])} + + # set the expected checksum values different from the actual values + pkts_bad = {'IP/UDP': 'Ether(dst="%s", src="52:00:00:00:00:00")/IP(chksum=0x0)/UDP(chksum=0xf)/("X"*46)' % mac, + 'IP/TCP': 'Ether(dst="%s", src="52:00:00:00:00:00")/IP(src="10.0.0.1",chksum=0x0)/TCP(chksum=0xf)/("X"*46)' % mac, + 'IP/SCTP': 'Ether(dst="%s", src="52:00:00:00:00:00")/IP(src="10.0.0.1",chksum=0x0)/SCTP(chksum=0xf)/("X"*48)' % mac, + 'IPv6/UDP': 'Ether(dst="%s", src="52:00:00:00:00:00")/IPv6(src="::1")/UDP(chksum=0xf)/("X"*46)' % mac, + 'IPv6/TCP': 'Ether(dst="%s", src="52:00:00:00:00:00")/IPv6(src="::1")/TCP(chksum=0xf)/("X"*46)' % mac} + + # send the packet checksum value same with the expected value + self.checksum_valid_flags(result, pkts_good, 1) + # send the packet checksum value different from the expected value + self.checksum_valid_flags(result, pkts_bad, 0) + def test_checksum_offload_enable(self): """ Insert IPv4/IPv6 UDP/TCP/SCTP checksum on the transmit packet. -- 2.5.0