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 8ED33A0526; Fri, 24 Jul 2020 22:46:22 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id 585A01C031; Fri, 24 Jul 2020 22:46:22 +0200 (CEST) Received: from mail-lj1-f179.google.com (mail-lj1-f179.google.com [209.85.208.179]) by dpdk.org (Postfix) with ESMTP id 2E0891C02C for ; Fri, 24 Jul 2020 22:46:21 +0200 (CEST) Received: by mail-lj1-f179.google.com with SMTP id s9so11247137ljm.11 for ; Fri, 24 Jul 2020 13:46:21 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=iol.unh.edu; s=unh-iol; h=mime-version:references:in-reply-to:from:date:message-id:subject:to :cc; bh=LTaBJrCKoTZ5RsLLj7b3O43xLm5d1p3wtIEV6+lsSDI=; b=A2O1rU1jJO6jMXnQEOhHVMwkx8hIXWRarpIgJ3pDq6RN953ig51cEHUGPCazy475BU Z/9P7cxI1PNASmrQEwxk4OpV5c1FMVvyxi3MSl6cADwKEPFvIT+wZ/fEhcf5Th3OSg8g KqQlroFybMe7XTjW/rA0ZV6IoPgVaxoQiCsZc= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=LTaBJrCKoTZ5RsLLj7b3O43xLm5d1p3wtIEV6+lsSDI=; b=Py3OU6fo7rieJoiS+gIE4QhnXS9IMW4glvPMqAun6+3bf5rljTSnK4rkEOuSX8sdff gAUVl+MZBqWgiuun4Onuu8jOqB3cjq2+x4d0j2jj1JNVJaOJnX7RVBcFNCXrcmk+qFXf fwHUuImbykHurQndjOoAcQo0EIx4p62PHIx395wogwf9R9Xhn/v++TWWsB6GN7HSolYc kJyS1+Ay1VP2rDNWytKVayMtBXTEmCYmxHsPCh3aIajWYp2kipfJNMWUpg2mPdFSTpy0 QkhGTVv0nyYGiyjUAlvc/Za0jE30famObFhmpbquQxdV4olXpO8UvFNLOoCGNrcL6KvK TAIQ== X-Gm-Message-State: AOAM530Z0MpiNVsK2QtwuHSj3LjfEmKS/wMShj5/LZ38CuFwG5slzYLu O89IaDVUlTzRqyJJoBMl4BdCSCyK12ySPxl+fp3M0Q== X-Google-Smtp-Source: ABdhPJzpTPtvd3uwYyImCS1IK+4lhvRddZ2vADzptkL5pmO9B2Vz+UERevM258MWJjkVKbsvVrKEC0U+Ov5vmWD6i68= X-Received: by 2002:a2e:961a:: with SMTP id v26mr5322090ljh.467.1595623580500; Fri, 24 Jul 2020 13:46:20 -0700 (PDT) MIME-Version: 1.0 References: <20200715200853.6125-1-dliu@iol.unh.edu> <8CE3E05A3F976642AAB0F4675D0AD20E0BC83F2D@SHSMSX101.ccr.corp.intel.com> In-Reply-To: <8CE3E05A3F976642AAB0F4675D0AD20E0BC83F2D@SHSMSX101.ccr.corp.intel.com> From: David Liu Date: Fri, 24 Jul 2020 16:45:44 -0400 Message-ID: To: "Tu, Lijuan" Cc: "dts@dpdk.org" , "lylavoie@iol.unh.edu" Content-Type: multipart/alternative; boundary="000000000000b62f7b05ab361072" Subject: Re: [dts] [PATCH v2]Add RSS Key Update Feature 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" --000000000000b62f7b05ab361072 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi Lijuan, Sorry, what you suggested makes sense. The V2 I send was some changes that will make the code cleaner by combining some duplicated code in the V1. To solve this issue, I will submit a patch that combines both of these versions. Thanks David On Thu, Jul 23, 2020 at 10:01 PM Tu, Lijuan wrote: > Hi David, > > V2 should be also based on DTS remote master, but not your local code. > > When V1 are not merged, we submit V2, V2 should cover V1+ fix comments > based on DTS remote code, maintainer will ignore V1 and merge V2. It's no= t > make sense to merge patches with obvious defect. > > > -----Original Message----- > > From: dts On Behalf Of David Liu > > Sent: 2020=E5=B9=B47=E6=9C=8816=E6=97=A5 4:09 > > To: dts@dpdk.org > > Cc: lylavoie@iol.unh.edu; David Liu > > Subject: [dts] [PATCH v2]Add RSS Key Update Feature > > > > Merge duplicated code. Add flag in send packet and verify result to > identify > > symmetric used. > > > > Signed-off-by: David Liu > > --- > > tests/TestSuite_rss_key_update.py | 183 ++++++++---------------------- > > 1 file changed, 46 insertions(+), 137 deletions(-) > > > > diff --git a/tests/TestSuite_rss_key_update.py > > b/tests/TestSuite_rss_key_update.py > > index 0985f30..adb44f1 100644 > > --- a/tests/TestSuite_rss_key_update.py > > +++ b/tests/TestSuite_rss_key_update.py > > @@ -39,7 +39,6 @@ Test the support of RSS Key Update by Poll Mode > Drivers. > > > > import time > > import re > > -import packet > > import random > > import utils > > > > @@ -63,85 +62,37 @@ iptypes =3D {'ipv4-sctp': 'sctp', > > > > class TestRssKeyUpdate(TestCase): > > > > - def send_packet(self, itf, tran_type): > > + def send_packet(self, itf, tran_type, symmetric): > > """ > > Sends packets. > > """ > > + packet_list =3D { > > + 'ipv4-sctp': 'IP(src=3D"192.168.0.%d", > > dst=3D"192.168.0.%d")/SCTP(sport=3D1024,dport=3D1024,tag=3D1)', > > + 'ipv4-other': 'IP(src=3D"192.168.0.%d", dst=3D"192.168.0.%= d")', > > + 'ipv4-frag': 'IP(src=3D"192.168.0.%d", > > dst=3D"192.168.0.%d",frag=3D1,flags=3D"MF")', > > + 'ipv4-udp': 'IP(src=3D"192.168.0.%d", > > dst=3D"192.168.0.%d")/UDP(sport=3D1024,dport=3D1024)', > > + 'ipv4-tcp': 'IP(src=3D"192.168.0.%d", > > dst=3D"192.168.0.%d")/TCP(sport=3D1024,dport=3D1024)', > > + 'ipv6-other':'IPv6(src=3D"3ffe:2501:200:1fff::%d", > > dst=3D"3ffe:2501:200:3::%d")', > > + 'ipv6-sctp': 'IPv6(src=3D"3ffe:2501:200:1fff::%d", > > dst=3D"3ffe:2501:200:3::%d", nh=3D132)/SCTP(sport=3D1024,dport=3D1024,t= ag=3D1)', > > + 'ipv6-udp': 'IPv6(src=3D"3ffe:2501:200:1fff::%d", > > dst=3D"3ffe:2501:200:3::%d")/UDP(sport=3D1024,dport=3D1024)', > > + 'ipv6-tcp': 'IPv6(src=3D"3ffe:2501:200:1fff::%d", > > dst=3D"3ffe:2501:200:3::%d")/TCP(sport=3D1024,dport=3D1024)', > > + 'ipv6-frag': 'IPv6(src=3D"3ffe:2501:200:1fff::%d", > > dst=3D"3ffe:2501:200:3::%d",nh=3D44)/IPv6ExtHdrFragment()' > > + } > > + > > received_pkts =3D [] > > self.tester.scapy_foreground() > > self.dut.send_expect("start", "testpmd>") > > mac =3D self.dut.get_mac_address(0) > > > > # send packet with different source and dest ip > > - if tran_type =3D=3D "ipv4-other": > > - for i in range(10): > > - packet =3D r'sendp([Ether(dst=3D"%s", > > src=3Dget_if_hwaddr("%s"))/IP(src=3D"192.168.0.%d", dst=3D"192.168.0.%d= ")], > > iface=3D"%s")' % ( > > - mac, itf, i + 1, i + 2, itf) > > - self.tester.scapy_append(packet) > > - self.tester.scapy_execute() > > - time.sleep(.5) > > - elif tran_type =3D=3D "ipv4-tcp": > > - for i in range(10): > > - packet =3D r'sendp([Ether(dst=3D"%s", > > src=3Dget_if_hwaddr("%s"))/IP(src=3D"192.168.0.%d", > > dst=3D"192.168.0.%d")/TCP(sport=3D1024,dport=3D1024)], iface=3D"%s")' %= ( > > - mac, itf, i + 1, i + 2, itf) > > - self.tester.scapy_append(packet) > > - self.tester.scapy_execute() > > - time.sleep(.5) > > - elif tran_type =3D=3D "ipv4-udp": > > - for i in range(10): > > - packet =3D r'sendp([Ether(dst=3D"%s", > > src=3Dget_if_hwaddr("%s"))/IP(src=3D"192.168.0.%d", > > dst=3D"192.168.0.%d")/UDP(sport=3D1024,dport=3D1024)], iface=3D"%s")' %= ( > > - mac, itf, i + 1, i + 2, itf) > > - self.tester.scapy_append(packet) > > - self.tester.scapy_execute() > > - time.sleep(.5) > > - elif tran_type =3D=3D "ipv4-sctp": > > - for i in range(10): > > - packet =3D r'sendp([Ether(dst=3D"%s", > > src=3Dget_if_hwaddr("%s"))/IP(src=3D"192.168.0.%d", > > dst=3D"192.168.0.%d")/SCTP(sport=3D1024,dport=3D1024,tag=3D1)], iface= =3D"%s")' % ( > > - mac, itf, i + 1, i + 2, itf) > > - self.tester.scapy_append(packet) > > - self.tester.scapy_execute() > > - time.sleep(.5) > > - elif tran_type =3D=3D "ipv4-frag": > > - for i in range(10): > > - packet =3D r'sendp([Ether(dst=3D"%s", > > src=3Dget_if_hwaddr("%s"))/IP(src=3D"192.168.0.%d", > > dst=3D"192.168.0.%d",frag=3D1,flags=3D"MF")], iface=3D"%s")' % ( > > - mac, itf, i + 1, i + 2, itf) > > - self.tester.scapy_append(packet) > > - self.tester.scapy_execute() > > - time.sleep(.5) > > - > > - elif tran_type =3D=3D "ipv6-other": > > - for i in range(10): > > - packet =3D r'sendp([Ether(dst=3D"%s", > > src=3Dget_if_hwaddr("%s"))/IPv6(src=3D"3ffe:2501:200:1fff::%d", > > dst=3D"3ffe:2501:200:3::%d")], iface=3D"%s")' % ( > > - mac, itf, i + 1, i + 2, itf) > > - self.tester.scapy_append(packet) > > - self.tester.scapy_execute() > > - time.sleep(.5) > > - elif tran_type =3D=3D "ipv6-tcp": > > - for i in range(10): > > - packet =3D r'sendp([Ether(dst=3D"%s", > > src=3Dget_if_hwaddr("%s"))/IPv6(src=3D"3ffe:2501:200:1fff::%d", > > dst=3D"3ffe:2501:200:3::%d")/TCP(sport=3D1024,dport=3D1024)], iface=3D"= %s")' % ( > > - mac, itf, i + 1, i + 2, itf) > > - self.tester.scapy_append(packet) > > - self.tester.scapy_execute() > > - time.sleep(.5) > > - elif tran_type =3D=3D "ipv6-udp": > > - for i in range(10): > > - packet =3D r'sendp([Ether(dst=3D"%s", > > src=3Dget_if_hwaddr("%s"))/IPv6(src=3D"3ffe:2501:200:1fff::%d", > > dst=3D"3ffe:2501:200:3::%d")/UDP(sport=3D1024,dport=3D1024)], iface=3D"= %s")' % ( > > - mac, itf, i + 1, i + 2, itf) > > - self.tester.scapy_append(packet) > > - self.tester.scapy_execute() > > - time.sleep(.5) > > - elif tran_type =3D=3D "ipv6-sctp": > > + if tran_type in packet_list.keys(): > > + packet_temp =3D r'sendp([Ether(dst=3D"%s", > > + src=3Dget_if_hwaddr("%s"))/%s], iface=3D"%s")' % (mac, itf, > > + packet_list[tran_type], itf) > > for i in range(10): > > - packet =3D r'sendp([Ether(dst=3D"%s", > > src=3Dget_if_hwaddr("%s"))/IPv6(src=3D"3ffe:2501:200:1fff::%d", > > dst=3D"3ffe:2501:200:3::%d", nh=3D132)/SCTP(sport=3D1024,dport=3D1024,t= ag=3D1)], > > iface=3D"%s")' % ( > > - mac, itf, i + 1, i + 2, itf) > > - self.tester.scapy_append(packet) > > - self.tester.scapy_execute() > > - time.sleep(.5) > > - elif tran_type =3D=3D "ipv6-frag": > > - for i in range(10): > > - packet =3D r'sendp([Ether(dst=3D"%s", > > src=3Dget_if_hwaddr("%s"))/IPv6(src=3D"3ffe:2501:200:1fff::%d", > > dst=3D"3ffe:2501:200:3::%d",nh=3D44)/IPv6ExtHdrFragment()], iface=3D"%s= ")' % ( > > - mac, itf, i + 1, i + 2, itf) > > + packet =3D packet_temp % (i + 1, i + 2) > > self.tester.scapy_append(packet) > > + if symmetric: > > + packet2 =3D packet_list[tran_type] % (mac, itf, i = + > 2, i + 1, itf) > > + self.tester.scapy_append(packet2) > > self.tester.scapy_execute() > > time.sleep(.5) > > else: > > @@ -154,102 +105,64 @@ class TestRssKeyUpdate(TestCase): > > # collect the hash result and the queue id > > for line in lines: > > line =3D line.strip() > > - if len(line) !=3D 0 and line.strip().startswith("port "): > > + if len(line) !=3D 0 and line.startswith("port "): > > reta_line =3D {} > > - rexp =3D r"port (\d)/queue (\d{1,2}): received (\d) > packets" > > - m =3D re.match(rexp, line.strip()) > > + rexp =3D r"port (\d+)/queue (\d+): received (\d+) pack= ets" > > + m =3D re.match(rexp, line) > > if m: > > reta_line["port"] =3D m.group(1) > > reta_line["queue"] =3D m.group(2) > > > > - elif len(line) !=3D 0 and line.startswith(("src=3D",)): > > + elif len(line) !=3D 0 and line.startswith("src=3D"): > > if "RSS hash" not in line: > > continue > > for item in line.split("-"): > > item =3D item.strip() > > - if(item.startswith("RSS hash")): > > + if item.startswith("RSS hash"): > > name, value =3D item.split("=3D", 1) > > > > reta_line[name.strip()] =3D value.strip() > > received_pkts.append(reta_line) > > > > - return(self.verifyResult(received_pkts)) > > + return(self.verifyResult(received_pkts, symmetric)) > > > > - def verifyResult(self, reta_lines): > > + def verifyResult(self, reta_lines, symmetric): > > """ > > Verify whether or not the result passes. > > """ > > - > > - global reta_num > > result =3D [] > > key_id =3D {} > > self.verify(len(reta_lines) > 0, 'No packet received!') > > self.result_table_create( > > ['packet index', 'hash value', 'hash index', 'queue id', > 'actual queue id', > > 'pass ']) > > > > - i =3D 0 > > - > > - for tmp_reta_line in reta_lines: > > + for i, tmp_reta_line in enumerate(reta_lines): > > status =3D "false" > > # compute the hash result of five tuple into the 7 LSBs > value. > > hash_index =3D int(tmp_reta_line["RSS hash"], 16) % reta_n= um > > - print(reta_entries[hash_index], tmp_reta_line) > > if(reta_entries[hash_index] =3D=3D int(tmp_reta_line["queu= e"])): > > status =3D "true" > > result.insert(i, 0) > > + if symmetric: > > + if(i % 2 =3D=3D 1): > > + if(pre_RSS_hash =3D=3D tmp_reta_line["RSS hash= "]): > > + status =3D "true" > > + result.insert(len(reta_lines) + (i - 1) // > 2, 0) > > + else: > > + status =3D "fail" > > + result.insert(len(reta_lines) + (i - 1) // > 2, 1) > > + pre_RSS_hash =3D tmp_reta_line["RSS hash"] > > else: > > status =3D "fail" > > result.insert(i, 1) > > self.result_table_add( > > [i, tmp_reta_line["RSS hash"], hash_index, > reta_entries[hash_index], > > tmp_reta_line["queue"], status]) > > - i =3D i + 1 > > - key_id[tmp_reta_line["RSS hash"]]=3Dreta_entries[hash_inde= x] > > + key_id[tmp_reta_line["RSS hash"]] =3D > > + reta_entries[hash_index] > > > > self.result_table_print() > > self.verify(sum(result) =3D=3D 0, "the reta update function > failed!") > > return key_id > > > > - def verifyResult_symmetric(self, reta_lines): > > - """ > > - Verify whether or not the result passes. > > - """ > > - > > - global reta_num > > - result =3D [] > > - key_id =3D {} > > - self.verify(len(reta_lines) > 0, 'No packet received!') > > - self.result_table_create( > > - ['packet index', 'RSS hash', 'hash index', 'queue id', > 'actual queue id', 'pass > > ']) > > - > > - i =3D 0 > > - for tmp_reta_line in reta_lines: > > - status =3D "false" > > - # compute the hash result of five tuple into the 7 LSBs > value. > > - hash_index =3D int(tmp_reta_line["RSS hash"], 16) % reta_n= um > > - if(reta_entries[hash_index] =3D=3D int(tmp_reta_line["queu= e"])): > > - status =3D "true" > > - result.insert(i, 0) > > - if(i % 2 =3D=3D 1): > > - if(pre_RSS_hash =3D=3D tmp_reta_line["RSS hash"]): > > - status =3D "true" > > - result.insert(len(reta_lines) + (i - 1) // 2, = 0) > > - else: > > - status =3D "fail" > > - result.insert(len(reta_lines) + (i - 1) // 2, = 1) > > - pre_RSS_hash =3D tmp_reta_line["RSS hash"] > > - else: > > - status =3D "fail" > > - result.insert(i, 1) > > - self.result_table_add( > > - [i, tmp_reta_line["RSS hash"], hash_index, > reta_entries[hash_index], > > tmp_reta_line["queue"], status]) > > - i =3D i + 1 > > - key_id[tmp_reta_line["RSS hash"]]=3Dreta_entries[hash_inde= x] > > - > > - self.result_table_print() > > - self.verify( > > - sum(result) =3D=3D 0, "the symmetric RSS hash function fai= led!") > > - return key_id > > - > > def set_up_all(self): > > """ > > Run at the start of each test suite. > > @@ -282,7 +195,7 @@ class TestRssKeyUpdate(TestCase): > > elif self.nic in ["redrockcanyou", "atwood", "boulderrapid"]: > > reta_num =3D 128 > > else: > > - self.verify(False, f"NIC Unsupported:{self.nic}") > > + self.verify(False, f"NIC Unsupported: {self.nic}") > > > > cores =3D self.dut.get_core_list("all") > > self.coremask =3D utils.create_mask(cores) @@ -300,8 +213,6 @@ > class > > TestRssKeyUpdate(TestCase): > > dutPorts =3D self.dut.get_ports(self.nic) > > localPort =3D self.tester.get_local_port(dutPorts[0]) > > self.itf =3D self.tester.get_interface(localPort) > > - global reta_num > > - global iptypes > > > > self.dut.kill_all() > > > > @@ -326,12 +237,12 @@ class TestRssKeyUpdate(TestCase): > > reta_entries.insert(i, random.randint(0, queue - 1)) > > self.dut.send_expect(f"port config 0 rss reta > ({i},{reta_entries[i]})", > > "testpmd> ") > > > > - ori_output =3D self.send_packet(self.itf, iptype) > > + ori_output =3D self.send_packet(self.itf, iptype, False) > > > > self.dut.send_expect("show port 0 rss-hash key", "testpmd> > ") > > self.dut.send_expect(f"port config 0 rss-hash-key {iptype} > > 4439796BB54C50f3B675EF5B124F9F30B8A2C0FFFFDC4D02A08C9B334FF64A4C > > 05C6FA343958D855FFF9583AE138C92E81150FFF", "testpmd> ") > > > > - new_output =3D self.send_packet(self.itf, iptype) > > + new_output =3D self.send_packet(self.itf, iptype, False) > > > > self.verify(ori_output !=3D new_output, "before and after > results are the > > same, hash key configuration failed!") > > > > @@ -356,16 +267,15 @@ class TestRssKeyUpdate(TestCase): > > reta_entries.insert(i, random.randint(0, queue - 1)) > > self.dut.send_expect(f"port config 0 rss reta > ({i},{reta_entries[i]})", > > "testpmd> ") > > > > - ori_output =3D self.send_packet(self.itf, iptype) > > + ori_output =3D self.send_packet(self.itf, iptype, True) > > > > out =3D self.dut.send_expect("show port 0 rss-hash key", > "testpmd> ") > > self.verify("rss disable" not in out, "rss is disable!") > > self.dut.send_expect(f"port config 0 rss-hash-key {iptype} > > 4439796BB54C50f3B675EF5B124F9F30B8A2C0FFFFDC4D02A08C9B334FF64A4C > > 05C6FA343958D855FFF9583AE138C92E81150FFF", "testpmd> ") > > > > - new_output =3D self.send_packet(self.itf, iptype) > > + new_output =3D self.send_packet(self.itf, iptype, True) > > > > self.verify(ori_output !=3D new_output, "before and after > results are the > > same, hash key configuration failed!") > > - self.dut.send_expect("quit", "# ", 30) > > > > def test_set_hash_key_short_long(self): > > > > @@ -384,26 +294,25 @@ class TestRssKeyUpdate(TestCase): > > out =3D self.dut.send_expect("show port info all", "testpmd> "= , > 120) > > self.verify(f"Hash key size in bytes: > {nic_rss_key_size[self.nic]}" in out, "not > > expected hash key size!") > > > > - test_keies =3D { > > + test_keys =3D { > > > > "4439796BB54C50f3B675EF5B124F9F30B8A2C0FFFFDC4D02A08C9B334FF64A4 > > C05C6FA343958D855FFF9583AE138C92E81150FFFFF": "longer", > > > > "4439796BB54C50f3B675EF5B124F9F30B8A2C0DC4D02A08C9B334FF64A4C05C > > 6FA343958D855FFF9583AE138C92E81150FFF": "shorter", > > } > > > > # config key length longer/shorter than 104 hexa-decimal numbe= rs > > - for key, error in test_keies.items(): > > + for key, error in test_keys.items(): > > out =3D self.dut.send_expect(f"port config 0 rss-hash-key > ipv4-udp {key}", > > "testpmd> ") > > self.verify("invalid" in out, f"Try to set hash key {error= } > than 104 hexa- > > decimal numbers!") > > > > # config ket length same as 104 hex-decimal numbers and keep > the config > > key =3D > > "4439796BB54C50f3B675EF5B124F9F30B8A2C0FFFFDC4D02A08C9B334FF64A4 > > C05C6FA343958D855FFF9583AE138C92E81150FFF" > > out =3D self.dut.send_expect(f"port config 0 rss-hash-key > ipv4-udp {key}", > > "testpmd> ") > > - self.dut.send_expect("quit", "# ", 30) > > > > def tear_down(self): > > """ > > Run after each test case. > > """ > > - self.dut.send_expect("quit", "# ", 30) > > + self.pmdout.quit() > > > > def tear_down_all(self): > > """ > > -- > > 2.17.1 > > --000000000000b62f7b05ab361072 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi Lijuan,

Sorry, what you suggeste= d=C2=A0makes sense. The V2 I send was some changes that will make the code = cleaner by combining some duplicated code in the V1. To solve this issue, I= will submit a patch that combines both of these versions.=C2=A0
=
Thanks
David

On Thu, Jul 23, 2020 at 10:01 PM= Tu, Lijuan <li= juan.tu@intel.com> wrote:
Hi David,

V2 should be also based on DTS remote master, but not your local code.

When V1 are not merged, we submit V2, V2 should cover V1+ fix comments base= d on DTS remote code, maintainer will ignore V1 and merge V2. It's not = make sense to merge patches with obvious defect.

> -----Original Message-----
> From: dts <dts-bounces@dpdk.org> On Behalf Of David Liu
> Sent: 2020=E5=B9=B47=E6=9C=8816=E6=97=A5 4:09
> To: dts@dpdk.org=
> Cc: lylavoie= @iol.unh.edu; David Liu <dliu@iol.unh.edu>
> Subject: [dts] [PATCH v2]Add RSS Key Update Feature
>
>=C2=A0 Merge duplicated code. Add flag in send packet and verify=C2=A0 = result to identify
> symmetric used.
>
> Signed-off-by: David Liu <dliu@iol.unh.edu>
> ---
>=C2=A0 tests/TestSuite_rss_key_update.py | 183 ++++++++----------------= ------
>=C2=A0 1 file changed, 46 insertions(+), 137 deletions(-)
>
> diff --git a/tests/TestSuite_rss_key_update.py
> b/tests/TestSuite_rss_key_update.py
> index 0985f30..adb44f1 100644
> --- a/tests/TestSuite_rss_key_update.py
> +++ b/tests/TestSuite_rss_key_update.py
> @@ -39,7 +39,6 @@ Test the support of RSS Key Update by Poll Mode Driv= ers.
>
>=C2=A0 import time
>=C2=A0 import re
> -import packet
>=C2=A0 import random
>=C2=A0 import utils
>
> @@ -63,85 +62,37 @@ iptypes =3D {'ipv4-sctp': 'sctp',<= br> >
>=C2=A0 class TestRssKeyUpdate(TestCase):
>
> -=C2=A0 =C2=A0 def send_packet(self, itf, tran_type):
> +=C2=A0 =C2=A0 def send_packet(self, itf, tran_type, symmetric):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 """
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Sends packets.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 """
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 packet_list =3D {
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'ipv4-sctp': 'I= P(src=3D"192.168.0.%d",
> dst=3D"192.168.0.%d")/SCTP(sport=3D1024,dport=3D1024,tag=3D1= )',
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'ipv4-other': '= IP(src=3D"192.168.0.%d", dst=3D"192.168.0.%d")', > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'ipv4-frag': 'I= P(src=3D"192.168.0.%d",
> dst=3D"192.168.0.%d",frag=3D1,flags=3D"MF")',<= br> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'ipv4-udp': 'IP= (src=3D"192.168.0.%d",
> dst=3D"192.168.0.%d")/UDP(sport=3D1024,dport=3D1024)', > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'ipv4-tcp': 'IP= (src=3D"192.168.0.%d",
> dst=3D"192.168.0.%d")/TCP(sport=3D1024,dport=3D1024)', > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'ipv6-other':'I= Pv6(src=3D"3ffe:2501:200:1fff::%d",
> dst=3D"3ffe:2501:200:3::%d")',
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'ipv6-sctp': 'I= Pv6(src=3D"3ffe:2501:200:1fff::%d",
> dst=3D"3ffe:2501:200:3::%d", nh=3D132)/SCTP(sport=3D1024,dpo= rt=3D1024,tag=3D1)',
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'ipv6-udp': 'IP= v6(src=3D"3ffe:2501:200:1fff::%d",
> dst=3D"3ffe:2501:200:3::%d")/UDP(sport=3D1024,dport=3D1024)&= #39;,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'ipv6-tcp': 'IP= v6(src=3D"3ffe:2501:200:1fff::%d",
> dst=3D"3ffe:2501:200:3::%d")/TCP(sport=3D1024,dport=3D1024)&= #39;,
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 'ipv6-frag': 'I= Pv6(src=3D"3ffe:2501:200:1fff::%d",
> dst=3D"3ffe:2501:200:3::%d",nh=3D44)/IPv6ExtHdrFragment()= 9;
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 }
> +
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 received_pkts =3D []
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.scapy_foreground()
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect("start&quo= t;, "testpmd>")
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 mac =3D self.dut.get_mac_address(0)<= br> >
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 # send packet with different source = and dest ip
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 if tran_type =3D=3D "ipv4-other"= ;:
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for i in range(10):
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 packet =3D r&= #39;sendp([Ether(dst=3D"%s",
> src=3Dget_if_hwaddr("%s"))/IP(src=3D"192.168.0.%d"= , dst=3D"192.168.0.%d")],
> iface=3D"%s")' % (
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= mac, itf, i + 1, i + 2, itf)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.s= capy_append(packet)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.scapy_execute()=
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 time.sleep(.5)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 elif tran_type =3D=3D "ipv4-tcp"= ;:
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for i in range(10):
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 packet =3D r&= #39;sendp([Ether(dst=3D"%s",
> src=3Dget_if_hwaddr("%s"))/IP(src=3D"192.168.0.%d"= ,
> dst=3D"192.168.0.%d")/TCP(sport=3D1024,dport=3D1024)], iface= =3D"%s")' % (
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= mac, itf, i + 1, i + 2, itf)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.s= capy_append(packet)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.scapy_execute()=
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 time.sleep(.5)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 elif tran_type =3D=3D "ipv4-udp"= ;:
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for i in range(10):
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 packet =3D r&= #39;sendp([Ether(dst=3D"%s",
> src=3Dget_if_hwaddr("%s"))/IP(src=3D"192.168.0.%d"= ,
> dst=3D"192.168.0.%d")/UDP(sport=3D1024,dport=3D1024)], iface= =3D"%s")' % (
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= mac, itf, i + 1, i + 2, itf)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.s= capy_append(packet)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.scapy_execute()=
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 time.sleep(.5)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 elif tran_type =3D=3D "ipv4-sctp&quo= t;:
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for i in range(10):
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 packet =3D r&= #39;sendp([Ether(dst=3D"%s",
> src=3Dget_if_hwaddr("%s"))/IP(src=3D"192.168.0.%d"= ,
> dst=3D"192.168.0.%d")/SCTP(sport=3D1024,dport=3D1024,tag=3D1= )], iface=3D"%s")' % (
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= mac, itf, i + 1, i + 2, itf)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.s= capy_append(packet)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.scapy_execute()=
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 time.sleep(.5)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 elif tran_type =3D=3D "ipv4-frag&quo= t;:
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for i in range(10):
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 packet =3D r&= #39;sendp([Ether(dst=3D"%s",
> src=3Dget_if_hwaddr("%s"))/IP(src=3D"192.168.0.%d"= ,
> dst=3D"192.168.0.%d",frag=3D1,flags=3D"MF")], ifac= e=3D"%s")' % (
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= mac, itf, i + 1, i + 2, itf)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.s= capy_append(packet)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.scapy_execute()=
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 time.sleep(.5)
> -
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 elif tran_type =3D=3D "ipv6-other&qu= ot;:
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for i in range(10):
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 packet =3D r&= #39;sendp([Ether(dst=3D"%s",
> src=3Dget_if_hwaddr("%s"))/IPv6(src=3D"3ffe:2501:200:1f= ff::%d",
> dst=3D"3ffe:2501:200:3::%d")], iface=3D"%s")' = % (
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= mac, itf, i + 1, i + 2, itf)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.s= capy_append(packet)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.scapy_execute()=
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 time.sleep(.5)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 elif tran_type =3D=3D "ipv6-tcp"= ;:
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for i in range(10):
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 packet =3D r&= #39;sendp([Ether(dst=3D"%s",
> src=3Dget_if_hwaddr("%s"))/IPv6(src=3D"3ffe:2501:200:1f= ff::%d",
> dst=3D"3ffe:2501:200:3::%d")/TCP(sport=3D1024,dport=3D1024)]= , iface=3D"%s")' % (
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= mac, itf, i + 1, i + 2, itf)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.s= capy_append(packet)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.scapy_execute()=
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 time.sleep(.5)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 elif tran_type =3D=3D "ipv6-udp"= ;:
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for i in range(10):
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 packet =3D r&= #39;sendp([Ether(dst=3D"%s",
> src=3Dget_if_hwaddr("%s"))/IPv6(src=3D"3ffe:2501:200:1f= ff::%d",
> dst=3D"3ffe:2501:200:3::%d")/UDP(sport=3D1024,dport=3D1024)]= , iface=3D"%s")' % (
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= mac, itf, i + 1, i + 2, itf)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.s= capy_append(packet)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.scapy_execute()=
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 time.sleep(.5)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 elif tran_type =3D=3D "ipv6-sctp&quo= t;:
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 if tran_type in packet_list.keys():
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 packet_temp =3D r'sendp= ([Ether(dst=3D"%s",
> + src=3Dget_if_hwaddr("%s"))/%s], iface=3D"%s")= 9; % (mac, itf,
> + packet_list[tran_type], itf)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for i in range(10): > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 packet =3D r&= #39;sendp([Ether(dst=3D"%s",
> src=3Dget_if_hwaddr("%s"))/IPv6(src=3D"3ffe:2501:200:1f= ff::%d",
> dst=3D"3ffe:2501:200:3::%d", nh=3D132)/SCTP(sport=3D1024,dpo= rt=3D1024,tag=3D1)],
> iface=3D"%s")' % (
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= mac, itf, i + 1, i + 2, itf)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.s= capy_append(packet)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.scapy_execute()=
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 time.sleep(.5)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 elif tran_type =3D=3D "ipv6-frag&quo= t;:
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for i in range(10):
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 packet =3D r&= #39;sendp([Ether(dst=3D"%s",
> src=3Dget_if_hwaddr("%s"))/IPv6(src=3D"3ffe:2501:200:1f= ff::%d",
> dst=3D"3ffe:2501:200:3::%d",nh=3D44)/IPv6ExtHdrFragment()], = iface=3D"%s")' % (
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= mac, itf, i + 1, i + 2, itf)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 packet =3D pa= cket_temp % (i + 1, i + 2)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tes= ter.scapy_append(packet)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if symmetric:=
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= packet2 =3D packet_list[tran_type] % (mac, itf, i + 2, i + 1, itf)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= self.tester.scapy_append(packet2)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.tester.scapy_exec= ute()
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 time.sleep(.5)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 else:
> @@ -154,102 +105,64 @@ class TestRssKeyUpdate(TestCase):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 # collect the hash result and the qu= eue id
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for line in lines:
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 line =3D line.strip()<= br> > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if len(line) !=3D 0 and lin= e.strip().startswith("port "):
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if len(line) !=3D 0 and lin= e.startswith("port "):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 reta_lin= e =3D {}
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 rexp =3D r&qu= ot;port (\d)/queue (\d{1,2}): received (\d) packets"
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 m =3D re.matc= h(rexp, line.strip())
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 rexp =3D r&qu= ot;port (\d+)/queue (\d+): received (\d+) packets"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 m =3D re.matc= h(rexp, line)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if m: >=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 reta_line["port"] =3D m.group(1)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 reta_line["queue"] =3D m.group(2)
>
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 elif len(line) !=3D 0 and l= ine.startswith(("src=3D",)):
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 elif len(line) !=3D 0 and l= ine.startswith("src=3D"):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if "= ;RSS hash" not in line:
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 continue
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 for item= in line.split("-"):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 item =3D item.strip()
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= if(item.startswith("RSS hash")):
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= if item.startswith("RSS hash"):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 = =C2=A0 =C2=A0 =C2=A0 name, value =3D item.split("=3D", 1)
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 reta_lin= e[name.strip()] =3D value.strip()
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 received= _pkts.append(reta_line)
>
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 return(self.verifyResult(received_pkts))<= br> > +=C2=A0 =C2=A0 =C2=A0 =C2=A0 return(self.verifyResult(received_pkts, s= ymmetric))
>
> -=C2=A0 =C2=A0 def verifyResult(self, reta_lines):
> +=C2=A0 =C2=A0 def verifyResult(self, reta_lines, symmetric):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 """
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Verify whether or not the result pas= ses.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 """
> -
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 global reta_num
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 result =3D []
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 key_id =3D {}
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify(len(reta_lines) > 0, = 'No packet received!')
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.result_table_create(
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ['packet index'= ;, 'hash value', 'hash index', 'queue id', 'act= ual queue id',
> 'pass '])
>
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 i =3D 0
> -
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 for tmp_reta_line in reta_lines:
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 for i, tmp_reta_line in enumerate(reta_li= nes):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 status =3D "false= "
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 # compute the hash res= ult of five tuple into the 7 LSBs value.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 hash_index =3D int(tmp= _reta_line["RSS hash"], 16) % reta_num
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 print(reta_entries[hash_ind= ex], tmp_reta_line)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(reta_entries[hash_i= ndex] =3D=3D int(tmp_reta_line["queue"])):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 status = =3D "true"
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 result.i= nsert(i, 0)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if symmetric:=
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= if(i % 2 =3D=3D 1):
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 if(pre_RSS_hash =3D=3D tmp_reta_line["RSS hash"]):=
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 status =3D "true"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 result.insert(len(reta_lines) + (i - 1) // 2, = 0)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 else:
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 status =3D "fail"
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 =C2=A0 =C2=A0 result.insert(len(reta_lines) + (i - 1) // 2, = 1)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= pre_RSS_hash =3D tmp_reta_line["RSS hash"]
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 else:
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 status = =3D "fail"
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 result.i= nsert(i, 1)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.result_table_add(=
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 [i, tmp_= reta_line["RSS hash"], hash_index, reta_entries[hash_index],
> tmp_reta_line["queue"], status])
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 i =3D i + 1
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 key_id[tmp_reta_line["= RSS hash"]]=3Dreta_entries[hash_index]
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 key_id[tmp_reta_line["= RSS hash"]] =3D
> + reta_entries[hash_index]
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.result_table_print()
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify(sum(result) =3D=3D 0, &q= uot;the reta update function failed!")
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return key_id
>
> -=C2=A0 =C2=A0 def verifyResult_symmetric(self, reta_lines):
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 """
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 Verify whether or not the result passes.<= br> > -=C2=A0 =C2=A0 =C2=A0 =C2=A0 """
> -
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 global reta_num
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 result =3D []
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 key_id =3D {}
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify(len(reta_lines) > 0, '= No packet received!')
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.result_table_create(
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ['packet index', &#= 39;RSS hash', 'hash index', 'queue id', 'actual que= ue id', 'pass
> '])
> -
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 i =3D 0
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 for tmp_reta_line in reta_lines:
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 status =3D "false"= ;
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 # compute the hash result o= f five tuple into the 7 LSBs value.
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 hash_index =3D int(tmp_reta= _line["RSS hash"], 16) % reta_num
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(reta_entries[hash_index]= =3D=3D int(tmp_reta_line["queue"])):
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 status =3D &q= uot;true"
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 result.insert= (i, 0)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if(i % 2 =3D= =3D 1):
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= if(pre_RSS_hash =3D=3D tmp_reta_line["RSS hash"]):
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 status =3D "true"
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 result.insert(len(reta_lines) + (i - 1) // 2, 0)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= else:
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 status =3D "fail"
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0= =C2=A0 =C2=A0 result.insert(len(reta_lines) + (i - 1) // 2, 1)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 pre_RSS_hash = =3D tmp_reta_line["RSS hash"]
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 else:
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 status =3D &q= uot;fail"
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 result.insert= (i, 1)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.result_table_add(
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 [i, tmp_reta_= line["RSS hash"], hash_index, reta_entries[hash_index],
> tmp_reta_line["queue"], status])
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 i =3D i + 1
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 key_id[tmp_reta_line["= RSS hash"]]=3Dreta_entries[hash_index]
> -
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.result_table_print()
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify(
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 sum(result) =3D=3D 0, "= ;the symmetric RSS hash function failed!")
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 return key_id
> -
>=C2=A0 =C2=A0 =C2=A0 def set_up_all(self):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 """
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Run at the start of each test suite.=
> @@ -282,7 +195,7 @@ class TestRssKeyUpdate(TestCase):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 elif self.nic in ["redrockcanyo= u", "atwood", "boulderrapid"]:
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 reta_num =3D 128
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 else:
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify(False, f"N= IC Unsupported:{self.nic}")
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify(False, f"N= IC Unsupported: {self.nic}")
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 cores =3D self.dut.get_core_list(&qu= ot;all")
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.coremask =3D utils.create_mask(= cores) @@ -300,8 +213,6 @@ class
> TestRssKeyUpdate(TestCase):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 dutPorts =3D self.dut.get_ports(self= .nic)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 localPort =3D self.tester.get_local_= port(dutPorts[0])
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.itf =3D self.tester.get_interfa= ce(localPort)
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 global reta_num
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 global iptypes
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.kill_all()
>
> @@ -326,12 +237,12 @@ class TestRssKeyUpdate(TestCase):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 reta_ent= ries.insert(i, random.randint(0, queue - 1))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut= .send_expect(f"port config 0 rss reta ({i},{reta_entries[i]})", > "testpmd> ")
>
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ori_output =3D self.send_pa= cket(self.itf, iptype)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ori_output =3D self.send_pa= cket(self.itf, iptype, False)
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect(&= quot;show port 0 rss-hash key", "testpmd> ")
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect(f= "port config 0 rss-hash-key {iptype}
> 4439796BB54C50f3B675EF5B124F9F30B8A2C0FFFFDC4D02A08C9B334FF64A4C
> 05C6FA343958D855FFF9583AE138C92E81150FFF", "testpmd> &quo= t;)
>
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 new_output =3D self.send_pa= cket(self.itf, iptype)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 new_output =3D self.send_pa= cket(self.itf, iptype, False)
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify(ori_output= !=3D new_output, "before and after results are the
> same, hash key configuration failed!")
>
> @@ -356,16 +267,15 @@ class TestRssKeyUpdate(TestCase):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 reta_ent= ries.insert(i, random.randint(0, queue - 1))
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut= .send_expect(f"port config 0 rss reta ({i},{reta_entries[i]})", > "testpmd> ")
>
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ori_output =3D self.send_pa= cket(self.itf, iptype)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 ori_output =3D self.send_pa= cket(self.itf, iptype, True)
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 out =3D self.dut.send_= expect("show port 0 rss-hash key", "testpmd> ")
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify("rss = disable" not in out, "rss is disable!")
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect(f= "port config 0 rss-hash-key {iptype}
> 4439796BB54C50f3B675EF5B124F9F30B8A2C0FFFFDC4D02A08C9B334FF64A4C
> 05C6FA343958D855FFF9583AE138C92E81150FFF", "testpmd> &quo= t;)
>
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 new_output =3D self.send_pa= cket(self.itf, iptype)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 new_output =3D self.send_pa= cket(self.itf, iptype, True)
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify(ori_output= !=3D new_output, "before and after results are the
> same, hash key configuration failed!")
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect("quit", &q= uot;# ", 30)
>
>=C2=A0 =C2=A0 =C2=A0 def test_set_hash_key_short_long(self):
>
> @@ -384,26 +294,25 @@ class TestRssKeyUpdate(TestCase):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 out =3D self.dut.send_expect("s= how port info all", "testpmd> ", 120)
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify(f"Hash key size in = bytes: {nic_rss_key_size[self.nic]}" in out, "not
> expected hash key size!")
>
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 test_keies =3D {
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 test_keys =3D {
>
> "4439796BB54C50f3B675EF5B124F9F30B8A2C0FFFFDC4D02A08C9B334FF64A4<= br> > C05C6FA343958D855FFF9583AE138C92E81150FFFFF": "longer",=
>
> "4439796BB54C50f3B675EF5B124F9F30B8A2C0DC4D02A08C9B334FF64A4C05C<= br> > 6FA343958D855FFF9583AE138C92E81150FFF": "shorter",
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 # config key length longer/shorter t= han 104 hexa-decimal numbers
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 for key, error in test_keies.items():
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 for key, error in test_keys.items():
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 out =3D self.dut.send_= expect(f"port config 0 rss-hash-key ipv4-udp {key}",
> "testpmd> ")
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 self.verify("inva= lid" in out, f"Try to set hash key {error} than 104 hexa-
> decimal numbers!")
>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 # config ket length same as 104 hex-= decimal numbers and keep the config
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 key =3D
> "4439796BB54C50f3B675EF5B124F9F30B8A2C0FFFFDC4D02A08C9B334FF64A4<= br> > C05C6FA343958D855FFF9583AE138C92E81150FFF"
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 out =3D self.dut.send_expect(f"= port config 0 rss-hash-key ipv4-udp {key}",
> "testpmd> ")
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect("quit", &q= uot;# ", 30)
>
>=C2=A0 =C2=A0 =C2=A0 def tear_down(self):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 """
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 Run after each test case.
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 """
> -=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.dut.send_expect("quit", &q= uot;# ", 30)
> +=C2=A0 =C2=A0 =C2=A0 =C2=A0 self.pmdout.quit()
>
>=C2=A0 =C2=A0 =C2=A0 def tear_down_all(self):
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 """
> --
> 2.17.1

--000000000000b62f7b05ab361072--