From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by dpdk.org (Postfix) with ESMTP id 6638329C7 for ; Mon, 20 Nov 2017 04:37:59 +0100 (CET) Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga102.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Nov 2017 19:37:58 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.44,424,1505804400"; d="scan'208";a="7127427" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by orsmga001.jf.intel.com with ESMTP; 19 Nov 2017 19:37:58 -0800 Received: from fmsmsx113.amr.corp.intel.com (10.18.116.7) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.319.2; Sun, 19 Nov 2017 19:37:57 -0800 Received: from shsmsx103.ccr.corp.intel.com (10.239.4.69) by FMSMSX113.amr.corp.intel.com (10.18.116.7) with Microsoft SMTP Server (TLS) id 14.3.319.2; Sun, 19 Nov 2017 19:37:57 -0800 Received: from shsmsx104.ccr.corp.intel.com ([169.254.5.152]) by SHSMSX103.ccr.corp.intel.com ([169.254.4.213]) with mapi id 14.03.0319.002; Mon, 20 Nov 2017 11:37:55 +0800 From: "Lin, Xueqin" To: "Liu, Yong" , "dts@dpdk.org" Thread-Topic: [dts] [PATCH v2] add ddp gtp test suite Thread-Index: AQHTYa++3K0/ssD6REq4CbSt0uYVbKMcnfeg Date: Mon, 20 Nov 2017 03:37:54 +0000 Message-ID: <0D300480287911409D9FF92C1FA2A3355B276C56@SHSMSX104.ccr.corp.intel.com> References: <1510728865-79456-1-git-send-email-xueqin.lin@intel.com> <5A12BAF2.2010003@intel.com> In-Reply-To: <5A12BAF2.2010003@intel.com> Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: 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 v2] 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, 20 Nov 2017 03:38:00 -0000 Thanks a lot for review. One cycle for not adding checksum, one cycle for adding bad checksum. I wi= ll also modify it to meaningful name. Best regards, Xueqin -----Original Message----- From: Liu, Yong=20 Sent: Monday, November 20, 2017 7:22 PM To: Lin, Xueqin ; dts@dpdk.org Subject: Re: [dts] [PATCH v2] add ddp gtp test suite Thanks Xueqin, two comments below. Regards, Marvin On 11/15/2017 02:54 PM, Xueqin Lin wrote: > --- > tests/TestSuite_ddp_gtp.py | 385 ++++++++++++++++++++++++++++++++++++++= +++++++ > 1 file changed, 385 insertions(+) > create mode 100644 tests/TestSuite_ddp_gtp.py > > diff --git a/tests/TestSuite_ddp_gtp.py b/tests/TestSuite_ddp_gtp.py=20 > new file mode 100644 index 0000000..f28bf34 > --- /dev/null > +++ b/tests/TestSuite_ddp_gtp.py > @@ -0,0 +1,385 @@ > +# > + > +import time > +import re > +import sys > +import utils > +from qemu_kvm import QEMUKvm > +from test_case import TestCase > +from pmd_output import PmdOutput > +from settings import get_nic_name > +import random > + > +VM_CORES_MASK =3D 'all' > + > + > +class Testddp_gtp(TestCase): > + > + def set_up_all(self): > + self.verify( > + self.nic in ['fortville_25g'], 'ddp gtp can not support %s n= ic' > + % 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 'dep/gtp.pkgo' > + profile_dst =3D "/tmp/" > + self.dut.session.copy_file_to(profile_file, profile_dst) > + PF_Q_strip =3D 'CONFIG_RTE_LIBRTE_I40E_QUEUE_NUM_PER_PF' > + VF_Q_strip =3D 'CONFIG_RTE_LIBRTE_I40E_QUEUE_NUM_PER_VF' > + self.PF_QUEUE =3D self.search_queue_number(PF_Q_strip) > + self.VF_QUEUE =3D self.search_queue_number(VF_Q_strip) > + > + def set_up(self): > + self.setup_vm_env() > + self.load_profile() > + > + def search_queue_number(self, Q_strip): > + """ > + Search max queue number from configuration. > + """ > + out =3D self.dut.send_expect("cat config/common_base", "]# ", 10= ) > + pattern =3D "(%s=3D)(\d*)" % Q_strip > + s =3D re.compile(pattern) > + res =3D s.search(out) > + if res is None: > + print "search no queue number" > + return None > + else: > + queue =3D res.group(2) > + return int(queue) > + > + 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) > + self.vm0_dut_ports =3D self.vm0_dut.get_ports('any') > + self.vm0_testpmd =3D PmdOutput(self.vm0_dut) > + self.env_done =3D True > + > + 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. > + """ > + self.dut_testpmd.start_testpmd( > + "Default", "--pkt-filter-mode=3Dperfect --port-topology=3Dch= ained \ > + --txq=3D%s --rxq=3D%s" > + % (self.PF_QUEUE, self.PF_QUEUE)) > + self.vm0_testpmd.start_testpmd( > + VM_CORES_MASK, "--port-topology=3Dchained --txq=3D%s --rxq= =3D%s" > + % (self.VF_QUEUE, self.VF_QUEUE)) > + 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=3D'', teid=3D0xF): > + """ > + 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 non match packets to queue 0. Flow director > + directs different TEIDs, inner L3 GTP packets to > + different queues. Cloud filter directs different TE= IDs > + 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), > + 'IPV6/GTPC':=20 > + 'Ether()/IPv6()/UDP(%sdport=3D2123)/GTP_U_Header(teid=3D%s)/Raw("X"*20)= '=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':=20 > + 'Ether()/IPv6()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/Raw("X"*20)= '=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(%sdpo= rt=3D2152)/GTP_U_Header(teid=3D%s)/IP(frag=3D5)/Raw("X"*20)' % (chk, teid), > + 'IPV4/GTPU/IPV4/UDP': 'Ether()/IP()/UDP(%sdpor= t=3D2152)/GTP_U_Header(teid=3D%s)/IP()/UDP()/Raw("X"*20)' % (chk, teid), > + 'IPV4/GTPU/IPV4/TCP': 'Ether()/IP()/UDP(%sdpor= t=3D2152)/GTP_U_Header(teid=3D%s)/IP()/TCP()/Raw("X"*20)' % (chk, teid), > + 'IPV4/GTPU/IPV4/SCTP': 'Ether()/IP()/UDP(%sdpo= rt=3D2152)/GTP_U_Header(teid=3D%s)/IP()/SCTP()/Raw("X"*20)' % (chk, teid), > + 'IPV4/GTPU/IPV4/ICMP': 'Ether()/IP()/UDP(%sdpo= rt=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(%sd= port=3D2152)/GTP_U_Header(teid=3D%s)/IP(frag=3D5)/Raw("X"*20)' % (chk, teid= ), > + 'IPV6/GTPU/IPV4/UDP': 'Ether()/IPv6()/UDP(%sdp= ort=3D2152)/GTP_U_Header(teid=3D%s)/IP()/UDP()/Raw("X"*20)' % (chk, teid), > + 'IPV6/GTPU/IPV4/TCP': 'Ether()/IPv6()/UDP(%sdp= ort=3D2152)/GTP_U_Header(teid=3D%s)/IP()/TCP()/Raw("X"*20)' % (chk, teid), > + 'IPV6/GTPU/IPV4/SCTP': 'Ether()/IPv6()/UDP(%sd= port=3D2152)/GTP_U_Header(teid=3D%s)/IP()/SCTP()/Raw("X"*20)' % (chk, teid)= , > + 'IPV6/GTPU/IPV4/ICMP':=20 > + 'Ether()/IPv6()/UDP(%sdport=3D2152)/GTP_U_Header(teid=3D%s)/IP()/ICMP()= / > + Raw("X"*20)' % (chk, teid)} > + > + pkts_gtpu_ipv6 =3D {'IPV4/GTPU/IPV6/FRAG': 'Ether()/IP()/UDP(%sd= port=3D2152)/GTP_U_Header(teid=3D%s)/IPv6()/IPv6ExtHdrFragment()/Raw("X"*20= )' % (chk, teid), > + 'IPV4/GTPU/IPV6': 'Ether()/IP()/UDP(%sdport=3D= 2152)/GTP_U_Header(teid=3D%s)/IPv6()/Raw("X"*20)' % (chk, teid), > + 'IPV4/GTPU/IPV6/UDP': 'Ether()/IP()/UDP(%sdpor= t=3D2152)/GTP_U_Header(teid=3D%s)/IPv6()/UDP()/Raw("X"*20)' % (chk, teid), > + 'IPV4/GTPU/IPV6/TCP': 'Ether()/IP()/UDP(%sdpor= t=3D2152)/GTP_U_Header(teid=3D%s)/IPv6()/TCP()/Raw("X"*20)' % (chk, teid), > + 'IPV4/GTPU/IPV6/SCTP': 'Ether()/IP()/UDP(%sdpo= rt=3D2152)/GTP_U_Header(teid=3D%s)/IPv6()/SCTP()/Raw("X"*20)' % (chk, teid)= , > + 'IPV4/GTPU/IPV6/ICMP': 'Ether()/IP()/UDP(%sdpo= rt=3D2152)/GTP_U_Header(teid=3D%s)/IPv6(nh=3D58)/ICMP()/Raw("X"*20)' % (chk= , teid), > + 'IPV6/GTPU/IPV6/FRAG': 'Ether()/IPv6()/UDP(%sd= port=3D2152)/GTP_U_Header(teid=3D%s)/IPv6()/IPv6ExtHdrFragment()/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(%sdp= ort=3D2152)/GTP_U_Header(teid=3D%s)/IPv6()/UDP()/Raw("X"*20)' % (chk, teid)= , > + 'IPV6/GTPU/IPV6/TCP': 'Ether()/IPv6()/UDP(%sdp= ort=3D2152)/GTP_U_Header(teid=3D%s)/IPv6()/TCP()/Raw("X"*20)' % (chk, teid)= , > + 'IPV6/GTPU/IPV6/SCTP': 'Ether()/IPv6()/UDP(%sd= port=3D2152)/GTP_U_Header(teid=3D%s)/IPv6()/SCTP()/Raw("X"*20)' % (chk, tei= d), > + 'IPV6/GTPU/IPV6/ICMP': 'Ether()/IPv6()/UDP(%sd= port=3D2152)/GTP_U_Header(teid=3D%s)/IPv6(nh=3D58)/ICMP()/Raw("X"*20)' % (c= hk, 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 is '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, self.PF_QUEUE - 1) > + if port !=3D 'pf': > + queue =3D random.randint(1, self.VF_QUEUE - 1) > + random_teid =3D random.randint(0x0, 0xFFFFFFFF) > + correct_teid =3D hex(random_teid) > + wrong_teid =3D hex((random_teid + 2) % int(0xFFFFFFFF)) > + 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 / en= d' > + % (tunnel_pkt, correct_teid, inner_L3, queue)) > + if type is '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): It's not clear about each loop will be validated. Suggest to use meaningful= name, like "for nomatch_opt in ['matched', 'not matched']". > + teid =3D correct_teid > + pkts =3D [] > + for cycles in range(2): Why here need these two round test? > + chk =3D '' > + for chktimes in range(2): > + pkts =3D self.gtp_packets( > + type, tunnel_pkt, inner_L3, nomatch_pkt, chk, te= id) > + 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 is 'pf': > + out =3D self.dut.get_session_output(timeout= =3D2) > + else: > + out =3D self.vm0_dut.get_session_output(time= out=3D2) > + self.verify( > + "port 0/queue %d" % queue in out, > + "Failed to receive packet in this=20 > + queue!!!") > + > + if port is '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 + endp= aram > + self.verify( > + layer_type in out, > + "Failed to output ptype information!= !!") > + if queue !=3D 0 and type is '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 direct= or to > + do classfication, send gtpc packet to PF, check PF could receive > + packet using configured queue, checksum is good. > + """ > + 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 direct= or to > + do classfication, send gtpu packet to PF, check PF could receive > + packet using configured queue, checksum is good. > + """ > + 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',=20 > + 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.gtp_test( > + type=3D'clfter', port=3D'pf', tunnel_pkt=3D'gtpc',=20 > + 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 conf= igured > + queue, checksum is good. > + """ > + 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',=20 > + 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 conf= igured > + queue, checksum is good. > + """ > + self.gtp_test( > + type=3D'clfter', port=3D'vf id 0', tunnel_pkt=3D'gtpc',=20 > + 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 conf= igured > + queue, checksum is good. > + """ > + self.gtp_test( > + type=3D'clfter', port=3D'vf id 0', tunnel_pkt=3D'gtpu', inne= r_L3=3DNone) > + self.gtp_test( > + type=3D'clfter', port=3D'vf id 0', tunnel_pkt=3D'gtpu', inne= r_L3=3D'ipv4') > + self.gtp_test( > + type=3D'clfter', port=3D'vf id 0', tunnel_pkt=3D'gtpu',=20 > + 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() > + > + def tear_down_all(self): > + self.destroy_vm_env()