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 2F8D4A0613 for ; Tue, 27 Aug 2019 08:12:45 +0200 (CEST) Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id DDB031B9A9; Tue, 27 Aug 2019 08:12:44 +0200 (CEST) Received: from mga11.intel.com (mga11.intel.com [192.55.52.93]) by dpdk.org (Postfix) with ESMTP id 8321B1B94A for ; Tue, 27 Aug 2019 08:12:42 +0200 (CEST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from fmsmga003.fm.intel.com ([10.253.24.29]) by fmsmga102.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 26 Aug 2019 23:12:41 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.64,436,1559545200"; d="scan'208";a="187820602" Received: from fmsmsx103.amr.corp.intel.com ([10.18.124.201]) by FMSMGA003.fm.intel.com with ESMTP; 26 Aug 2019 23:12:41 -0700 Received: from fmsmsx121.amr.corp.intel.com (10.18.125.36) by FMSMSX103.amr.corp.intel.com (10.18.124.201) with Microsoft SMTP Server (TLS) id 14.3.439.0; Mon, 26 Aug 2019 23:12:41 -0700 Received: from shsmsx104.ccr.corp.intel.com (10.239.4.70) by fmsmsx121.amr.corp.intel.com (10.18.125.36) with Microsoft SMTP Server (TLS) id 14.3.439.0; Mon, 26 Aug 2019 23:12:41 -0700 Received: from shsmsx106.ccr.corp.intel.com ([169.254.10.204]) by SHSMSX104.ccr.corp.intel.com ([169.254.5.112]) with mapi id 14.03.0439.000; Tue, 27 Aug 2019 14:12:39 +0800 From: "Zhu, TaoX" To: "dts@dpdk.org" Thread-Topic: [dts][PATCH V1] test_plans/sriov_kvm: Add fortville support and optimize some cases Thread-Index: AQHVXJz1dMMk6WJL2kaHeh7ESsEhPKcOg2yQ Date: Tue, 27 Aug 2019 06:12:38 +0000 Message-ID: <60652C6914E08D41B9AA1580751B3CA9BD5591@SHSMSX106.ccr.corp.intel.com> References: <1566885985-69940-1-git-send-email-taox.zhu@intel.com> In-Reply-To: <1566885985-69940-1-git-send-email-taox.zhu@intel.com> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: 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 V1] test_plans/sriov_kvm: Add fortville support and optimize some cases 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" Tested-by: Zhu, TaoX -----Original Message----- From: Zhu, TaoX=20 Sent: Tuesday, August 27, 2019 2:06 PM To: dts@dpdk.org Cc: Zhu, TaoX Subject: [dts][PATCH V1] test_plans/sriov_kvm: Add fortville support and op= timize some cases Adjustment for the following reasons: 1. VLAN filter is not allowed to be set to vlan id 0 in fortville. 2. link-mirror and pool-mirror can't coexist in fortville(hardware limitation). 3. Comprehensive coverage of fortville and niantic mirror features. Signed-off-by: Zhu Tao --- test_plans/sriov_kvm_test_plan.rst | 190 +++++++++++++++++------------ 1 file changed, 110 insertions(+), 80 deletions(-) diff --git a/test_plans/sriov_kvm_test_plan.rst b/test_plans/sriov_kvm_test= _plan.rst index f1c17c3..f22b2ed 100644 --- a/test_plans/sriov_kvm_test_plan.rst +++ b/test_plans/sriov_kvm_test_plan.rst @@ -41,17 +41,18 @@ communications. The testpmd application is used to configure traffic mirroring, PF VM rece= ive mode, PFUTA hash table and control traffic to a VF for inter-VM commun= ication. =20 -The 82599 supports four separate mirroring rules, each associated with a -= destination pool. Each rule is programmed with one of the four mirroring ty= pes: - -1. Pool mirroring: reflect all the packets received to a pool from the net= work. -2. Uplink port mirroring: reflect all the traffic received from the networ= k. -3. Downlink port mirroring: reflect all the traffic transmitted to the +The Niantic and Fortville supports some separate mirroring rules, each=20 +associated with a destination pool. Each rule is programmed with one of th= e five mirroring types: + +1. Pool up mirroring: reflect all the packets received from the pool ingre= ss traffic. +2. Pool down mirroring(Fortville only): reflect all the traffic transmitte= d from the + pool. +3. Uplink port mirroring: reflect all the traffic received from the ingres= s traffic. +4. Downlink port mirroring: reflect all the traffic transmitted to the network. -4. VLAN mirroring: reflect all the traffic received from the network +5. VLAN mirroring: reflect all the traffic received from the network in a set of given VLANs (either from the network or from local VMs). =20 - Prerequisites for all 2VMs cases/Mirror 2VMs cases =3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 @@ -133,14 +134,14 @@ will be forwarded to VF1 and then send out:: Send 10 packets with VF0 mac address and make sure the packets will be fo= rwarded by VF1. =20 -Test Case2: Mirror Traffic between 2VMs with Pool mirroring +Test Case2: Mirror Traffic between 2VMs with Pool up mirroring =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 Set up common 2VM prerequisites. =20 Add one mirror rule that will mirror VM0 income traffic to VM1:: =20 - PF testpmd-> set port 0 mirror-rule 0 pool-mirror 0x1 dst-pool 1 on + PF testpmd-> set port 0 mirror-rule 0 pool-mirror-up 0x1 dst-pool 1=20 + on =20 Send 10 packets to VM0 and verify the packets has been mirrored to VM1 and= forwarded the packet. @@ -149,8 +150,30 @@ After test need reset mirror rule:: =20 PF testpmd-> reset port 0 mirror-rule 0 =20 +Test Case3: Mirror Traffic between 2VMs with Pool down=20 +mirroring(Niantic not support)=20 +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D + +Set up common 2VM prerequisites. + +Add one mirror rule that will mirror VM0 outcome traffic to VM1:: + + PF testpmd-> set port 0 mirror-rule 0 pool-mirror-down 0x1 dst-pool=20 + 1 on + +Make sure VM1 in receive only mode, VM0 send 32 packets, and verify the=20 +VM0 packets has been mirrored to VM1:: + + VF1 testpmd-> set fwd rxonly + VF1 testpmd-> start + VF0 testpmd-> start tx_first + +Note: don't let VF1 fwd packets since downlink mirror will mirror back=20 +the packets to received packets, which will be an infinite loop. + +After test need reset mirror rule:: + + PF testpmd-> reset port 0 mirror-rule 0 =20 -Test Case3: Mirror Traffic between 2VMs with Uplink mirroring +Test Case4: Mirror Traffic between 2VMs with Uplink mirroring =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 Set up common 2VM prerequisites. @@ -166,7 +189,7 @@ After test need reset mirror rule:: =20 PF testpmd-> reset port 0 mirror-rule 0 =20 -Test Case4: Mirror Traffic between 2VMs with Downlink mirroring +Test Case5: Mirror Traffic between 2VMs with Downlink mirroring =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 Run testpmd on VM0 and VM1 and start traffic forward on the VM hosts:: @@ -174,12 +197,11 @@ Run testpmd on VM0 and VM1 and start traffic forward = on the VM hosts:: VF0 ./x86_64-default-linuxapp-gcc/app/testpmd -c f -n 4 -- -i VF1 ./x86_64-default-linuxapp-gcc/app/testpmd -c f -n 4 -- -i =20 - Add one mirror rule that will mirror VM0 outcome traffic to VM1:: =20 PF testpmd-> set port 0 mirror-rule 0 downlink-mirror dst-pool 1 on =20 -Make sure VM1 in receive only mode, VM0 send 16 packets, and verify the VM= 0 +Make sure VM1 in receive only mode, VM0 send 32 packets, and verify the=20 +VM0 packets has been mirrored to VM1:: =20 VF1 testpmd-> set fwd rxonly @@ -193,120 +215,129 @@ After test need reset mirror rule:: =20 PF testpmd-> reset port 0 mirror-rule 0 =20 -Test Case5: Mirror Traffic between VMs with Vlan mirroring +Test Case6: Mirror Traffic between 2VMs with Vlan mirroring =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D =20 Set up common 2VM prerequisites. =20 -Add rx vlan-id 0 on VF0, add one mirror rule that will mirror VM0 income -= traffic with specified vlan to VM1:: +Generate a random number N of 1-4095, Add rx vlan-id N on VF0, add one=20 +mirror rule that will mirror VM0 income traffic with specified vlan to VM1= :: =20 - PF testpmd-> rx_vlan add 0 port 0 vf 0x1 - PF testpmd-> set port 0 mirror-rule 0 vlan-mirror 0 dst-pool 1 on + PF testpmd-> rx_vlan add N port 0 vf 0x1 + PF testpmd-> set port 0 mirror-rule 0 vlan-mirror n dst-pool 1 on =20 -Send 10 packets with vlan-id0/vm0 MAC to VM0 and verify the packets has be= en +Send 10 packets with vlan-id N and VM0 MAC to VM0 and verify the=20 +packets has been mirrored to VM1 and forwarded the packet. =20 -After test need reset mirror rule:: - - PF testpmd-> reset port 0 mirror-rule 0 - -Test Case6: Mirror Traffic between 2VMs with Vlan & Pool mirroring -=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D - -Set up common 2VM prerequisites. - -Add rx vlan-id 3 of VF1, and 2 mirror rules, one is VM0 income traffic to = VM1, -one is VM1 vlan income traffic to VM0:: - - PF testpmd-> rx_vlan add 3 port 0 vf 0x2 - PF testpmd-> set port 0 mirror-rule 0 pool-mirror 0x1 dst-pool 1 on - PF testpmd-> set port 0 mirror-rule 1 vlan-mirror 3 dst-pool 0 on - -Send 2 flows one by one, first 10 packets with VM0 mac, and the second 100= -packets with VM1 vlan and mac, and verify the first 10 packets has been -= mirrored first to VM1, second 100 packets go to VM0 and the packets have be= en -forwarded. +Note: don't let VF1 fwd packets since vlan downlink mirror will mirror=20 +back the packets to received packets, which will be an infinite loop. =20 After test need reset mirror rule:: =20 PF testpmd-> reset port 0 mirror-rule 0 - PF testpmd-> reset port 0 mirror-rule 1 =20 -Test Case7: Mirror Traffic between 2VMs with Uplink & Downlink mirroring -= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +Test Case7: Mirror Traffic between 2VMs with up link mirroring & down=20 +link mirroring=20 +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 Run testpmd on VM0 and VM1 and start traffic forward on the VM hosts:: =20 VF0 ./x86_64-default-linuxapp-gcc/app/testpmd -c f -n 4 -- -i VF1 ./x86_64-default-linuxapp-gcc/app/testpmd -c f -n 4 -- -i =20 -Add 2 mirror rules that will mirror VM0 outcome and income traffic to VM1:= : +When mirroring only between two Vfs, pool up (or down) mirroring and up=20 +(or down) link mirroring lead to the same behavior, so we randomly choose = one way to mirror in both up and down directions. +up link mirroring as below: + 1. Pool up mirroring (Case 2) + 2. Uplink port mirroring(Case 4) +down link mirroring as below: + 1. Pool down mirroring(Fortville only, Case 3) + 2. Downlink port mirroring(Case 5) =20 - PF testpmd-> set port 0 mirror-rule 0 downlink-mirror dst-pool 1 on - PF testpmd-> set port 0 mirror-rule 0 uplink-mirror dst-pool 1 on +And 2 mirror rules, one is randomly selected up link mirroring, one is=20 +randomly selected down link mirroring(Niantic use Downlink port=20 +mirroring). The 2 mirror rules will mirroring +VM0 income and outcome traffic to VM1. =20 -Make sure VM1 in receive only mode, VM0 first send 16 packets, and verify = the -VM0 packets has been mirrored to VM1:: +Make sure VM1 in receive only mode, Send 10 packets to VF0 with VF0=20 +MAC,verify that all VF0 received packets and transmitted packets will mirr= or to VF1, VF1 will receive 20 packets:: =20 + VF0 testpmd-> set fwd mac + VF0 testpmd-> start VF1 testpmd-> set fwd rxonly VF1 testpmd-> start - VF0 testpmd-> start tx_first =20 -Note: don't let VF1 fwd packets since downlink mirror will mirror back the +Note: don't let VF1 fwd packets since vlan downlink mirror will mirror=20 +back the packets to received packets, which will be an infinite loop. =20 -Send 10 packets to VF0 with VF0 MAC from ixia, verify that all VF0 receive= d -packets and transmitted packets will mirror to VF1:: - - VF0 testpmd-> stop - VF0 testpmd-> start - After test need reset mirror rule:: =20 PF testpmd-> reset port 0 mirror-rule 0 + PF testpmd-> reset port 0 mirror-rule 1 =20 -Test Case8: Mirror Traffic between 2VMs with Vlan & Pool & Uplink & Downli= nk mirroring -=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +Test Case8: Mirror Traffic between 2VMs with Vlan & with up link=20 +mirroring & down link mirroring=20 +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D +=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 Run testpmd on VM0 and VM1 and start traffic forward on the VM hosts:: =20 VF0 ./x86_64-default-linuxapp-gcc/app/testpmd -c f -n 4 -- -i VF1 ./x86_64-default-linuxapp-gcc/app/testpmd -c f -n 4 -- -i =20 +When mirroring only between two Vfs, pool up (or down) mirroring and up=20 +(or down) link mirroring lead to the same behavior, so we randomly choose = one way to mirror in both up and down directions. +up link mirroring as below: + 1. Pool up mirroring (Case 2) + 2. Uplink port mirroring(Case 4) +down link mirroring as below: + 1. Pool down mirroring(Fortville only, Case 3) + 2. Downlink port mirroring(Case 5) =20 -Add rx vlan-id 0 on VF0 and add 4 mirror rules:: +And 2 mirror rules, one is randomly selected up link mirroring, one is=20 +randomly selected down link mirroring(Niantic use Downlink port=20 +mirroring). The 2 mirror rules will mirroring +VM0 income and outcome traffic to VM1. =20 - PF testpmd-> reset port 0 mirror-rule 1 - PF testpmd-> set port 0 mirror-rule 0 downlink-mirror dst-pool 1 on - PF testpmd-> set port 0 mirror-rule 1 uplink-mirror dst-pool 1 on - PF testpmd-> rx_vlan add 0 port 0 vf 0x2 - PF testpmd-> set port 0 mirror-rule 2 vlan-mirror 0 dst-pool 0 on - PF testpmd-> set port 0 mirror-rule 3 pool-mirror 0x1 dst-pool 1 on +Generate a random number N of 1-4095, Add rx vlan-id N and a mirror rule:: =20 -Make sure VM1 in receive only mode, VM0 first send 16 packets, and verify = the -VM0 packets has been mirrored to VM1, VF1, RX, 16packets (downlink mirror)= :: + PF testpmd-> rx_vlan add N port 0 vf 0x2 + PF testpmd-> set port 0 mirror-rule 2 vlan-mirror N dst-pool 0 on + +Note: Because of Hardware limitation, downlink-mirror and=20 +pool-mirror-down cannot coexist, uplink-mirror and pool-mirror-up cannot c= oexist in Fortville. + +Fortville: Make sure VM0 in receive only mode:: =20 VF1 testpmd-> set fwd rxonly VF1 testpmd-> start - VF0 testpmd-> start tx_first + VF0 testpmd-> set fwd mac + VF0 testpmd-> start =20 -Note: don't let VF1 fwd packets since downlink mirror will mirror back the= -packets to received packets, which will be an infinite loop. +Send 1 packet with VM1 vlan id N and mac, and verify that VF0 have 1 RX=20 +packet(vlan mirror), and VF1 have 2 RX packets(RX and down link mirror). =20 -Send 1 packet to VF0 with VF0 MAC from ixia, check if VF0 RX 1 packet and = TX 1 -packet, and VF1 has 2 packets mirror from VF0(uplink mirror/downlink/= pool):: +Send 1 packet to VF0 with VF0 MAC, check if VF0 RX 1 packet and TX 1=20 +packet, and VF1 has 1 packets mirror from VF0(uplink mirror) at least. =20 - VF0 testpmd-> stop - VF0 testpmd-> set fwd mac - VF0 testpmd-> start +Niantic add rules as below:: + + PF testpmd> set port 0 mirror-rule 0 pool-mirror-up 0x1 dst-pool 1 on + PF testpmd> rx_vlan add N port 0 vf 0x2 + PF testpmd> set port 0 mirror-rule 2 vlan-mirror N dst-pool 0 on + PF testpmd> set port 0 mirror-rule 1 downlink-mirror dst-pool 1 on + PF testpmd> set port 0 mirror-rule 3 uplink-mirror dst-pool 1 on + +Note: don't let VF0 fwd packets since downlink vlan mirror will mirror=20 +back the packets to received packets, which will be an infinite loop. =20 -Send 1 packet with VM1 vlan id and mac, and verify that VF0 have 1 RX pack= et, 1 -TX packet, and VF1 have 2 packets(downlink mirror):: +Make sure VM0 in receive only mode, VM0 first send 32 packets, and=20 +verify the +VM0 packets has been mirrored to VM1, VF1 RX 32 packets (down link mirror)= :: =20 - VF0 testpmd-> stop + VF1 testpmd-> set fwd rxonly + VF1 testpmd-> start VF0 testpmd-> set fwd rxonly - VF0 testpmd-> start + VF0 testpmd-> start tx_first + +Send 1 packet with VM1 vlan id N and mac, and verify that VF0 have 1 RX pa= cket(vlan mirror). + +Send 1 packet to VF0 with VF0 MAC, check if VF0 RX 1 packet and TX 1=20 +packet, and VF1 has 2 packets mirror from VF0(up link mirror). =20 After test need reset mirror rule:: =20 @@ -315,7 +346,6 @@ After test need reset mirror rule:: PF testpmd-> reset port 0 mirror-rule 2 PF testpmd-> reset port 0 mirror-rule 3 =20 - Test Case9: Add Multi exact MAC address on VF =3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D =20 -- 2.21.0.windows.1