Patch Detail
get:
Show a patch.
patch:
Update a patch.
put:
Update a patch.
GET /api/patches/109319/?format=api
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" ] }{ "id": 109319, "url": "