From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from dpdk.org (dpdk.org [92.243.14.124]) by inbox.dpdk.org (Postfix) with ESMTP id E1B0BA0553; Mon, 17 Feb 2020 09:26:50 +0100 (CET) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id C2F4A1D8E3; Mon, 17 Feb 2020 09:26:50 +0100 (CET) Received: from mga17.intel.com (mga17.intel.com [192.55.52.151]) by dpdk.org (Postfix) with ESMTP id CE38D1D8E2 for ; Mon, 17 Feb 2020 09:26:48 +0100 (CET) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga006.fm.intel.com ([10.253.24.20]) by fmsmga107.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 17 Feb 2020 00:26:47 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.70,451,1574150400"; d="scan'208";a="435478347" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by fmsmga006.fm.intel.com with ESMTP; 17 Feb 2020 00:26:47 -0800 Received: from fmsmsx120.amr.corp.intel.com (10.18.124.208) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.439.0; Mon, 17 Feb 2020 00:26:47 -0800 Received: from shsmsx106.ccr.corp.intel.com (10.239.4.159) by fmsmsx120.amr.corp.intel.com (10.18.124.208) with Microsoft SMTP Server (TLS) id 14.3.439.0; Mon, 17 Feb 2020 00:26:46 -0800 Received: from shsmsx103.ccr.corp.intel.com ([169.254.4.196]) by SHSMSX106.ccr.corp.intel.com ([169.254.10.225]) with mapi id 14.03.0439.000; Mon, 17 Feb 2020 16:26:44 +0800 From: "Peng, Yuan" To: "S, Varalakshmi" , "dts@dpdk.org" CC: "S, Varalakshmi" Thread-Topic: [dts] [PATCH] [PATCH]tests: Test Script for L2TPv3 Thread-Index: AQHV4xtBxM9wRinU8UKzu8w8bxv7eagfDVeA Date: Mon, 17 Feb 2020 08:26:43 +0000 Message-ID: <67D543A150B29E4CAAE53918F64EDAEA37800C92@SHSMSX103.ccr.corp.intel.com> References: <20200214094310.11529-1-varalakshmi.s@intel.com> In-Reply-To: <20200214094310.11529-1-varalakshmi.s@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiNDFlMWMzMzktZWJmNi00OTJjLTg3MDMtMGQyZmI2YWFiMGVhIiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjEwLjE4MDQuNDkiLCJUcnVzdGVkTGFiZWxIYXNoIjoiWTRmSnRtT1BZUXVaMVNwd2dOSFh2cUxJNjJ6RTJvYTg5YXVhUE9VK1FNZEJXeWNqajRZMGd3Mk5rZ0tVTnRVUSJ9 x-ctpclassification: CTP_NT dlp-product: dlpe-windows dlp-version: 11.2.0.6 dlp-reaction: no-action x-originating-ip: [10.239.127.40] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Subject: Re: [dts] [PATCH] [PATCH]tests: Test Script for L2TPv3 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: , Errors-To: dts-bounces@dpdk.org Sender: "dts" Hi Lakshimi, There are many similar hard code steps in each test case, like: self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset set fiel= d 27') You'd better put them to a function, the pctype and flowtype can be passing= by argument. You can refer to the TestSuite_ddp_ppp_l2tp.py There are 3 cases less than test plan: Test Case : Adding L2TPv3 profile to the port Test Case : Deleting L2TPv3 profile from the port Test Case : Adding and deleting Flow Director rules -----Original Message----- From: dts On Behalf Of Varalakshmi Sent: Friday, February 14, 2020 5:43 PM To: dts@dpdk.org Cc: S, Varalakshmi Subject: [dts] [PATCH] [PATCH]tests: Test Script for L2TPv3 Automated script for L2TPv3 feature Signed-off-by: Varalakshmi --- tests/TestSuite_DdpL2tpv3.py | 568 +++++++++++++++++++++++++++++++++++ 1 file changed, 568 insertions(+) create mode 100644 tests/TestSuite_DdpL2tpv3.py diff --git a/tests/TestSuite_DdpL2tpv3.py b/tests/TestSuite_DdpL2tpv3.py ne= w file mode 100644 index 0000000..24b4f3c --- /dev/null +++ b/tests/TestSuite_DdpL2tpv3.py @@ -0,0 +1,568 @@ +# +import time +import re +import sys +import utils +from test_case import TestCase +from pmd_output import PmdOutput +from settings import get_nic_name +from scapy.all import * +import random + +class TestDdpL2tpv3(TestCase): + + def set_up_all(self): + self.dut_ports =3D self.dut.get_ports(self.nic) + profile_file =3D 'dep/l2tpv3oip-l4.pkg' + profile_dst =3D "/tmp/" + self.dut.session.copy_file_to(profile_file, profile_dst) + out =3D self.dut.send_expect("cat config/common_base", "]# ", 10) + self.PF_Q_strip =3D 'CONFIG_RTE_LIBRTE_I40E_QUEUE_NUM_PER_PF' + pattern =3D "(%s=3D)(\d*)" % self.PF_Q_strip + self.PF_QUEUE =3D self.element_strip(out, pattern) + self.used_dut_port =3D self.dut_ports[0] + tester_port =3D self.tester.get_local_port(self.used_dut_port) + self.tester_intf =3D self.tester.get_interface(tester_port) + self.dut_testpmd =3D PmdOutput(self.dut) + + def set_up(self): + self.load_profile() + + def element_strip(self, out, pattern): + """ + Strip and get queue number. + """ + =20 + s =3D re.compile(pattern) + res =3D s.search(out) + if res is None: + print 'Queue number not in output.' + return None + else: + result =3D res.group(2) + return int(result) + + + def load_profile(self): + """ + Load profile to update FVL configuration tables, profile will be + stored in binary file. + """ + self.dut_testpmd.start_testpmd( + "Default", "--pkt-filter-mode=3Dperfect --port-topology=3Dchai= ned \ + --txq=3D%s --rxq=3D%s --disable-rss" + % (self.PF_QUEUE, self.PF_QUEUE)) + self.dut_testpmd.execute_cmd('port stop 0') + time.sleep(1) + self.dut_testpmd.execute_cmd( + 'ddp add 0 /tmp/l2tpv3oip-l4.pkg,/tmp/l2tpv3oip-l4.bak') + out =3D self.dut_testpmd.execute_cmd('ddp get list 0') + self.verify("Profile number is: 1" in out, + "Failed to load ddp profile!!!") + self.dut_testpmd.execute_cmd('port start all') + + def l2tpv3pkts(self, keyword): + """ + Generate L2TPv3oIPv4, L2TPv3oIPv6 and UDP packets. + """ + pkt =3D [] + if keyword is not 'def': + if keyword is "l2tpv3oipv4": + pkt.append("Ether()/IP(proto=3D115)/Raw('\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IP(proto=3D115)/Raw('\\x00\\x00\\x03\\= fe9')") + if keyword is "l2tpv3oipv4_dst": + pkt.append("Ether()/IP(dst=3D\"8.8.8.8\",proto=3D115)/Raw(= '\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IP(dst=3D\"8.8.8.8\",proto=3D115)/Raw(= '\\x00\\x00\\x03\\xb9')") + pkt.append("Ether()/IP(dst=3D\"88.8.8.8\",proto=3D115)/Raw= ('\\x00\\x00\\x03\\xe9')") + if keyword is "l2tpv3oipv4_src": + pkt.append("Ether()/IP(src=3D\"1.1.1.1\",proto=3D115)/Raw(= '\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IP(src=3D\"1.1.1.1\",proto=3D115)/Raw(= '\\x00\\x00\\x03\\xa9')") + pkt.append("Ether()/IP(src=3D\"11.1.1.1\",proto=3D115)/Raw= ('\\x00\\x00\\x03\\xe9')") + if keyword is "l2tpv3oipv4_src_dst": + pkt.append("Ether()/IP(src=3D\"5.5.5.5\",dst=3D\"2.2.2.2\"= ,proto=3D115)/Raw('\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IP(src=3D\"5.5.5.5\",dst=3D\"2.2.2.2\"= ,proto=3D115)/Raw('\\x00\\x00\\x03\\xf9')") + pkt.append("Ether()/IP(src=3D\"55.5.5.5\",dst=3D\"2.2.2.2\= ",proto=3D115)/Raw('\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IP(src=3D\"5.5.5.5\",dst=3D\"22.2.2.2\= ",proto=3D115)/Raw('\\x00\\x00\\x03\\xe9')") + if keyword is "l2tpv3oipv6": + pkt.append("Ether()/IPv6(nh=3D115)/Raw('\\x00\\x00\\x03\\x= e9')") + pkt.append("Ether()/IPv6(nh=3D115)/Raw('\\x00\\x00\\x03\\x= c9')") + if keyword is "l2tpv3oipv6_dst": + pkt.append("Ether()/IPv6(dst=3D\"8:7:6:5:4:3:2:1\",nh=3D11= 5)/Raw('\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IPv6(dst=3D\"8:7:6:5:4:3:2:1\",nh=3D11= 5)/Raw('\\x00\\x00\\x03\\xd9')") + pkt.append("Ether()/IPv6(dst=3D\"8888:7:6:5:4:3:2:1\",nh= =3D115)/Raw('\\x00\\x00\\x03\\xe9')") + if keyword is "l2tpv3oipv6_src": + pkt.append("Ether()/IPv6(src=3D\"1:2:3:4:5:6:7:8\",nh=3D11= 5)/Raw('\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IPv6(src=3D\"1:2:3:4:5:6:7:8\",nh=3D11= 5)/Raw('\\x00\\x00\\x03\\xf9')") + pkt.append("Ether()/IPv6(src=3D\"1111:2:3:4:5:6:7:8\",nh= =3D115)/Raw('\\x00\\x00\\x03\\xe9')") + if keyword is "l2tpv3oipv6_src_dst": + pkt.append("Ether()/IPv6(src=3D\"2:3:4:5:6:7:8:9\",dst=3D\= "6:5:4:3:2:1:8:9\",nh=3D115)/Raw('\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IPv6(src=3D\"2:3:4:5:6:7:8:9\",dst=3D\= "6:5:4:3:2:1:8:9\",nh=3D115)/Raw('\\x00\\x00\\x03\\xf9')") + pkt.append("Ether()/IPv6(src=3D\"2222:3:4:5:6:7:8:9\",dst= =3D\"6:5:4:3:2:1:8:9\",nh=3D115)/Raw('\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IPv6(src=3D\"2:3:4:5:6:7:8:9\",dst=3D\= "6666:5:4:3:2:1:8:9\",nh=3D115)/Raw('\\x00\\x00\\x03\\xe9')") + if keyword is "l2tpv3_ipv4_ipv6": + pkt.append("Ether()/IP(proto=3D115)/Raw('\\x00\\x00\\x03\\= xe9')") + pkt.append("Ether()/IP(proto=3D115)/Raw('\\x00\\x00\\x03\\= xf9')") + pkt.append("Ether()/IPv6(nh=3D115)/Raw('\\x00\\x00\\x03\\x= e9')") + pkt.append("Ether()/IPv6(nh=3D115)/Raw('\\x00\\x00\\x03\\x= f9')") + if keyword is "l2tpv3oip_v4src_v6src" : + pkt.append("Ether()/IP(src=3D\"1.3.5.7\",proto=3D115)/Raw(= '\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IP(src=3D\"1.3.5.7\",proto=3D115)/Raw(= '\\x00\\x00\\x03\\xa9')") + pkt.append("Ether()/IP(src=3D\"11.3.5.7\",proto=3D115)/Raw= ('\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IPv6(src=3D\"1:3:5:7:9:2:4:6\",nh=3D11= 5)/Raw('\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IPv6(src=3D\"1:3:5:7:9:2:4:6\",nh=3D11= 5)/Raw('\\x00\\x00\\x03\\xf9')") + pkt.append("Ether()/IPv6(src=3D\"1111:3:5:7:9:2:4:6\",nh= =3D115)/Raw('\\x00\\x00\\x03\\xe9')") + if keyword is "l2tpv3oip_v4dst_v6dst": + pkt.append("Ether()/IP(dst=3D\"9.7.5.3\",proto=3D115)/Raw(= '\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IP(dst=3D\"9.7.5.3\",proto=3D115)/Raw(= '\\x00\\x00\\x03\\xb9')") + pkt.append("Ether()/IP(dst=3D\"99.7.5.3\",proto=3D115)/Raw= ('\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IPv6(dst=3D\"2:4:6:8:1:3:5:7\",nh=3D11= 5)/Raw('\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IPv6(dst=3D\"2:4:6:8:1:3:5:7\",nh=3D11= 5)/Raw('\\x00\\x00\\x03\\xd9')") + pkt.append("Ether()/IPv6(dst=3D\"2222:4:6:8:1:3:5:7\",nh= =3D115)/Raw('\\x00\\x00\\x03\\xe9')") + if keyword is "l2tpv3oip_v4srcdst_v6srcdst": + pkt.append("Ether()/IP(src=3D\"9.8.7.6\",dst=3D\"4.5.6.7\"= ,proto=3D115)/Raw('\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IP(src=3D\"9.8.7.6\",dst=3D\"4.5.6.7\"= ,proto=3D115)/Raw('\\x00\\x00\\x03\\xf9')") + pkt.append("Ether()/IP(src=3D\"99.8.7.6\",dst=3D\"4.5.6.7\= ",proto=3D115)/Raw('\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IP(src=3D\"9.8.7.6\",dst=3D\"44.5.6.7\= ",proto=3D115)/Raw('\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IPv6(src=3D\"1:2:3:4:5:6:7:8\",dst=3D\= "9:8:7:6:5:4:3:2\",nh=3D115)/Raw('\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IPv6(src=3D\"1:2:3:4:5:6:7:8\",dst=3D\= "9:8:7:6:5:4:3:2\",nh=3D115)/Raw('\\x00\\x00\\x03\\xf9')") + pkt.append("Ether()/IPv6(src=3D\"1111:2:3:4:5:6:7:8\",dst= =3D\"9:8:7:6:5:4:3:2\",nh=3D115)/Raw('\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IPv6(src=3D\"1:2:3:4:5:6:7:8\",dst=3D\= "9999:8:7:6:5:4:3:2\",nh=3D115)/Raw('\\x00\\x00\\x03\\xe9')") + if keyword is "l2tpv3oip_v4_v6_udp": + pkt.append("Ether()/IP(dst=3D\"9.7.5.3\",proto=3D115)/Raw(= '\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IP(dst=3D\"9.7.5.3\",proto=3D115)/Raw(= '\\x00\\x00\\x03\\xb9')") + pkt.append("Ether()/IPv6(dst=3D\"2:4:6:8:1:3:5:7\",nh=3D11= 5)/Raw('\\x00\\x00\\x03\\xe9')") + pkt.append("Ether()/IPv6(dst=3D\"2:4:6:8:1:3:5:7\",nh=3D11= 5)/Raw('\\x00\\x00\\x03\\xd9')") + pkt.append("Ether()/IP()/UDP()") + return pkt + + def send_and_verify(self,keyword=3D'def'): + """ + Send packets and verify result. + """ + pkt =3D self.l2tpv3pkts(keyword) + qnum=3D[] + for i in range(len(pkt)): + self.tester.scapy_append('sendp([%s], iface=3D"%s")'%(pkt[i], self.te= ster_intf)) + self.tester.scapy_execute() + out =3D self.dut.get_session_output(timeout=3D2) + pattern =3D "port (\d)/queue (\d{1,2}): received (\d) packets" + qnum.append(self.element_strip(out, pattern)) + return qnum + + def run_fd_test(self, keyword): + """ + Configure Flow director rules. + =20 + keywords: keywords have IPv4/IPv6 SIP DIP and UDP + """ + + out=3Dself.dut_testpmd.execute_cmd('start') + out=3Dself.dut_testpmd.execute_cmd('set verbose 1') + qdef=3D[] + qnum =3D self.send_and_verify(keyword) + for i in range(len(qnum)): + self.verify(qnum[i] =3D=3D 0, "Receive packet from wrong=20 +queue!!!") + =20 + queue =3D random.randint(1, self.PF_QUEUE - 1) + =20 + if 'l2tpv3oipv4' is keyword: + =09 + out=3Dself.dut_testpmd.execute_cmd( 'flow create 0 ingress pat= tern eth / ipv4 / l2tpv3oip session_id is 1001 / end actions queue index {}= / end'.format(queue)) + qdef.append(queue) #Queue Number as configured in the rule for= matched sessionID + qdef.append(0) #Default Queue number to check for in case of non=20 +matching sessionID + =20 + if 'l2tpv3oipv4_dst' is keyword: + out=3Dself.dut_testpmd.execute_cmd( 'flow create 0 ingress pat= tern eth / ipv4 dst is 8.8.8.8 / l2tpv3oip session_id is 1001 / end actio= ns queue index {} / end'.format(queue)) + qdef.append(queue) #Queue Number as configured in the rule for= matched sessionID + qdef.append(0) #Default Queue number to check for in case of non mat= ching sessionID + qdef.append(0) #Default Queue number to check for in case of non=20 +matching DIP + + + if 'l2tpv3oipv4_src' is keyword: + out=3Dself.dut_testpmd.execute_cmd( 'flow create 0 ingress pat= tern eth / ipv4 src is 1.1.1.1 / l2tpv3oip session_id is 1001 / end actions= queue index {} / end'.format(queue)) + qdef.append(queue) #Queue Number as configured in the rule for= matched sessionID + qdef.append(0) #Default Queue number to check for in case of non mat= ching sessionID + qdef.append(0) #Default Queue number to check for in case of non=20 +matching SIP + + if 'l2tpv3oipv4_src_dst' is keyword: + out=3Dself.dut_testpmd.execute_cmd( 'flow create 0 ingress pat= tern eth / ipv4 src is 5.5.5.5 dst is 2.2.2.2 / l2tpv3oip session_id is 100= 1 / end actions queue index {} / end'.format(queue)) + qdef.append(queue) #Queue Number as configured in the rule for= matched sessionID + qdef.append(0) #Default Queue number to check for in case of non mat= ching sessionID + qdef.append(0) #Default Queue number to check for in case of non mat= ching SIP + qdef.append(0) #Default Queue number to check for in case of non=20 +matching DIP + + if 'l2tpv3oipv6' is keyword: + out=3Dself.dut_testpmd.execute_cmd( 'flow create 0 ingress pat= tern eth / ipv6 / l2tpv3oip session_id is 1001 / end actions queue index {}= / end'.format(queue)) + qdef.append(queue) #Queue Number as configured in the rule for= matched sessionID + qdef.append(0) #Default Queue number to check for in case of non=20 +matching sessionID + + if 'l2tpv3oipv6_dst' is keyword: + out=3Dself.dut_testpmd.execute_cmd( 'flow create 0 ingress pat= tern eth / ipv6 dst is 8:7:6:5:4:3:2:1 / l2tpv3oip session_id is 1001 / end= actions queue index {} / end'.format(queue)) + qdef.append(queue) #Queue Number as configured in the rule for= matched sessionID + qdef.append(0) #Default Queue number to check for in case of non mat= ching sessionID + qdef.append(0) #Default Queue number to check for in case of non=20 +matching DIP + + if 'l2tpv3oipv6_src' is keyword: + out=3Dself.dut_testpmd.execute_cmd('flow create 0 ingress patt= ern eth / ipv6 src is 1:2:3:4:5:6:7:8 / l2tpv3oip session_id is 1001 / end = actions queue index {} / end'.format(queue)) + qdef.append(queue) #Queue Number as configured in the rule for= matched sessionID + qdef.append(0) #Default Queue number to check for in case of non mat= ching sessionID + qdef.append(0) #Default Queue number to check for in case of non=20 +matching SIP + + if 'l2tpv3oipv6_src_dst' is keyword: + out=3Dself.dut_testpmd.execute_cmd( 'flow create 0 ingress pat= tern eth / ipv6 src is 2:3:4:5:6:7:8:9 dst is 6:5:4:3:2:1:8:9 / l2tpv3oip s= ession_id is 1001 / end actions queue index {} / end'.format(queue)) + qdef.append(queue) #Queue Number as configured in the rule for= matched sessionID + qdef.append(0) #Default Queue number to check for in case of non mat= ching sessionID + qdef.append(0) #Default Queue number to check for in case of non mat= ching SIP + qdef.append(0) #Default Queue number to check for in case of non=20 +matching DIP + + if 'l2tpv3_ipv4_ipv6' is keyword: + out=3Dself.dut_testpmd.execute_cmd( 'flow create 0 ingress pat= tern eth / ipv4 / l2tpv3oip session_id is 1001 / end actions queue index {}= / end'.format(queue)) + qdef.append(queue) #Queue Number as configured in the rule for= matched sessionID + qdef.append(0) #Default Queue number to check for in case of non mat= ching sessionID + queue =3D random.randint(1, self.PF_QUEUE - 1) + out=3Dself.dut_testpmd.execute_cmd( 'flow create 0 ingress pat= tern eth / ipv6 / l2tpv3oip session_id is 1001 / end actions queue index {}= / end'.format(queue)) + qdef.append(queue) #Queue Number as configured in the rule for= matched sessionID + qdef.append(0) #Default Queue number to check for in case of non=20 +matching sessionID + + if 'l2tpv3oip_v4src_v6src' is keyword: + out=3Dself.dut_testpmd.execute_cmd( 'flow create 0 ingress pat= tern eth / ipv4 src is 1.3.5.7 / l2tpv3oip session_id is 1001 / end actions= queue index {} / end'.format(queue)) + qdef.append(queue) #Queue Number as configured in the rule for= matched sessionID + qdef.append(0) #Default Queue number to check for in case of n= on matching sessionID + qdef.append(0) #Default Queue number to check for in case of n= on matching IPv4 SIP + queue =3D random.randint(1, self.PF_QUEUE - 1) + out=3Dself.dut_testpmd.execute_cmd( 'flow create 0 ingress pat= tern eth / ipv6 src is 1:3:5:7:9:2:4:6 / l2tpv3oip session_id is 1001 / end= actions queue index {} / end'.format(queue)) + qdef.append(queue) #Queue Number as configured in the rule for= matched sessionID + qdef.append(0) #Default Queue number to check for in case of n= on matching sessionID + qdef.append(0) #Default Queue number to check for in case=20 + of non matching IPv6 SIP + + if 'l2tpv3oip_v4dst_v6dst' is keyword: + out=3Dself.dut_testpmd.execute_cmd( 'flow create 0 ingress pat= tern eth / ipv4 dst is 9.7.5.3 / l2tpv3oip session_id is 1001 / end actions= queue index {} / end'.format(queue)) + qdef.append(queue) #Queue Number as configured in the rule for= matched sessionID + qdef.append(0) #Default Queue number to check for in case of = non matching sessionID + qdef.append(0) #Default Queue number to check for in case of = non matching IPv4 DIP + queue =3D random.randint(1, self.PF_QUEUE - 1) + out=3Dself.dut_testpmd.execute_cmd( 'flow create 0 ingress pat= tern eth / ipv6 dst is 2:4:6:8:1:3:5:7 / l2tpv3oip session_id is 1001 / end= actions queue index {} / end'.format(queue)) + qdef.append(queue) #Queue Number as configured in the rule for= matched sessionID + qdef.append(0) #Default Queue number to check for in case of n= on matching sessionID + qdef.append(0) #Default Queue number to check for in case=20 + of non matching IPv6 DIP + + if 'l2tpv3oip_v4srcdst_v6srcdst' is keyword: + out=3Dself.dut_testpmd.execute_cmd( 'flow create 0 ingress pat= tern eth / ipv4 src is 9.8.7.6 dst is 4.5.6.7 / l2tpv3oip session_id is 100= 1 / end actions queue index {} / end'.format(queue)) + qdef.append(queue) #Queue Number as configured in the rule for= matched sessionID + qdef.append(0) #Default Queue number to check for in case of = non matching sessionID + qdef.append(0) #Default Queue number to check for in case of = non matching IPv4 SIP + qdef.append(0) #Default Queue number to check for in case of = non matching IPv4 DIP + queue =3D random.randint(1, self.PF_QUEUE - 1) + out=3Dself.dut_testpmd.execute_cmd( 'flow create 0 ingress pat= tern eth / ipv6 src is 1:2:3:4:5:6:7:8 dst is 9:8:7:6:5:4:3:2 / l2tpv3oip s= ession_id is 1001 / end actions queue index {} / end'.format(queue)) + qdef.append(queue) #Queue Number as configured in the rule for= matched sessionID + qdef.append(0) #Default Queue number to check for in case of = non matching sessionID + qdef.append(0) #Default Queue number to check for in case of = non matching IPv6 SIP + qdef.append(0) #Default Queue number to check for in case=20 + of non matching IPv6 DIP + + if 'l2tpv3oip_v4_v6_udp' is keyword: + out=3Dself.dut_testpmd.execute_cmd( 'flow create 0 ingress pat= tern eth / ipv4 / l2tpv3oip session_id is 1001 / end actions queue index {}= / end'.format(queue)) + qdef.append(queue) #Queue Number as configured in the rule for= matched sessionID + qdef.append(0) #Default Queue number to check for in case of n= on matching sessionID + queue =3D random.randint(1, self.PF_QUEUE - 1) + out=3Dself.dut_testpmd.execute_cmd( 'flow create 0 ingress pat= tern eth / ipv6 / l2tpv3oip session_id is 1001 / end actions queue index {}= / end'.format(queue)) + qdef.append(queue) #Queue Number as configured in the rule for= matched sessionID=20 + qdef.append(0) #Default Queue number to check for in case of n= on matching sessionID + queue =3D random.randint(1, self.PF_QUEUE - 1) + out=3Dself.dut_testpmd.execute_cmd( 'flow create 0 ingress pat= tern eth / ipv4 / udp / end actions queue index {} / end'.format(queue)) + qdef.append(queue) #Queue Number as configured in the rule + + qnum=3Dself.send_and_verify(keyword) + =20 + + for i in range(len(qdef)): + self.verify(qdef[i] =3D=3D qnum[i], "Receive packet from wrong queue!= !!") + self.dut_testpmd.execute_cmd("flow flush 0") # Delete all the=20 +flow director rules + =20 + def test_l2tpv3oipv4(self): + """ + L2TPv3 PAY is supported by NVM with profile updated. + Default flow director input set is sessionID + flow director works to send matched packets to configured queue,=20 + otherwise to queue 0. + """ + self.dut_testpmd.execute_cmd('port stop 0') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset c= lear all') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 44') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 45') + self.dut_testpmd.execute_cmd('port start 0') + self.dut_testpmd.execute_cmd('start') + keyword =3D 'l2tpv3oipv4' + self.run_fd_test(keyword) + =20 + def test_l2tpv3oipv4_src(self): + """ + Flow director input set is sessionID + SIP for pctype 28 + """ + + self.dut_testpmd.execute_cmd('port stop 0') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset c= lear all') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 15') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 16') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 44') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 45') + self.dut_testpmd.execute_cmd('port start 0') + self.dut_testpmd.execute_cmd('start') + keyword =3D 'l2tpv3oipv4_src' + self.run_fd_test(keyword) + + def test_l2tpv3oipv4_dst(self): + """ + Flow director input set is sessionID + DIP for pctype 28 + """ + self.dut_testpmd.execute_cmd('port stop 0') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset c= lear all') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 27') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 28') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 44') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 45') + self.dut_testpmd.execute_cmd('port start 0') + self.dut_testpmd.execute_cmd('start') + keyword =3D 'l2tpv3oipv4_dst' + self.run_fd_test(keyword) + + def test_l2tpv3oipv4_src_dst(self): + """ + Flow director input set is sessionID + SIP + DIP for pctype 28 + """ + self.dut_testpmd.execute_cmd('port stop 0') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset c= lear all') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 15') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 16') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 27') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 28') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 44') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 45') + self.dut_testpmd.execute_cmd('port start 0') + self.dut_testpmd.execute_cmd('start') + keyword =3D 'l2tpv3oipv4_src_dst' + self.run_fd_test(keyword) + =20 + def test_l2tpv3oipv6(self): + + """ + Flow director input set is sessionID for pctyp 38 + """ + self.dut_testpmd.execute_cmd('port stop 0') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset c= lear all') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 44') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 45') + self.dut_testpmd.execute_cmd('port start 0') + self.dut_testpmd.execute_cmd('start') + keyword =3D 'l2tpv3oipv6' + self.run_fd_test(keyword) + =20 + def test_l2tpv3oipv6_dst(self): + """ + Flow director input set is sessionID + DIP for pctype 38 + """ + self.dut_testpmd.execute_cmd('port stop 0') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset c= lear all') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 21') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 22') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 23') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 24') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 25') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 26') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 27') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 28') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 44') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 45') + self.dut_testpmd.execute_cmd('port start 0') + self.dut_testpmd.execute_cmd('start') + keyword =3D 'l2tpv3oipv6_dst' + self.run_fd_test(keyword) + + def test_l2tpv3oipv6_src(self): + """ + Flow director input set is sessionID + SIP for pctype 38 + """ + self.dut_testpmd.execute_cmd('port stop 0') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset c= lear all') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 13') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 14') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 15') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 16') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 17') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 18') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 19') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 20') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 44') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 45') + self.dut_testpmd.execute_cmd('port start 0') + self.dut_testpmd.execute_cmd('start') + keyword =3D 'l2tpv3oipv6_src' + self.run_fd_test(keyword) + + def test_l2tpv3oipv6_src_dst(self): + """ + Flow director input set is sessionID + SIP + DIP for pctype 38 + """ + self.dut_testpmd.execute_cmd('port stop 0') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset c= lear all') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 13') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 14') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 15') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 16') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 17') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 18') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 19') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 20') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 21') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 22') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 23') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 24') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 25') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 26') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 27') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 28') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 44') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 45') + self.dut_testpmd.execute_cmd('port start 0') + self.dut_testpmd.execute_cmd('start') + keyword =3D 'l2tpv3oipv6_src_dst' + self.run_fd_test(keyword) + + def test_l2tpv3_ipv4_ipv6(self): + """ + Flow director input set is sessionID for pctype 28 and 38 + """ + self.dut_testpmd.execute_cmd('port stop 0') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset c= lear all') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset c= lear all') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 44') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 45') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 44') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 45') + self.dut_testpmd.execute_cmd('port start 0') + self.dut_testpmd.execute_cmd('start') + keyword =3D 'l2tpv3_ipv4_ipv6' + self.run_fd_test(keyword) + + def test_l2tpv3oip_v4src_v6src(self): + """ + Flow director input set is sessionID + SIP for pctype 28 and 38 + """ + self.dut_testpmd.execute_cmd('port stop 0') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset c= lear all') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset c= lear all') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 15') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 16') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 13') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 14') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 15') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 16') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 17') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 18') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 19') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 20') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 44') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 45') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 44') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 45') + self.dut_testpmd.execute_cmd('port start 0') + self.dut_testpmd.execute_cmd('start') + keyword =3D 'l2tpv3oip_v4src_v6src' + self.run_fd_test(keyword) + + def test_l2tpv3oip_v4dst_v6dst(self): + """ + Flow director input set is sessionID + DIP for pctype 28 and 38 + """ + self.dut_testpmd.execute_cmd('port stop 0') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset c= lear all') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset c= lear all') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 27') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 28') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 21') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 22') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 23') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 24') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 25') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 26') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 27') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 28') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 44') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 45') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 44') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 45') + self.dut_testpmd.execute_cmd('port start 0') + self.dut_testpmd.execute_cmd('start') + keyword =3D 'l2tpv3oip_v4dst_v6dst' + self.run_fd_test(keyword) + + def test_l2tpv3oip_v4srcdst_v6srcdst(self): + """ + Flow director input set is sessionID + SIP + DIP for pctype 28 and= 38=20 + """ + self.dut_testpmd.execute_cmd('port stop 0') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset c= lear all') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset c= lear all') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 15') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 16') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 27') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 28') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 13') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 14') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 15') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 16') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 17') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 18') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 19') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 20') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 21') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 22') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 23') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 24') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 25') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 26') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 27') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 28') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 44') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 45') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 44') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 45') + self.dut_testpmd.execute_cmd('port start 0') + self.dut_testpmd.execute_cmd('start') + keyword =3D 'l2tpv3oip_v4srcdst_v6srcdst' + self.run_fd_test(keyword) + + def test_l2tpv3oip_v4_v6_udp(self): + """ + Flow director input set is sessionID for pctype 28 and 38=20 + """ + self.dut_testpmd.execute_cmd('port stop 0') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset c= lear all') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset c= lear all') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 44') + self.dut_testpmd.execute_cmd('port config 0 pctype 28 fdir_inset s= et field 45') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 44') + self.dut_testpmd.execute_cmd('port config 0 pctype 38 fdir_inset s= et field 45') + self.dut_testpmd.execute_cmd('port start 0') + self.dut_testpmd.execute_cmd('start') + keyword =3D 'l2tpv3oip_v4_v6_udp' + self.run_fd_test(keyword) + + def tear_down(self): + self.dut_testpmd.execute_cmd('stop') + out =3D self.dut_testpmd.execute_cmd('ddp get list 0') + if "Profile number is: 0" not in out: + self.dut_testpmd.execute_cmd('port stop all') + time.sleep(1) + self.dut_testpmd.execute_cmd('ddp del 0 /tmp/l2tpv3oip-l4.bak'= ) + out =3D self.dut_testpmd.execute_cmd('ddp get list 0') + self.verify("Profile number is: 0" in out, + "Failed to delete ddp profile!!!") + self.dut_testpmd.execute_cmd('port start all') + self.dut_testpmd.quit() + + def tear_down_all(self): + pass + + + + -- 2.17.1