From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by dpdk.org (Postfix) with ESMTP id 0B8061B37D for ; Mon, 13 Nov 2017 14:16:41 +0100 (CET) Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 13 Nov 2017 05:16:25 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.44,389,1505804400"; d="scan'208";a="1373368" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by FMSMGA003.fm.intel.com with ESMTP; 13 Nov 2017 05:16:25 -0800 Received: from fmsmsx155.amr.corp.intel.com (10.18.116.71) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.319.2; Mon, 13 Nov 2017 05:16:24 -0800 Received: from shsmsx102.ccr.corp.intel.com (10.239.4.154) by FMSMSX155.amr.corp.intel.com (10.18.116.71) with Microsoft SMTP Server (TLS) id 14.3.319.2; Mon, 13 Nov 2017 05:16:24 -0800 Received: from shsmsx103.ccr.corp.intel.com ([169.254.4.213]) by shsmsx102.ccr.corp.intel.com ([169.254.2.175]) with mapi id 14.03.0319.002; Mon, 13 Nov 2017 21:16:22 +0800 From: "Liu, Yong" To: "Lin, Xueqin" , "dts@dpdk.org" CC: "Lin, Xueqin" Thread-Topic: [dts] [PATCH] add DDP GTP test suite Thread-Index: AQHTVgUF0eIBLSaYlEiPzss2lrVk5qMSTr1g Date: Mon, 13 Nov 2017 13:16:21 +0000 Message-ID: <86228AFD5BCD8E4EBFD2B90117B5E81E62F15E41@SHSMSX103.ccr.corp.intel.com> References: <1509843957-171469-1-git-send-email-xueqin.lin@intel.com> In-Reply-To: <1509843957-171469-1-git-send-email-xueqin.lin@intel.com> Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiMTk3NDljMjctYjQyOC00ZjMxLTg1MDMtNWM5YTgyNWM4YzY0IiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX0lDIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjIuNS4xOCIsIlRydXN0ZWRMYWJlbEhhc2giOiJ3dk1CdWtnZkdieXl4eWZhRHJiM2JJOWFwSVg1ZVc2NElmY3VkTlwvblFLZUNHXC9cL0crWjd2amRmc1hVQ2NMb1ZIIn0= x-ctpclassification: CTP_IC dlp-product: dlpe-windows dlp-version: 11.0.0.116 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] add DDP GTP test suite 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: Mon, 13 Nov 2017 13:16:42 -0000 Xueqin, some comments are inline. Thanks, Marvin > -----Original Message----- > From: dts [mailto:dts-bounces@dpdk.org] On Behalf Of Xueqin Lin > Sent: Sunday, November 05, 2017 9:06 AM > To: dts@dpdk.org > Cc: Lin, Xueqin > Subject: [dts] [PATCH] add DDP GTP test suite >=20 > --- > tests/TestSuite_ddp_gtp.py | 375 > +++++++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 375 insertions(+) > create mode 100644 tests/TestSuite_ddp_gtp.py >=20 > diff --git a/tests/TestSuite_ddp_gtp.py b/tests/TestSuite_ddp_gtp.py > new file mode 100644 > index 0000000..0164f8d > --- /dev/null > +++ b/tests/TestSuite_ddp_gtp.py > @@ -0,0 +1,375 @@ > +# > + > +import time > +import sys > +import utils > +from scapy.utils import rdpcap > + Imported function rdpcap seems not be used in this suite, please remove it. > +from qemu_kvm import QEMUKvm > +from test_case import TestCase > +from pmd_output import PmdOutput > +from packet import Packet, sniff_packets, load_sniff_packets Imported functions seem not be used, please remove it. > +from settings import get_nic_name > +import random > + > +VM_CORES_MASK =3D 'all' > +PF_MAX_QUEUE =3D 64 > +VF_MAX_QUEUE =3D 4 > + These values are defined in configuration, please retrieve the value from d= pdk source code. > + > +class Testddp_gtp(TestCase): > + > + def set_up_all(self): > + self.verify( > + self.nic in ['fortville_25g'], 'ddp gtp can not support %s > nic' > + % self.nic) > + self.dut_ports =3D self.dut.get_ports(self.nic) > + self.verify(len(self.dut_ports) >=3D 1, "Insufficient ports") > + self.vm0 =3D None > + self.env_done =3D False > + profile_file =3D r'dep/gtp.pkgo' Byte string look like no special use here, please just use the normal strin= g object. > + profile_dst =3D "/tmp/" > + self.dut.session.copy_file_to(profile_file, profile_dst) > + > + def set_up(self): > + self.setup_vm_env() > + > + def bind_nic_driver(self, ports, driver=3D""): > + if driver =3D=3D "igb_uio": > + for port in ports: > + netdev =3D self.dut.ports_info[port]['port'] > + driver =3D netdev.get_nic_driver() > + if driver !=3D 'igb_uio': > + netdev.bind_driver(driver=3D'igb_uio') > + else: > + for port in ports: > + netdev =3D self.dut.ports_info[port]['port'] > + driver_now =3D netdev.get_nic_driver() > + if driver =3D=3D "": > + driver =3D netdev.default_driver > + if driver !=3D driver_now: > + netdev.bind_driver(driver=3Ddriver) > + > + def setup_vm_env(self, driver=3D'igb_uio'): > + """ > + Create testing environment with VF generated from 1PF > + """ > + if self.env_done is False: > + self.bind_nic_driver(self.dut_ports[:1], driver=3D"igb_uio") > + self.used_dut_port =3D self.dut_ports[0] > + tester_port =3D self.tester.get_local_port(self.used_dut_por= t) > + self.tester_intf =3D self.tester.get_interface(tester_port) > + self.dut.generate_sriov_vfs_by_port( > + self.used_dut_port, 1, driver=3Ddriver) > + self.sriov_vfs_port =3D self.dut.ports_info[ > + self.used_dut_port]['vfs_port'] > + for port in self.sriov_vfs_port: > + port.bind_driver('pci-stub') > + time.sleep(1) > + self.dut_testpmd =3D PmdOutput(self.dut) > + time.sleep(1) > + vf0_prop =3D {'opt_host': self.sriov_vfs_port[0].pci} > + # set up VM0 ENV > + self.vm0 =3D QEMUKvm(self.dut, 'vm0', 'ddp_gtp') > + self.vm0.set_vm_device(driver=3D'pci-assign', **vf0_prop) > + try: > + self.vm0_dut =3D self.vm0.start() > + if self.vm0_dut is None: > + raise Exception("Set up VM0 ENV failed!") > + except Exception as e: > + self.destroy_vm_env() > + raise Exception(e) Suggest to move all testpmd start actions into separated function. Only kee= p VM and VF related actions in this function. Please correct me if I'm wrong. The process of each test case is following = four steps. Step1-2 is needed before each case, step 4 is needed after case= finished. You can add step1-2 into set_up function and step4 into tear_down function. 1. Setup host/VM testpmd 2. GTP-U ddp load 3. Run test cases 4. Clear register/quit testpmd > + self.vm0_dut_ports =3D self.vm0_dut.get_ports('any') > + self.vm0_testpmd =3D PmdOutput(self.vm0_dut) > + self.env_done =3D True > + self.dut_testpmd.start_testpmd( > + "Default", "--pkt-filter-mode=3Dperfect --port-topology=3Dch= ained > \ > + --txq=3D%s --rxq=3D%s" > + % (PF_MAX_QUEUE, PF_MAX_QUEUE)) > + self.vm0_testpmd.start_testpmd( > + VM_CORES_MASK, "--port-topology=3Dchained --txq=3D%s --rxq= =3D%s" > + % (VF_MAX_QUEUE, VF_MAX_QUEUE)) > + > + def destroy_vm_env(self): > + > + if getattr(self, 'vm0', None): > + self.vm0_dut.kill_all() > + self.vm0_testpmd =3D None > + self.vm0_dut_ports =3D None > + # destroy vm0 > + self.vm0.stop() > + self.vm0 =3D None > + > + if getattr(self, 'used_dut_port', None): > + self.dut.destroy_sriov_vfs_by_port(self.used_dut_port) > + port =3D self.dut.ports_info[self.used_dut_port]['port'] > + self.used_dut_port =3D None > + > + self.env_done =3D False > + > + def load_profile(self): > + """ > + Load profile to update FVL configuration tables, profile will be > + stored in binary file and need to be passed to AQ to program FVL > + during initialization stage. > + """ Look like every case will call it, why not add it into set_up function?=20 > + self.dut_testpmd.execute_cmd('port stop all') > + time.sleep(1) > + out =3D self.dut_testpmd.execute_cmd('ddp get list 0') > + self.dut_testpmd.execute_cmd('ddp add 0 /tmp/gtp.pkgo') > + 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') > + time.sleep(1) > + self.dut_testpmd.execute_cmd('set fwd rxonly') > + self.dut_testpmd.execute_cmd('set verbose 1') > + self.dut_testpmd.execute_cmd('start') > + self.vm0_testpmd.execute_cmd('set fwd rxonly') > + self.vm0_testpmd.execute_cmd('set verbose 1') > + self.vm0_testpmd.execute_cmd('start') > + > + def gtp_packets( > + self, type=3D'fdir', tunnel_pkt=3D'gtpu', inner_L3=3D'ipv4', > + nomatch_pkt=3D1, chk=3D0xF, teid=3D0x0): > + """ > + Generate different GTP types according to different parameters. > + Input: > + filter type: includes flow director and cloud filter > + tunnel packet: includes GTPC and GTPU > + inner_L3: GTPC has no inner L3. GTPU has no, IPV4 and IPV6 inner > L3. > + nomatch_pkt: PF or VSIs receive match packets to configured queu= e, > but > + receive no match packets to queue 0. Flow director > + directs different TEIDs, inner L3 GTP packets to > + different queues. Cloud filter directs different > TEIDs > + GTP packets to different queues. > + chk: checksum > + teid: GTP teid > + """ > + pkts =3D [] > + pkts_gtpc_pay =3D {'IPV4/GTPC': > 'Ether()/IP()/UDP(%sdport=3D2123)/GTP_U_Header(teid=3D%s)/Raw("X"*20)' % = (chk, > teid), In function announcement, chk is hex value. But in packets definition like = chk should be string. Please check it. > + 'IPV6/GTPC': > 'Ether()/IPv6()/UDP(%sdport=3D2123)/GTP_U_Header(teid=3D%s)/Raw("X"*20)' = % > (chk, teid)} > + pkts_gtpu_pay =3D {'IPV4/GTPU': > 'Ether()/IP()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/Raw("X"*20)' % = (chk, > teid), > + 'IPV6/GTPU': > 'Ether()/IPv6()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/Raw("X"*20)' = % > (chk, teid)} > + pkts_gtpu_ipv4 =3D {'IPV4/GTPU/IPV4': > 'Ether()/IP()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IP()/Raw("X"*20= )' % > (chk, teid), > + 'IPV4/GTPU/IPV4/FRAG': > 'Ether()/IP()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IP(frag=3D5)/Ra= w("X"*2 > 0)' % (chk, teid), > + 'IPV4/GTPU/IPV4/UDP': > 'Ether()/IP()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IP()/UDP()/Raw(= "X"*2 > 0)' % (chk, teid), > + 'IPV4/GTPU/IPV4/TCP': > 'Ether()/IP()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IP()/TCP()/Raw(= "X"*2 > 0)' % (chk, teid), > + 'IPV4/GTPU/IPV4/SCTP': > 'Ether()/IP()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IP()/SCTP()/Raw= ("X"* > 20)' % (chk, teid), > + 'IPV4/GTPU/IPV4/ICMP': > 'Ether()/IP()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IP()/ICMP()/Raw= ("X"* > 20)' % (chk, teid), > + 'IPV6/GTPU/IPV4': > 'Ether()/IPv6()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IP()/Raw("X"*= 20)' % > (chk, teid), > + 'IPV6/GTPU/IPV4/FRAG': > 'Ether()/IPv6()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IP(frag=3D5)/= Raw("X" > *20)' % (chk, teid), > + 'IPV6/GTPU/IPV4/UDP': > 'Ether()/IPv6()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IP()/UDP()/Ra= w("X" > *20)' % (chk, teid), > + 'IPV6/GTPU/IPV4/TCP': > 'Ether()/IPv6()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IP()/TCP()/Ra= w("X" > *20)' % (chk, teid), > + 'IPV6/GTPU/IPV4/SCTP': > 'Ether()/IPv6()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IP()/SCTP()/R= aw("X > "*20)' % (chk, teid), > + 'IPV6/GTPU/IPV4/ICMP': > 'Ether()/IPv6()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IP()/ICMP()/R= aw("X > "*20)' % (chk, teid)} > + > + pkts_gtpu_ipv6 =3D {'IPV4/GTPU/IPV6/FRAG': > 'Ether()/IP()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IPv6()/IPv6ExtH= drFra > gment()/Raw("X"*20)' % (chk, teid), > + 'IPV4/GTPU/IPV6': > 'Ether()/IP()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IPv6()/Raw("X"*= 20)' % > (chk, teid), > + 'IPV4/GTPU/IPV6/UDP': > 'Ether()/IP()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IPv6()/UDP()/Ra= w("X" > *20)' % (chk, teid), > + 'IPV4/GTPU/IPV6/TCP': > 'Ether()/IP()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IPv6()/TCP()/Ra= w("X" > *20)' % (chk, teid), > + 'IPV4/GTPU/IPV6/SCTP': > 'Ether()/IP()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IPv6()/SCTP()/R= aw("X > "*20)' % (chk, teid), > + 'IPV4/GTPU/IPV6/ICMP': > 'Ether()/IP()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IPv6(nh=3D58)/I= CMP()/R > aw("X"*20)' % (chk, teid), > + 'IPV6/GTPU/IPV6/FRAG': > 'Ether()/IPv6()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IPv6()/IPv6Ex= tHdrF > ragment()/Raw("X"*20)' % (chk, teid), > + 'IPV6/GTPU/IPV6': > 'Ether()/IPv6()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IPv6()/Raw("X= "*20) > ' % (chk, teid), > + 'IPV6/GTPU/IPV6/UDP': > 'Ether()/IPv6()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IPv6()/UDP()/= Raw(" > X"*20)' % (chk, teid), > + 'IPV6/GTPU/IPV6/TCP': > 'Ether()/IPv6()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IPv6()/TCP()/= Raw(" > X"*20)' % (chk, teid), > + 'IPV6/GTPU/IPV6/SCTP': > 'Ether()/IPv6()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IPv6()/SCTP()= /Raw( > "X"*20)' % (chk, teid), > + 'IPV6/GTPU/IPV6/ICMP': > 'Ether()/IPv6()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IPv6(nh=3D58)= /ICMP() > /Raw("X"*20)' % (chk, teid)} > + if nomatch_pkt is 0: > + if tunnel_pkt is 'gtpc' and inner_L3 is None: > + pkts =3D pkts_gtpc_pay > + if tunnel_pkt is 'gtpu' and inner_L3 is None: > + pkts =3D pkts_gtpu_pay > + if tunnel_pkt is 'gtpu' and inner_L3 is 'ipv4': > + pkts =3D pkts_gtpu_ipv4 > + if tunnel_pkt is 'gtpu' and inner_L3 is 'ipv6': > + pkts =3D pkts_gtpu_ipv6 > + > + if nomatch_pkt =3D=3D 1: > + if type =3D=3D 'fdir': > + if tunnel_pkt is 'gtpc' and inner_L3 is None: > + pkts =3D dict( > + pkts_gtpu_pay.items() + > + pkts_gtpu_ipv4.items() + > + pkts_gtpu_ipv6.items()) > + if tunnel_pkt is 'gtpu' and inner_L3 is None: > + pkts =3D dict( > + pkts_gtpc_pay.items() + > + pkts_gtpu_ipv4.items() + > + pkts_gtpu_ipv6.items()) > + if tunnel_pkt is 'gtpu' and inner_L3 is 'ipv4': > + pkts =3D dict( > + pkts_gtpc_pay.items() + > + pkts_gtpu_pay.items() + > + pkts_gtpu_ipv6.items()) > + if tunnel_pkt is 'gtpu' and inner_L3 is 'ipv6': > + pkts =3D dict( > + pkts_gtpc_pay.items() + > + pkts_gtpu_pay.items() + > + pkts_gtpu_ipv4.items()) > + if type is 'clfter': > + if tunnel_pkt is 'gtpc': > + pkts =3D dict( > + pkts_gtpu_pay.items() + > + pkts_gtpu_ipv4.items() + > + pkts_gtpu_ipv6.items()) > + if tunnel_pkt is 'gtpu': > + pkts =3D pkts_gtpc_pay > + return pkts > + > + def gtp_test( > + self, type=3D'fdir', port=3D'pf', tunnel_pkt=3D'gtpu', > inner_L3=3D'ipv4'): > + """ > + Send GTP packet to dut, receive packet from configured queue. > + Input: filter type, port type, packet type, inner L3 type > + """ > + queue =3D random.randint(1, PF_MAX_QUEUE - 1) > + if port !=3D 'pf': > + queue =3D random.randint(1, VF_MAX_QUEUE - 1) > + random_teid =3D random.randint(0x0, 0xFFFFF) TEID is 32bit value, why just choose first 20bits? > + correct_teid =3D hex(random_teid) > + wrong_teid =3D hex((random_teid + 2) % int(0xFFFFF)) > + if type is 'fdir': > + if inner_L3 is None: > + self.dut_testpmd.execute_cmd( > + 'flow create 0 ingress pattern eth / ipv4 / udp / \ > + %s teid is %s / end actions queue index %d / end' > + % (tunnel_pkt, correct_teid, queue)) > + else: > + self.dut_testpmd.execute_cmd( > + 'flow create 0 ingress pattern eth / ipv4 / udp / \ > + %s teid is %s / %s / end actions queue index %d / > end' > + % (tunnel_pkt, correct_teid, inner_L3, queue)) > + if type =3D=3D 'clfter': > + self.dut_testpmd.execute_cmd( > + 'flow create 0 ingress pattern eth / ipv4 / udp / \ > + %s teid is %s / end actions %s / queue index %d / end' > + % (tunnel_pkt, correct_teid, port, queue)) > + for nomatch_pkt in range(2): > + teid =3D correct_teid > + pkts =3D [] > + for cycles in range(2): > + chk =3D '' > + for chktimes in range(2): > + pkts =3D self.gtp_packets( > + type, tunnel_pkt, inner_L3, nomatch_pkt, chk, > teid) > + for packet_type in pkts.keys(): > + self.tester.scapy_append( > + 'sendp([%s], iface=3D"%s")' > + % (pkts[packet_type], self.tester_intf)) > + self.tester.scapy_execute() > + if port =3D=3D 'pf': > + out =3D self.dut.get_session_output(timeout= =3D2) > + else: > + out =3D > self.vm0_dut.get_session_output(timeout=3D2) > + self.verify( > + "port 0/queue %d" % queue in out, > + "Failed to receive packet in this queue!!!") > + > + if port =3D=3D 'pf': > + layerparams =3D ['L3_', 'TUNNEL_', > + 'INNER_L3_', 'INNER_L4_'] > + ptypes =3D packet_type.split('/') > + endparams =3D ['_EXT_UNKNOWN', '', > + '_EXT_UNKNOWN', ''] > + for layerparam, ptype, endparam in zip( > + layerparams, ptypes, endparams): > + layer_type =3D layerparam + ptype + > endparam > + self.verify( > + layer_type in out, > + "Failed to output ptype > information!!!") > + if queue !=3D 0 and type =3D=3D 'fdir': > + self.verify("PKT_RX_FDIR" in out, > + "Failed to test flow director!!!= ") > + if teid =3D=3D wrong_teid or nomatch_pkt =3D=3D 1: > + break > + chk =3D 'chksum=3D0x1234,' > + if nomatch_pkt =3D=3D 1: > + break > + queue =3D 0 > + teid =3D wrong_teid > + > + def test_fdir_gtpc_pf(self): > + """ > + GTP is supported by NVM with profile updated. Select flow > director to > + do classfication, send gtpc packet to PF, check PF could receive > + packet using configured queue, checksum is good. > + """ > + self.load_profile() > + self.gtp_test( > + type=3D'fdir', port=3D'pf', tunnel_pkt=3D'gtpc', inner_L3=3D= None) > + > + def test_fdir_gtpu_pf(self): > + """ > + GTP is supported by NVM with profile updated. Select flow > director to > + do classfication, send gtpu packet to PF, check PF could receive > + packet using configured queue, checksum is good. > + """ > + self.load_profile() > + self.gtp_test( > + type=3D'fdir', port=3D'pf', tunnel_pkt=3D'gtpu', inner_L3=3D= None) > + self.gtp_test( > + type=3D'fdir', port=3D'pf', tunnel_pkt=3D'gtpu', inner_L3=3D= 'ipv4') > + self.gtp_test( > + type=3D'fdir', port=3D'pf', tunnel_pkt=3D'gtpu', inner_L3=3D= 'ipv6') > + > + def test_clfter_gtpc_pf(self): > + """ > + GTP is supported by NVM with profile updated. Select cloud filte= r, > + send gtpc packet to PF, check PF could receive packet using > + configured queue, checksum is good. > + """ > + self.load_profile() > + self.gtp_test( > + type=3D'clfter', port=3D'pf', tunnel_pkt=3D'gtpc', inner_L3= =3DNone) > + > + def test_clfter_gtpu_pf(self): > + """ > + GTP is supported by NVM with profile updated. Select cloud filte= r, > + send gtpu packet to PF, check PF could receive packet using > configured > + queue, checksum is good. > + """ > + self.load_profile() > + self.gtp_test( > + type=3D'clfter', port=3D'pf', tunnel_pkt=3D'gtpu', inner_L3= =3DNone) > + self.gtp_test( > + type=3D'clfter', port=3D'pf', tunnel_pkt=3D'gtpu', inner_L3= =3D'ipv4') > + self.gtp_test( > + type=3D'clfter', port=3D'pf', tunnel_pkt=3D'gtpu', inner_L3= =3D'ipv6') > + > + def test_clfter_gtpc_vf(self): > + """ > + GTP is supported by NVM with profile updated. Select cloud filte= r, > + send gtpc packet to VF, check PF could receive packet using > configured > + queue, checksum is good. > + """ > + self.load_profile() > + self.gtp_test( > + type=3D'clfter', port=3D'vf id 0', tunnel_pkt=3D'gtpc', > inner_L3=3DNone) > + > + def test_clfter_gtpu_vf(self): > + """ > + GTP is supported by NVM with profile updated. Select cloud filte= r, > + send gtpu packet to VF, check PF could receive packet using > configured > + queue, checksum is good. > + """ > + self.load_profile() > + self.gtp_test( > + type=3D'clfter', port=3D'vf id 0', tunnel_pkt=3D'gtpu', > inner_L3=3DNone) > + self.gtp_test( > + type=3D'clfter', port=3D'vf id 0', tunnel_pkt=3D'gtpu', > inner_L3=3D'ipv4') > + self.gtp_test( > + type=3D'clfter', port=3D'vf id 0', tunnel_pkt=3D'gtpu', > inner_L3=3D'ipv6') > + > + def tear_down(self): > + if self.vm0_testpmd: > + self.dut_testpmd.execute_cmd('write reg 0 0xb8190 1') > + self.dut_testpmd.execute_cmd('write reg 0 0xb8190 2') > + self.vm0_testpmd.quit() > + self.dut_testpmd.quit() > + pass Please remove pass in the end. > + > + def tear_down_all(self): > + self.destroy_vm_env() > + pass Please remove pass in the end. > -- > 2.5.5