get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/96653/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 96653,
    "url": "http://patchwork.dpdk.org/api/patches/96653/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dts/patch/1628088115-756-6-git-send-email-lijuan.tu@intel.com/",
    "project": {
        "id": 3,
        "url": "http://patchwork.dpdk.org/api/projects/3/?format=api",
        "name": "DTS",
        "link_name": "dts",
        "list_id": "dts.dpdk.org",
        "list_email": "dts@dpdk.org",
        "web_url": "",
        "scm_url": "git://dpdk.org/tools/dts",
        "webscm_url": "http://git.dpdk.org/tools/dts/",
        "list_archive_url": "https://inbox.dpdk.org/dts",
        "list_archive_url_format": "https://inbox.dpdk.org/dts/{}",
        "commit_url_format": ""
    },
    "msgid": "<1628088115-756-6-git-send-email-lijuan.tu@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dts/1628088115-756-6-git-send-email-lijuan.tu@intel.com",
    "date": "2021-08-04T14:41:55",
    "name": "[v2,5/5] remove cloud_filter as it is no longer maintained",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": false,
    "hash": "d96f559c878af3442066ad144df0cde30bf04b00",
    "submitter": {
        "id": 1098,
        "url": "http://patchwork.dpdk.org/api/people/1098/?format=api",
        "name": "Tu, Lijuan",
        "email": "lijuan.tu@intel.com"
    },
    "delegate": null,
    "mbox": "http://patchwork.dpdk.org/project/dts/patch/1628088115-756-6-git-send-email-lijuan.tu@intel.com/mbox/",
    "series": [
        {
            "id": 18180,
            "url": "http://patchwork.dpdk.org/api/series/18180/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dts/list/?series=18180",
            "date": "2021-08-04T14:41:50",
            "name": "remove some run-down cases",
            "version": 2,
            "mbox": "http://patchwork.dpdk.org/series/18180/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/96653/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/96653/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dts-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id BB628A0C51;\n\tWed,  4 Aug 2021 08:52:17 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id ABAC04121E;\n\tWed,  4 Aug 2021 08:52:17 +0200 (CEST)",
            "from mga05.intel.com (mga05.intel.com [192.55.52.43])\n by mails.dpdk.org (Postfix) with ESMTP id 8023D4014F\n for <dts@dpdk.org>; Wed,  4 Aug 2021 08:52:14 +0200 (CEST)",
            "from fmsmga008.fm.intel.com ([10.253.24.58])\n by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 03 Aug 2021 23:52:10 -0700",
            "from unknown (HELO dpdk-lijuan.sh.intel.com) ([10.67.119.192])\n by fmsmga008.fm.intel.com with ESMTP; 03 Aug 2021 23:52:09 -0700"
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6200,9189,10065\"; a=\"299451062\"",
            "E=Sophos;i=\"5.84,293,1620716400\"; d=\"scan'208\";a=\"299451062\"",
            "E=Sophos;i=\"5.84,293,1620716400\"; d=\"scan'208\";a=\"479985081\""
        ],
        "X-ExtLoop1": "1",
        "From": "Lijuan Tu <lijuan.tu@intel.com>",
        "To": "dts@dpdk.org",
        "Cc": "Lijuan Tu <lijuan.tu@intel.com>",
        "Date": "Wed,  4 Aug 2021 22:41:55 +0800",
        "Message-Id": "<1628088115-756-6-git-send-email-lijuan.tu@intel.com>",
        "X-Mailer": "git-send-email 1.8.3.1",
        "In-Reply-To": "<1628088115-756-1-git-send-email-lijuan.tu@intel.com>",
        "References": "<1628088115-756-1-git-send-email-lijuan.tu@intel.com>",
        "Subject": "[dts] [v2, 5/5] remove cloud_filter as it is no longer maintained",
        "X-BeenThere": "dts@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "test suite reviews and discussions <dts.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dts>,\n <mailto:dts-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dts/>",
        "List-Post": "<mailto:dts@dpdk.org>",
        "List-Help": "<mailto:dts-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dts>,\n <mailto:dts-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dts-bounces@dpdk.org",
        "Sender": "\"dts\" <dts-bounces@dpdk.org>"
    },
    "content": "Signed-off-by: Lijuan Tu <lijuan.tu@intel.com>\n---\n test_plans/cloud_filter_test_plan.rst | 326 ------------------------\n test_plans/index.rst                  |   1 -\n tests/TestSuite_cloud_filter.py       | 463 ----------------------------------\n 3 files changed, 790 deletions(-)\n delete mode 100644 test_plans/cloud_filter_test_plan.rst\n delete mode 100644 tests/TestSuite_cloud_filter.py",
    "diff": "diff --git a/test_plans/cloud_filter_test_plan.rst b/test_plans/cloud_filter_test_plan.rst\ndeleted file mode 100644\nindex 500e131..0000000\n--- a/test_plans/cloud_filter_test_plan.rst\n+++ /dev/null\n@@ -1,326 +0,0 @@\n-.. Copyright (c) <2016-2017> Intel Corporation\n-   All rights reserved.\n-\n-   Redistribution and use in source and binary forms, with or without\n-   modification, are permitted provided that the following conditions\n-   are met:\n-\n-   - Redistributions of source code must retain the above copyright\n-     notice, this list of conditions and the following disclaimer.\n-\n-   - Redistributions in binary form must reproduce the above copyright\n-     notice, this list of conditions and the following disclaimer in\n-     the documentation and/or other materials provided with the\n-     distribution.\n-\n-   - Neither the name of Intel Corporation nor the names of its\n-     contributors may be used to endorse or promote products derived\n-     from this software without specific prior written permission.\n-\n-   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n-   \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n-   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS\n-   FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE\n-   COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,\n-   INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n-   (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR\n-   SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n-   HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,\n-   STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n-   ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n-   OF THE POSSIBILITY OF SUCH DAMAGE.\n-\n-==========================================\n-Cloud filter Support through Ethtool Tests\n-==========================================\n-\n-This feature based on X710 to classify VxLan/Geneve packets and put those into\n-a specified queue in VF for further processing from virtual switch.\n-\n-Prerequisites\n-=============\n-Cloud filter feature based on latest i40e out of tree driver. Should also\n-update ethtool and XL710 firmware:\n-\n-* Ethtool version: 3.18\n-* i40e driver: i40e-1.5.13_rc1\n-* Kernel version: 4.2.2\n-* Xl710 DA2 firmware: 5.02 0x80002282\n-\n-BIOS setting:\n-\n-* Enable VT-d and VT-x\n-\n-Kernel command line:\n-\n-* Enable Intel IOMMU with below arguments\n-* intel_iommu=on iommu=pt\n-\n-Create two VFs from kernel driver::\n-\n-   echo 2 > /sys/bus/pci/devices/0000\\:82\\:00.0/sriov_numvfs\n-   ifconfig $PF_INTF up\n-\n-Add vxlan network interface based on PF device::\n-\n-    ip li add vxlan0 type vxlan id 1 group 239.1.1.1 local 127.0.0.1 dev $PF_INTF\n-    ifconfig vxlan0 up\n-\n-Allocate hugepage for dpdk::\n-\n-    echo 4096 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages\n-\n-Bind vf device to igb_uio driver and start testpmd with multiple queues::\n-\n-    cd dpdk\n-    modprobe uio\n-    insmod  ./x86_64-native-linuxapp-gcc/kmod/igb_uio.ko\n-    ./tools/dpdk_nic_bind.py --bind=igb_uio 82:02.0 82:02.1\n-    ./x86_64-native-linuxapp-gcc/app/testpmd -c ffff -n 4 -- -i --rxq=4 --txq=4 --disable-rss\n-    testpmd> set nbcore 8\n-    testpmd> set fwd rxonly\n-    testpmd> set verbose 1\n-    testpmd> start\n-\n-\n-Test case: cloud filter rule(inner ip)\n---------------------------------------\n-\n-1. Add cloud filter with inner ip address rule.  Flow type ip4 mean this rule\n-   only match inner destination ip address.  User define field higher 32bit is\n-   all 0xf mean vni id is not in the rule.  Lower 32bit is 1 mean packet will\n-   be forwarded to VF1.  Action 3 mean packet will be redirected to queue 3::\n-\n-      ethtool -N $PF_INTF flow-type ip4 dst-ip 192.168.1.1 user-def 0xffffffff00000001 action 3 loc 1\n-\n-2. Send vxlan packet with inner ip matched rule::\n-\n-      Ether()/IP()/UDP()/Vxlan()/Ether()/IP(dst=\"192.168.1.1\")/TCP()/Raw('x' * 20)\n-\n-3. verify packet received by queue3 of VF1, verify packet type is correct::\n-\n-      testpmd> port 1/queue 3: received 1 packets\n-      src=00:00:00:00:00:00 - dst=00:00:00:00:09:00 - type=0x0800 - length=106 - nb_segs=1\n-\n-   - (outer) L2 type: ETHER - (outer) L3 type: IPV4_EXT_UNKNOWN - (outer) L4 type: Unknown\n-   - Tunnel type: GRENAT - Inner L2 type: ETHER - Inner L3 type: IPV4_EXT_UNKNOWN - Inner L4 type: UDP\n-   - VXLAN packet: packet type =24721, Destination UDP port =8472, VNI = 1 - Receive queue=0x3\n-\n-Test case: cloud filter rule(inner mac)\n----------------------------------------\n-1. Add cloud filter with Inner mac rule. Dst mac mask ff:ff:ff:ff:ff:ff mean\n-   outer mac address is not in the rule.  Src mac mask 00:00:00:00:00:00 mean\n-   inner mac address is in the rule.  User define field higher 32bit is all\n-   0xf mean vni id is not in the rule.  Lower 32bit is 1 mean packet will be\n-   forwarded to VF1.  Action 3 mean packet will be redirected to queue 3::\n-\n-      ethtool -N $PF_INTF flow-type ether dst 00:00:00:00:00:00 m \\\n-      ff:ff:ff:ff:ff:ff src 00:00:00:00:09:00 m 00:00:00:00:00:00 \\\n-      user-def 0xffffffff00000001 action 3 loc 1\n-\n-2. Send vxlan packet with inner mac matched rule::\n-\n-      Ether()/IP()/UDP()/Vxlan()/Ether(dst=\"00:00:00:00:09:00\")/IP()/TCP()/Raw('x' * 20)\n-\n-3. verify packet received by queue3 of VF1, verify packet type is correct::\n-\n-      testpmd> port 1/queue 3: received 1 packets\n-      src=00:00:00:00:00:00 - dst=00:00:00:00:09:00 - type=0x0800 - length=120 - nb_segs=1\n-\n-   - (outer) L2 type: ETHER - (outer) L3 type: IPV4_EXT_UNKNOWN - (outer) L4 type: Unknown\n-   - Tunnel type: GRENAT - Inner L2 type: ETHER - Inner L3 type:\n-     IPV4_EXT_UNKNOWN - Inner L4 type: TCP\n-   - VXLAN packet: packet type =24721, Destination UDP port =8472, VNI = 0 - Receive queue=0x3\n-\n-Test case: cloud filter rule(inner mac + outer mac + vni)\n----------------------------------------------------------\n-\n-1. Add cloud filter with Inner mac + outer mac + vni rule.  Dst mac mask\n-   00:00:00:00:00:00 mean outer mac address is in the rule.  Src mac mask\n-   00:00:00:00:00:00 mean inner mac address is in the rule.  User define field\n-   higher 32bit is 0x1 mean vni match 1 is in the rule.  Lower 32bit is 1 mean\n-   packet will be forwarded to VF1.  Action 3 mean packet will be redirected\n-   to queue 3::\n-\n-      ethtool -N $PF_INTF flow-type ether dst 00:00:00:00:10:00 m \\\n-      00:00:00:00:00:00 src 00:00:00:00:09:00 m 00:00:00:00:00:00 \\\n-      user-def 0x100000001 action 3 loc 1\n-\n-2. Send vxlan packet with inner mac match rule::\n-\n-    Ether(dst=\"00:00:00:00:10:00\")/IP()/UDP()/Vxlan(vni=1)/Ether(dst=\"00:00:00:00:09:00\")/IP()/TCP()/Raw('x' * 20)\n-\n-3. verify packet received by queue3 of VF1, verify packet type is correct::\n-\n-      testpmd> port 1/queue 3: received 1 packets\n-      src=00:00:00:00:00:00 - dst=00:00:00:00:09:00 - type=0x0800 - length=120 - nb_segs=1\n-\n-   - (outer) L2 type: ETHER - (outer) L3 type: IPV4_EXT_UNKNOWN - (outer) L4 type: Unknown\n-   - Tunnel type: GRENAT - Inner L2 type: ETHER - Inner L3 type: IPV4_EXT_UNKNOWN - Inner L4 type: TCP\n-   - VXLAN packet: packet type =24721, Destination UDP port =8472, VNI = 0 - Receive queue=0x3\n-\n-Test case: cloud filter rule(inner mac + inner vlan + vni)\n-----------------------------------------------------------\n-\n-1. Add cloud filter with Inner mac + inner vlan + vni rule.  Dst mac mask\n-   ff:ff:ff:ff:ff:ff mean outer mac address is not in the rule.  Src mac mask\n-   00:00:00:00:00:00 mean inner mac address is in the rule.  Vlan 1 mean vlan\n-   match is in the rule.  User define field higher 32bit is 0x1 mean vni match\n-   1 is in the rule.  Lower 32bit is 1 mean packet will be forwarded to VF1.\n-   Action 3 mean packet will be redirected to queue 3::\n-\n-      ethtool -N $PF_INTF flow-type ether dst 00:00:00:00:00:00 m \\\n-      ff:ff:ff:ff:ff:ff src 00:00:00:00:09:00 m 00:00:00:00:00:00 \\\n-      vlan 1 user-def 0x100000001 action 3 loc 1\n-\n-2. Send vxlan packet with inner mac match rule::\n-\n-      Ether()/IP()/UDP()/Vxlan(vni=1)/Ether(dst=\"00:00:00:00:09:00\")/Dot1Q(vlan=1)/IP()/TCP()/Raw('x' * 20)\n-\n-3. verify packet received by queue3 of VF1, verify packet type is correct::\n-\n-    testpmd> port 1/queue 3: received 1 packets\n-    src=00:00:00:00:00:00 - dst=00:00:00:00:09:00 - type=0x0800 - length=124 - nb_segs=1\n-\n-   - (outer) L2 type: ETHER - (outer) L3 type: IPV4_EXT_UNKNOWN - (outer) L4 type: Unknown\n-   - Tunnel type: GRENAT - Inner L2 type: ETHER_VLAN - Inner L3 type: IPV4_EXT_UNKNOWN - Inner L4 type: TCP\n-   - VXLAN packet: packet type =24721, Destination UDP port =8472, VNI = 1 - Receive queue=0x3\n-\n-Test case: cloud filter rule(inner mac + inner vlan)\n-----------------------------------------------------\n-\n-1. Add cloud filter with Inner mac + inner vlan rule.  Dst mac mask\n-   ff:ff:ff:ff:ff:ff mean outer mac address is not in the rule.  Src mac mask\n-   00:00:00:00:00:00 mean inner mac address is in the rule.  Vlan 1 mean vlan\n-   match is in the rule.  User define field higher 32bit is all 0xf mean vni\n-   id is not in the rule.  Lower 32bit is 1 mean packet will be forwarded to\n-   VF1.  Action 3 mean packet will be redirected to queue 3::\n-\n-      ethtool -N $PF_INTF flow-type ether dst 00:00:00:00:00:00 m \\\n-      ff:ff:ff:ff:ff:ff src 00:00:00:00:09:00 m 00:00:00:00:00:00 \\\n-      vlan 1 user-def 0xffffffff00000001 action 3 loc 1\n-\n-2. Send vxlan packet with inner mac match rule::\n-\n-      Ether()/IP()/UDP()/Vxlan(vni=1)/Ether(dst=\"00:00:00:00:09:00\")/Dot1Q(vlan=1)/IP()/TCP()/Raw('x' * 20)\n-\n-3. verify packet received by queue3 of VF1, verify packet type is correct::\n-\n-    testpmd> port 1/queue 3: received 1 packets\n-    src=00:00:00:00:00:00 - dst=00:00:00:00:09:00 - type=0x0800 - length=124 - nb_segs=1\n-\n-   - (outer) L2 type: ETHER - (outer) L3 type: IPV4_EXT_UNKNOWN - (outer) L4 type: Unknown\n-   - Tunnel type: GRENAT - Inner L2 type: ETHER_VLAN - Inner L3 type: IPV4_EXT_UNKNOWN - Inner L4 type: TCP\n-   - VXLAN packet: packet type =24721, Destination UDP port =8472, VNI = 1 - Receive queue=0x3\n-\n-Test case: Remove cloud filter rule\n------------------------------------\n-\n-Remove cloud filter rule in location 1::\n-\n-    ethtool -N $PF_INTF delete 1\n-\n-Dump rule and check there's no rule listed::\n-\n-    ethtool -n $PF_INTF\n-    Total 0 rules\n-\n-Send packet match last rule::\n-\n-    Ether(dst not match PF&VF)/IP()/UDP()/Vxlan(vni=1)/Ether(dst=\"00:00:00:00:09:00\")/Dot1Q(vlan=1)/IP()/TCP()/Raw('x' * 20)\n-\n-Check packet only received on PF device.\n-\n-Test case: Multiple cloud filter rules\n---------------------------------------\n-\n-1. Add cloud filter with Inner mac + inner vlan rule.  Dst mac mask\n-   ff:ff:ff:ff:ff:ff mean outer mac address is not in the rule.  Src mac mask\n-   00:00:00:00:00:00 mean inner mac address is in the rule.  Vlan 1 mean vlan\n-   match is in the rule.  User define field higher 32bit is all 0xf mean vni\n-   id is not in the rule.  Lower 32bit is 1 mean packet will be forwarded to\n-   VF1.  Action 3 mean packet will be redirected to queue 3::\n-\n-      ethtool -N $PF_INTF flow-type ether dst 00:00:00:00:00:00 m \\\n-      ff:ff:ff:ff:ff:ff src 00:00:00:00:09:00 m 00:00:00:00:00:00 \\\n-      vlan 1 user-def 0xffffffff00000001 action 3 loc 1\n-\n-2. Add another cloud filter with Inner mac + inner vlan rule.  Dst mac mask\n-   ff:ff:ff:ff:ff:ff mean outer mac address is not in the rule.  Src mac mask\n-   00:00:00:00:00:00 mean inner mac address is in the rule.  Vlan 2 mean vlan\n-   match is in the rule.  User define field higher 32bit is all 0xf mean vni\n-   id is not in the rule.  Lower 32bit is 0 mean packet will be forwarded to\n-   VF0.  Action 3 mean packet will be redirected to queue 3.  Locate 2 mean\n-   this rule will be added to index 2::\n-\n-      ethtool -N $PF_INTF flow-type ether dst 00:00:00:00:00:00 m \\\n-      ff:ff:ff:ff:ff:ff src 00:00:00:00:10:00 m 00:00:00:00:00:00 \\\n-      vlan 2 user-def 0xffffffff00000000 action 3 loc 2\n-\n-3. Dump cloud filter rules::\n-\n-      ethtool -n $PF_INTF\n-      64 RX rings available\n-      Total 2 rules\n-\n-4. Send packet match rule 1::\n-\n-      Ether()/IP()/UDP()/Vxlan(vni=1)/Ether(dst=\"00:00:00:00:09:00\")/Dot1Q(vlan=1)/IP()/TCP()/Raw('x' * 20)\n-\n-5. verify packet received by queue3 of VF1, verify packet type is correct::\n-\n-      testpmd> port 1/queue 3: received 1 packets\n-      src=00:00:00:00:00:00 - dst=00:00:00:00:09:00 - type=0x0800 - length=124 - nb_segs=1\n-\n-   - (outer) L2 type: ETHER - (outer) L3 type: IPV4_EXT_UNKNOWN - (outer) L4 type: Unknown\n-   - Tunnel type: GRENAT - Inner L2 type: ETHER_VLAN - Inner L3 type: IPV4_EXT_UNKNOWN - Inner L4 type: TCP\n-   - VXLAN packet: packet type =24721, Destination UDP port =8472, VNI = 1 - Receive queue=0x3\n-\n-6. Send packet match rule 2::\n-\n-      Ether()/IP()/UDP()/Vxlan(vni=1)/Ether(dst=\"00:00:00:00:10:00\")/Dot1Q(vlan=2)/IP()/TCP()/Raw('x' * 20)\n-\n-7. verify packet received by queue3 of VF0, verify packet type is correct::\n-\n-      testpmd> port 0/queue 3: received 1 packets\n-      src=00:00:00:00:00:00 - dst=00:00:00:00:09:00 - type=0x0800 - length=124 - nb_segs=1\n-\n-   - (outer) L2 type: ETHER - (outer) L3 type: IPV4_EXT_UNKNOWN - (outer) L4 type: Unknown - Tunnel type: GRENAT\n-   - Inner L2 type: ETHER_VLAN - Inner L3 type: IPV4_EXT_UNKNOWN - Inner L4 type: TCP\n-   - VXLAN packet: packet type =24721, Destination UDP port =8472, VNI = 1 - Receive queue=0x3\n-\n-Test case: Bifurcated between kernel VF and dpdk VF\n----------------------------------------------------\n-\n-1. Add cloud filter with inner ip address rule.  Flow type ip4 mean this rule\n-   only match inner destination ip address.  User define field higher 32bit is\n-   all 0xf mean vni id is not in the rule.  Lower 32bit is 1 mean packet will\n-   be forwarded to VF1.  Action 3 mean packet will be redirected to queue 3::\n-\n-      ethtool -N $PF_INTF flow-type ip4 dst-ip 192.168.1.1 user-def 0xffffffff00000001 action 3 loc 1\n-\n-2. Add cloud filter with inner ip address rule.  Flow type ip4 mean this rule\n-   only match inner destination ip address.  User define field higher 32bit is\n-   all 0xf mean vni id is not in the rule.  Lower 32bit is 0 mean packet will\n-   be forwarded to VF0.  Action 0 mean packet will be redirected to queue 0::\n-\n-      ethtool -N $PF_INTF flow-type ip4 dst-ip 192.168.2.1 user-def 0xffffffff00000000 action 0 loc 2\n-\n-3. Send vxlan packet which matched first rule::\n-\n-      Ether()/IP()/UDP()/Vxlan()/Ether()/IP(dst=\"192.168.1.1\")/UDP()/Raw('x' * 20)\n-\n-4. verify packet received by queue3 of VF1, verify packet type is correct::\n-\n-      testpmd> port 1/queue 3: received 1 packets\n-      src=00:00:00:00:00:00 - dst=00:00:00:00:09:00 - type=0x0800 - length=106 - nb_segs=1\n-\n-   - (outer) L2 type: ETHER - (outer) L3 type: IPV4_EXT_UNKNOWN - (outer) L4 type: Unknown\n-   - Tunnel type: GRENAT - Inner L2 type: ETHER - Inner L3 type: IPV4_EXT_UNKNOWN - Inner L4 type: UDP\n-   - VXLAN packet: packet type =24721, Destination UDP port =8472, VNI = 1 - Receive queue=0x3\n-\n-5. Send vxlan packet which matched second rule::\n-\n-      Ether()/IP()/UDP()/Vxlan()/Ether()/IP(dst=\"192.168.2.1\")/UDP()/Raw('x' * 20)\n-\n-6. verify packet received by VF0, verify packet content is correct\ndiff --git a/test_plans/index.rst b/test_plans/index.rst\nindex 55d3297..0208a22 100644\n--- a/test_plans/index.rst\n+++ b/test_plans/index.rst\n@@ -40,7 +40,6 @@ The following are the test plans for the DPDK DTS automated test system.\n     ABI_stable_test_plan\n     blocklist_test_plan\n     checksum_offload_test_plan\n-    cloud_filter_test_plan\n     coremask_test_plan\n     cvl_advanced_rss_test_plan\n     cvl_advanced_rss_gtpu_test_plan\ndiff --git a/tests/TestSuite_cloud_filter.py b/tests/TestSuite_cloud_filter.py\ndeleted file mode 100644\nindex abc474f..0000000\n--- a/tests/TestSuite_cloud_filter.py\n+++ /dev/null\n@@ -1,463 +0,0 @@\n-# BSD LICENSE\n-#\n-# Copyright(c) 2020 Intel Corporation. All rights reserved.\n-# All rights reserved.\n-#\n-# Redistribution and use in source and binary forms, with or without\n-# modification, are permitted provided that the following conditions\n-# are met:\n-#\n-#   * Redistributions of source code must retain the above copyright\n-#     notice, this list of conditions and the following disclaimer.\n-#   * Redistributions in binary form must reproduce the above copyright\n-#     notice, this list of conditions and the following disclaimer in\n-#     the documentation and/or other materials provided with the\n-#     distribution.\n-#   * Neither the name of Intel Corporation nor the names of its\n-#     contributors may be used to endorse or promote products derived\n-#     from this software without specific prior written permission.\n-#\n-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n-# \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT\n-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n-\n-\"\"\"\n-DPDK Test suite.\n-\n-Test Cloud Filters features in DPDK.\n-\n-\"\"\"\n-\n-import string\n-import re\n-import time\n-import os\n-from test_case import TestCase\n-from pmd_output import PmdOutput\n-from settings import HEADER_SIZE\n-from packet import Packet\n-\n-from scapy.layers.inet import UDP, IP\n-from scapy.layers.vxlan import VXLAN\n-from scapy.packet import split_layers, bind_layers\n-\n-VXLAN_PORT = 4789\n-CLOUD_PORT = 8472\n-split_layers(UDP, VXLAN, dport=VXLAN_PORT)\n-bind_layers(UDP, VXLAN, dport=CLOUD_PORT)\n-\n-#\n-#\n-# Test class.\n-#\n-\n-\n-class CloudFilterConfig(object):\n-\n-    \"\"\"\n-    Module for config/verify cloud filter rule\n-    \"\"\"\n-\n-    RULE_TYPE = [\n-        'iip', 'imac', 'omac+imac+vni', 'imac+ivlan+vni', 'imac+ivlan']\n-\n-    def __init__(self, test_case, pf_intf=\"\"):\n-        self.case = test_case\n-        # make sure pf existed\n-        out = self.case.dut.send_expect(\n-            'ifconfig %s' % pf_intf, \"#\", alt_session=True)\n-        self.case.verify(\"Device not found\" not in out,\n-                         \"Cloud filter need PF interface!!!\")\n-        self.pf_intf = pf_intf\n-        self.pkt = Packet()\n-\n-    def config_rule(self, **kwargs):\n-        \"\"\"\n-        Configure cloud filter rule settings, must check rule format\n-        \"\"\"\n-        self.rule_idx = 1\n-        self.case.verify(\n-            'type' in kwargs, \"Cloud filter rule must configure filter type\")\n-        rule_type = kwargs['type']\n-        self.case.verify(\n-            rule_type in self.RULE_TYPE, \"Cloud filter rule type not correct\")\n-        self.case.verify(\n-            'vf' in kwargs, \"Cloud filter rule must configure device!!!\")\n-        self.case.verify(\n-            'queue' in kwargs, \"Cloud filter rule must configure queue index\")\n-        if 'loc' in kwargs:\n-            self.rule_idx = kwargs['loc']\n-\n-        self.cf_rule = {}\n-        self.cf_rule['type'] = rule_type\n-        self.cf_rule['vf'] = kwargs['vf']\n-        self.cf_rule['queue'] = kwargs['queue']\n-\n-        required_args = rule_type.split('+')\n-        for required_arg in required_args:\n-            self.case.verify(required_arg in kwargs,\n-                             \"Argument for [%s] missing!!!\" % required_arg)\n-            self.cf_rule[required_arg] = kwargs[required_arg]\n-\n-        if 'ivlan' in self.cf_rule:\n-            self.pkt.assign_layers(['ether', 'ipv4', 'udp',\n-                                    'vxlan', 'inner_mac', 'inner_vlan',\n-                                    'inner_ipv4', 'inner_tcp', 'raw'])\n-        else:\n-            self.pkt.assign_layers(['ether', 'ipv4', 'udp',\n-                                    'vxlan', 'inner_mac',\n-                                    'inner_ipv4', 'inner_tcp', 'raw'])\n-\n-    def ethtool_add(self):\n-        \"\"\"\n-        Add cloud filter rule by ethtool and return rule index\n-        \"\"\"\n-        ip_fmt = \"ethtool -N %(PF)s flow-type ip4 dst-ip %(IP)s user-def \" + \\\n-            \"%(VNI_VF)s action %(QUEUE)d loc %(ID)d\"\n-        ether_fmt = \"ethtool -N %(PF)s flow-type ether dst %(OMAC)s m \" + \\\n-            \"%(OMASK)s src %(IMAC)s m %(IMASK)s user-def %(VNI_VF)s \" + \\\n-            \"action %(QUEUE)d loc %(ID)d\"\n-        ether_vlan_fmt = \"ethtool -N %(PF)s flow-type ether dst %(OMAC)s m \" + \\\n-            \"%(OMASK)s src %(IMAC)s m %(IMASK)s vlan %(VLAN)d \" + \\\n-            \"user-def %(VNI_VF)s action %(QUEUE)d loc %(ID)d\"\n-\n-\n-        # generate user define field\n-        vni_vf = '0x'\n-        if 'vni' in self.cf_rule:\n-            vni_str = hex(self.cf_rule['vni'])[2:]\n-        else:\n-            vni_str = 'ffffffff'  # without vni\n-        vni_vf += vni_str\n-        vf_str = \"%08x\" % self.cf_rule['vf']\n-        vni_vf += vf_str\n-\n-        if 'omac' in self.cf_rule:\n-            omac_str = self.cf_rule['omac']\n-            omac_mask = '00:00:00:00:00:00'\n-        else:\n-            omac_str = '00:00:00:00:00:00'\n-            omac_mask = 'ff:ff:ff:ff:ff:ff'\n-\n-        if 'imac' in self.cf_rule:\n-            imac_str = self.cf_rule['imac']\n-            imac_mask = '00:00:00:00:00:00'\n-        else:\n-            imac_str = '00:00:00:00:00:00'\n-            imac_mask = 'ff:ff:ff:ff:ff:ff'\n-\n-        if 'iip' in self.cf_rule:\n-            ip_str = self.cf_rule['iip']\n-\n-        if self.cf_rule['type'] == 'iip':\n-            ethtool_cmd = ip_fmt % {'PF': self.pf_intf,\n-                                    'IP': ip_str,\n-                                    'VNI_VF': vni_vf,\n-                                    'QUEUE': self.cf_rule['queue'],\n-                                    'ID': self.rule_idx}\n-        elif 'ivlan' in self.cf_rule:\n-            ethtool_cmd = ether_vlan_fmt % {'PF': self.pf_intf,\n-                                       'OMAC': omac_str,\n-                                       'OMASK': omac_mask,\n-                                       'IMAC': imac_str,\n-                                       'IMASK': imac_mask,\n-                                       'VLAN': self.cf_rule['ivlan'],\n-                                       'VNI_VF': vni_vf,\n-                                       'QUEUE': self.cf_rule['queue'],\n-                                       'ID': self.rule_idx}\n-        else:\n-            ethtool_cmd = ether_fmt % {'PF': self.pf_intf,\n-                                       'OMAC': omac_str,\n-                                       'OMASK': omac_mask,\n-                                       'IMAC': imac_str,\n-                                       'IMASK': imac_mask,\n-                                       'VNI_VF': vni_vf,\n-                                       'QUEUE': self.cf_rule['queue'],\n-                                       'ID': self.rule_idx}\n-\n-        print(ethtool_cmd)\n-        out = self.case.dut.send_expect(ethtool_cmd, \"# \", alt_session=True)\n-        self.case.verify(\"ethtool\" not in out, \"Add cloud filter failed!!!\")\n-\n-        return self.rule_idx\n-\n-    def ethtool_delete(self):\n-        \"\"\"\n-        Delete cloud filter rule by index and return whether success\n-        \"\"\"\n-        self.case.dut.send_expect(\"ethtool -N %s delete %d\" % (self.pf_intf,\n-                                                               self.rule_idx),\n-                                  \"# \", alt_session=True)\n-\n-    def ethtool_dumprule(self):\n-        \"\"\"\n-        Dump cloud filter rule according to index value\n-        \"\"\"\n-        pass\n-\n-    def transmit_packet(self, match=True):\n-        \"\"\"\n-        Send packet match or not matched cloud filter rules\n-        \"\"\"\n-        ether_cfg = {'src': self.case.tester_mac}\n-        if match:\n-            if 'iip' in list(self.cf_rule.keys()):\n-                self.pkt.config_layer(\n-                    'inner_ipv4', {'dst': self.cf_rule['iip']})\n-            if 'imac' in list(self.cf_rule.keys()):\n-                self.pkt.config_layer(\n-                    'inner_mac', {'dst': self.cf_rule['imac']})\n-            if 'omac' in list(self.cf_rule.keys()):\n-                ether_cfg['dst'] = self.cf_rule['omac']\n-            if 'ivlan' in list(self.cf_rule.keys()):\n-                self.pkt.config_layer(\n-                    'inner_vlan', {'vlan': self.cf_rule['ivlan']})\n-            if 'vni' in list(self.cf_rule.keys()):\n-                self.pkt.config_layer('vxlan', {'vni': self.cf_rule['vni']})\n-\n-        self.pkt.config_layer('ether', ether_cfg)\n-        self.pkt.config_layer('raw', {'payload': ['01'] * 18})\n-        self.pkt.send_pkt(crb=self.case.tester, tx_port=self.case.tester_intf)\n-\n-\n-class TestCloudFilter(TestCase):\n-\n-    def set_up_all(self):\n-        \"\"\"\n-        vxlan Prerequisites\n-        \"\"\"\n-        # this feature only enable in FVL now\n-        self.verify(self.nic in [\"fortville_eagle\", \"fortville_spirit\",\n-                                 \"fortville_spirit_single\"],\n-                    \"Cloud filter only supported by Fortville\")\n-        # Based on h/w type, choose how many ports to use\n-        self.dut_ports = self.dut.get_ports()\n-\n-        # Verify that enough ports are available\n-        self.verify(len(self.dut_ports) >= 1, \"Insufficient ports for testing\")\n-\n-        # required setting test environment\n-        self.env_done = False\n-        self.vf_queues = 4\n-\n-    def setup_vf_env(self):\n-        \"\"\"\n-        Create testing environment with 2VFs generated from PF\n-        \"\"\"\n-        if self.env_done:\n-            return\n-\n-        # get PF interface name and opposite tester interface name\n-        self.pf_port = self.dut_ports[0]\n-        self.bind_nics_driver([self.pf_port], driver=\"i40e\")\n-        self.pf_intf = self.dut.ports_info[self.pf_port]['intf']\n-        tester_port = self.tester.get_local_port(self.pf_port)\n-        self.tester_intf = self.tester.get_interface(tester_port)\n-        self.tester_mac = self.tester.get_mac(tester_port)\n-        pf_numa = self.dut.get_numa_id(self.pf_port)\n-\n-        self.dut.generate_sriov_vfs_by_port(self.pf_port, 2, driver=\"default\")\n-\n-        # enable vxlan on PF\n-        self.dut.send_expect(\"ip li add vxlan0 type vxlan id 1 group \" +\n-                             \"239.1.1.1 local 127.0.0.1 dev %s\" % self.pf_intf,\n-                             \"# \")\n-        self.dut.send_expect(\"ifconfig vxlan0 up\", \"# \")\n-\n-        self.vf_port0 = self.dut.ports_info[self.pf_port]['vfs_port'][0]\n-        self.vf_port1 = self.dut.ports_info[self.pf_port]['vfs_port'][1]\n-\n-        # bind one vf device to dpdk\n-        self.vf_port0.bind_driver(driver='igb_uio')\n-        self.vf_port1.bind_driver(driver='i40evf')\n-        self.vf_intf = self.vf_port1.intf_name\n-\n-        # bind vf0 to igb_uio and start testpmd\n-        core_num = self.vf_queues + 1\n-        cores = \"1S/%dC/1T\" % core_num\n-\n-        self.pmdout = PmdOutput(self.dut)\n-        self.pmdout.start_testpmd(\n-            cores, \"--rxq=%d --txq=%d --portmask=0x1 --enable-rx-cksum\" %\n-            (self.vf_queues, self.vf_queues), socket=pf_numa)\n-\n-        # rxonly and verbose enabled\n-        self.pmdout.execute_cmd(\"set nbcore %d\" % self.vf_queues)\n-        self.pmdout.execute_cmd(\"set fwd rxonly\")\n-        self.pmdout.execute_cmd(\"set verbose 1\")\n-        self.pmdout.execute_cmd(\"start\")\n-\n-        self.env_done = True\n-\n-    def destroy_vf_env(self):\n-\n-        if getattr(self, 'pmd_output', None):\n-            self.dut.kill_all()\n-\n-        if getattr(self, 'pf_port', None):\n-            self.dut.destroy_sriov_vfs_by_port(self.pf_port)\n-            self.bind_nics_driver([self.pf_port], driver=\"igb_uio\")\n-\n-        self.env_done = False\n-\n-    def bind_nics_driver(self, ports, driver=\"\"):\n-        # modprobe vfio driver\n-        if driver == \"vfio-pci\":\n-            for port in ports:\n-                netdev = self.dut.ports_info[port]['port']\n-                driver = netdev.get_nic_driver()\n-                if driver != 'vfio-pci':\n-                    netdev.bind_driver(driver='vfio-pci')\n-\n-        elif driver == \"igb_uio\":\n-            # igb_uio should insmod as default, no need to check\n-            for port in ports:\n-                netdev = self.dut.ports_info[port]['port']\n-                driver = netdev.get_nic_driver()\n-                if driver != 'igb_uio':\n-                    netdev.bind_driver(driver='igb_uio')\n-        else:\n-            for port in ports:\n-                netdev = self.dut.ports_info[port]['port']\n-                driver_now = netdev.get_nic_driver()\n-                if driver == \"\":\n-                    driver = netdev.default_driver\n-                if driver != driver_now:\n-                    netdev.bind_driver(driver=driver)\n-\n-    def send_and_verify(self, cloud_cfg=None, dpdk=True):\n-        \"\"\"\n-        Send packet match cloud filter rule and verify packet received\n-        \"\"\"\n-        self.logger.info(\"Verifying vxlan %s filter\" % cloud_cfg.cf_rule['type'])\n-        if dpdk:\n-            cloud_cfg.transmit_packet()\n-            out = self.pmdout.get_output()\n-            queue = cloud_cfg.cf_rule['queue']\n-            self.verify(\"queue %d\" %\n-                        queue in out, \"Vxlan not received in queue %d\" % queue)\n-            self.verify(\"VXLAN packet\" in out, \"Vxlan packet not detected\")\n-            self.verify(\"Inner L4 type: TCP\" in out,\n-                        \"Vxlan inner L4 type not detected\")\n-            if 'vni' in list(cloud_cfg.cf_rule.keys()):\n-                vni = cloud_cfg.cf_rule['vni']\n-                self.verify(\"VNI = %d\" %\n-                            vni in out, \"Vxlan vni value not correct\")\n-            if 'ivlan' in list(cloud_cfg.cf_rule.keys()):\n-                self.verify(\"Inner L2 type: ETHER_VLAN\" in out,\n-                            \"Vxlan inner vlan not detected\")\n-        else:\n-            # packet received on dut VF device\n-            tmp_file = '/tmp/cloud_filter_%s.pcap' % self.vf_intf\n-            sniff_cmd = ('tcpdump -w ' + tmp_file +\n-                         ' -i {0} 2>tcpdump_{0}.out &').format(self.vf_intf)\n-            rm_cmd = 'rm -f ' + tmp_file\n-            self.dut.send_expect(rm_cmd, '#', alt_session=True)\n-            self.dut.send_expect(sniff_cmd, '#', alt_session=True)\n-            # wait for interface promisc enable\n-            time.sleep(2)\n-            cloud_cfg.transmit_packet()\n-            self.dut.send_expect('killall tcpdump', '#', alt_session=True)\n-            # wait for pcap file saved\n-            time.sleep(2)\n-            # copy pcap to tester and then analyze\n-            self.dut.session.copy_file_from(tmp_file)\n-            pkt = Packet()\n-            pkt.read_pcapfile(filename=\"cloud_filter_%s.pcap\" % self.vf_intf)\n-            self.verify(\n-                len(pkt) == 1, \"%d packet recevied on kernel VF\" % len(pkt))\n-            cap_pkt = pkt[0]\n-            try:\n-                dport = cap_pkt[UDP].dport\n-                self.verify(dport == CLOUD_PORT,\n-                            \"Captured packet is not vxlan packet\")\n-                inner_ip = cap_pkt['VXLAN'][IP].dst\n-                self.verify(inner_ip == cloud_cfg.cf_rule['iip'],\n-                            \"Inner ip not matched\")\n-            except:\n-                print(\"Kernel VF captured packet not match rule\")\n-                raise\n-\n-        self.logger.info(\"Verified vxlan %s filter pass\" % cloud_cfg.cf_rule['type'])\n-\n-    def test_cloud_filter(self):\n-        \"\"\"\n-        Verify dpdk work with linux driver added cloud filter rule\n-        \"\"\"\n-        # setting for cloud filter rule\n-        queue = self.vf_queues - 1\n-        vni = 1\n-        vlan = 1\n-        # add cloud filter rule\n-        rules = [\n-            {'type': 'iip', 'iip': '192.168.1.1',\n-             'vf': 0, 'queue': queue, 'loc': 1},\n-            {'type': 'imac', 'imac': '00:00:00:00:09:00',\n-             'vf': 0, 'queue': queue, 'loc': 1},\n-            {'type': 'omac+imac+vni', 'omac': '00:00:00:00:10:00',\n-             'imac': '00:00:00:00:09:00', 'vni': vni, 'vf': 0, 'queue': queue,\n-             'loc': 1},\n-            {'type': 'imac+ivlan+vni', 'imac': '00:00:00:00:09:00',\n-             'ivlan': vlan, 'vni': vni, 'vf': 0, 'queue': queue, 'loc': 1},\n-            {'type': 'imac+ivlan', 'imac': '00:00:00:00:09:00',\n-             'ivlan': vlan, 'vf': 0, 'queue': queue, 'loc': 1},\n-        ]\n-        cf_cfg = CloudFilterConfig(self, self.pf_intf)\n-        for rule in rules:\n-            cf_cfg.config_rule(**rule)\n-            cf_cfg.ethtool_add()\n-\n-            self.send_and_verify(cf_cfg)\n-\n-            cf_cfg.ethtool_delete()\n-\n-    def test_bifurcated_driver(self):\n-        \"\"\"\n-        Verify bifurcated driver work with dpdk VF and kernel VF\n-        \"\"\"\n-        rules = [\n-            {'type': 'iip', 'iip': '192.168.1.1', 'vf': 0,\n-             'queue': self.vf_queues - 1, 'loc': 1},\n-            {'type': 'iip', 'iip': '192.168.2.1', 'vf': 1, 'queue': 0,\n-             'loc': 2}]\n-\n-        dpdk_cfg = CloudFilterConfig(self, self.pf_intf)\n-        # fdir rule for dpdk VF\n-        dpdk_cfg.config_rule(**rules[0])\n-        dpdk_cfg.ethtool_add()\n-        self.send_and_verify(dpdk_cfg)\n-        # fdir rule for kernel VF\n-        kernel_cfg = CloudFilterConfig(self, self.pf_intf)\n-        kernel_cfg.config_rule(**rules[1])\n-        kernel_cfg.ethtool_add()\n-        self.send_and_verify(kernel_cfg, dpdk=False)\n-\n-        pass\n-\n-    def set_up(self):\n-        \"\"\"\n-        Run before each test case.\n-        \"\"\"\n-        self.setup_vf_env()\n-        pass\n-\n-    def tear_down(self):\n-        \"\"\"\n-        Run after each test case.\n-        \"\"\"\n-        pass\n-\n-    def tear_down_all(self):\n-        \"\"\"\n-        Run after each test suite.\n-        \"\"\"\n-        self.destroy_vf_env()\n-        pass\n",
    "prefixes": [
        "v2",
        "5/5"
    ]
}