get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 109319,
    "url": "http://patches.dpdk.org/api/patches/109319/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20220406151903.2916254-20-juraj.linkes@pantheon.tech/",
    "project": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<20220406151903.2916254-20-juraj.linkes@pantheon.tech>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20220406151903.2916254-20-juraj.linkes@pantheon.tech",
    "date": "2022-04-06T15:18:59",
    "name": "[RFC,v1,19/23] dts: merge DTS framework/flow/flow_action_items.py to DPDK",
    "commit_ref": null,
    "pull_url": null,
    "state": "rfc",
    "archived": true,
    "hash": "5315c368efb9d34239bb1cb46929b22c3cd85adb",
    "submitter": {
        "id": 1626,
        "url": "http://patches.dpdk.org/api/people/1626/?format=api",
        "name": "Juraj Linkeš",
        "email": "juraj.linkes@pantheon.tech"
    },
    "delegate": {
        "id": 1,
        "url": "http://patches.dpdk.org/api/users/1/?format=api",
        "username": "tmonjalo",
        "first_name": "Thomas",
        "last_name": "Monjalon",
        "email": "thomas@monjalon.net"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20220406151903.2916254-20-juraj.linkes@pantheon.tech/mbox/",
    "series": [
        {
            "id": 22381,
            "url": "http://patches.dpdk.org/api/series/22381/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=22381",
            "date": "2022-04-06T15:18:40",
            "name": "merge DTS test resource files to DPDK",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/22381/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/109319/comments/",
    "check": "warning",
    "checks": "http://patches.dpdk.org/api/patches/109319/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-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 685F0A0509;\n\tWed,  6 Apr 2022 17:21:34 +0200 (CEST)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 2D9D542978;\n\tWed,  6 Apr 2022 17:19:31 +0200 (CEST)",
            "from lb.pantheon.sk (lb.pantheon.sk [46.229.239.20])\n by mails.dpdk.org (Postfix) with ESMTP id 15B1C42966\n for <dev@dpdk.org>; Wed,  6 Apr 2022 17:19:28 +0200 (CEST)",
            "from localhost (localhost [127.0.0.1])\n by lb.pantheon.sk (Postfix) with ESMTP id 6D5D1129C28;\n Wed,  6 Apr 2022 17:19:27 +0200 (CEST)",
            "from lb.pantheon.sk ([127.0.0.1])\n by localhost (lb.pantheon.sk [127.0.0.1]) (amavisd-new, port 10024)\n with ESMTP id azlPRA1ht7vk; Wed,  6 Apr 2022 17:19:24 +0200 (CEST)",
            "from entguard.lab.pantheon.local (unknown [46.229.239.141])\n by lb.pantheon.sk (Postfix) with ESMTP id 9500D19E0DE;\n Wed,  6 Apr 2022 17:19:15 +0200 (CEST)"
        ],
        "X-Virus-Scanned": "amavisd-new at siecit.sk",
        "From": "=?utf-8?q?Juraj_Linke=C5=A1?= <juraj.linkes@pantheon.tech>",
        "To": "thomas@monjalon.net, david.marchand@redhat.com,\n Honnappa.Nagarahalli@arm.com, ohilyard@iol.unh.edu, lijuan.tu@intel.com",
        "Cc": "dev@dpdk.org, =?utf-8?q?Juraj_Linke=C5=A1?= <juraj.linkes@pantheon.tech>",
        "Subject": "[RFC PATCH v1 19/23] dts: merge DTS\n framework/flow/flow_action_items.py to DPDK",
        "Date": "Wed,  6 Apr 2022 15:18:59 +0000",
        "Message-Id": "<20220406151903.2916254-20-juraj.linkes@pantheon.tech>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20220406151903.2916254-1-juraj.linkes@pantheon.tech>",
        "References": "<20220406151903.2916254-1-juraj.linkes@pantheon.tech>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org"
    },
    "content": "---\n dts/framework/flow/flow_action_items.py | 1597 +++++++++++++++++++++++\n 1 file changed, 1597 insertions(+)\n create mode 100644 dts/framework/flow/flow_action_items.py",
    "diff": "diff --git a/dts/framework/flow/flow_action_items.py b/dts/framework/flow/flow_action_items.py\nnew file mode 100644\nindex 0000000000..1542bd9225\n--- /dev/null\n+++ b/dts/framework/flow/flow_action_items.py\n@@ -0,0 +1,1597 @@\n+# BSD LICENSE\n+#\n+# Copyright(c) 2020 Intel Corporation. All rights reserved.\n+# Copyright © 2018[, 2019] The University of New Hampshire. 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+from typing import Dict, FrozenSet, Tuple\n+\n+from .enums import FlowActionType\n+from .flow_items import FlowItem\n+\n+ALWAYS_ALLOWED_ACTIONS = {FlowActionType.VOID}\n+\n+ENTRY_POINTS = {\n+    FlowActionType.VOID,\n+    FlowActionType.PASSTHRU,\n+    FlowActionType.FLAG,\n+    FlowActionType.DROP,\n+    FlowActionType.COUNT,\n+    FlowActionType.MAC_SWAP,\n+    FlowActionType.DEC_TTL,\n+    FlowActionType.JUMP,\n+    FlowActionType.MARK,\n+    FlowActionType.QUEUE,\n+    FlowActionType.RSS,\n+    FlowActionType.PF,\n+    FlowActionType.VF,\n+    FlowActionType.PHY_PORT,\n+    FlowActionType.PORT_ID,\n+    FlowActionType.SECURITY,\n+    FlowActionType.OF_SET_MPLS_TTL,\n+    FlowActionType.OF_DEC_MPLS_TTL,\n+    FlowActionType.OF_SET_NW_TTL,\n+    FlowActionType.OF_DEC_NW_TTL,\n+    FlowActionType.OF_COPY_TTL_OUT,\n+    FlowActionType.OF_COPY_TTL_IN,\n+    FlowActionType.OF_POP_VLAN,\n+    FlowActionType.OF_PUSH_VLAN,\n+    FlowActionType.OF_SET_VLAN_VID,\n+    FlowActionType.OF_SET_VLAN_PCP,\n+    FlowActionType.OF_POP_MPLS,\n+    FlowActionType.OF_PUSH_MPLS,\n+    FlowActionType.VXLAN_ENCAP,\n+    FlowActionType.VXLAN_DECAP,\n+    FlowActionType.NVGRE_ENCAP,\n+    FlowActionType.NVGRE_DECAP,\n+    FlowActionType.RAW_ENCAP,\n+    FlowActionType.RAW_DECAP,\n+    FlowActionType.SET_IPV4_SRC,\n+    FlowActionType.SET_IPV4_DST,\n+    FlowActionType.SET_IPV6_SRC,\n+    FlowActionType.SET_IPV6_DST,\n+    FlowActionType.SET_TP_SRC,\n+    FlowActionType.SET_TP_DST,\n+    FlowActionType.SET_TTL,\n+    FlowActionType.SET_MAC_SRC,\n+    FlowActionType.SET_MAC_DST,\n+    FlowActionType.INC_TCP_SEQ,\n+    FlowActionType.DEC_TCP_SEQ,\n+    FlowActionType.INC_TCP_ACK,\n+    FlowActionType.DEC_TCP_ACK,\n+    FlowActionType.SET_TAG,\n+    FlowActionType.SET_META,\n+    FlowActionType.SET_IPV4_DSCP,\n+    FlowActionType.SET_IPV6_DSCP,\n+    FlowActionType.AGE,\n+}\n+\n+\n+class ActionFlowItem(FlowItem):\n+    allowed_with: FrozenSet[FlowActionType] = frozenset(\n+        {item for item in FlowActionType}\n+    )\n+\n+    valid_next_items: FrozenSet[FlowActionType] = frozenset(\n+        {item for item in FlowActionType}\n+    )\n+\n+    test_case: Dict[str, Tuple[str, frozenset, frozenset]] = dict()\n+\n+\n+class FlowActionVoid(ActionFlowItem):\n+    type = FlowActionType.VOID\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / udp / end actions void / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionPassthru(ActionFlowItem):\n+    type = FlowActionType.PASSTHRU\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / udp / end actions passthru / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionFlag(ActionFlowItem):\n+    type = FlowActionType.FLAG\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / udp / end actions flag / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionDrop(ActionFlowItem):\n+    type = FlowActionType.DROP\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / udp / end actions drop / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionCount(ActionFlowItem):\n+    type = FlowActionType.COUNT\n+    test_case = {\n+        \"test_shared\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1\"\n+            \" / udp / end actions count shared 0 id 1 / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+        \"test_id\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / udp / end actions count id 1 / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionMac_swap(ActionFlowItem):\n+    type = FlowActionType.MAC_SWAP\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / udp / end actions mac_swap / end\",\n+            frozenset(\n+                {\n+                    'Ether(src=\"90:61:ae:fd:41:43\", dst = \"ab:cd:ef:12:34:56\") '\n+                    \"/ IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    'Ether(src=\"90:61:ae:fd:41:43\", dst = \"ab:cd:ef:12:34:56\") '\n+                    \"/ IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    'Ether(src=\"90:61:ae:fd:41:43\", dst = \"ab:cd:ef:12:34:56\") '\n+                    \"/ IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    'Ether(src=\"90:61:ae:fd:41:43\", dst = \"ab:cd:ef:12:34:56\") '\n+                    \"/ IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    'Ether(src=\"90:61:ae:fd:41:43\", dst = \"ab:cd:ef:12:34:56\") '\n+                    \"/ IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionDec_ttl(ActionFlowItem):\n+    type = FlowActionType.DEC_TTL\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / udp / end actions dec_ttl / end\",\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.1\\\", ttl = 128) / UDP() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\", ttl = 128) / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\", ttl = 128) / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\", ttl = 128 ) / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\", ttl = 128) / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionJump(ActionFlowItem):\n+    type = FlowActionType.JUMP\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / udp / end actions jump group 1 / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionMark(ActionFlowItem):\n+    type = FlowActionType.MARK\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions mark id 0xABCDEF / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionQueue(ActionFlowItem):\n+    type = FlowActionType.QUEUE\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / udp / end actions queue index 1 / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionRss(ActionFlowItem):\n+    type = FlowActionType.RSS\n+\n+    # RSS already has a test suite.\n+    \"\"\"\n+     test_case = {\n+         'case1': ('ingress pattern eth / ipv4 src is 192.168.0.1 / udp / end actions / end',\n+                   frozenset({\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}),\n+                   frozenset({\"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                              \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                              \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                              \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\"})),\n+     }\n+     \"\"\"\n+\n+\n+class FlowActionPf(ActionFlowItem):\n+    type = FlowActionType.PF\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / udp / end actions pf / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionVf(ActionFlowItem):\n+    type = FlowActionType.VF\n+    test_case = {\n+        \"test_original\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 /\"\n+            \" udp / end actions vf original 1/ end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+        \"test_id\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / udp / end actions vf id 1 / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionPhy_port(ActionFlowItem):\n+    type = FlowActionType.PHY_PORT\n+\n+    test_case = {\n+        # original port index\n+        \"test_original\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1\"\n+            \" / udp / end actions phy_port original / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+        # physical port index\n+        \"test_index\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions phy_port index 1 / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionPort_id(ActionFlowItem):\n+    type = FlowActionType.PORT_ID\n+\n+    test_case = {\n+        # original DPDK port ID\n+        \"test_original\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions port_id original / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+        # DPDK port ID\n+        \"test_id\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions port_id id 1 / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionMeter(ActionFlowItem):\n+    type = FlowActionType.METER\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / udp / end actions meter mtr_id 1 / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionSecurity(ActionFlowItem):\n+    type = FlowActionType.SECURITY\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1\"\n+            \" / udp / end actions security security_session 1 / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionOf_set_mpls_ttl(ActionFlowItem):\n+    type = FlowActionType.OF_SET_MPLS_TTL\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions of_set_mpls_ttl mpls_ttl 64 / end\",\n+            frozenset(\n+                {\n+                    'Ether() / IP(src=\"192.168.0.1\") / MPLS(label = 0xab, ttl=128)'\n+                    \" / UDP() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / MPLS(label = 0xab, ttl=128) / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / MPLS(label = 0xab, ttl=128) / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / MPLS(label = 0xab, ttl=128) / UDP() / Raw('\\\\x00' * 64)\",\n+                    'Ether() / IP(src=\"132.177.0.99\") / MPLS(label = 0xab, ttl=128)'\n+                    \" / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionOf_dec_mpls_ttl(ActionFlowItem):\n+    type = FlowActionType.OF_DEC_MPLS_TTL\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / udp / end actions of_dec_mpls_ttl / end\",\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.1\\\") / MPLS(label = 0xab, ttl=128) / UDP() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / MPLS(label = 0xab, ttl=128) / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / MPLS(label = 0xab, ttl=128) / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / MPLS(label = 0xab, ttl=128) / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / MPLS(label = 0xab, ttl=128) / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionOf_set_nw_ttl(ActionFlowItem):\n+    type = FlowActionType.OF_SET_NW_TTL\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions of_set_nw_ttl nw_ttl 64 / end\",\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.1\\\", ttl=128) / UDP() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\", ttl=128) / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\", ttl=128) / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\", ttl=128) / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\", ttl=128) / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionOf_dec_nw_ttl(ActionFlowItem):\n+    type = FlowActionType.OF_DEC_NW_TTL\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / udp / end actions of_dec_nw_ttl / end\",\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.1\\\", ttl=128) / UDP() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\", ttl=128) / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\", ttl=128) / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\", ttl=128) / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\", ttl=128) / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionOf_copy_ttl_out(ActionFlowItem):\n+    type = FlowActionType.OF_COPY_TTL_OUT\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions of_copy_ttl_out / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionOf_copy_ttl_in(ActionFlowItem):\n+    type = FlowActionType.OF_COPY_TTL_IN\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions of_copy_ttl_out / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionOf_pop_vlan(ActionFlowItem):\n+    type = FlowActionType.OF_POP_VLAN\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / udp / end actions of_pop_vlan / end\",\n+            frozenset(\n+                {\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"192.168.0.1\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"192.168.0.2\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\",\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"10.0.30.99\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\",\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"8.8.8.8\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\",\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"132.177.0.99\")'\n+                    \" / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionOf_push_vlan(ActionFlowItem):\n+    type = FlowActionType.OF_PUSH_VLAN\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1\"\n+            \" / udp / end actions of_push_vlan ethertype 0x8100 / end\",\n+            frozenset(\n+                {\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"192.168.0.1\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"192.168.0.2\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\",\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"10.0.30.99\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\",\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"8.8.8.8\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\",\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"132.177.0.99\")'\n+                    \" / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionOf_set_vlan_vid(ActionFlowItem):\n+    type = FlowActionType.OF_SET_VLAN_VID\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions of_set_vlan_vid vlan_vid 0xbbb / end\",\n+            frozenset(\n+                {\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"192.168.0.1\")'\n+                    \" / UDP() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"192.168.0.2\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\",\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"10.0.30.99\") '\n+                    \"/ UDP() / Raw('\\x00' * 64)\",\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"8.8.8.8\") '\n+                    \"/ UDP() / Raw('\\x00' * 64)\",\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"132.177.0.99\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionOf_set_vlan_pcp(ActionFlowItem):\n+    type = FlowActionType.OF_SET_VLAN_PCP\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1\"\n+            \" / udp / end actions of_set_vlan_vid vlan_pcp 0x7 / end\",\n+            frozenset(\n+                {\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"192.168.0.1\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"192.168.0.2\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\",\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"10.0.30.99\") '\n+                    \"/ UDP() / Raw('\\x00' * 64)\",\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"8.8.8.8\") '\n+                    \"/ UDP() / Raw('\\x00' * 64)\",\n+                    'Ether() / Dot1Q(prio = 0x5, id = 0x0, vlan = 0xaaa) / IP(src=\"132.177.0.99\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionOf_pop_mpls(ActionFlowItem):\n+    type = FlowActionType.OF_POP_MPLS\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions of_pop_mpls ethertype 0x0806 / end\",\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.1\\\") / MPLS(label = 0xab, ttl=128) / UDP() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / MPLS(label = 0xab, ttl=128) / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / MPLS(label = 0xab, ttl=128) / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / MPLS(label = 0xab, ttl=128) / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / MPLS(label = 0xab, ttl=128) / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionOf_push_mpls(ActionFlowItem):\n+    type = FlowActionType.OF_PUSH_MPLS\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1\"\n+            \" / udp / end actions of_push_mpls ethertype 0x0806 / end\",\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.1\\\") / MPLS(label = 0xab, ttl=128) / UDP() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / MPLS(label = 0xab, ttl=128) / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / MPLS(label = 0xab, ttl=128) / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / MPLS(label = 0xab, ttl=128) / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / MPLS(label = 0xab, ttl=128) / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionVxlan_encap(ActionFlowItem):\n+    type = FlowActionType.VXLAN_ENCAP\n+\n+    test_case = {\n+        # VXLAN encap definition is the VNI?\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1\"\n+            \" / udp / end actions vxlan_encap definition 0x112233 / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionVxlan_decap(ActionFlowItem):\n+    type = FlowActionType.VXLAN_DECAP\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / udp / end actions vxlan_decap / end\",\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / VXLAN() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / VXLAN() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / VXLAN() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / VXLAN() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / VXLAN() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionNvgre_encap(ActionFlowItem):\n+    type = FlowActionType.NVGRE_ENCAP\n+    # NVGRE PACKETS NOT SUPPORTED BY SCAPY.\n+    \"\"\"\n+     test_case = {\n+         'test': ('ingress pattern eth / ipv4 src is 192.168.0.1\n+         / udp / end actions nvgre_encap definition 0x112233 / end',\n+                   frozenset({\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() /  NVGRE() / Raw('\\\\x00' * 64)\"}),\n+                   frozenset({\"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() /  NVGRE() / Raw('\\\\x00' * 64)\",\n+                              \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() /  NVGRE() / Raw('\\\\x00' * 64)\",\n+                              \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() /  NVGRE() / Raw('\\\\x00' * 64)\",\n+                              \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() /  NVGRE() / Raw('\\\\x00' * 64)\"})),\n+     }\n+     \"\"\"\n+\n+\n+class FlowActionNvgre_decap(ActionFlowItem):\n+    type = FlowActionType.NVGRE_DECAP\n+    # NVGRE PACKETS NOT SUPPORTED BY SCAPY.\n+    \"\"\"\n+     test_case = {\n+         'test': ('ingress pattern eth / ipv4 src is 192.168.0.1 / udp / end actions nvgre_decap / end',\n+                   frozenset({\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / NVGRE() / Raw('\\\\x00' * 64)\"}),\n+                   frozenset({\"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / NVGRE() / Raw('\\\\x00' * 64)\",\n+                              \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / NVGRE() / Raw('\\\\x00' * 64)\",\n+                              \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / NVGRE() / Raw('\\\\x00' * 64)\",\n+                              \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / NVGRE() / Raw('\\\\x00' * 64)\"})),\n+     }\n+     \"\"\"\n+\n+\n+class FlowActionRaw_encap(ActionFlowItem):\n+    type = FlowActionType.RAW_ENCAP\n+    # Assume we are encapsulating with a VLAN header with the following values:\n+    # TPID: 0x8100\n+    # Prio: 0x5\n+    # PCP: 0\n+    # VID: 0xaaa\n+    # This makes the full header: 0x8100aaaa\n+    test_case = {\n+        \"test_data\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions raw_encap data 0x8100aaaa / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+        \"test_preserve\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions raw_encap data 0x8100aaaa preserve 0xffffffff / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+        # Is \"size\" in bits or bytes? Unclear in documentation, defaulting to bits.\n+        \"test_size\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions raw_encap data 0x8100aaaa size 32 / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionRaw_decap(ActionFlowItem):\n+    type = FlowActionType.RAW_DECAP\n+    test_case = {\n+        \"test_data\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions raw_decap data 0x8100aaaa / end\",\n+            frozenset(\n+                {\"Ether()  / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    'Ether() /  Dot1Q(prio = 0x5, id = 0x0, vlan = 0xbbb) / IP(src=\"192.168.0.2\")'\n+                    \" / UDP() / Raw('\\\\x00' * 64)\",\n+                    'Ether() /  Dot1Q(prio = 0x5, id = 0x0, vlan = 0xbbb) / IP(src=\"10.0.30.99\") '\n+                    \"/ UDP() / Raw('\\x00' * 64)\",\n+                    'Ether() /  Dot1Q(prio = 0x5, id = 0x0, vlan = 0xbbb) / IP(src=\"8.8.8.8\")'\n+                    \" / UDP() / Raw('\\x00' * 64)\",\n+                    'Ether() /  Dot1Q(prio = 0x5, id = 0x0, vlan = 0xbbb) / IP(src=\"132.177.0.99\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+        # Is \"size\" in bits or bytes? Unclear in documentation, defaulting to bits.\n+        \"test_size\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions raw_decap data 0x8100aaaa size 32 / end\",\n+            frozenset(\n+                {\n+                    'Ether() /  Dot1Q(prio = 0x5, id = 0x0, vlan = 0xbbb) / IP(src=\"192.168.0.1\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    'Ether() /  Dot1Q(prio = 0x5, id = 0x0, vlan = 0xbbb) / IP(src=\"192.168.0.2\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\",\n+                    'Ether() /  Dot1Q(prio = 0x5, id = 0x0, vlan = 0xbbb) / IP(src=\"10.0.30.99\")'\n+                    \" / UDP() / Raw('\\x00' * 64)\",\n+                    'Ether() /  Dot1Q(prio = 0x5, id = 0x0, vlan = 0xbbb) / IP(src=\"8.8.8.8\") '\n+                    \"/ UDP() / Raw('\\x00' * 64)\",\n+                    'Ether() /  Dot1Q(prio = 0x5, id = 0x0, vlan = 0xbbb) / IP(src=\"132.177.0.99\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionSet_ipv4_src(ActionFlowItem):\n+    type = FlowActionType.SET_IPV4_SRC\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions set_ipv4_src ipv4_addr 172.16.0.10  / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionSet_ipv4_dst(ActionFlowItem):\n+    type = FlowActionType.SET_IPV4_DST\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 dst is 192.168.0.1\"\n+            \" / udp / end actions set_ipv4_dst ipv4_addr 172.16.0.10 / end\",\n+            frozenset(\n+                {\"Ether() / IP(dst=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(dst=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(dst=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(dst=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(dst=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionSet_ipv6_src(ActionFlowItem):\n+    type = FlowActionType.SET_IPV6_SRC\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv6 src is 2001:0000:9d38:6ab8:1c48:3a1c:a95a:b1c2 \"\n+            \"/ udp / end actions set_ipv6_src ipv6_addr 2001:0000:9d38:6ab8:1c48:9999:aaaa:bbbb\",\n+            frozenset(\n+                {\n+                    'Ether() / IPv6(src=\"2001:0000:9d38:6ab8:1c48:3a1c:a95a:b1c2\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IPv6(src=\\\"2001:0000:9d38:6ab8:1c48:3a1c:a95a:b1c3\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IPv6(src=\\\"2001:0000:9d38:6ab8:1c48:3a1c:a95a:b1c4\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IPv6(src=\\\"2001:0000:9d38:6ab8:1c48:3a1c:a95a:b1c5\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    'Ether() / IPv6(src=\"2001:0000:9d38:6ab8:1c48:3a1c:a95a:b1c6\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionSet_ipv6_dst(ActionFlowItem):\n+    type = FlowActionType.SET_IPV6_DST\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv6 dst is 2001:0000:9d38:6ab8:1c48:3a1c:a95a:b1c2 \"\n+            \"/ udp / end actions set_ipv6_dst ipv6_addr 2001:0000:9d38:6ab8:1c48:9999:aaaa:bbbb\",\n+            frozenset(\n+                {\n+                    'Ether() / IPv6(dst=\"2001:0000:9d38:6ab8:1c48:3a1c:a95a:b1c2\")'\n+                    \" / UDP() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IPv6(dst=\\\"2001:0000:9d38:6ab8:1c48:3a1c:a95a:b1c3\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IPv6(dst=\\\"2001:0000:9d38:6ab8:1c48:3a1c:a95a:b1c4\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IPv6(dst=\\\"2001:0000:9d38:6ab8:1c48:3a1c:a95a:b1c5\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    'Ether() / IPv6(dst=\"2001:0000:9d38:6ab8:1c48:3a1c:a95a:b1c6\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionSet_tp_src(ActionFlowItem):\n+    type = FlowActionType.SET_TP_SRC\n+\n+    test_case = {\n+        # UDP\n+        \"test_udp\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1\"\n+            \" / udp / end actions set_tp_src port 1998 / end\",\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.1\\\") UDP(sport=3838) / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") UDP(sport=3838) / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") UDP(sport=3838) / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") UDP(sport=3838) / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") UDP(sport=3838) / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+        # TCP\n+        \"test_tcp\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / tcp / end actions set_tp_src port 1998 / end\",\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.1\\\") TCP(sport=3838) / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") TCP(sport=3838) / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") TCP(sport=3838) / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") TCP(sport=3838) / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") TCP(sport=3838) / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionSet_tp_dst(ActionFlowItem):\n+    type = FlowActionType.SET_TP_DST\n+\n+    test_case = {\n+        # UDP\n+        \"test_udp\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions set_tp_dst port 1998 / end\",\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.1\\\") UDP(dport=3838) / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") UDP(dport=3838) / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") UDP(dport=3838) / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") UDP(dport=3838) / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") UDP(dport=3838) / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+        # TCP\n+        \"test_tcp\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / tcp / end actions set_tp_dst port 1998 / end\",\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.1\\\") TCP(dport=3838) / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") TCP(dport=3838) / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") TCP(dport=3838) / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") TCP(dport=3838) / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") TCP(dport=3838) / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionSet_ttl(ActionFlowItem):\n+    type = FlowActionType.SET_TTL\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1\"\n+            \" / udp / end actions set_ttl ttl_value 64 / end\",\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.1\\\" , ttl=128 ) / UDP() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\" , ttl=128 ) / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\" , ttl=128 ) / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\", ttl=128 ) / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\", ttl=128 ) / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionSet_mac_src(ActionFlowItem):\n+    type = FlowActionType.SET_MAC_SRC\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1\"\n+            \" / udp / end actions set_mac_src mac_addr 10:20:30:40:50:60 / end\",\n+            frozenset(\n+                {\n+                    'Ether(src=\"90:61:ae:fd:41:43\") / IP(src=\"192.168.0.1\") / UDP() / Raw(\\'\\\\x00\\' * 64)'\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    'Ether(src=\"90:61:ae:fd:41:43\") / IP(src=\"192.168.0.2\") / UDP() / Raw(\\'\\\\x00\\' * 64)',\n+                    'Ether(src=\"90:61:ae:fd:41:43\") / IP(src=\"10.0.30.99\") / UDP() / Raw(\\'\\\\x00\\' * 64)',\n+                    'Ether(src=\"90:61:ae:fd:41:43\") / IP(src=\"8.8.8.8\") / UDP() / Raw(\\'\\\\x00\\' * 64)',\n+                    'Ether(src=\"90:61:ae:fd:41:43\") / IP(src=\"132.177.0.99\") / UDP() / Raw(\\'\\\\x00\\' * 64)',\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionSet_mac_dst(ActionFlowItem):\n+    type = FlowActionType.SET_MAC_DST\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1\"\n+            \" / udp / end actions set_mac_dst mac_addr 10:20:30:40:50:60 / end\",\n+            frozenset(\n+                {\n+                    'Ether(dst=\"90:61:ae:fd:41:43\") / IP(src=\"192.168.0.1\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    'Ether(dst=\"90:61:ae:fd:41:43\") / IP(src=\"192.168.0.2\") / UDP() / Raw(\\'\\\\x00\\' * 64)',\n+                    'Ether(dst=\"90:61:ae:fd:41:43\") / IP(src=\"10.0.30.99\") / UDP() / Raw(\\'\\x00\\' * 64)',\n+                    'Ether(dst=\"90:61:ae:fd:41:43\") / IP(src=\"8.8.8.8\") / UDP() / Raw(\\'\\x00\\' * 64)',\n+                    'Ether(dst=\"90:61:ae:fd:41:43\") / IP(src=\"132.177.0.99\") '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionInc_tcp_seq(ActionFlowItem):\n+    type = FlowActionType.INC_TCP_SEQ\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / tcp / end actions inc_tcp_seq / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / TCP(seq=2) / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / TCP(seq=2) / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / TCP(seq=2) / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / TCP(seq=2) / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / TCP(seq=2) / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionDec_tcp_seq(ActionFlowItem):\n+    type = FlowActionType.DEC_TCP_SEQ\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / tcp / end actions dec_tcp_seq / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / TCP(seq=2) / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / TCP(seq=2) / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / TCP(seq=2) / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / TCP(seq=2) / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / TCP(seq=2) / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionInc_tcp_ack(ActionFlowItem):\n+    type = FlowActionType.INC_TCP_ACK\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / tcp / end actions inc_tcp_ack / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / TCP(ack=2) / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / TCP(ack=2) / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / TCP(ack=2) / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / TCP(ack=2) / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / TCP(ack=2) / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionDec_tcp_ack(ActionFlowItem):\n+    type = FlowActionType.DEC_TCP_ACK\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 / tcp / end actions dec_tcp_ack / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / TCP(ack=2) / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / TCP(ack=2) / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / TCP(ack=2) / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / TCP(ack=2) / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / TCP(ack=2) / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionSet_tag(ActionFlowItem):\n+    type = FlowActionType.SET_TAG\n+\n+    test_case = {\n+        \"test_data\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions set_tag data 0xabc / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+        # bit-mask applies to \"data\"\n+        \"test_mask\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions set_tag data 0xabc mask 0xcba / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+        \"test_index\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions set_tag data 0xabc index 1 / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionSet_meta(ActionFlowItem):\n+    type = FlowActionType.SET_META\n+\n+    test_case = {\n+        \"test_data\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions set_meta data 0xabc / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+        # bit-mask applies to \"data\"\n+        \"test_mask\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions set_meta data 0xabc mask 0xcb / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionSet_ipv4_dscp(ActionFlowItem):\n+    type = FlowActionType.SET_IPV4_DSCP\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions set_ipv4_dscp dscp 2 / end\",\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.1\\\", tos = 0) / UDP() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\", tos = 0) / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\", tos = 0) / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\", tos = 0) / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\", tos = 0) / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionSet_ipv6_dscp(ActionFlowItem):\n+    type = FlowActionType.SET_IPV6_DSCP\n+\n+    test_case = {\n+        \"test\": (\n+            \"ingress pattern eth / ipv6 src is 2001:0000:9d38:6ab8:1c48:3a1c:a95a:b1c2 \"\n+            \"/ udp / end actions set_ipv6_dscp dscp 0x30\",\n+            frozenset(\n+                {\n+                    'Ether() / IPv6(src=\"2001:0000:9d38:6ab8:1c48:3a1c:a95a:b1c2\", tc = 0) '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\"\n+                }\n+            ),\n+            frozenset(\n+                {\n+                    'Ether() / IPv6(src=\"2001:0000:9d38:6ab8:1c48:3a1c:a95a:b1c3\", tc = 0) '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\",\n+                    'Ether() / IPv6(src=\"2001:0000:9d38:6ab8:1c48:3a1c:a95a:b1c4\", tc = 0) '\n+                    \"/ UDP() / Raw('\\x00' * 64)\",\n+                    'Ether() / IPv6(src=\"2001:0000:9d38:6ab8:1c48:3a1c:a95a:b1c5\", tc = 0) '\n+                    \"/ UDP() / Raw('\\x00' * 64)\",\n+                    'Ether() / IPv6(src=\"2001:0000:9d38:6ab8:1c48:3a1c:a95a:b1c6\", tc = 0) '\n+                    \"/ UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+class FlowActionAge(ActionFlowItem):\n+    type = FlowActionType.AGE\n+\n+    test_case = {\n+        \"test_timeout\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions age timeout 128 / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+        # 8 bits reserved, must be zero\n+        \"test_reserved\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions age timeout 128 reserved 0 / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+        # The user flow context, NULL means the rte_flow pointer.\n+        \"test_context\": (\n+            \"ingress pattern eth / ipv4 src is 192.168.0.1 \"\n+            \"/ udp / end actions age timeout 128 context NULL / end\",\n+            frozenset(\n+                {\"Ether() / IP(src=\\\"192.168.0.1\\\") / UDP() / Raw('\\\\x00' * 64)\"}\n+            ),\n+            frozenset(\n+                {\n+                    \"Ether() / IP(src=\\\"192.168.0.2\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"10.0.30.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"8.8.8.8\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                    \"Ether() / IP(src=\\\"132.177.0.99\\\") / UDP() / Raw('\\\\x00' * 64)\",\n+                }\n+            ),\n+        ),\n+    }\n+\n+\n+ACTION_ITEMS_TYPE_CLASS_MAPPING: Dict[FlowActionType, ActionFlowItem] = {\n+    FlowActionType.PASSTHRU: FlowActionPassthru,\n+    FlowActionType.FLAG: FlowActionFlag,\n+    FlowActionType.DROP: FlowActionDrop,\n+    FlowActionType.COUNT: FlowActionCount,\n+    FlowActionType.MAC_SWAP: FlowActionMac_swap,\n+    FlowActionType.DEC_TTL: FlowActionDec_ttl,\n+    FlowActionType.JUMP: FlowActionJump,\n+    FlowActionType.MARK: FlowActionMark,\n+    FlowActionType.QUEUE: FlowActionQueue,\n+    FlowActionType.RSS: FlowActionRss,\n+    FlowActionType.PF: FlowActionPf,\n+    FlowActionType.VF: FlowActionVf,\n+    FlowActionType.PHY_PORT: FlowActionPhy_port,\n+    FlowActionType.PORT_ID: FlowActionPort_id,\n+    FlowActionType.METER: FlowActionMeter,\n+    FlowActionType.SECURITY: FlowActionSecurity,\n+    FlowActionType.OF_SET_MPLS_TTL: FlowActionOf_set_mpls_ttl,\n+    FlowActionType.OF_DEC_MPLS_TTL: FlowActionOf_dec_mpls_ttl,\n+    FlowActionType.OF_SET_NW_TTL: FlowActionOf_set_nw_ttl,\n+    FlowActionType.OF_DEC_NW_TTL: FlowActionOf_dec_nw_ttl,\n+    FlowActionType.OF_COPY_TTL_OUT: FlowActionOf_copy_ttl_out,\n+    FlowActionType.OF_COPY_TTL_IN: FlowActionOf_copy_ttl_in,\n+    FlowActionType.OF_POP_VLAN: FlowActionOf_pop_vlan,\n+    FlowActionType.OF_PUSH_VLAN: FlowActionOf_push_vlan,\n+    FlowActionType.OF_SET_VLAN_VID: FlowActionOf_set_vlan_vid,\n+    FlowActionType.OF_SET_VLAN_PCP: FlowActionOf_set_vlan_pcp,\n+    FlowActionType.OF_POP_MPLS: FlowActionOf_pop_mpls,\n+    FlowActionType.OF_PUSH_MPLS: FlowActionOf_push_mpls,\n+    FlowActionType.VXLAN_ENCAP: FlowActionVxlan_encap,\n+    FlowActionType.VXLAN_DECAP: FlowActionVxlan_decap,\n+    FlowActionType.NVGRE_ENCAP: FlowActionNvgre_encap,\n+    FlowActionType.NVGRE_DECAP: FlowActionNvgre_decap,\n+    FlowActionType.RAW_ENCAP: FlowActionRaw_encap,\n+    FlowActionType.RAW_DECAP: FlowActionRaw_decap,\n+    FlowActionType.SET_IPV4_SRC: FlowActionSet_ipv4_src,\n+    FlowActionType.SET_IPV4_DST: FlowActionSet_ipv4_dst,\n+    FlowActionType.SET_IPV6_SRC: FlowActionSet_ipv6_src,\n+    FlowActionType.SET_IPV6_DST: FlowActionSet_ipv6_dst,\n+    FlowActionType.SET_TP_SRC: FlowActionSet_tp_src,\n+    FlowActionType.SET_TP_DST: FlowActionSet_tp_dst,\n+    FlowActionType.SET_TTL: FlowActionSet_ttl,\n+    FlowActionType.SET_MAC_SRC: FlowActionSet_mac_src,\n+    FlowActionType.SET_MAC_DST: FlowActionSet_mac_dst,\n+    FlowActionType.INC_TCP_SEQ: FlowActionInc_tcp_seq,\n+    FlowActionType.DEC_TCP_SEQ: FlowActionDec_tcp_seq,\n+    FlowActionType.INC_TCP_ACK: FlowActionInc_tcp_ack,\n+    FlowActionType.DEC_TCP_ACK: FlowActionDec_tcp_ack,\n+    FlowActionType.SET_TAG: FlowActionSet_tag,\n+    FlowActionType.SET_META: FlowActionSet_meta,\n+    FlowActionType.SET_IPV4_DSCP: FlowActionSet_ipv4_dscp,\n+    FlowActionType.SET_IPV6_DSCP: FlowActionSet_ipv6_dscp,\n+    FlowActionType.AGE: FlowActionAge,\n+}\n",
    "prefixes": [
        "RFC",
        "v1",
        "19/23"
    ]
}