From patchwork Tue Aug 2 19:04:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Jiale, SongX" X-Patchwork-Id: 114536 Return-Path: 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]) by inbox.dpdk.org (Postfix) with ESMTP id 13700A0545; Tue, 2 Aug 2022 12:45:31 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 0476B40DF7; Tue, 2 Aug 2022 12:45:31 +0200 (CEST) Received: from mga06.intel.com (mga06b.intel.com [134.134.136.31]) by mails.dpdk.org (Postfix) with ESMTP id 9582D400D7 for ; Tue, 2 Aug 2022 12:45:28 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1659437128; x=1690973128; h=from:to:cc:subject:date:message-id; bh=tnR2NCcEBFyWB76yEeecjOutNW3f1XfjzND/wCea4T4=; b=aubtNyYzR5FUYNOj91wHD4YZw5BcAGAngNwbK1s3L+2XIFlOzpJZCgvl K0RB8TxGD3bQn+qELIeRhZo1FvxaWci7IQSH+xq2wv5JUqchONnDJ1cCt mnuINY9ZRZxvd6uRtSqJlEcgJaJDlp0S7Mp5TC0e/pnGTdiTnt5kgAhqD Sql/kc1q4a6TDSd29Uj7SmlT3RBPrpFfFLNawKLnpbHcNJ+ONHPDZLK2V ECfEj7wNCxm90dxiDww6nLQGGthIgbrt6BlFwx+thbVI/e4j2d8wriMks 1Re5pLMUJIch0yz2rrrbCiOUydGT+6MPLYi3uDaNftimoIqAR+G81c7vt A==; X-IronPort-AV: E=McAfee;i="6400,9594,10426"; a="351087449" X-IronPort-AV: E=Sophos;i="5.93,210,1654585200"; d="scan'208";a="351087449" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Aug 2022 03:45:27 -0700 X-IronPort-AV: E=Sophos;i="5.93,210,1654585200"; d="scan'208";a="578173796" Received: from unknown (HELO cvl_tetser_105.icx.intel.com) ([10.239.252.94]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Aug 2022 03:45:25 -0700 From: Jiale Song To: dts@dpdk.org Cc: Jiale Song Subject: [dts] [PATCH V2 1/4] tests/ice_fdir_protocol_agnostic_flow: add test cases Date: Tue, 2 Aug 2022 19:04:38 +0000 Message-Id: <20220802190441.10272-1-songx.jiale@intel.com> X-Mailer: git-send-email 2.17.1 X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dts-bounces@dpdk.org add test cases for ice fdir protocol agnostic flow offloading. Signed-off-by: Jiale Song Acked-by: Fu, Qi --- ...stSuite_ice_fdir_protocol_agnostic_flow.py | 1259 +++++++++++++++++ 1 file changed, 1259 insertions(+) create mode 100644 tests/TestSuite_ice_fdir_protocol_agnostic_flow.py diff --git a/tests/TestSuite_ice_fdir_protocol_agnostic_flow.py b/tests/TestSuite_ice_fdir_protocol_agnostic_flow.py new file mode 100644 index 00000000..df0979ec --- /dev/null +++ b/tests/TestSuite_ice_fdir_protocol_agnostic_flow.py @@ -0,0 +1,1259 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2022 Intel Corporation +# + +import copy +import re +import traceback +from collections import OrderedDict + +from framework.exception import VerifyFailure +from framework.packet import Packet +from framework.pmd_output import PmdOutput +from framework.test_case import TestCase, skip_unsupported_pkg +from framework.utils import GREEN, RED + +from .rte_flow_common import FdirProcessing + +MAC_IPv4_UDP = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/UDP(sport=22,dport=23)/Raw("x" * 80)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.20",dst="192.168.0.21")/UDP(sport=22,dport=23)/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.22")/UDP(sport=22,dport=23)/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/UDP(sport=21,dport=23)/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/UDP(sport=22,dport=24)/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw("x" * 80)', + ], +} + +mac_ipv4_udp_queue = { + "sub_casename": "mac_ipv4_udp_queue", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500001C0000000000110000C0A80014C0A800150016001700080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000 / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv4_UDP, + "check_param": {"port_id": 0, "mark_id": 10, "queue": 1}, +} + +mac_ipv4_udp_rss = { + "sub_casename": "mac_ipv4_udp_rss", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500001C0000000000110000C0A80014C0A800150016001700080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000 / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv4_UDP, + "check_param": {"port_id": 0, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv4_udp_passthru = { + "sub_casename": "mac_ipv4_udp_passthru", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500001C0000000000110000C0A80014C0A800150016001700080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000 / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv4_UDP, + "check_param": {"port_id": 0, "mark_id": 1, "rss": True}, +} + +mac_ipv4_udp_drop = { + "sub_casename": "mac_ipv4_udp_drop", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500001C0000000000110000C0A80014C0A800150016001700080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000 / end actions drop / end", + ], + "packet": MAC_IPv4_UDP, + "check_param": {"port_id": 0, "drop": True}, +} + +# Test case 1: ICE_FDIR_MAC/IPv4/UDP +mac_ipv4_udp = [ + mac_ipv4_udp_queue, + mac_ipv4_udp_rss, + mac_ipv4_udp_passthru, + mac_ipv4_udp_drop, +] + +MAC_IPv6_TCP = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="CDCD:910A:2222:5498:8475:1111:3900:1010")/TCP(sport=22,dport=23)/("X"*480)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2021", src="CDCD:910A:2222:5498:8475:1111:3900:1010")/TCP(sport=22,dport=23)/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="CDCD:910A:2222:5498:8475:1111:3900:1011")/TCP(sport=22,dport=23)/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="CDCD:910A:2222:5498:8475:1111:3900:1010")/TCP(sport=21,dport=23)/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="CDCD:910A:2222:5498:8475:1111:3900:1010")/TCP(sport=22,dport=24)/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="CDCD:910A:2222:5498:8475:1111:3900:1010")/UDP(sport=22,dport=23)/("X"*480)', + ], +} + +mac_ipv6_tcp_queue = { + "sub_casename": "mac_ipv6_tcp_queue", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000140600CDCD910A222254988475111139001010CDCD910A2222549884751111390020200016001700000000000000005000000000000000 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv6_TCP, + "check_param": {"port_id": 0, "mark_id": 10, "queue": 1}, +} + +mac_ipv6_tcp_rss = { + "sub_casename": "mac_ipv6_tcp_rss", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000140600CDCD910A222254988475111139001010CDCD910A2222549884751111390020200016001700000000000000005000000000000000 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv6_TCP, + "check_param": {"port_id": 0, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv6_tcp_passthru = { + "sub_casename": "mac_ipv6_tcp_passthru", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000140600CDCD910A222254988475111139001010CDCD910A2222549884751111390020200016001700000000000000005000000000000000 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv6_TCP, + "check_param": {"port_id": 0, "mark_id": 1, "rss": True}, +} + +mac_ipv6_tcp_drop = { + "sub_casename": "mac_ipv6_tcp_drop", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000140600CDCD910A222254988475111139001010CDCD910A2222549884751111390020200016001700000000000000005000000000000000 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 / end actions drop / end", + ], + "packet": MAC_IPv6_TCP, + "check_param": {"port_id": 0, "drop": True}, +} + +# Test case 2: ICE_FDIR_MAC/IPv6/TCP +mac_ipv6_tcp = [ + mac_ipv6_tcp_queue, + mac_ipv6_tcp_rss, + mac_ipv6_tcp_passthru, + mac_ipv6_tcp_drop, +] + +MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/Raw("x" * 80)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.1.21")/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.1.20",dst="192.168.0.21")/Raw("x" * 80)', + ], +} + +mac_ipv4_udp_vxlan_mac_ipv4_pay_queue = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_pay_queue", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000460000000000110000C0A80014C0A80015000012B50032000008000000000000000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY, + "check_param": {"port_id": 0, "mark_id": 10, "queue": 1}, +} + +mac_ipv4_udp_vxlan_mac_ipv4_pay_rss = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_pay_rss", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000460000000000110000C0A80014C0A80015000012B50032000008000000000000000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY, + "check_param": {"port_id": 0, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv4_udp_vxlan_mac_ipv4_pay_passthru = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_pay_passthru", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000460000000000110000C0A80014C0A80015000012B50032000008000000000000000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY, + "check_param": {"port_id": 0, "mark_id": 1, "rss": True}, +} + +mac_ipv4_udp_vxlan_mac_ipv4_pay_drop = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_pay_drop", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000460000000000110000C0A80014C0A80015000012B50032000008000000000000000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions drop / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY, + "check_param": {"port_id": 0, "drop": True}, +} + +# Test case 3: ICE_FDIR_MAC/IPv4/UDP/VXLAN/MAC/IPv4/PAY +mac_ipv4_udp_vxlan_mac_ipv4_pay = [ + mac_ipv4_udp_vxlan_mac_ipv4_pay_queue, + mac_ipv4_udp_vxlan_mac_ipv4_pay_rss, + mac_ipv4_udp_vxlan_mac_ipv4_pay_passthru, + mac_ipv4_udp_vxlan_mac_ipv4_pay_drop, +] + +MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/UDP()/("X"*480)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.10.20",dst="192.168.0.21")/UDP()/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.10.21")/UDP()/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/TCP()/("X"*480)', + ], +} + +mac_ipv4_udp_vxlan_mac_ipv4_udp_queue = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_udp_queue", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004E00000000001100000101010102020202000012B5003A0000080000000000000000000000000100000000000208004500001C0000000000110000C0A80014C0A800150000000000080000 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP, + "check_param": {"port_id": 0, "mark_id": 10, "queue": 1}, +} + +mac_ipv4_udp_vxlan_mac_ipv4_udp_rss = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_udp_rss", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004E00000000001100000101010102020202000012B5003A0000080000000000000000000000000100000000000208004500001C0000000000110000C0A80014C0A800150000000000080000 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP, + "check_param": {"port_id": 0, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv4_udp_vxlan_mac_ipv4_udp_passthru = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_udp_passthru", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004E00000000001100000101010102020202000012B5003A0000080000000000000000000000000100000000000208004500001C0000000000110000C0A80014C0A800150000000000080000 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP, + "check_param": {"port_id": 0, "mark_id": 1, "rss": True}, +} + +mac_ipv4_udp_vxlan_mac_ipv4_udp_drop = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_udp_drop", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004E00000000001100000101010102020202000012B5003A0000080000000000000000000000000100000000000208004500001C0000000000110000C0A80014C0A800150000000000080000 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions drop / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP, + "check_param": {"port_id": 0, "drop": True}, +} + +# Test case 4: ICE_FDIR_MAC/IPv4/UDP/VXLAN/MAC/IPv4/UDP +mac_ipv4_udp_vxlan_mac_ipv4_udp = [ + mac_ipv4_udp_vxlan_mac_ipv4_udp_queue, + mac_ipv4_udp_vxlan_mac_ipv4_udp_rss, + mac_ipv4_udp_vxlan_mac_ipv4_udp_passthru, + mac_ipv4_udp_vxlan_mac_ipv4_udp_drop, +] + +MAC_IPv4_UDP_VXLAN_MAC_IPv4_vni = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN(vni=3)/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN(vni=3)/Ether()/IP(src="192.168.10.20",dst="192.168.0.21")/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN(vni=3)/Ether()/IP(src="192.168.0.20",dst="192.168.10.21")/("X"*480)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN(vni=13)/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/("X"*480)', + ], +} + +mac_ipv4_udp_vxlan_mac_ipv4_vni_queue = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_vni_queue", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000003000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000 / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_vni, + "check_param": {"port_id": 0, "mark_id": 10, "queue": 1}, +} + +mac_ipv4_udp_vxlan_mac_ipv4_vni_rss = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_vni_rss", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000003000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000 / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_vni, + "check_param": {"port_id": 0, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv4_udp_vxlan_mac_ipv4_vni_passthru = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_vni_passthru", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000003000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000 / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_vni, + "check_param": {"port_id": 0, "mark_id": 1, "rss": True}, +} + +mac_ipv4_udp_vxlan_mac_ipv4_vni_drop = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_vni_drop", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000003000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000 / end actions drop / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_vni, + "check_param": {"port_id": 0, "drop": True}, +} + +# Test case 6: ICE_FDIR_MAC/IPv4/UDP/VXLAN/MAC/IPv4_vni +mac_ipv4_udp_vxlan_mac_ipv4_vni = [ + mac_ipv4_udp_vxlan_mac_ipv4_vni_queue, + mac_ipv4_udp_vxlan_mac_ipv4_vni_rss, + mac_ipv4_udp_vxlan_mac_ipv4_vni_passthru, + mac_ipv4_udp_vxlan_mac_ipv4_vni_drop, +] + +MAC_IPv4_UDP_GTPU_IPv4 = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.20", dst="192.168.10.21")/Raw("x"*20)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.30", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.20", dst="192.168.10.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.31")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.20", dst="192.168.10.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.30", dst="192.168.10.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.20", dst="192.168.10.31")/Raw("x"*20)', + ], +} + +mac_ipv4_udp_gtpu_ipv4_queue = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv4_queue", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000380000000000110000C0A80014C0A80015000008680024000030FF001400000000450000140000000000000000C0A80A14C0A80A15 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_IPv4, + "check_param": {"port_id": 0, "mark_id": 10, "queue": 1}, +} + +mac_ipv4_udp_gtpu_ipv4_rss = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv4_rss", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000380000000000110000C0A80014C0A80015000008680024000030FF001400000000450000140000000000000000C0A80A14C0A80A15 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_IPv4, + "check_param": {"port_id": 0, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv4_udp_gtpu_ipv4_passthru = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv4_passthru", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000380000000000110000C0A80014C0A80015000008680024000030FF001400000000450000140000000000000000C0A80A14C0A80A15 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_IPv4, + "check_param": {"port_id": 0, "mark_id": 1, "rss": True}, +} + +mac_ipv4_udp_gtpu_ipv4_drop = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv4_drop", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000380000000000110000C0A80014C0A80015000008680024000030FF001400000000450000140000000000000000C0A80A14C0A80A15 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions drop / end", + ], + "packet": MAC_IPv4_UDP_GTPU_IPv4, + "check_param": {"port_id": 0, "drop": True}, +} + +# Test case 7: ICE_FDIR_MAC/IPv4/UDP/GTPU/IPv4 +mac_ipv4_udp_gtpu_ipv4 = [ + mac_ipv4_udp_gtpu_ipv4_queue, + mac_ipv4_udp_gtpu_ipv4_rss, + mac_ipv4_udp_gtpu_ipv4_passthru, + mac_ipv4_udp_gtpu_ipv4_drop, +] + +MAC_IPv4_UDP_GTPU_IPv6_UDP = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP()/Raw("x"*20)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.10.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.10.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1011", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/UDP()/Raw("x"*20)', + ], +} + +mac_ipv4_udp_gtpu_ipv6_udp_queue = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv6_udp_queue", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000540000000000110000C0A80014C0A80015000008680040000030FF0030000000006000000000081100CDCD910A222254988475111139001010CDCD910A2222549884751111390020210000000000080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_IPv6_UDP, + "check_param": {"port_id": 0, "mark_id": 10, "queue": 1}, +} + +mac_ipv4_udp_gtpu_ipv6_udp_rss = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv6_udp_rss", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000540000000000110000C0A80014C0A80015000008680040000030FF0030000000006000000000081100CDCD910A222254988475111139001010CDCD910A2222549884751111390020210000000000080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_IPv6_UDP, + "check_param": {"port_id": 0, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv4_udp_gtpu_ipv6_udp_passthru = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv6_udp_passthru", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000540000000000110000C0A80014C0A80015000008680040000030FF0030000000006000000000081100CDCD910A222254988475111139001010CDCD910A2222549884751111390020210000000000080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_IPv6_UDP, + "check_param": {"port_id": 0, "mark_id": 1, "rss": True}, +} + +mac_ipv4_udp_gtpu_ipv6_udp_drop = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv6_udp_drop", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000540000000000110000C0A80014C0A80015000008680040000030FF0030000000006000000000081100CDCD910A222254988475111139001010CDCD910A2222549884751111390020210000000000080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 / end actions drop / end", + ], + "packet": MAC_IPv4_UDP_GTPU_IPv6_UDP, + "check_param": {"port_id": 0, "drop": True}, +} + +# Test case 8: ICE_FDIR_MAC/IPv4/UDP/GTPU/IPv6/UDP +mac_ipv4_udp_gtpu_ipv6_udp = [ + mac_ipv4_udp_gtpu_ipv6_udp_queue, + mac_ipv4_udp_gtpu_ipv6_udp_rss, + mac_ipv4_udp_gtpu_ipv6_udp_passthru, + mac_ipv4_udp_gtpu_ipv6_udp_drop, +] + +MAC_IPv6_UDP_GTPU_DL_IPv4 = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.0.20", dst="192.168.0.21")/Raw("x"*20)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1011", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.0.20", dst="192.168.0.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.0.20", dst="192.168.0.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.10.20", dst="192.168.0.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.0.20", dst="192.168.10.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.0.20", dst="192.168.0.21")/Raw("x"*20)', + ], +} + +mac_ipv6_udp_gtpu_dl_ipv4_queue = { + "sub_casename": "mac_ipv6_udp_gtpu_dl_ipv4_queue", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000281100CDCD910A222254988475111139001010CDCD910A222254988475111139002021000008680028000034FF001C000000000000008501000000450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv6_UDP_GTPU_DL_IPv4, + "check_param": {"port_id": 0, "mark_id": 10, "queue": 1}, +} + +mac_ipv6_udp_gtpu_dl_ipv4_rss = { + "sub_casename": "mac_ipv6_udp_gtpu_dl_ipv4_rss", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000281100CDCD910A222254988475111139001010CDCD910A222254988475111139002021000008680028000034FF001C000000000000008501000000450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv6_UDP_GTPU_DL_IPv4, + "check_param": {"port_id": 0, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv6_udp_gtpu_dl_ipv4_passthru = { + "sub_casename": "mac_ipv6_udp_gtpu_dl_ipv4_passthru", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000281100CDCD910A222254988475111139001010CDCD910A222254988475111139002021000008680028000034FF001C000000000000008501000000450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv6_UDP_GTPU_DL_IPv4, + "check_param": {"port_id": 0, "mark_id": 1, "rss": True}, +} + +mac_ipv6_udp_gtpu_dl_ipv4_drop = { + "sub_casename": "mac_ipv6_udp_gtpu_dl_ipv4_drop", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000281100CDCD910A222254988475111139001010CDCD910A222254988475111139002021000008680028000034FF001C000000000000008501000000450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions drop / end", + ], + "packet": MAC_IPv6_UDP_GTPU_DL_IPv4, + "check_param": {"port_id": 0, "drop": True}, +} + +# Test case 9: ICE_FDIR_MAC/IPv6/UDP/GTPU/DL/IPv4 +mac_ipv6_udp_gtpu_dl_ipv4 = [ + mac_ipv6_udp_gtpu_dl_ipv4_queue, + mac_ipv6_udp_gtpu_dl_ipv4_rss, + mac_ipv6_udp_gtpu_dl_ipv4_passthru, + mac_ipv6_udp_gtpu_dl_ipv4_drop, +] + +MAC_IPv4_GTPU_UL_IPv4 = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/Raw("x"*20)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.10.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.10.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.11.20", dst="192.168.1.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.11.21")/Raw("x"*20)', + ], +} + +mac_ipv4_gtpu_ul_ipv4_queue = { + "sub_casename": "mac_ipv4_gtpu_ul_ipv4_queue", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500003C0000000000110000C0A80014C0A80015000008680028000034FF001C000000000000008501100000450000140000000000000000C0A80114C0A80115 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F00000000000000000000000000000FFFFFFFFFFFFFFFF / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv4_GTPU_UL_IPv4, + "check_param": {"port_id": 0, "mark_id": 10, "queue": 1}, +} + +mac_ipv4_gtpu_ul_ipv4_rss = { + "sub_casename": "mac_ipv4_gtpu_ul_ipv4_rss", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500003C0000000000110000C0A80014C0A80015000008680028000034FF001C000000000000008501100000450000140000000000000000C0A80114C0A80115 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F00000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv4_GTPU_UL_IPv4, + "check_param": {"port_id": 0, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv4_gtpu_ul_ipv4_passthru = { + "sub_casename": "mac_ipv4_gtpu_ul_ipv4_passthru", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500003C0000000000110000C0A80014C0A80015000008680028000034FF001C000000000000008501100000450000140000000000000000C0A80114C0A80115 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F00000000000000000000000000000FFFFFFFFFFFFFFFF / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv4_GTPU_UL_IPv4, + "check_param": {"port_id": 0, "mark_id": 1, "rss": True}, +} + +mac_ipv4_gtpu_ul_ipv4_drop = { + "sub_casename": "mac_ipv4_gtpu_ul_ipv4_drop", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500003C0000000000110000C0A80014C0A80015000008680028000034FF001C000000000000008501100000450000140000000000000000C0A80114C0A80115 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F00000000000000000000000000000FFFFFFFFFFFFFFFF / end actions drop / end", + ], + "packet": MAC_IPv4_GTPU_UL_IPv4, + "check_param": {"port_id": 0, "drop": True}, +} + +# Test case 10: ICE_FDIR_MAC/IPv4/UDP/GTPU/UL/IPv4 +mac_ipv4_gtpu_ul_ipv4 = [ + mac_ipv4_gtpu_ul_ipv4_queue, + mac_ipv4_gtpu_ul_ipv4_rss, + mac_ipv4_gtpu_ul_ipv4_passthru, + mac_ipv4_gtpu_ul_ipv4_drop, +] + +MAC_IPv4_UDP_GTPU_DL_IPv6 = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IPv6(src="CDCD:910A:2222:5498:8475:1111:4000:1010", dst="CDCD:910A:2222:5498:8475:1111:4000:2021")/Raw("x"*20)' + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IPv6(src="CDCD:910A:2222:5498:8475:1111:4000:1010", dst="CDCD:910A:2222:5498:8475:1111:4000:2021")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.10.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IPv6(src="CDCD:910A:2222:5498:8475:1111:4000:1010", dst="CDCD:910A:2222:5498:8475:1111:4000:2021")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.10.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IPv6(src="CDCD:910A:2222:5498:8475:1111:4000:1010", dst="CDCD:910A:2222:5498:8475:1111:4000:2021")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IPv6(src="CDCD:910A:2222:5498:8475:1111:4000:1011", dst="CDCD:910A:2222:5498:8475:1111:4000:2021")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IPv6(src="CDCD:910A:2222:5498:8475:1111:4000:1010", dst="CDCD:910A:2222:5498:8475:1111:4000:2022")/Raw("x"*20)', + ], +} + +mac_ipv4_udp_gtpu_dl_ipv6_queue = { + "sub_casename": "mac_ipv4_udp_gtpu_dl_ipv6_queue", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF00300000000000000085010000006000000000000000CDCD910A222254988475111140001010CDCD910A222254988475111140002021 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_DL_IPv6, + "check_param": {"port_id": 0, "mark_id": 10, "queue": 1}, +} + +mac_ipv4_udp_gtpu_dl_ipv6_rss = { + "sub_casename": "mac_ipv4_udp_gtpu_dl_ipv6_rss", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF00300000000000000085010000006000000000000000CDCD910A222254988475111140001010CDCD910A222254988475111140002021 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_DL_IPv6, + "check_param": {"port_id": 0, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv4_udp_gtpu_dl_ipv6_passthru = { + "sub_casename": "mac_ipv4_udp_gtpu_dl_ipv6_passthru", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF00300000000000000085010000006000000000000000CDCD910A222254988475111140001010CDCD910A222254988475111140002021 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_DL_IPv6, + "check_param": {"port_id": 0, "mark_id": 1, "rss": True}, +} + +mac_ipv4_udp_gtpu_dl_ipv6_drop = { + "sub_casename": "mac_ipv4_udp_gtpu_dl_ipv6_drop", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF00300000000000000085010000006000000000000000CDCD910A222254988475111140001010CDCD910A222254988475111140002021 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / end actions drop / end", + ], + "packet": MAC_IPv4_UDP_GTPU_DL_IPv6, + "check_param": {"port_id": 0, "drop": True}, +} + +# Test case 11: ICE_FDIR_MAC/IPv4/UDP/GTPU/DL/IPv6 +mac_ipv4_udp_gtpu_dl_ipv6 = [ + mac_ipv4_udp_gtpu_dl_ipv6_queue, + mac_ipv4_udp_gtpu_dl_ipv6_rss, + mac_ipv4_udp_gtpu_dl_ipv6_passthru, + mac_ipv4_udp_gtpu_dl_ipv6_drop, +] + +MAC_IPv4_UDP_GTPU_UL_IPv4_TCP = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.16.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.10.21")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + ], +} + +mac_ipv4_udp_gtpu_ul_ipv4_tcp_queue = { + "sub_casename": "mac_ipv4_udp_gtpu_ul_ipv4_tcp_queue", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF0030000000000000008501100000450000280000000000060000C0A80114C0A801150000000000000000000000005000000000000000 pattern mask 000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000 / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_UL_IPv4_TCP, + "check_param": {"port_id": 0, "mark_id": 10, "queue": 1}, +} + +mac_ipv4_udp_gtpu_ul_ipv4_tcp_rss = { + "sub_casename": "mac_ipv4_udp_gtpu_ul_ipv4_tcp_rss", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF0030000000000000008501100000450000280000000000060000C0A80114C0A801150000000000000000000000005000000000000000 pattern mask 000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000 / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_UL_IPv4_TCP, + "check_param": {"port_id": 0, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv4_udp_gtpu_ul_ipv4_tcp_passthru = { + "sub_casename": "mac_ipv4_udp_gtpu_ul_ipv4_tcp_passthru", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF0030000000000000008501100000450000280000000000060000C0A80114C0A801150000000000000000000000005000000000000000 pattern mask 000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000 / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_UL_IPv4_TCP, + "check_param": {"port_id": 0, "mark_id": 1, "rss": True}, +} + +mac_ipv4_udp_gtpu_ul_ipv4_tcp_drop = { + "sub_casename": "mac_ipv4_udp_gtpu_ul_ipv4_tcp_drop", + "rule": [ + "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF0030000000000000008501100000450000280000000000060000C0A80114C0A801150000000000000000000000005000000000000000 pattern mask 000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000 / end actions drop / end", + ], + "packet": MAC_IPv4_UDP_GTPU_UL_IPv4_TCP, + "check_param": {"port_id": 0, "drop": True}, +} + +# Test case 12: ICE_FDIR_MAC/IPv4/UDP/GTPU/UL/IPv4/TCP_un-word-aligned key +mac_ipv4_udp_gtpu_ul_ipv4_tcp = [ + mac_ipv4_udp_gtpu_ul_ipv4_tcp_queue, + mac_ipv4_udp_gtpu_ul_ipv4_tcp_rss, + mac_ipv4_udp_gtpu_ul_ipv4_tcp_passthru, + mac_ipv4_udp_gtpu_ul_ipv4_tcp_drop, +] + + +class TestIceFdirProtocolAgnosticFlow(TestCase): + """ + E810 enable Protocol agnostic flow offloading + """ + + def set_up_all(self): + """ + Run at the start of each test suite. + """ + self.skip_case("ICE" in self.nic, "%s nic not support this suite" % self.nic) + self.dports = self.dut.get_ports(self.nic) + # Verify that enough ports are available + self.verify(len(self.dports) >= 1, "Insufficient ports") + self.pmd_output = PmdOutput(self.dut) + self.tester_ifaces = [ + self.tester.get_interface(self.dut.ports_map[port]) for port in self.dports + ] + self.rxq = 16 + self.pkt = Packet() + self.fdirpro = FdirProcessing( + self, self.pmd_output, self.tester_ifaces, self.rxq + ) + self.logfmt = "*" * 20 + + @skip_unsupported_pkg("os default") + def set_up(self): + """ + Run before each test case. + """ + self.launch_testpmd() + + def launch_testpmd(self): + """ + launch testpmd with the command + """ + params = "--rxq={0} --txq={0}".format(self.rxq) + eal_params = '--log-level="pmd,7"' + self.pmd_output.start_testpmd( + param=params, eal_param=eal_params, ports=[self.dports[0]] + ) + self.pmd_output.execute_cmd("set fwd rxonly") + self.pmd_output.execute_cmd("set verbose 1") + self.pmd_output.execute_cmd("rx_vxlan_port add 4789 0") + self.pmd_output.execute_cmd("start") + self.pmd_output.wait_link_status_up(0) + + def get_pkt_statistic(self, out, **kwargs): + """ + :param out: information received by testpmd after sending packets and port statistics + :return: rx statistic dict, eg: {'rx-packets':1, 'rx-dropped':0, 'rx-total':1} + """ + p = re.compile( + r"Forward\sstatistics\s+for\s+port\s+{}\s+.*\n.*RX-packets:\s(\d+)\s+RX-dropped:\s(\d+)\s+RX-total:\s(\d+)\s".format( + kwargs.get("port_id") + ) + ) + item_name = ["rx-packets", "rx-dropped", "rx-total"] + statistic = p.findall(out) + if statistic: + static_dict = { + k: v for k, v in zip(item_name, list(map(int, list(statistic[0])))) + } + return static_dict + else: + raise Exception( + "got wrong output, not match pattern {}".format(p.pattern).replace( + "\\\\", "\\" + ) + ) + + def check_pkt_num(self, out, **kwargs): + """ + check number of received packets matches the expected value + :param out: information received by testpmd after sending packets and port statistics + :param kwargs: some specified parameters, such as: pkt_num, port_id + :return: rx statistic dict + """ + self.logger.info( + "{0} check pkt num for port:{1} {0}".format( + self.logfmt, kwargs.get("port_id") + ) + ) + pkt_num = kwargs.get("pkt_num") + res = self.get_pkt_statistic(out, **kwargs) + res_num = res["rx-total"] + self.verify( + res_num == pkt_num, + "fail: got wrong number of packets, expect pakcet number {}, got {}".format( + pkt_num, res_num + ), + ) + self.logger.info( + (GREEN("pass: pkt num is {} same as expected".format(pkt_num))) + ) + return res + + def check_queue(self, out, check_param, **kwargs): + """ + verify that queue value matches the expected value + :param out: information received by testpmd after sending packets and port statistics + :param check_param: check item name and value, eg + "check_param": {"port_id": 0, "queue": 2} + :param kwargs: some specified parameters, such as: pkt_num, port_id, stats + :return: + """ + self.logger.info("{0} check queue {0}".format(self.logfmt)) + queue = check_param["queue"] + if isinstance(check_param["queue"], int): + queue = [queue] + patt = re.compile( + r"port\s+{}/queue(.+?):\s+received\s+(\d+)\s+packets".format( + kwargs.get("port_id") + ) + ) + res = patt.findall(out) + if res: + pkt_queue = set([int(i[0]) for i in res]) + if kwargs.get("stats"): + self.verify( + all(q in queue for q in pkt_queue), + "fail: queue id not matched, expect queue {}, got {}".format( + queue, pkt_queue + ), + ) + self.logger.info((GREEN("pass: queue id {} matched".format(pkt_queue)))) + else: + try: + self.verify( + not any(q in queue for q in pkt_queue), + "fail: queue id should not matched, {} should not in {}".format( + pkt_queue, queue + ), + ) + self.logger.info( + (GREEN("pass: queue id {} not matched".format(pkt_queue))) + ) + except VerifyFailure: + self.logger.info( + "queue id {} contains the queue {} specified in rule, so need to check" + " whether the packet directed by rss or not".format( + pkt_queue, queue + ) + ) + # for mismatch packet the 'stats' parameter is False, need to change to True + kwargs["stats"] = True + self.check_rss(out, **kwargs) + + else: + raise Exception("got wrong output, not match pattern") + + def check_mark_id(self, out, check_param, **kwargs): + """ + verify that the mark ID matches the expected value + :param out: information received by testpmd after sending packets + :param check_param: check item name and value, eg + "check_param": {"port_id": 0, "mark_id": 1} + :param kwargs: some specified parameters,eg: stats + :return: None + usage: + check_mark_id(out, check_param, stats=stats) + """ + self.logger.info("{0} check mark id {0}".format(self.logfmt)) + fdir_scanner = re.compile("FDIR matched ID=(0x\w+)") + all_mark = fdir_scanner.findall(out) + stats = kwargs.get("stats") + if stats: + mark_list = set(int(i, 16) for i in all_mark) + self.verify( + all([i == check_param["mark_id"] for i in mark_list]) and mark_list, + "failed: some packet mark id of {} not match expect {}".format( + mark_list, check_param["mark_id"] + ), + ) + self.logger.info((GREEN("pass: all packets mark id are matched "))) + else: + # for mismatch packet,verify no mark id in output of received packet + self.verify( + not all_mark, "mark id {} in output, expect no mark id".format(all_mark) + ) + self.logger.info((GREEN("pass: no mark id in output"))) + + def check_rss(self, out, **kwargs): + """ + check whether the packet directed by rss or not according to the specified parameters + :param out: information received by testpmd after sending packets and port statistics + :param kwargs: some specified parameters, such as: rxq, stats + :return: queue value list + usage: + check_rss(out, rxq=rxq, stats=stats) + """ + self.logger.info("{0} check rss {0}".format(self.logfmt)) + rxq = kwargs.get("rxq") + p = re.compile("RSS\shash=(\w+)\s-\sRSS\squeue=(\w+)") + pkt_info = p.findall(out) + self.verify( + pkt_info, + "no information matching the pattern was found,pattern:{}".format( + p.pattern + ), + ) + pkt_queue = set([int(i[1], 16) for i in pkt_info]) + if kwargs.get("stats"): + self.verify( + all([int(i[0], 16) % rxq == int(i[1], 16) for i in pkt_info]), + "some pkt not directed by rss.", + ) + self.logger.info((GREEN("pass: all pkts directed by rss"))) + else: + self.verify( + not any([int(i[0], 16) % rxq == int(i[1], 16) for i in pkt_info]), + "some pkt directed by rss, expect not directed by rss", + ) + self.logger.info((GREEN("pass: no pkt directed by rss"))) + return pkt_queue + + def check_drop(self, out, **kwargs): + """ + check the drop number of packets according to the specified parameters + :param out: information received by testpmd after sending packets and port statistics + :param kwargs: some specified parameters, such as: pkt_num, port_id, stats + :return: None + usage: + chek_drop(out, pkt_num=pkt_num, port_id=portid, stats=stats) + """ + self.logger.info("{0} check drop {0}".format(self.logfmt)) + pkt_num = kwargs.get("pkt_num") + stats = kwargs.get("stats") + if "switch" in self.__class__.__name__.lower() and stats: + pkt_num = 0 + res = self.get_pkt_statistic(out, **kwargs) + self.verify( + pkt_num == res["rx-total"], + "failed: get wrong amount of packet {}, expected {}".format( + res["rx-total"], pkt_num + ), + ) + drop_packet_num = res["rx-dropped"] + if stats: + self.verify( + drop_packet_num == pkt_num, + "failed: {} packet dropped,expect {} dropped".format( + drop_packet_num, pkt_num + ), + ) + self.logger.info( + ( + GREEN( + "pass: drop packet number {} is matched".format(drop_packet_num) + ) + ) + ) + else: + self.verify( + drop_packet_num == 0 and res["rx-packets"] == pkt_num, + "failed: {} packet dropped, expect 0 packet dropped".format( + drop_packet_num + ), + ) + self.logger.info( + ( + GREEN( + "pass: drop packet number {} is matched".format(drop_packet_num) + ) + ) + ) + + def check_with_param(self, out, pkt_num, check_param, stats=True): + """ + according to the key and value of the check parameter, + perform the corresponding verification in the out information + :param out: information received by testpmd after sending packets and port statistics + :param pkt_num: number of packets sent + :param check_param: check item name and value, eg: + "check_param": {"port_id": 0, "mark_id": 1, "queue": 1} + "check_param": {"port_id": 0, "drop": 1} + :param stats: effective status of rule, True or False, default is True + :return: + usage: + check_with_param(out, pkt_num, check_param, stats) + check_with_param(out, pkt_num, check_param=check_param) + """ + rxq = self.rxq + port_id = ( + check_param["port_id"] if check_param.get("port_id") is not None else 0 + ) + match_flag = True + """ + check_dict shows the supported check items,the key is item name and value represent the check priority, + the smaller the value, the higher the priority, priority default value is 999. if need to add new check item, + please add it to the dict and implement the corresponding method and named as 'check_itemname',eg: check_queue + """ + default_pri = 999 + check_dict = { + "queue": default_pri, + "drop": default_pri, + "mark_id": 1, + "rss": default_pri, + } + params = {"port_id": port_id, "rxq": rxq, "pkt_num": pkt_num, "stats": stats} + # sort check_param order by priority, from high to low, set priority as 999 if key not in check_dict + check_param = OrderedDict( + sorted( + check_param.items(), + key=lambda item: check_dict.get(item[0], params["pkt_num"]), + ) + ) + if not check_param.get("drop"): + self.check_pkt_num(out, **params) + for k in check_param: + parameter = copy.deepcopy(params) + if k not in check_dict: + continue + func_name = "check_{}".format(k) + try: + func = getattr(self, func_name) + except AttributeError: + emsg = "{},this func is not implemented, please check!".format( + traceback.format_exc() + ) + raise Exception(emsg) + else: + # for mismatch packet, if the check item is 'rss',should also verify the packets are distributed by rss + if k == "rss" and not stats: + parameter["stats"] = True + match_flag = False + res = func(out=out, check_param=check_param, **parameter) + if k == "rss" and match_flag: + self.matched_queue.append(res) + + def send_pkt_get_output_flow( + self, pkts, port_id=0, count=1, interval=0, get_stats=False + ): + self.pmd_output.execute_cmd("clear port stats all") + tx_port = self.tester_ifaces[port_id] if port_id else self.tester_ifaces[0] + self.logger.info("----------send packet-------------") + self.logger.info("{}".format(pkts)) + if not isinstance(pkts, list): + pkts = [pkts] + self.pkt.update_pkt(pkts) + self.pkt.send_pkt( + crb=self.tester, + tx_port=tx_port, + count=count, + interval=interval, + ) + out1 = self.pmd_output.get_output(timeout=3) + if get_stats: + out2 = self.pmd_output.execute_cmd("show port stats all") + self.pmd_output.execute_cmd("stop") + else: + out2 = self.pmd_output.execute_cmd("stop") + self.pmd_output.execute_cmd("start") + return "".join([out1, out2]) + + def flow_rule_operate(self, case): + """ + test steps of flow rule case: + 1. create rule + 2. send and check match packets + 3. send and check mismatch packets + 4. list and destroy rule + 5. send and check match packet are distributed by rss + :param case: case dict info, eg: + mac_ipv4_pay_queue_index = { + "sub_casename": "mac_ipv4_pay_queue_index", + "rule": "flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 / end actions queue index 1 / end", + "packet": MAC_IPV4_PAY, + "check_param": {"port_id": 0, "queue": 1} + } + :return: None + """ + check_param = case.get("check_param") + port_id = check_param.get("port_id") if check_param.get("port_id") else 0 + tport_id = check_param.get("tport_id") if check_param.get("tport_id") else 0 + # validate and create rule + rule = case.get("rule") + extend_rule = case.get("extend_rule") + if extend_rule: + self.fdirpro.create_rule(extend_rule) + self.fdirpro.validate_rule(rule) + rule_li = self.fdirpro.create_rule(rule) + # send and check match packets + self.logger.info("{0} send and check match packets {0}".format(self.logfmt)) + match_pkts = case.get("packet").get("match") + self.verify(match_pkts, "no match packets in case info") + out1 = self.send_pkt_get_output_flow(pkts=match_pkts, port_id=tport_id) + self.matched_queue = [] + self.check_with_param( + out1, + pkt_num=len(match_pkts), + check_param=check_param, + ) + # send and check mismatch packets + self.logger.info("{0} send and check mismatch packets {0}".format(self.logfmt)) + mismatch_pkts = case.get("packet").get("mismatch") + self.verify(mismatch_pkts, "no mismatch packets in case info") + out2 = self.send_pkt_get_output_flow(pkts=mismatch_pkts) + self.check_with_param( + out2, + pkt_num=len(mismatch_pkts), + check_param=check_param, + stats=False, + ) + # list and destroy rule + self.logger.info("{0} list and destroy rule {0}".format(self.logfmt)) + self.fdirpro.check_rule(port_id=port_id, rule_list=rule_li) + self.fdirpro.destroy_rule(port_id=port_id, rule_id=rule_li) + # send match packet + self.logger.info( + "{0} send and check match packets after destroy rule {0}".format( + self.logfmt + ) + ) + out3 = self.send_pkt_get_output_flow(pkts=match_pkts) + self.check_with_param( + out3, + pkt_num=len(match_pkts), + check_param=check_param, + stats=False, + ) + if check_param.get("rss"): + self.verify( + self.matched_queue + and self.matched_queue[0 : len(match_pkts)] + == self.matched_queue[-len(match_pkts) :], + "send twice match packet, received in different queues", + ) + # check not rule exists + self.fdirpro.check_rule(port_id=port_id, stats=False, rule_list=rule_li) + + def rte_flow(self, case_list, func_name, **kwargs): + """ + main flow of case: + 1. iterate the case list and do the below steps: + a. get the subcase name and init dict to save result + b. call method by func name to execute case step + c. record case result and err msg if case failed + d. clear flow rule + 2. calculate the case passing rate according to the result dict + 3. record case result and pass rate in the case log file + 4. verify whether the case pass rate is equal to 100, if not, mark the case as failed and raise the err msg + :param case_list: case list, each item is a subcase of case + :param func_name: hadle case method name, eg: + 'flow_rule_operate': a method of 'FlowRuleProcessing' class, + used to handle flow rule related suites,such as fdir and switch_filter + 'handle_rss_distribute_cases': a method of 'RssProcessing' class, + used to handle rss related suites + :return: + usage: + for flow rule related: + rte_flow(caselist, flow_rule_operate) + for rss related: + rte_flow(caselist, handle_rss_distribute_cases) + """ + if not isinstance(case_list, list): + case_list = [case_list] + test_results = dict() + for case in case_list: + case_name = case.get("sub_casename") + test_results[case_name] = {} + try: + self.logger.info("{0} case_name:{1} {0}".format("*" * 20, case_name)) + case.update(kwargs) + func_name(case) + except Exception: + test_results[case_name]["result"] = "failed" + test_results[case_name]["err"] = re.sub( + r"['\r\n]", "", str(traceback.format_exc(limit=1)) + ).replace("\\\\", "\\") + self.logger.info( + ( + RED( + "case failed:{}, err:{}".format( + case_name, traceback.format_exc() + ) + ) + ) + ) + else: + test_results[case_name]["result"] = "passed" + self.logger.info((GREEN("case passed: {}".format(case_name)))) + finally: + check_param = case.get("check_param") + if check_param: + port_id = check_param.get("port_id") + else: + port_id = case.get("port_id") if case.get("port_id") else 0 + self.pmd_output.execute_cmd("flow flush %s" % port_id) + pass_rate = ( + round( + sum(1 for k in test_results if "passed" in test_results[k]["result"]) + / len(test_results), + 4, + ) + * 100 + ) + self.logger.info( + [ + "{}:{}".format(sub_name, test_results[sub_name]["result"]) + for sub_name in test_results + ] + ) + self.logger.info("pass rate is: {}".format(pass_rate)) + msg = [ + "subcase_name:{}:{},err:{}".format( + name, test_results[name].get("result"), test_results[name].get("err") + ) + for name in test_results.keys() + if "failed" in test_results[name]["result"] + ] + self.verify( + int(pass_rate) == 100, + "some subcases failed, detail as below:{}".format(msg), + ) + + def test_multi_rules_mac_ipv6_udp_vxlan_ipv4(self): + """ + Test case 13: ICE_FDIR_multi-rules_MAC/IPv6/UDP/VXLAN/IPv4 + """ + rules = [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000241100CDCD910A222254988475111139001010CDCD910A222254988475111139002020000012B5002400000800000000000000450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions queue index 4 / mark id 11 / end", + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000241100CDCD910A222254988475111139001010CDCD910A222254988475111139002020000012B5002400000800000000000000450000140000000000000000C0A80014C0A80015 pattern mask 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions queue index 1 / mark id 1 / end", + ] + packet = [ + 'Ether(dst="00:11:22:33:44:55")/IPv6()/UDP()/VXLAN()/IP(src="192.168.0.20",dst="192.168.0.21")/("X"*480)', + ] + check_param = {"port_id": 0, "mark_id": 11, "queue": 4} + # create rule + self.fdirpro.create_rule(rules[0], check_stats=True) + self.fdirpro.create_rule(rules[1], check_stats=False) + out = self.send_pkt_get_output_flow(packet, port_id=check_param["port_id"]) + # match rule 1 + self.check_with_param(out, len(packet), check_param=check_param) + + def test_mac_ipv4_udp_gtpu_ul_ipv4_tcp(self): + """ + Test case 12: ICE_FDIR_MAC/IPv4/UDP/GTPU/UL/IPv4/TCP_un-word-aligned key + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv4_udp_gtpu_ul_ipv4_tcp, func_name) + + def test_mac_ipv4_udp_gtpu_dl_ipv6(self): + """ + Test case 11: ICE_FDIR_MAC/IPv4/UDP/GTPU/DL/IPv6 + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv4_udp_gtpu_dl_ipv6, func_name) + + def test_mac_ipv4_gtpu_ul_ipv4(self): + """ + Test case 10: ICE_FDIR_MAC/IPv4/UDP/GTPU/UL/IPv4 + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv4_gtpu_ul_ipv4, func_name) + + def test_mac_ipv6_udp_gtpu_dl_ipv4(self): + """ + Test case 9: ICE_FDIR_MAC/IPv6/UDP/GTPU/DL/IPv4 + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv6_udp_gtpu_dl_ipv4, func_name) + + def test_mac_ipv4_udp_gtpu_ipv6_udp(self): + """ + Test case 8: ICE_FDIR_MAC/IPv4/UDP/GTPU/IPv6/UDP + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv4_udp_gtpu_ipv6_udp, func_name) + + def test_mac_ipv4_udp_gtpu_ipv4(self): + """ + Test case 7: ICE_FDIR_MAC/IPv4/GTPU/IPv4 + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv4_udp_gtpu_ipv4, func_name) + + def test_mac_ipv4_udp_vxlan_mac_ipv4_vni(self): + """ + # Test case 6: ICE_FDIR_MAC/IPv4/UDP/VXLAN/MAC/IPv4_vni + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4_vni, func_name) + + def test_mac_ipv4_udp_vxlan_mac_ipv4_udp(self): + """ + Test case 4: ICE_FDIR_MAC/IPv4/UDP/VXLAN/MAC/IPv4/UDP + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4_udp, func_name) + + def test_mac_ipv4_udp_vxlan_mac_ipv4_pay(self): + """ + Test case 3: ICE_FDIR_MAC/IPv4/UDP/VXLAN/MAC/IPv4/PAY + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4_pay, func_name) + + def test_mac_ipv6_tcp(self): + """ + Test case 2: ICE_FDIR_MAC/IPv6/TCP + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv6_tcp, func_name) + + def test_mac_ipv4_udp(self): + """ + Test case 1: ICE_FDIR_MAC/IPv4/UDP + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv4_udp, func_name) + + def tear_down(self): + """ + Run after each test case. + """ + try: + self.pmd_output.quit() + except: + self.dut.kill_all() + + def tear_down_all(self): + """ + Run after each test suite. + """ + self.dut.kill_all() From patchwork Tue Aug 2 19:04:39 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Jiale, SongX" X-Patchwork-Id: 114537 Return-Path: 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]) by inbox.dpdk.org (Postfix) with ESMTP id 32C36A0547; Tue, 2 Aug 2022 12:45:32 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 2BE2540141; Tue, 2 Aug 2022 12:45:32 +0200 (CEST) Received: from mga06.intel.com (mga06b.intel.com [134.134.136.31]) by mails.dpdk.org (Postfix) with ESMTP id E0DE7400D7 for ; Tue, 2 Aug 2022 12:45:29 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1659437130; x=1690973130; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=m/n4UuO2HRgKL+l6KvRbMk1o4qCoRZav/2/PrL/Af6w=; b=j6WstkbRoYTxXP6M7GdA4ORtBZiPnyGEDYk+xpNexL8f6iGZJjzxqJxY laJJcO43XjTZm5ICTmFajv1a5kSafuMeXus5vDhqU3wij3zipTaQwKpUj vJO01JOsPch0Uwo6ZQqrmJs2E5PzVbsKc/dq2ZNOGfwb2ITbmgZH3bOPG 6aiWZHksNXh67gwkGrIRok5J4hJFb4V8TNPTAfZMEQbYWseMZimeTTwDl G3622XnfZ4NRktzjQuGIU8mPgXZ+0wz8xLFnY/q3aX4ynT0RCauIYScO6 B3kWnDyeqP6NmI9RxV1/zjB33enI4fDork6YTgxxF0yaHstTAICpE9cbt Q==; X-IronPort-AV: E=McAfee;i="6400,9594,10426"; a="351087450" X-IronPort-AV: E=Sophos;i="5.93,210,1654585200"; d="scan'208";a="351087450" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Aug 2022 03:45:28 -0700 X-IronPort-AV: E=Sophos;i="5.93,210,1654585200"; d="scan'208";a="578173819" Received: from unknown (HELO cvl_tetser_105.icx.intel.com) ([10.239.252.94]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Aug 2022 03:45:27 -0700 From: Jiale Song To: dts@dpdk.org Cc: Jiale Song Subject: [dts] [PATCH V2 2/4] tests/iavf_fdir_protocol_agnostic_flow: add test cases Date: Tue, 2 Aug 2022 19:04:39 +0000 Message-Id: <20220802190441.10272-2-songx.jiale@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220802190441.10272-1-songx.jiale@intel.com> References: <20220802190441.10272-1-songx.jiale@intel.com> X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dts-bounces@dpdk.org add test cases for iavf fdir protocol agnostic flow offloading. Signed-off-by: Jiale Song Acked-by: Fu, Qi --- ...tSuite_iavf_fdir_protocol_agnostic_flow.py | 1287 +++++++++++++++++ 1 file changed, 1287 insertions(+) create mode 100644 tests/TestSuite_iavf_fdir_protocol_agnostic_flow.py diff --git a/tests/TestSuite_iavf_fdir_protocol_agnostic_flow.py b/tests/TestSuite_iavf_fdir_protocol_agnostic_flow.py new file mode 100644 index 00000000..772d8ec2 --- /dev/null +++ b/tests/TestSuite_iavf_fdir_protocol_agnostic_flow.py @@ -0,0 +1,1287 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2022 Intel Corporation +# + + +import copy +import re +import traceback +from collections import OrderedDict + +from framework.exception import VerifyFailure +from framework.packet import Packet +from framework.pmd_output import PmdOutput +from framework.test_case import TestCase, skip_unsupported_pkg +from framework.utils import GREEN, RED + +from .rte_flow_common import FdirProcessing + +MAC_IPv4_UDP = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/UDP(sport=22,dport=23)/Raw("x" * 80)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.20",dst="192.168.0.21")/UDP(sport=22,dport=23)/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.22")/UDP(sport=22,dport=23)/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/UDP(sport=21,dport=23)/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/UDP(sport=22,dport=24)/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw("x" * 80)', + ], +} + +mac_ipv4_udp_queue = { + "sub_casename": "mac_ipv4_udp_queue", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500001C0000000000110000C0A80014C0A800150016001700080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000 / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv4_UDP, + "check_param": {"port_id": 1, "mark_id": 10, "queue": 1}, +} + +mac_ipv4_udp_rss = { + "sub_casename": "mac_ipv4_udp_rss", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500001C0000000000110000C0A80014C0A800150016001700080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000 / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv4_UDP, + "check_param": {"port_id": 1, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv4_udp_passthru = { + "sub_casename": "mac_ipv4_udp_passthru", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500001C0000000000110000C0A80014C0A800150016001700080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000 / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv4_UDP, + "check_param": {"port_id": 1, "mark_id": 1, "rss": True}, +} + +mac_ipv4_udp_drop = { + "sub_casename": "mac_ipv4_udp_drop", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500001C0000000000110000C0A80014C0A800150016001700080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000 / end actions drop / end", + ], + "packet": MAC_IPv4_UDP, + "check_param": {"port_id": 1, "drop": True}, +} + +# Test case 1: IAVF_FDIR_MAC/IPv4/UDP +mac_ipv4_udp = [ + mac_ipv4_udp_queue, + mac_ipv4_udp_rss, + mac_ipv4_udp_passthru, + mac_ipv4_udp_drop, +] + +MAC_IPv6_TCP = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="CDCD:910A:2222:5498:8475:1111:3900:1010")/TCP(sport=22,dport=23)/("X"*480)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2021", src="CDCD:910A:2222:5498:8475:1111:3900:1010")/TCP(sport=22,dport=23)/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="CDCD:910A:2222:5498:8475:1111:3900:1011")/TCP(sport=22,dport=23)/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="CDCD:910A:2222:5498:8475:1111:3900:1010")/TCP(sport=21,dport=23)/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="CDCD:910A:2222:5498:8475:1111:3900:1010")/TCP(sport=22,dport=24)/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="CDCD:910A:2222:5498:8475:1111:3900:1010")/UDP(sport=22,dport=23)/("X"*480)', + ], +} + +mac_ipv6_tcp_queue = { + "sub_casename": "mac_ipv6_tcp_queue", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000140600CDCD910A222254988475111139001010CDCD910A2222549884751111390020200016001700000000000000005000000000000000 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv6_TCP, + "check_param": {"port_id": 1, "mark_id": 10, "queue": 1}, +} + +mac_ipv6_tcp_rss = { + "sub_casename": "mac_ipv6_tcp_rss", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000140600CDCD910A222254988475111139001010CDCD910A2222549884751111390020200016001700000000000000005000000000000000 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv6_TCP, + "check_param": {"port_id": 1, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv6_tcp_passthru = { + "sub_casename": "mac_ipv6_tcp_passthru", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000140600CDCD910A222254988475111139001010CDCD910A2222549884751111390020200016001700000000000000005000000000000000 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv6_TCP, + "check_param": {"port_id": 1, "mark_id": 1, "rss": True}, +} + +mac_ipv6_tcp_drop = { + "sub_casename": "mac_ipv6_tcp_drop", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000140600CDCD910A222254988475111139001010CDCD910A2222549884751111390020200016001700000000000000005000000000000000 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 / end actions drop / end", + ], + "packet": MAC_IPv6_TCP, + "check_param": {"port_id": 1, "drop": True}, +} + +# Test case 2: IAVF_FDIR_MAC/IPv6/TCP +mac_ipv6_tcp = [ + mac_ipv6_tcp_queue, + mac_ipv6_tcp_rss, + mac_ipv6_tcp_passthru, + mac_ipv6_tcp_drop, +] + +MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/Raw("x" * 80)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.1.21")/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.1.20",dst="192.168.0.21")/Raw("x" * 80)', + ], +} + +mac_ipv4_udp_vxlan_mac_ipv4_pay_queue = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_pay_queue", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000460000000000110000C0A80014C0A80015000012B50032000008000000000000000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY, + "check_param": {"port_id": 1, "mark_id": 10, "queue": 1}, +} + +mac_ipv4_udp_vxlan_mac_ipv4_pay_rss = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_pay_rss", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000460000000000110000C0A80014C0A80015000012B50032000008000000000000000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY, + "check_param": {"port_id": 1, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv4_udp_vxlan_mac_ipv4_pay_passthru = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_pay_passthru", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000460000000000110000C0A80014C0A80015000012B50032000008000000000000000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY, + "check_param": {"port_id": 1, "mark_id": 1, "rss": True}, +} + +mac_ipv4_udp_vxlan_mac_ipv4_pay_drop = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_pay_drop", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000460000000000110000C0A80014C0A80015000012B50032000008000000000000000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions drop / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY, + "check_param": {"port_id": 1, "drop": True}, +} + +# Test case 3: IAVF_FDIR_MAC/IPv4/UDP/VXLAN/MAC/IPv4/PAY +mac_ipv4_udp_vxlan_mac_ipv4_pay = [ + mac_ipv4_udp_vxlan_mac_ipv4_pay_queue, + mac_ipv4_udp_vxlan_mac_ipv4_pay_rss, + mac_ipv4_udp_vxlan_mac_ipv4_pay_passthru, + mac_ipv4_udp_vxlan_mac_ipv4_pay_drop, +] + +MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/UDP()/("X"*480)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.10.20",dst="192.168.0.21")/UDP()/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.10.21")/UDP()/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/TCP()/("X"*480)', + ], +} + +mac_ipv4_udp_vxlan_mac_ipv4_udp_queue = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_udp_queue", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004E00000000001100000101010102020202000012B5003A0000080000000000000000000000000100000000000208004500001C0000000000110000C0A80014C0A800150000000000080000 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP, + "check_param": {"port_id": 1, "mark_id": 10, "queue": 1}, +} + +mac_ipv4_udp_vxlan_mac_ipv4_udp_rss = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_udp_rss", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004E00000000001100000101010102020202000012B5003A0000080000000000000000000000000100000000000208004500001C0000000000110000C0A80014C0A800150000000000080000 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP, + "check_param": {"port_id": 1, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv4_udp_vxlan_mac_ipv4_udp_passthru = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_udp_passthru", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004E00000000001100000101010102020202000012B5003A0000080000000000000000000000000100000000000208004500001C0000000000110000C0A80014C0A800150000000000080000 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP, + "check_param": {"port_id": 1, "mark_id": 1, "rss": True}, +} + +mac_ipv4_udp_vxlan_mac_ipv4_udp_drop = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_udp_drop", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004E00000000001100000101010102020202000012B5003A0000080000000000000000000000000100000000000208004500001C0000000000110000C0A80014C0A800150000000000080000 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions drop / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP, + "check_param": {"port_id": 1, "drop": True}, +} + +# Test case 4: IAVF_FDIR_MAC/IPv4/UDP/VXLAN/MAC/IPv4/UDP +mac_ipv4_udp_vxlan_mac_ipv4_udp = [ + mac_ipv4_udp_vxlan_mac_ipv4_udp_queue, + mac_ipv4_udp_vxlan_mac_ipv4_udp_rss, + mac_ipv4_udp_vxlan_mac_ipv4_udp_passthru, + mac_ipv4_udp_vxlan_mac_ipv4_udp_drop, +] + +MAC_IPv4_UDP_VXLAN_MAC_IPv4_vni = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN(vni=3)/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN(vni=3)/Ether()/IP(src="192.168.10.20",dst="192.168.0.21")/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN(vni=3)/Ether()/IP(src="192.168.0.20",dst="192.168.10.21")/("X"*480)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN(vni=13)/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/("X"*480)', + ], +} + +mac_ipv4_udp_vxlan_mac_ipv4_vni_queue = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_vni_queue", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000003000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000 / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_vni, + "check_param": {"port_id": 1, "mark_id": 10, "queue": 1}, +} + +mac_ipv4_udp_vxlan_mac_ipv4_vni_rss = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_vni_rss", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000003000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000 / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_vni, + "check_param": {"port_id": 1, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv4_udp_vxlan_mac_ipv4_vni_passthru = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_vni_passthru", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000003000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000 / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_vni, + "check_param": {"port_id": 1, "mark_id": 1, "rss": True}, +} + +mac_ipv4_udp_vxlan_mac_ipv4_vni_drop = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_vni_drop", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000003000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F0000000000000000000000000000000000000000000000000000000000000000000000 / end actions drop / end", + ], + "packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_vni, + "check_param": {"port_id": 1, "drop": True}, +} + +# Test case 5: IAVF_FDIR_MAC/IPv4/UDP/VXLAN/MAC/IPv4_vni +mac_ipv4_udp_vxlan_mac_ipv4_vni = [ + mac_ipv4_udp_vxlan_mac_ipv4_vni_queue, + mac_ipv4_udp_vxlan_mac_ipv4_vni_rss, + mac_ipv4_udp_vxlan_mac_ipv4_vni_passthru, + mac_ipv4_udp_vxlan_mac_ipv4_vni_drop, +] + +MAC_IPv4_UDP_GTPU_IPv4 = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.20", dst="192.168.10.21")/Raw("x"*20)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.30", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.20", dst="192.168.10.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.31")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.20", dst="192.168.10.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.30", dst="192.168.10.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.20", dst="192.168.10.31")/Raw("x"*20)', + ], +} + +mac_ipv4_udp_gtpu_ipv4_queue = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv4_queue", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000380000000000110000C0A80014C0A80015000008680024000030FF001400000000450000140000000000000000C0A80A14C0A80A15 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_IPv4, + "check_param": {"port_id": 1, "mark_id": 10, "queue": 1}, +} + +mac_ipv4_udp_gtpu_ipv4_rss = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv4_rss", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000380000000000110000C0A80014C0A80015000008680024000030FF001400000000450000140000000000000000C0A80A14C0A80A15 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_IPv4, + "check_param": {"port_id": 1, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv4_udp_gtpu_ipv4_passthru = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv4_passthru", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000380000000000110000C0A80014C0A80015000008680024000030FF001400000000450000140000000000000000C0A80A14C0A80A15 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_IPv4, + "check_param": {"port_id": 1, "mark_id": 1, "rss": True}, +} + +mac_ipv4_udp_gtpu_ipv4_drop = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv4_drop", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000380000000000110000C0A80014C0A80015000008680024000030FF001400000000450000140000000000000000C0A80A14C0A80A15 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions drop / end", + ], + "packet": MAC_IPv4_UDP_GTPU_IPv4, + "check_param": {"port_id": 1, "drop": True}, +} + +# Test case 6: IAVF_FDIR_MAC/IPv4/UDP/GTPU/IPv4 +mac_ipv4_udp_gtpu_ipv4 = [ + mac_ipv4_udp_gtpu_ipv4_queue, + mac_ipv4_udp_gtpu_ipv4_rss, + mac_ipv4_udp_gtpu_ipv4_passthru, + mac_ipv4_udp_gtpu_ipv4_drop, +] + +MAC_IPv4_UDP_GTPU_IPv6_UDP = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP()/Raw("x"*20)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.10.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.10.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1011", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/UDP()/Raw("x"*20)', + ], +} + +mac_ipv4_udp_gtpu_ipv6_udp_queue = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv6_udp_queue", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000540000000000110000C0A80014C0A80015000008680040000030FF0030000000006000000000081100CDCD910A222254988475111139001010CDCD910A2222549884751111390020210000000000080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_IPv6_UDP, + "check_param": {"port_id": 1, "mark_id": 10, "queue": 1}, +} + +mac_ipv4_udp_gtpu_ipv6_udp_rss = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv6_udp_rss", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000540000000000110000C0A80014C0A80015000008680040000030FF0030000000006000000000081100CDCD910A222254988475111139001010CDCD910A2222549884751111390020210000000000080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_IPv6_UDP, + "check_param": {"port_id": 1, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv4_udp_gtpu_ipv6_udp_passthru = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv6_udp_passthru", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000540000000000110000C0A80014C0A80015000008680040000030FF0030000000006000000000081100CDCD910A222254988475111139001010CDCD910A2222549884751111390020210000000000080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_IPv6_UDP, + "check_param": {"port_id": 1, "mark_id": 1, "rss": True}, +} + +mac_ipv4_udp_gtpu_ipv6_udp_drop = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv6_udp_drop", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000540000000000110000C0A80014C0A80015000008680040000030FF0030000000006000000000081100CDCD910A222254988475111139001010CDCD910A2222549884751111390020210000000000080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000 / end actions drop / end", + ], + "packet": MAC_IPv4_UDP_GTPU_IPv6_UDP, + "check_param": {"port_id": 1, "drop": True}, +} + +# Test case 7: IAVF_FDIR_MAC/IPv4/UDP/GTPU/IPv6/UDP +mac_ipv4_udp_gtpu_ipv6_udp = [ + mac_ipv4_udp_gtpu_ipv6_udp_queue, + mac_ipv4_udp_gtpu_ipv6_udp_rss, + mac_ipv4_udp_gtpu_ipv6_udp_passthru, + mac_ipv4_udp_gtpu_ipv6_udp_drop, +] + +MAC_IPv6_UDP_GTPU_DL_IPv4 = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.0.20", dst="192.168.0.21")/Raw("x"*20)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1011", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.0.20", dst="192.168.0.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.0.20", dst="192.168.0.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.10.20", dst="192.168.0.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.0.20", dst="192.168.10.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.0.20", dst="192.168.0.21")/Raw("x"*20)', + ], +} + +mac_ipv6_udp_gtpu_dl_ipv4_queue = { + "sub_casename": "mac_ipv6_udp_gtpu_dl_ipv4_queue", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000281100CDCD910A222254988475111139001010CDCD910A222254988475111139002021000008680028000034FF001C000000000000008501000000450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv6_UDP_GTPU_DL_IPv4, + "check_param": {"port_id": 1, "mark_id": 10, "queue": 1}, +} + +mac_ipv6_udp_gtpu_dl_ipv4_rss = { + "sub_casename": "mac_ipv6_udp_gtpu_dl_ipv4_rss", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000281100CDCD910A222254988475111139001010CDCD910A222254988475111139002021000008680028000034FF001C000000000000008501000000450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv6_UDP_GTPU_DL_IPv4, + "check_param": {"port_id": 1, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv6_udp_gtpu_dl_ipv4_passthru = { + "sub_casename": "mac_ipv6_udp_gtpu_dl_ipv4_passthru", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000281100CDCD910A222254988475111139001010CDCD910A222254988475111139002021000008680028000034FF001C000000000000008501000000450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv6_UDP_GTPU_DL_IPv4, + "check_param": {"port_id": 1, "mark_id": 1, "rss": True}, +} + +mac_ipv6_udp_gtpu_dl_ipv4_drop = { + "sub_casename": "mac_ipv6_udp_gtpu_dl_ipv4_drop", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000281100CDCD910A222254988475111139001010CDCD910A222254988475111139002021000008680028000034FF001C000000000000008501000000450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions drop / end", + ], + "packet": MAC_IPv6_UDP_GTPU_DL_IPv4, + "check_param": {"port_id": 1, "drop": True}, +} + +# Test case 8: IAVF_FDIR_MAC/IPv6/UDP/GTPU/DL/IPv4 +mac_ipv6_udp_gtpu_dl_ipv4 = [ + mac_ipv6_udp_gtpu_dl_ipv4_queue, + mac_ipv6_udp_gtpu_dl_ipv4_rss, + mac_ipv6_udp_gtpu_dl_ipv4_passthru, + mac_ipv6_udp_gtpu_dl_ipv4_drop, +] + +MAC_IPv4_GTPU_UL_IPv4 = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/Raw("x"*20)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.10.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.10.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.11.20", dst="192.168.1.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.11.21")/Raw("x"*20)', + ], +} + +mac_ipv4_gtpu_ul_ipv4_queue = { + "sub_casename": "mac_ipv4_gtpu_ul_ipv4_queue", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500003C0000000000110000C0A80014C0A80015000008680028000034FF001C000000000000008501100000450000140000000000000000C0A80114C0A80115 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F00000000000000000000000000000FFFFFFFFFFFFFFFF / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv4_GTPU_UL_IPv4, + "check_param": {"port_id": 1, "mark_id": 10, "queue": 1}, +} + +mac_ipv4_gtpu_ul_ipv4_rss = { + "sub_casename": "mac_ipv4_gtpu_ul_ipv4_rss", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500003C0000000000110000C0A80014C0A80015000008680028000034FF001C000000000000008501100000450000140000000000000000C0A80114C0A80115 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F00000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv4_GTPU_UL_IPv4, + "check_param": {"port_id": 1, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv4_gtpu_ul_ipv4_passthru = { + "sub_casename": "mac_ipv4_gtpu_ul_ipv4_passthru", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500003C0000000000110000C0A80014C0A80015000008680028000034FF001C000000000000008501100000450000140000000000000000C0A80114C0A80115 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F00000000000000000000000000000FFFFFFFFFFFFFFFF / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv4_GTPU_UL_IPv4, + "check_param": {"port_id": 1, "mark_id": 1, "rss": True}, +} + +mac_ipv4_gtpu_ul_ipv4_drop = { + "sub_casename": "mac_ipv4_gtpu_ul_ipv4_drop", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500003C0000000000110000C0A80014C0A80015000008680028000034FF001C000000000000008501100000450000140000000000000000C0A80114C0A80115 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F00000000000000000000000000000FFFFFFFFFFFFFFFF / end actions drop / end", + ], + "packet": MAC_IPv4_GTPU_UL_IPv4, + "check_param": {"port_id": 1, "drop": True}, +} + +# Test case 9: IAVF_FDIR_MAC/IPv4/UDP/GTPU/UL/IPv4 +mac_ipv4_gtpu_ul_ipv4 = [ + mac_ipv4_gtpu_ul_ipv4_queue, + mac_ipv4_gtpu_ul_ipv4_rss, + mac_ipv4_gtpu_ul_ipv4_passthru, + mac_ipv4_gtpu_ul_ipv4_drop, +] + +MAC_IPv4_UDP_GTPU_DL_IPv6 = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IPv6(src="CDCD:910A:2222:5498:8475:1111:4000:1010", dst="CDCD:910A:2222:5498:8475:1111:4000:2021")/Raw("x"*20)' + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IPv6(src="CDCD:910A:2222:5498:8475:1111:4000:1010", dst="CDCD:910A:2222:5498:8475:1111:4000:2021")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.10.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IPv6(src="CDCD:910A:2222:5498:8475:1111:4000:1010", dst="CDCD:910A:2222:5498:8475:1111:4000:2021")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.10.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IPv6(src="CDCD:910A:2222:5498:8475:1111:4000:1010", dst="CDCD:910A:2222:5498:8475:1111:4000:2021")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IPv6(src="CDCD:910A:2222:5498:8475:1111:4000:1011", dst="CDCD:910A:2222:5498:8475:1111:4000:2021")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IPv6(src="CDCD:910A:2222:5498:8475:1111:4000:1010", dst="CDCD:910A:2222:5498:8475:1111:4000:2022")/Raw("x"*20)', + ], +} + +mac_ipv4_udp_gtpu_dl_ipv6_queue = { + "sub_casename": "mac_ipv4_udp_gtpu_dl_ipv6_queue", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF00300000000000000085010000006000000000000000CDCD910A222254988475111140001010CDCD910A222254988475111140002021 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_DL_IPv6, + "check_param": {"port_id": 1, "mark_id": 10, "queue": 1}, +} + +mac_ipv4_udp_gtpu_dl_ipv6_rss = { + "sub_casename": "mac_ipv4_udp_gtpu_dl_ipv6_rss", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF00300000000000000085010000006000000000000000CDCD910A222254988475111140001010CDCD910A222254988475111140002021 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_DL_IPv6, + "check_param": {"port_id": 1, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv4_udp_gtpu_dl_ipv6_passthru = { + "sub_casename": "mac_ipv4_udp_gtpu_dl_ipv6_passthru", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF00300000000000000085010000006000000000000000CDCD910A222254988475111140001010CDCD910A222254988475111140002021 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_DL_IPv6, + "check_param": {"port_id": 1, "mark_id": 1, "rss": True}, +} + +mac_ipv4_udp_gtpu_dl_ipv6_drop = { + "sub_casename": "mac_ipv4_udp_gtpu_dl_ipv6_drop", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF00300000000000000085010000006000000000000000CDCD910A222254988475111140001010CDCD910A222254988475111140002021 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000F000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / end actions drop / end", + ], + "packet": MAC_IPv4_UDP_GTPU_DL_IPv6, + "check_param": {"port_id": 1, "drop": True}, +} + +# Test case 10: IAVF_FDIR_MAC/IPv4/UDP/GTPU/DL/IPv6 +mac_ipv4_udp_gtpu_dl_ipv6 = [ + mac_ipv4_udp_gtpu_dl_ipv6_queue, + mac_ipv4_udp_gtpu_dl_ipv6_rss, + mac_ipv4_udp_gtpu_dl_ipv6_passthru, + mac_ipv4_udp_gtpu_dl_ipv6_drop, +] + +MAC_IPv4_UDP_GTPU_UL_IPv4_TCP = { + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.16.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.10.21")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + ], +} + +mac_ipv4_udp_gtpu_ul_ipv4_tcp_queue = { + "sub_casename": "mac_ipv4_udp_gtpu_ul_ipv4_tcp_queue", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF0030000000000000008501100000450000280000000000060000C0A80114C0A801150000000000000000000000005000000000000000 pattern mask 000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000 / end actions queue index 1 / mark id 10 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_UL_IPv4_TCP, + "check_param": {"port_id": 1, "mark_id": 10, "queue": 1}, +} + +mac_ipv4_udp_gtpu_ul_ipv4_tcp_rss = { + "sub_casename": "mac_ipv4_udp_gtpu_ul_ipv4_tcp_rss", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF0030000000000000008501100000450000280000000000060000C0A80114C0A801150000000000000000000000005000000000000000 pattern mask 000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000 / end actions rss queues 0 1 2 3 end / mark id 4 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_UL_IPv4_TCP, + "check_param": {"port_id": 1, "mark_id": 4, "queue": [0, 1, 2, 3]}, +} + +mac_ipv4_udp_gtpu_ul_ipv4_tcp_passthru = { + "sub_casename": "mac_ipv4_udp_gtpu_ul_ipv4_tcp_passthru", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF0030000000000000008501100000450000280000000000060000C0A80114C0A801150000000000000000000000005000000000000000 pattern mask 000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000 / end actions passthru / mark id 1 / end", + ], + "packet": MAC_IPv4_UDP_GTPU_UL_IPv4_TCP, + "check_param": {"port_id": 1, "mark_id": 1, "rss": True}, +} + +mac_ipv4_udp_gtpu_ul_ipv4_tcp_drop = { + "sub_casename": "mac_ipv4_udp_gtpu_ul_ipv4_tcp_drop", + "rule": [ + "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF0030000000000000008501100000450000280000000000060000C0A80114C0A801150000000000000000000000005000000000000000 pattern mask 000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FF000000000000000000000000000000000000000000 / end actions drop / end", + ], + "packet": MAC_IPv4_UDP_GTPU_UL_IPv4_TCP, + "check_param": {"port_id": 1, "drop": True}, +} + +# Test case 11: IAVF_FDIR_MAC/IPv4/UDP/GTPU/UL/IPv4/TCP_un-word-aligned key +mac_ipv4_udp_gtpu_ul_ipv4_tcp = [ + mac_ipv4_udp_gtpu_ul_ipv4_tcp_queue, + mac_ipv4_udp_gtpu_ul_ipv4_tcp_rss, + mac_ipv4_udp_gtpu_ul_ipv4_tcp_passthru, + mac_ipv4_udp_gtpu_ul_ipv4_tcp_drop, +] + +vf1_mac = "00:11:22:33:44:55" + + +class TestIavfFdirProtocolAgnosticFlow(TestCase): + """ + E810 enable Protocol agnostic flow offloading + """ + + def set_up_all(self): + """ + Run at the start of each test suite. + """ + self.skip_case("ICE" in self.nic, "%s nic not support this suite" % self.nic) + self.dports = self.dut.get_ports(self.nic) + # Verify that enough ports are available + self.verify(len(self.dports) >= 1, "Insufficient ports") + self.pmd_output = PmdOutput(self.dut) + self.tester_ifaces = [ + self.tester.get_interface(self.dut.ports_map[port]) for port in self.dports + ] + self.pf_interface0 = self.dut.ports_info[self.dports[0]]["intf"] + self.create_iavf() + self.rxq = 16 + self.pkt = Packet() + self.fdirpro = FdirProcessing( + self, self.pmd_output, self.tester_ifaces, self.rxq + ) + self.logfmt = "*" * 20 + + @skip_unsupported_pkg("os default") + def set_up(self): + """ + Run before each test case. + """ + self.launch_testpmd() + + def create_iavf(self): + self.dut.restore_interfaces() + self.dut.generate_sriov_vfs_by_port(self.dports[0], 2) + # set VF0 as trust + self.dut.send_expect("ip link set %s vf 0 trust on" % self.pf_interface0, "#") + self.sriov_vfs_port = self.dut.ports_info[self.dports[0]]["vfs_port"] + self.vf_pci0 = self.sriov_vfs_port[0].pci + self.vf_pci1 = self.sriov_vfs_port[1].pci + try: + for port in self.sriov_vfs_port: + port.bind_driver(self.drivername) + self.dut.send_expect("ifconfig %s up" % self.pf_interface0, "# ") + self.dut.send_expect( + "ip link set %s vf 1 mac %s" % (self.pf_interface0, vf1_mac), "# " + ) + except Exception as e: + self.destroy_iavf() + raise Exception(e) + + def launch_testpmd(self): + """ + launch testpmd with the command + """ + params = "--rxq={0} --txq={0}".format(self.rxq) + eal_params = '-a {},cap=dcf -a {} --log-level="pmd,7"'.format( + self.vf_pci0, self.vf_pci1 + ) + self.pmd_output.start_testpmd(param=params, eal_param=eal_params) + self.pmd_output.execute_cmd("set fwd rxonly") + self.pmd_output.execute_cmd("set verbose 1") + self.pmd_output.execute_cmd("port config 0 udp_tunnel_port add vxlan 0x12b5") + self.pmd_output.execute_cmd("start") + self.pmd_output.wait_link_status_up(0) + + def destroy_iavf(self): + self.dut.destroy_sriov_vfs_by_port(self.dports[0]) + self.dut.bind_interfaces_linux(self.drivername) + + def get_pkt_statistic(self, out, **kwargs): + """ + :param out: information received by testpmd after sending packets and port statistics + :return: rx statistic dict, eg: {'rx-packets':1, 'rx-dropped':0, 'rx-total':1} + """ + p = re.compile( + r"Forward\sstatistics\s+for\s+port\s+{}\s+.*\n.*RX-packets:\s(\d+)\s+RX-dropped:\s(\d+)\s+RX-total:\s(\d+)\s".format( + kwargs.get("port_id") + ) + ) + item_name = ["rx-packets", "rx-dropped", "rx-total"] + statistic = p.findall(out) + if statistic: + static_dict = { + k: v for k, v in zip(item_name, list(map(int, list(statistic[0])))) + } + return static_dict + else: + raise Exception( + "got wrong output, not match pattern {}".format(p.pattern).replace( + "\\\\", "\\" + ) + ) + + def check_pkt_num(self, out, **kwargs): + """ + check number of received packets matches the expected value + :param out: information received by testpmd after sending packets and port statistics + :param kwargs: some specified parameters, such as: pkt_num, port_id + :return: rx statistic dict + """ + self.logger.info( + "{0} check pkt num for port:{1} {0}".format( + self.logfmt, kwargs.get("port_id") + ) + ) + pkt_num = kwargs.get("pkt_num") + res = self.get_pkt_statistic(out, **kwargs) + res_num = res["rx-total"] + self.verify( + res_num == pkt_num, + "fail: got wrong number of packets, expect pakcet number {}, got {}".format( + pkt_num, res_num + ), + ) + self.logger.info( + (GREEN("pass: pkt num is {} same as expected".format(pkt_num))) + ) + return res + + def check_queue(self, out, check_param, **kwargs): + """ + verify that queue value matches the expected value + :param out: information received by testpmd after sending packets and port statistics + :param check_param: check item name and value, eg + "check_param": {"port_id": 0, "queue": 2} + :param kwargs: some specified parameters, such as: pkt_num, port_id, stats + :return: + """ + self.logger.info("{0} check queue {0}".format(self.logfmt)) + queue = check_param["queue"] + if isinstance(check_param["queue"], int): + queue = [queue] + patt = re.compile( + r"port\s+{}/queue(.+?):\s+received\s+(\d+)\s+packets".format( + kwargs.get("port_id") + ) + ) + res = patt.findall(out) + if res: + pkt_queue = set([int(i[0]) for i in res]) + if kwargs.get("stats"): + self.verify( + all(q in queue for q in pkt_queue), + "fail: queue id not matched, expect queue {}, got {}".format( + queue, pkt_queue + ), + ) + self.logger.info((GREEN("pass: queue id {} matched".format(pkt_queue)))) + else: + try: + self.verify( + not any(q in queue for q in pkt_queue), + "fail: queue id should not matched, {} should not in {}".format( + pkt_queue, queue + ), + ) + self.logger.info( + (GREEN("pass: queue id {} not matched".format(pkt_queue))) + ) + except VerifyFailure: + self.logger.info( + "queue id {} contains the queue {} specified in rule, so need to check" + " whether the packet directed by rss or not".format( + pkt_queue, queue + ) + ) + # for mismatch packet the 'stats' parameter is False, need to change to True + kwargs["stats"] = True + self.check_rss(out, **kwargs) + + else: + raise Exception("got wrong output, not match pattern") + + def check_mark_id(self, out, check_param, **kwargs): + """ + verify that the mark ID matches the expected value + :param out: information received by testpmd after sending packets + :param check_param: check item name and value, eg + "check_param": {"port_id": 0, "mark_id": 1} + :param kwargs: some specified parameters,eg: stats + :return: None + usage: + check_mark_id(out, check_param, stats=stats) + """ + self.logger.info("{0} check mark id {0}".format(self.logfmt)) + fdir_scanner = re.compile("FDIR matched ID=(0x\w+)") + all_mark = fdir_scanner.findall(out) + stats = kwargs.get("stats") + if stats: + mark_list = set(int(i, 16) for i in all_mark) + self.verify( + all([i == check_param["mark_id"] for i in mark_list]) and mark_list, + "failed: some packet mark id of {} not match expect {}".format( + mark_list, check_param["mark_id"] + ), + ) + self.logger.info((GREEN("pass: all packets mark id are matched "))) + else: + # for mismatch packet,verify no mark id in output of received packet + self.verify( + not all_mark, "mark id {} in output, expect no mark id".format(all_mark) + ) + self.logger.info((GREEN("pass: no mark id in output"))) + + def check_rss(self, out, **kwargs): + """ + check whether the packet directed by rss or not according to the specified parameters + :param out: information received by testpmd after sending packets and port statistics + :param kwargs: some specified parameters, such as: rxq, stats + :return: queue value list + usage: + check_rss(out, rxq=rxq, stats=stats) + """ + self.logger.info("{0} check rss {0}".format(self.logfmt)) + rxq = kwargs.get("rxq") + p = re.compile("RSS\shash=(\w+)\s-\sRSS\squeue=(\w+)") + pkt_info = p.findall(out) + self.verify( + pkt_info, + "no information matching the pattern was found,pattern:{}".format( + p.pattern + ), + ) + pkt_queue = set([int(i[1], 16) for i in pkt_info]) + if kwargs.get("stats"): + self.verify( + all([int(i[0], 16) % rxq == int(i[1], 16) for i in pkt_info]), + "some pkt not directed by rss.", + ) + self.logger.info((GREEN("pass: all pkts directed by rss"))) + else: + self.verify( + not any([int(i[0], 16) % rxq == int(i[1], 16) for i in pkt_info]), + "some pkt directed by rss, expect not directed by rss", + ) + self.logger.info((GREEN("pass: no pkt directed by rss"))) + return pkt_queue + + def check_drop(self, out, **kwargs): + """ + check the drop number of packets according to the specified parameters + :param out: information received by testpmd after sending packets and port statistics + :param kwargs: some specified parameters, such as: pkt_num, port_id, stats + :return: None + usage: + chek_drop(out, pkt_num=pkt_num, port_id=portid, stats=stats) + """ + self.logger.info("{0} check drop {0}".format(self.logfmt)) + pkt_num = kwargs.get("pkt_num") + stats = kwargs.get("stats") + if "switch" in self.__class__.__name__.lower() and stats: + pkt_num = 0 + res = self.get_pkt_statistic(out, **kwargs) + self.verify( + pkt_num == res["rx-total"], + "failed: get wrong amount of packet {}, expected {}".format( + res["rx-total"], pkt_num + ), + ) + drop_packet_num = res["rx-dropped"] + if stats: + self.verify( + drop_packet_num == pkt_num, + "failed: {} packet dropped,expect {} dropped".format( + drop_packet_num, pkt_num + ), + ) + self.logger.info( + ( + GREEN( + "pass: drop packet number {} is matched".format(drop_packet_num) + ) + ) + ) + else: + self.verify( + drop_packet_num == 0 and res["rx-packets"] == pkt_num, + "failed: {} packet dropped, expect 0 packet dropped".format( + drop_packet_num + ), + ) + self.logger.info( + ( + GREEN( + "pass: drop packet number {} is matched".format(drop_packet_num) + ) + ) + ) + + def check_with_param(self, out, pkt_num, check_param, stats=True): + """ + according to the key and value of the check parameter, + perform the corresponding verification in the out information + :param out: information received by testpmd after sending packets and port statistics + :param pkt_num: number of packets sent + :param check_param: check item name and value, eg: + "check_param": {"port_id": 0, "mark_id": 1, "queue": 1} + "check_param": {"port_id": 0, "drop": 1} + :param stats: effective status of rule, True or False, default is True + :return: + usage: + check_with_param(out, pkt_num, check_param, stats) + check_with_param(out, pkt_num, check_param=check_param) + """ + rxq = self.rxq + port_id = ( + check_param["port_id"] if check_param.get("port_id") is not None else 0 + ) + match_flag = True + """ + check_dict shows the supported check items,the key is item name and value represent the check priority, + the smaller the value, the higher the priority, priority default value is 999. if need to add new check item, + please add it to the dict and implement the corresponding method and named as 'check_itemname',eg: check_queue + """ + default_pri = 999 + check_dict = { + "queue": default_pri, + "drop": default_pri, + "mark_id": 1, + "rss": default_pri, + } + params = {"port_id": port_id, "rxq": rxq, "pkt_num": pkt_num, "stats": stats} + # sort check_param order by priority, from high to low, set priority as 999 if key not in check_dict + check_param = OrderedDict( + sorted( + check_param.items(), + key=lambda item: check_dict.get(item[0], params["pkt_num"]), + ) + ) + if not check_param.get("drop"): + self.check_pkt_num(out, **params) + for k in check_param: + parameter = copy.deepcopy(params) + if k not in check_dict: + continue + func_name = "check_{}".format(k) + try: + func = getattr(self, func_name) + except AttributeError: + emsg = "{},this func is not implemented, please check!".format( + traceback.format_exc() + ) + raise Exception(emsg) + else: + # for mismatch packet, if the check item is 'rss',should also verify the packets are distributed by rss + if k == "rss" and not stats: + parameter["stats"] = True + match_flag = False + res = func(out=out, check_param=check_param, **parameter) + if k == "rss" and match_flag: + self.matched_queue.append(res) + + def send_pkt_get_output_flow( + self, pkts, port_id=0, count=1, interval=0, get_stats=False + ): + self.pmd_output.execute_cmd("clear port stats all") + tx_port = self.tester_ifaces[port_id] if port_id else self.tester_ifaces[0] + self.logger.info("----------send packet-------------") + self.logger.info("{}".format(pkts)) + if not isinstance(pkts, list): + pkts = [pkts] + self.pkt.update_pkt(pkts) + self.pkt.send_pkt( + crb=self.tester, + tx_port=tx_port, + count=count, + interval=interval, + ) + out1 = self.pmd_output.get_output(timeout=3) + if get_stats: + out2 = self.pmd_output.execute_cmd("show port stats all") + self.pmd_output.execute_cmd("stop") + else: + out2 = self.pmd_output.execute_cmd("stop") + self.pmd_output.execute_cmd("start") + return "".join([out1, out2]) + + def flow_rule_operate(self, case): + """ + test steps of flow rule case: + 1. create rule + 2. send and check match packets + 3. send and check mismatch packets + 4. list and destroy rule + 5. send and check match packet are distributed by rss + :param case: case dict info, eg: + mac_ipv4_pay_queue_index = { + "sub_casename": "mac_ipv4_pay_queue_index", + "rule": "flow create 0 ingress pattern eth / ipv4 src is 192.168.0.20 / end actions queue index 1 / end", + "packet": MAC_IPV4_PAY, + "check_param": {"port_id": 0, "queue": 1} + } + :return: None + """ + check_param = case.get("check_param") + port_id = check_param.get("port_id") if check_param.get("port_id") else 0 + tport_id = check_param.get("tport_id") if check_param.get("tport_id") else 0 + # validate and create rule + rule = case.get("rule") + extend_rule = case.get("extend_rule") + if extend_rule: + self.fdirpro.create_rule(extend_rule) + self.fdirpro.validate_rule(rule) + rule_li = self.fdirpro.create_rule(rule) + # send and check match packets + self.logger.info("{0} send and check match packets {0}".format(self.logfmt)) + match_pkts = case.get("packet").get("match") + self.verify(match_pkts, "no match packets in case info") + out1 = self.send_pkt_get_output_flow(pkts=match_pkts, port_id=tport_id) + self.matched_queue = [] + self.check_with_param( + out1, + pkt_num=len(match_pkts), + check_param=check_param, + ) + # send and check mismatch packets + self.logger.info("{0} send and check mismatch packets {0}".format(self.logfmt)) + mismatch_pkts = case.get("packet").get("mismatch") + self.verify(mismatch_pkts, "no mismatch packets in case info") + out2 = self.send_pkt_get_output_flow(pkts=mismatch_pkts) + self.check_with_param( + out2, + pkt_num=len(mismatch_pkts), + check_param=check_param, + stats=False, + ) + # list and destroy rule + self.logger.info("{0} list and destroy rule {0}".format(self.logfmt)) + self.fdirpro.check_rule(port_id=port_id, rule_list=rule_li) + self.fdirpro.destroy_rule(port_id=port_id, rule_id=rule_li) + # send match packet + self.logger.info( + "{0} send and check match packets after destroy rule {0}".format( + self.logfmt + ) + ) + out3 = self.send_pkt_get_output_flow(pkts=match_pkts) + self.check_with_param( + out3, + pkt_num=len(match_pkts), + check_param=check_param, + stats=False, + ) + if check_param.get("rss"): + self.verify( + self.matched_queue + and self.matched_queue[0 : len(match_pkts)] + == self.matched_queue[-len(match_pkts) :], + "send twice match packet, received in different queues", + ) + # check not rule exists + self.fdirpro.check_rule(port_id=port_id, stats=False, rule_list=rule_li) + + def rte_flow(self, case_list, func_name, **kwargs): + """ + main flow of case: + 1. iterate the case list and do the below steps: + a. get the subcase name and init dict to save result + b. call method by func name to execute case step + c. record case result and err msg if case failed + d. clear flow rule + 2. calculate the case passing rate according to the result dict + 3. record case result and pass rate in the case log file + 4. verify whether the case pass rate is equal to 100, if not, mark the case as failed and raise the err msg + :param case_list: case list, each item is a subcase of case + :param func_name: hadle case method name, eg: + 'flow_rule_operate': a method of 'FlowRuleProcessing' class, + used to handle flow rule related suites,such as fdir and switch_filter + 'handle_rss_distribute_cases': a method of 'RssProcessing' class, + used to handle rss related suites + :return: + usage: + for flow rule related: + rte_flow(caselist, flow_rule_operate) + for rss related: + rte_flow(caselist, handle_rss_distribute_cases) + """ + if not isinstance(case_list, list): + case_list = [case_list] + test_results = dict() + for case in case_list: + case_name = case.get("sub_casename") + test_results[case_name] = {} + try: + self.logger.info("{0} case_name:{1} {0}".format("*" * 20, case_name)) + case.update(kwargs) + func_name(case) + except Exception: + test_results[case_name]["result"] = "failed" + test_results[case_name]["err"] = re.sub( + r"['\r\n]", "", str(traceback.format_exc(limit=1)) + ).replace("\\\\", "\\") + self.logger.info( + ( + RED( + "case failed:{}, err:{}".format( + case_name, traceback.format_exc() + ) + ) + ) + ) + else: + test_results[case_name]["result"] = "passed" + self.logger.info((GREEN("case passed: {}".format(case_name)))) + finally: + check_param = case.get("check_param") + if check_param: + port_id = check_param.get("port_id") + else: + port_id = case.get("port_id") if case.get("port_id") else 0 + self.pmd_output.execute_cmd("flow flush %s" % port_id) + pass_rate = ( + round( + sum(1 for k in test_results if "passed" in test_results[k]["result"]) + / len(test_results), + 4, + ) + * 100 + ) + self.logger.info( + [ + "{}:{}".format(sub_name, test_results[sub_name]["result"]) + for sub_name in test_results + ] + ) + self.logger.info("pass rate is: {}".format(pass_rate)) + msg = [ + "subcase_name:{}:{},err:{}".format( + name, test_results[name].get("result"), test_results[name].get("err") + ) + for name in test_results.keys() + if "failed" in test_results[name]["result"] + ] + self.verify( + int(pass_rate) == 100, + "some subcases failed, detail as below:{}".format(msg), + ) + + def test_multi_rules_mac_ipv6_udp_vxlan_ipv4(self): + """ + Test case 12: IAVF_FDIR_multi-rules_MAC/IPv6/UDP/VXLAN/IPv4 + """ + rules = [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000241100CDCD910A222254988475111139001010CDCD910A222254988475111139002020000012B5002400000800000000000000450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions queue index 4 / mark id 11 / end", + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000241100CDCD910A222254988475111139001010CDCD910A222254988475111139002020000012B5002400000800000000000000450000140000000000000000C0A80014C0A80015 pattern mask 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions queue index 1 / mark id 1 / end", + ] + packet = [ + 'Ether(dst="00:11:22:33:44:55")/IPv6()/UDP()/VXLAN()/IP(src="192.168.0.20",dst="192.168.0.21")/("X"*480)', + ] + check_param = {"port_id": 1, "mark_id": 11, "queue": 4} + # check rule + self.fdirpro.create_rule(rules, check_stats=True) + out = self.send_pkt_get_output_flow(packet, port_id=0) + # match rule 1 + self.check_with_param(out, len(packet), check_param) + + def test_mac_ipv4_udp_gtpu_ul_ipv4_tcp(self): + """ + Test case 11: IAVF_FDIR_MAC/IPv4/UDP/GTPU/UL/IPv4/TCP_un-word-aligned key + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv4_udp_gtpu_ul_ipv4_tcp, func_name) + + def test_mac_ipv4_udp_gtpu_dl_ipv6(self): + """ + Test case 10: IAVF_FDIR_MAC/IPv4/UDP/GTPU/DL/IPv6 + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv4_udp_gtpu_dl_ipv6, func_name) + + def test_mac_ipv4_gtpu_ul_ipv4(self): + """ + Test case 9: IAVF_FDIR_MAC/IPv4/UDP/GTPU/UL/IPv4 + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv4_gtpu_ul_ipv4, func_name) + + def test_mac_ipv6_udp_gtpu_dl_ipv4(self): + """ + Test case 8: IAVF_FDIR_MAC/IPv6/UDP/GTPU/DL/IPv4 + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv6_udp_gtpu_dl_ipv4, func_name) + + def test_mac_ipv4_udp_gtpu_ipv6_udp(self): + """ + Test case 7: IAVF_FDIR_MAC/IPv4/UDP/GTPU/IPv6/UDP + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv4_udp_gtpu_ipv6_udp, func_name) + + def test_mac_ipv4_udp_gtpu_ipv4(self): + """ + Test case 6: IAVF_FDIR_MAC/IPv4/GTPU/IPv4 + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv4_udp_gtpu_ipv4, func_name) + + def test_mac_ipv4_udp_vxlan_mac_ipv4_vni(self): + """ + # Test case 5: IAVF_FDIR_MAC/IPv4/UDP/VXLAN/MAC/IPv4_vni + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4_vni, func_name) + + def test_mac_ipv4_udp_vxlan_mac_ipv4_udp(self): + """ + Test case 4: IAVF_FDIR_MAC/IPv4/UDP/VXLAN/MAC/IPv4/UDP + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4_udp, func_name) + + def test_mac_ipv4_udp_vxlan_mac_ipv4_pay(self): + """ + Test case 3: IAVF_FDIR_MAC/IPv4/UDP/VXLAN/MAC/IPv4/PAY + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4_pay, func_name) + + def test_mac_ipv6_tcp(self): + """ + Test case 2: IAVF_FDIR_MAC/IPv6/TCP + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv6_tcp, func_name) + + def test_mac_ipv4_udp(self): + """ + Test case 1: IAVF_FDIR_MAC/IPv4/UDP + """ + func_name = self.flow_rule_operate + self.rte_flow(mac_ipv4_udp, func_name) + + def tear_down(self): + """ + Run after each test case. + """ + try: + self.pmd_output.quit() + except: + self.dut.kill_all() + + def tear_down_all(self): + """ + Run after each test suite. + """ + self.dut.kill_all() + self.destroy_iavf() From patchwork Tue Aug 2 19:04:40 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Jiale, SongX" X-Patchwork-Id: 114538 Return-Path: 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]) by inbox.dpdk.org (Postfix) with ESMTP id 5272CA0545; Tue, 2 Aug 2022 12:45:33 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 4DF7042B84; Tue, 2 Aug 2022 12:45:33 +0200 (CEST) Received: from mga06.intel.com (mga06b.intel.com [134.134.136.31]) by mails.dpdk.org (Postfix) with ESMTP id 9C90540141 for ; Tue, 2 Aug 2022 12:45:30 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1659437130; x=1690973130; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=e3g+l/YSsWtPEf9RXfS/Xfe6Nrmor1eqe+CpBVCzfOI=; b=n5paPUTuxrzsYA2OnmhAngkwauX5gLo0MZ92UoPWdS01+HhDDA3aie3Y mFv6MuOurOKwYjhI3JojnOe3fNWOYi7Y8Q/kjo0R+kmVUSVn58I8fc2AC lb7wQH5nLNV4BVv32k5ZNCJy6cGbztUCWDOus/SFTHQ+HFUIJTa0a+3c3 AcD3BRYQxu3zV/btxW7Y0b39mYJv9yEk2tXl/+8i7v5UO6zfqCeVyYgaV d9UTqB1G7z4i1Unomd9HMi7Xq9AFBzhw8Di0g6oQ4xlqysWUfFgQ+DLzs E3C8/iPp3dBdujnFtNrGg+jhqLFJ3VJnkX0XLLI37dAIVaQV6TJR1fkxq g==; X-IronPort-AV: E=McAfee;i="6400,9594,10426"; a="351087455" X-IronPort-AV: E=Sophos;i="5.93,210,1654585200"; d="scan'208";a="351087455" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Aug 2022 03:45:30 -0700 X-IronPort-AV: E=Sophos;i="5.93,210,1654585200"; d="scan'208";a="578173825" Received: from unknown (HELO cvl_tetser_105.icx.intel.com) ([10.239.252.94]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Aug 2022 03:45:29 -0700 From: Jiale Song To: dts@dpdk.org Cc: Jiale Song Subject: [dts] [PATCH V2 3/4] tests/ice_rss_protocol_agnostic_flow: add test cases Date: Tue, 2 Aug 2022 19:04:40 +0000 Message-Id: <20220802190441.10272-3-songx.jiale@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220802190441.10272-1-songx.jiale@intel.com> References: <20220802190441.10272-1-songx.jiale@intel.com> X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dts-bounces@dpdk.org add test cases for ice rss protocol agnostic flow offloading. Signed-off-by: Jiale Song Acked-by: Fu, Qi --- ...estSuite_ice_rss_protocol_agnostic_flow.py | 627 ++++++++++++++++++ 1 file changed, 627 insertions(+) create mode 100644 tests/TestSuite_ice_rss_protocol_agnostic_flow.py diff --git a/tests/TestSuite_ice_rss_protocol_agnostic_flow.py b/tests/TestSuite_ice_rss_protocol_agnostic_flow.py new file mode 100644 index 00000000..8295a591 --- /dev/null +++ b/tests/TestSuite_ice_rss_protocol_agnostic_flow.py @@ -0,0 +1,627 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2022 Intel Corporation +# + +import re +import traceback + +from framework.pmd_output import PmdOutput +from framework.test_case import TestCase, skip_unsupported_pkg +from framework.utils import GREEN, RED + +from .rte_flow_common import RssProcessing + +MAC_IPv4_UDP = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21") /UDP(sport=22,dport=23)/Raw("x" * 80)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.20",dst="192.168.0.21")/UDP(sport=22,dport=23)/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.22")/UDP(sport=22,dport=23)/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/UDP(sport=21,dport=23)/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/UDP(sport=22,dport=24)/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw("x" * 80)', + ], +} +# Test case 1: ICE_RSS_MAC/IPv4/UDP +mac_ipv4_udp = { + "sub_casename": "mac_ipv4_udp", + "rule": "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500001C0000000000110000C0A80014C0A800150016001700080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000 / end actions rss queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP["basic"], + "action": {"save_hash": "ipv4-udp"}, + }, + { + "send_packet": MAC_IPv4_UDP["mismatch"], + "action": {"check_hash_different": "ipv4-udp"}, + }, + ], +} + +MAC_IPv6_TCP_sysmetric = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="CDCD:910A:2222:5498:8475:1111:3900:1010")/TCP(sport=22,dport=23)/("X"*480)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="CDCD:910A:2222:5498:8475:1111:3900:1010")/TCP(sport=23,dport=22)/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:1010", src="CDCD:910A:2222:5498:8475:1111:3900:2020")/TCP(sport=22,dport=23)/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:1010", src="CDCD:910A:2222:5498:8475:1111:3900:2020")/TCP(sport=23,dport=22)/("X"*480)', + ], +} +# Test case 2: ICE_RSS_MAC/IPv6/TCP_sysmetric +mac_ipv6_tcp_sysmetric = { + "sub_casename": "mac_ipv6_tcp_sysmetric", + "rule": "flow create 0 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000140600CDCD910A222254988475111139001010CDCD910A2222549884751111390020200016001700000000000000005000000000000000 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 / end actions rss func symmetric_toeplitz queues end / end", + "test": [ + { + "send_packet": MAC_IPv6_TCP_sysmetric["basic"], + "action": {"save_hash": "ipv6-tcp"}, + }, + { + "send_packet": MAC_IPv6_TCP_sysmetric["match"], + "action": {"check_hash_same": "ipv6-tcp"}, + }, + ], +} + +MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/Raw("x" * 80)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.10")/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP(dst="192.168.0.10")/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN(vni=33)/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/Raw("x" * 80)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.10.20",dst="192.168.0.21")/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.10.21")/Raw("x" * 80)', + ], +} +# Test case 3: ICE_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4/PAY +mac_ipv4_udp_vxlan_mac_ipv4_pay = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_pay", + "rule": "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000003000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY["basic"], + "action": {"save_hash": "ipv4_udp_vxlan_ipv4_pay"}, + }, + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY["mismatch"], + "action": {"check_hash_different": "ipv4_udp_vxlan_ipv4_pay"}, + }, + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY["match"], + "action": {"check_hash_same": "ipv4_udp_vxlan_ipv4_pay"}, + }, + ], +} + +MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/UDP()/("X"*480)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.10")/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/UDP()/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP(dst="192.168.0.10")/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/UDP()/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN(vni=33)/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/UDP()/("X"*480)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.10.20",dst="192.168.0.21")/UDP()/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.10.21")/UDP()/("X"*480)', + ], +} +# Test case 4: ICE_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4/UDP +mac_ipv4_udp_vxlan_mac_ipv4_udp = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_udp", + "rule": "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004E00000000001100000101010102020202000012B5003A0000080000000000000000000000000100000000000208004500001C0000000000110000C0A80014C0A800150000000000080000 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions rss queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP["basic"], + "action": {"save_hash": "ipv4_udp_vxlan_ipv6_pay"}, + }, + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP["mismatch"], + "action": {"check_hash_different": "ipv4_udp_vxlan_ipv6_pay"}, + }, + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP["match"], + "action": {"check_hash_same": "ipv4_udp_vxlan_ipv6_pay"}, + }, + ], +} + +MAC_IPv4_UDP_VXLAN_MAC_IPv4_sysmetric = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/Raw("x" * 80)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.21",dst="192.168.0.20")/Raw("x" * 80)', + ], +} +# Test case 5: ICE_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4_sysmetric +mac_ipv4_udp_vxlan_mac_ipv4_sysmetric = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_sysmetric", + "rule": "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000000000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss func symmetric_toeplitz queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_sysmetric["basic"], + "action": {"save_hash": "ipv6_udp_vxlan_ipv4_pay"}, + }, + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_sysmetric["match"], + "action": {"check_hash_same": "ipv6_udp_vxlan_ipv4_pay"}, + }, + ], +} + +MAC_IPv4_UDP_VXLAN_MAC_IPv4 = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/("X"*480)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.10.21")/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.10")/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP(dst="192.168.0.10")/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN(vni=22)/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/("X"*480)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.10.20",dst="192.168.0.21")/("X"*480)', + ], +} +# Test case 6: ICE_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4_inner-l3-src-only +mac_ipv4_udp_vxlan_mac_ipv4 = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4", + "rule": "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000000000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF00000000 / end actions rss queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4["basic"], + "action": {"save_hash": "ipv4_udp_vxlan_ipv6_tcp"}, + }, + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4["mismatch"], + "action": {"check_hash_different": "ipv4_udp_vxlan_ipv6_tcp"}, + }, + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4["match"], + "action": {"check_hash_same": "ipv4_udp_vxlan_ipv6_tcp"}, + }, + ], +} + +MAC_IPv4_UDP_GTPU_IPv4 = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.20", dst="192.168.10.21")/Raw("x"*20)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x567)/IP(src="192.168.10.20", dst="192.168.10.21")/Raw("x"*20)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.30", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.20", dst="192.168.10.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.31")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.20", dst="192.168.10.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.30", dst="192.168.10.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.20", dst="192.168.10.31")/Raw("x"*20)', + ], +} +# Test case 7: ICE_RSS_MAC/IPv4/UDP/GTPU/IPv4 +mac_ipv4_udp_gtpu_ipv4 = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv4", + "rule": "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000380000000000110000C0A80014C0A80015000008680024000030FF001400000000450000140000000000000000C0A80A14C0A80A15 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP_GTPU_IPv4["basic"], + "action": {"save_hash": "ipv4_gtpu_ipv4"}, + }, + { + "send_packet": MAC_IPv4_UDP_GTPU_IPv4["mismatch"], + "action": {"check_hash_different": "ipv4_gtpu_ipv4"}, + }, + { + "send_packet": MAC_IPv4_UDP_GTPU_IPv4["match"], + "action": {"check_hash_same": "ipv4_gtpu_ipv4"}, + }, + ], +} + +MAC_IPv4_UDP_GTPU_IPv6_UDP = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP()/Raw("x"*20)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1011", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/UDP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP()/Raw("x"*20)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.21", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.22")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP()/Raw("x"*20)', + ], +} +# Test case 8: ICE_RSS_MAC/IPv4/UDP/GTPU/IPv6/UDP_outer-l3 +mac_ipv4_udp_gtpu_ipv6_udp = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv6_udp", + "rule": "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000540000000000110000C0A80014C0A80015000008680040000030FF0030000000006000000000081100CDCD910A222254988475111139001010CDCD910A2222549884751111390020210000000000080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 / end actions rss queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP_GTPU_IPv6_UDP["basic"], + "action": {"save_hash": "ipv4_gtpu_ipv6_udp"}, + }, + { + "send_packet": MAC_IPv4_UDP_GTPU_IPv6_UDP["mismatch"], + "action": {"check_hash_different": "ipv4_gtpu_ipv6_udp"}, + }, + { + "send_packet": MAC_IPv4_UDP_GTPU_IPv6_UDP["match"], + "action": {"check_hash_same": "ipv4_gtpu_ipv6_udp"}, + }, + ], +} + +MAC_IPv4_UDP_GTPU_EH_IPv4_UDP_sysmetric = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/UDP()/Raw("x"*20)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.21", dst="192.168.1.20")/UDP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.21", dst="192.168.0.20")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/UDP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.21", dst="192.168.0.20")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.21", dst="192.168.1.20")/UDP()/Raw("x"*20)', + ], +} +# Test case 9: ICE_RSS_MAC/IPv4/UDP/GTPU/EH/IPv4/UDP_innersysmetric +mac_ipv4_udp_gtpu_eh_ipv4_udp_sysmetric = { + "sub_casename": "mac_ipv4_udp_gtpu_eh_ipv4_udp_sysmetric ", + "rule": "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000440000000000110000C0A80014C0A80014000008680030000034FF00240000000000000085010000004500001C0000000000110000C0A80114C0A801150000000000080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions rss func symmetric_toeplitz queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP_GTPU_EH_IPv4_UDP_sysmetric["basic"], + "action": {"save_hash": "ipv6_gtpu_eh_ipv4_tcp"}, + }, + { + "send_packet": MAC_IPv4_UDP_GTPU_EH_IPv4_UDP_sysmetric["match"], + "action": {"check_hash_same": "ipv6_gtpu_eh_ipv4_tcp"}, + }, + ], +} + +MAC_IPv4_UDP_GTPU_UL_IPv4 = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/Raw("x"*20)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.10.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.11.20", dst="192.168.1.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.11.21")/Raw("x"*20)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.10.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/Raw("x"*20)', + ], +} +# Test case 10: ICE_RSS_MAC/IPv4/UDP/GTPU/UL/IPv4_inner-l3-dst-only +mac_ipv4_udp_gtpu_ul_ipv4 = { + "sub_casename": "mac_ipv4_udp_gtpu_ul_ipv4", + "rule": "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500003C0000000000110000C0A80014C0A80015000008680028000034FF001C000000000000008501100000450000140000000000000000C0A80114C0A80115 pattern mask 000000000000000000000000000000000000000000000000000000000000FFFFFFFF000000000000000000000000000000000000000000F000000000000000000000000000000000000000000000 / end actions rss queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP_GTPU_UL_IPv4["basic"], + "action": {"save_hash": "ipv4_gtpu_ul_ipv4"}, + }, + { + "send_packet": MAC_IPv4_UDP_GTPU_UL_IPv4["mismatch"], + "action": {"check_hash_different": "ipv4_gtpu_ul_ipv4"}, + }, + { + "send_packet": MAC_IPv4_UDP_GTPU_UL_IPv4["match"], + "action": {"check_hash_same": "ipv4_gtpu_ul_ipv4"}, + }, + ], +} + +MAC_IPv4_UDP_GTPU_DL_IPv4_TCP = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.10.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.10.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.11.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.21", dst="192.168.1.21")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.22")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x123)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.22")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x123)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.22")/TCP()/Raw("x"*20)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="191.168.1.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.161.1.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + ], +} +# Test case 11: ICE_RSS_MAC/IPv4/UDP/GTPU/DL/IPv4/TCP_un-word-aligned key +mac_ipv4_udp_gtpu_dl_ipv4_tcp = { + "sub_casename": "mac_ipv4_udp_gtpu_dl_ipv4_tcp", + "rule": "flow create 0 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF0030000000000000008501000000450000280000000000060000C0A80114C0A801150000000000000000000000005000000000000000 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F00000000000000000000000000000FFFF0000000000000000000000000000000000000000000000000000 / end actions rss queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP_GTPU_DL_IPv4_TCP["basic"], + "action": {"save_hash": "ipv4_gtpu_dl_ipv4_tcp"}, + }, + { + "send_packet": MAC_IPv4_UDP_GTPU_DL_IPv4_TCP["mismatch"], + "action": {"check_hash_different": "ipv4_gtpu_dl_ipv4_tcp"}, + }, + { + "send_packet": MAC_IPv4_UDP_GTPU_DL_IPv4_TCP["match"], + "action": {"check_hash_same": "ipv4_gtpu_dl_ipv4_tcp"}, + }, + ], +} + + +class TestIceRssProtocolAgnosticFlow(TestCase): + """ + E810 enable Protocol agnostic flow offloading + """ + + def set_up_all(self): + """ + Run at the start of each test suite. + """ + self.skip_case("ICE" in self.nic, "%s nic not support this suite" % self.nic) + self.dports = self.dut.get_ports(self.nic) + # Verify that enough ports are available + self.verify(len(self.dports) >= 1, "Insufficient ports") + self.pmd_output = PmdOutput(self.dut) + self.tester_ifaces = [ + self.tester.get_interface(self.dut.ports_map[port]) for port in self.dports + ] + self.rxq = 16 + self.rsspro = RssProcessing(self, self.pmd_output, self.tester_ifaces, self.rxq) + + @skip_unsupported_pkg("os default") + def set_up(self): + """ + Run before each test case. + """ + self.launch_testpmd() + + def launch_testpmd(self): + """ + launch testpmd with the command + """ + params = "--rxq={0} --txq={0} --disable-rss --rxd=384 --txd=384".format( + self.rxq + ) + eal_params = '--log-level="pmd,7"' + self.pmd_output.start_testpmd( + param=params, eal_param=eal_params, ports=[self.dports[0]] + ) + self.pmd_output.execute_cmd("set fwd rxonly") + self.pmd_output.execute_cmd("set verbose 1") + self.pmd_output.execute_cmd("rx_vxlan_port add 4789 0") + self.pmd_output.execute_cmd("start") + self.pmd_output.wait_link_status_up(0) + + def rte_flow(self, case_list, func_name, **kwargs): + """ + main flow of case: + 1. iterate the case list and do the below steps: + a. get the subcase name and init dict to save result + b. call method by func name to execute case step + c. record case result and err msg if case failed + d. clear flow rule + 2. calculate the case passing rate according to the result dict + 3. record case result and pass rate in the case log file + 4. verify whether the case pass rate is equal to 100, if not, mark the case as failed and raise the err msg + :param case_list: case list, each item is a subcase of case + :param func_name: hadle case method name, eg: + 'flow_rule_operate': a method of 'FlowRuleProcessing' class, + used to handle flow rule related suites,such as fdir and switch_filter + 'handle_rss_distribute_cases': a method of 'RssProcessing' class, + used to handle rss related suites + :return: + usage: + for flow rule related: + rte_flow(caselist, flow_rule_operate) + for rss related: + rte_flow(caselist, handle_rss_distribute_cases) + """ + if not isinstance(case_list, list): + case_list = [case_list] + test_results = dict() + for case in case_list: + case_name = case.get("sub_casename") + test_results[case_name] = {} + try: + self.logger.info("{0} case_name:{1} {0}".format("*" * 20, case_name)) + case.update(kwargs) + func_name(case) + except Exception: + test_results[case_name]["result"] = "failed" + test_results[case_name]["err"] = re.sub( + r"['\r\n]", "", str(traceback.format_exc(limit=1)) + ).replace("\\\\", "\\") + self.logger.info( + ( + RED( + "case failed:{}, err:{}".format( + case_name, traceback.format_exc() + ) + ) + ) + ) + else: + test_results[case_name]["result"] = "passed" + self.logger.info((GREEN("case passed: {}".format(case_name)))) + finally: + check_param = case.get("check_param") + if check_param: + port_id = check_param.get("port_id") + else: + port_id = case.get("port_id") if case.get("port_id") else 0 + self.pmd_output.execute_cmd("flow flush %s" % port_id) + pass_rate = ( + round( + sum(1 for k in test_results if "passed" in test_results[k]["result"]) + / len(test_results), + 4, + ) + * 100 + ) + self.logger.info( + [ + "{}:{}".format(sub_name, test_results[sub_name]["result"]) + for sub_name in test_results + ] + ) + self.logger.info("pass rate is: {}".format(pass_rate)) + msg = [ + "subcase_name:{}:{},err:{}".format( + name, test_results[name].get("result"), test_results[name].get("err") + ) + for name in test_results.keys() + if "failed" in test_results[name]["result"] + ] + self.verify( + int(pass_rate) == 100, + "some subcases failed, detail as below:{}".format(msg), + ) + + def test_multi_rules_mac_ipv4_udp_vxlan_ipv6(self): + """ + Test case 12: ICE_RSS_multi-rules_MAC/IPv4/UDP/VXLAN/IPv6 + """ + rules = [ + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004C00000000001100000101010102020202000012B50038000008000000000000006000000000000000CDCD910A222254988475111139001010CDCD910A222254988475111139002021 pattern mask 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / end actions rss queues end / end", + "flow create 0 ingress pattern raw pattern spec 00112233445500000000000208004500004C00000000001100000101010102020202000012B50038000008000000000000006000000000000000CDCD910A222254988475111139001010CDCD910A222254988475111139002021 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 / end actions rss queues end / end", + ] + MAC_IPv4_UDP_VXLAN_IPv6 = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/("X"*480)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/("X"*480)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1011", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/("X"*480)', + ], + } + tests = [ + { + "send_packet": MAC_IPv4_UDP_VXLAN_IPv6["basic"], + "action": {"save_hash": "ipv4_udp_vxlan_ipv6"}, + }, + { + "send_packet": MAC_IPv4_UDP_VXLAN_IPv6["mismatch"], + "action": {"check_hash_different": "ipv4_udp_vxlan_ipv6"}, + }, + { + "send_packet": MAC_IPv4_UDP_VXLAN_IPv6["match"], + "action": {"check_hash_same": "ipv4_udp_vxlan_ipv6"}, + }, + ] + # create rule + self.rsspro.create_rule(rules, check_stats=True) + self.rsspro.error_msgs = [] + self.rsspro.error_msgs = [] + self.rsspro.handle_tests(tests, port_id=0) + if self.rsspro.error_msgs: + self.verify( + False, + " ".join( + [errs.replace("'", " ") for errs in self.rsspro.error_msgs[:500]] + ), + ) + + def test_mac_ipv4_udp_gtpu_dl_ipv4_tcp(self): + """ + Test case 11: ICE_RSS_MAC/IPv4/UDP/GTPU/DL/IPv4/TCP_un-word-aligned key + """ + func_name = self.rsspro.handle_rss_case + self.rte_flow(mac_ipv4_udp_gtpu_dl_ipv4_tcp, func_name, port_id=0) + + def test_mac_ipv4_udp_gtpu_ul_ipv4(self): + """ + Test case 10: ICE_RSS_MAC/IPv4/UDP/GTPU/UL/IPv4_inner-l3-dst-only + """ + func_name = self.rsspro.handle_rss_case + self.rte_flow(mac_ipv4_udp_gtpu_ul_ipv4, func_name, port_id=0) + + def test_mac_ipv4_udp_gtpu_eh_ipv4_udp_sysmetric(self): + """ + Test case 9: ICE_RSS_MAC/IPv4/GTPU/EH/IPv4/DUP_innersysmetric + """ + func_name = self.rsspro.handle_rss_case + self.rte_flow(mac_ipv4_udp_gtpu_eh_ipv4_udp_sysmetric, func_name, port_id=0) + + def test_mac_ipv4_udp_gtpu_ipv6_udp(self): + """ + # Test case 8: ICE_RSS_MAC/IPv4/UDP/GTPU/IPv6/UDP_outer-l3 + """ + func_name = self.rsspro.handle_rss_case + self.rte_flow(mac_ipv4_udp_gtpu_ipv6_udp, func_name, port_id=0) + + def test_mac_ipv4_udp_gtpu_ipv4(self): + """ + Test case 7: ICE_RSS_MAC/IPv4/UDP/GTPU/IPv4 + """ + func_name = self.rsspro.handle_rss_case + self.rte_flow(mac_ipv4_udp_gtpu_ipv4, func_name, port_id=0) + + def test_mac_ipv4_udp_vxlan_mac_ipv4(self): + """ + Test case 6: ICE_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4_inner-l3-src-only + """ + func_name = self.rsspro.handle_rss_case + self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4, func_name, port_id=0) + + def test_mac_ipv4_udp_vxlan_mac_ipv4_sysmetric(self): + """ + Test case 5: ICE_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4_sysmetric + """ + func_name = self.rsspro.handle_rss_case + self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4_sysmetric, func_name, port_id=0) + + def test_mac_ipv4_udp_vxlan_mac_ipv4_udp(self): + """ + Test case 4: ICE_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4/UDP + """ + func_name = self.rsspro.handle_rss_case + self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4_udp, func_name, port_id=0) + + def test_mac_ipv4_udp_vxlan_mac_ipv4_pay(self): + """ + Test case 3: ICE_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4/PAY + """ + func_name = self.rsspro.handle_rss_case + self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4_pay, func_name, port_id=0) + + def test_mac_ipv6_tcp_sysmetric(self): + """ + Test case 2: ICE_RSS_MAC/IPv6/TCP_sysmetric + """ + func_name = self.rsspro.handle_rss_case + self.rte_flow(mac_ipv6_tcp_sysmetric, func_name, port_id=0) + + def test_mac_ipv4_udp(self): + """ + Test case 1: ICE_RSS_MAC/IPv4/UDP + """ + func_name = self.rsspro.handle_rss_case + self.rte_flow(mac_ipv4_udp, func_name, port_id=0) + + def tear_down(self): + """ + Run after each test case. + """ + try: + self.pmd_output.quit() + except: + self.dut.kill_all() + + def tear_down_all(self): + """ + Run after each test suite. + """ + self.dut.kill_all() From patchwork Tue Aug 2 19:04:41 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Jiale, SongX" X-Patchwork-Id: 114539 Return-Path: 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]) by inbox.dpdk.org (Postfix) with ESMTP id 7D700A0547; Tue, 2 Aug 2022 12:45:34 +0200 (CEST) Received: from [217.70.189.124] (localhost [127.0.0.1]) by mails.dpdk.org (Postfix) with ESMTP id 7528242B77; Tue, 2 Aug 2022 12:45:34 +0200 (CEST) Received: from mga06.intel.com (mga06b.intel.com [134.134.136.31]) by mails.dpdk.org (Postfix) with ESMTP id 7224842B77 for ; Tue, 2 Aug 2022 12:45:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1659437132; x=1690973132; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=ws/6agSPl4qE65EqSKiDO8HkcCDOd5pdU1VDrRVCP4s=; b=ZCSm3tgDA0MB0IHaoa7B9OLRaEmIDINUuNl5pM+Da9d/O2idhLm6v8pp ifFwlywqaLiIphEGmC2v4JRkE2djW0CAazC83o/+dKTaBmNBc2/wyWBs1 pWDlprtGUSGQP5ZJLvc7Wwl8RbOE8Woj+XOuh5oJw8jVXX2rglNSmMf2e B7GzkQQ+jrYvIFpeXhfAmHtmuNqOVTeXeC1dEb+9Z1QUAwEeshJSV5sFC SXxTbJfRNbRa+iZteLiHLa7U2BdKze/EKIqwyKmcjnYW8snjmGoDbn1ep eFX5YtAxXDonMB1MOffnf9SS8gRY7LS6XQ9HWcXgAT0SILhlk6RW526F8 w==; X-IronPort-AV: E=McAfee;i="6400,9594,10426"; a="351087457" X-IronPort-AV: E=Sophos;i="5.93,210,1654585200"; d="scan'208";a="351087457" Received: from orsmga006.jf.intel.com ([10.7.209.51]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Aug 2022 03:45:31 -0700 X-IronPort-AV: E=Sophos;i="5.93,210,1654585200"; d="scan'208";a="578173832" Received: from unknown (HELO cvl_tetser_105.icx.intel.com) ([10.239.252.94]) by orsmga006-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Aug 2022 03:45:30 -0700 From: Jiale Song To: dts@dpdk.org Cc: Jiale Song Subject: [dts] [PATCH V2 4/4] tests/iavf_rss_protocol_agnostic_flow: add test cases Date: Tue, 2 Aug 2022 19:04:41 +0000 Message-Id: <20220802190441.10272-4-songx.jiale@intel.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20220802190441.10272-1-songx.jiale@intel.com> References: <20220802190441.10272-1-songx.jiale@intel.com> X-BeenThere: dts@dpdk.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: test suite reviews and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dts-bounces@dpdk.org add test cases for iavf rss protocol agnostic flow offloading. Signed-off-by: Jiale Song Tested-by: Weiyuan Li Acked-by: Fu, Qi --- ...stSuite_iavf_rss_protocol_agnostic_flow.py | 749 ++++++++++++++++++ 1 file changed, 749 insertions(+) create mode 100644 tests/TestSuite_iavf_rss_protocol_agnostic_flow.py diff --git a/tests/TestSuite_iavf_rss_protocol_agnostic_flow.py b/tests/TestSuite_iavf_rss_protocol_agnostic_flow.py new file mode 100644 index 00000000..54710d17 --- /dev/null +++ b/tests/TestSuite_iavf_rss_protocol_agnostic_flow.py @@ -0,0 +1,749 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright(c) 2022 Intel Corporation +# + +import re +import traceback + +from framework.packet import Packet +from framework.pmd_output import PmdOutput +from framework.test_case import TestCase, skip_unsupported_pkg +from framework.utils import GREEN, RED + +from .rte_flow_common import RssProcessing + +MAC_IPv4_UDP = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21") /UDP(sport=22,dport=23)/Raw("x" * 80)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.1.20",dst="192.168.0.21")/UDP(sport=22,dport=23)/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.22")/UDP(sport=22,dport=23)/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/UDP(sport=21,dport=23)/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/UDP(sport=22,dport=24)/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20",dst="192.168.0.21")/TCP(sport=22,dport=23)/Raw("x" * 80)', + ], +} +# Test case 1: IAVF_RSS_MAC/IPv4/UDP +mac_ipv4_udp = { + "sub_casename": "mac_ipv4_udp", + "rule": "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500001C0000000000110000C0A80014C0A800150016001700080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF00000000 / end actions rss queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP["basic"], + "action": {"save_hash": "ipv4-udp"}, + }, + { + "send_packet": MAC_IPv4_UDP["mismatch"], + "action": {"check_hash_different": "ipv4-udp"}, + }, + ], +} + +MAC_IPv6_TCP_sysmetric = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="CDCD:910A:2222:5498:8475:1111:3900:1010")/TCP(sport=22,dport=23)/("X"*480)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:2020", src="CDCD:910A:2222:5498:8475:1111:3900:1010")/TCP(sport=23,dport=22)/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:1010", src="CDCD:910A:2222:5498:8475:1111:3900:2020")/TCP(sport=22,dport=23)/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IPv6(dst="CDCD:910A:2222:5498:8475:1111:3900:1010", src="CDCD:910A:2222:5498:8475:1111:3900:2020")/TCP(sport=23,dport=22)/("X"*480)', + ], +} +# Test case 2: IAVF_RSS_MAC/IPv6/TCP_sysmetric +mac_ipv6_tcp_sysmetric = { + "sub_casename": "mac_ipv6_tcp_sysmetric", + "rule": "flow create 1 ingress pattern raw pattern spec 00112233445500000000000286DD6000000000140600CDCD910A222254988475111139001010CDCD910A2222549884751111390020200016001700000000000000005000000000000000 pattern mask 00000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 / end actions rss func symmetric_toeplitz queues end / end", + "test": [ + { + "send_packet": MAC_IPv6_TCP_sysmetric["basic"], + "action": {"save_hash": "ipv6-tcp"}, + }, + { + "send_packet": MAC_IPv6_TCP_sysmetric["match"], + "action": {"check_hash_same": "ipv6-tcp"}, + }, + ], +} + +MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/Raw("x" * 80)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.10")/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP(dst="192.168.0.10")/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN(vni=33)/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/Raw("x" * 80)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.10.20",dst="192.168.0.21")/Raw("x" * 80)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.10.21")/Raw("x" * 80)', + ], +} +# Test case 3: IAVF_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4/PAY +mac_ipv4_udp_vxlan_mac_ipv4_pay = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_pay", + "rule": "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000003000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY["basic"], + "action": {"save_hash": "ipv4_udp_vxlan_ipv4_pay"}, + }, + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY["mismatch"], + "action": {"check_hash_different": "ipv4_udp_vxlan_ipv4_pay"}, + }, + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_PAY["match"], + "action": {"check_hash_same": "ipv4_udp_vxlan_ipv4_pay"}, + }, + ], +} + +MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/UDP()/("X"*480)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.10")/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/UDP()/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP(dst="192.168.0.10")/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/UDP()/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN(vni=33)/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/UDP()/("X"*480)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.10.20",dst="192.168.0.21")/UDP()/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.10.21")/UDP()/("X"*480)', + ], +} +# Test case 4: IAVF_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4/UDP +mac_ipv4_udp_vxlan_mac_ipv4_udp = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_udp", + "rule": "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004E00000000001100000101010102020202000012B5003A0000080000000000000000000000000100000000000208004500001C0000000000110000C0A80014C0A800150000000000080000 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions rss queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP["basic"], + "action": {"save_hash": "ipv4_udp_vxlan_ipv6_pay"}, + }, + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP["mismatch"], + "action": {"check_hash_different": "ipv4_udp_vxlan_ipv6_pay"}, + }, + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_UDP["match"], + "action": {"check_hash_same": "ipv4_udp_vxlan_ipv6_pay"}, + }, + ], +} + +MAC_IPv4_UDP_VXLAN_MAC_IPv4_sysmetric = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/Raw("x" * 80)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.21",dst="192.168.0.20")/Raw("x" * 80)', + ], +} +# Test case 5: IAVF_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4_sysmetric +mac_ipv4_udp_vxlan_mac_ipv4_sysmetric = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4_sysmetric", + "rule": "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000000000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss func symmetric_toeplitz queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_sysmetric["basic"], + "action": {"save_hash": "ipv6_udp_vxlan_ipv4_pay"}, + }, + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4_sysmetric["match"], + "action": {"check_hash_same": "ipv6_udp_vxlan_ipv4_pay"}, + }, + ], +} + +MAC_IPv4_UDP_VXLAN_MAC_IPv4 = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/("X"*480)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.10.21")/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.10")/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP(dst="192.168.0.10")/UDP()/VXLAN()/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/("X"*480)', + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN(vni=22)/Ether()/IP(src="192.168.0.20",dst="192.168.0.21")/("X"*480)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/Ether()/IP(src="192.168.10.20",dst="192.168.0.21")/("X"*480)', + ], +} +# Test case 6: IAVF_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4_inner-l3-src-only +mac_ipv4_udp_vxlan_mac_ipv4 = { + "sub_casename": "mac_ipv4_udp_vxlan_mac_ipv4", + "rule": "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004600000000001100000101010102020202000012B50032000008000000000000000000000000010000000000020800450000140000000000000000C0A80014C0A80015 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFF00000000 / end actions rss queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4["basic"], + "action": {"save_hash": "ipv4_udp_vxlan_ipv6_tcp"}, + }, + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4["mismatch"], + "action": {"check_hash_different": "ipv4_udp_vxlan_ipv6_tcp"}, + }, + { + "send_packet": MAC_IPv4_UDP_VXLAN_MAC_IPv4["match"], + "action": {"check_hash_same": "ipv4_udp_vxlan_ipv6_tcp"}, + }, + ], +} + +MAC_IPv4_UDP_GTPU_IPv4 = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.20", dst="192.168.10.21")/Raw("x"*20)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x567)/IP(src="192.168.10.20", dst="192.168.10.21")/Raw("x"*20)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.30", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.20", dst="192.168.10.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.31")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.20", dst="192.168.10.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.30", dst="192.168.10.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IP(src="192.168.10.20", dst="192.168.10.31")/Raw("x"*20)', + ], +} +# Test case 7: IAVF_RSS_MAC/IPv4/UDP/GTPU/IPv4 +mac_ipv4_udp_gtpu_ipv4 = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv4", + "rule": "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000380000000000110000C0A80014C0A80015000008680024000030FF001400000000450000140000000000000000C0A80A14C0A80A15 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF / end actions rss queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP_GTPU_IPv4["basic"], + "action": {"save_hash": "ipv4_gtpu_ipv4"}, + }, + { + "send_packet": MAC_IPv4_UDP_GTPU_IPv4["mismatch"], + "action": {"check_hash_different": "ipv4_gtpu_ipv4"}, + }, + { + "send_packet": MAC_IPv4_UDP_GTPU_IPv4["match"], + "action": {"check_hash_same": "ipv4_gtpu_ipv4"}, + }, + ], +} + +MAC_IPv4_UDP_GTPU_IPv6_UDP = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP()/Raw("x"*20)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1011", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/UDP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP()/Raw("x"*20)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.21", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.22")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/UDP()/Raw("x"*20)', + ], +} +# Test case 8: IAVF_RSS_MAC/IPv4/UDP/GTPU/IPv6/UDP_outer-l3 +mac_ipv4_udp_gtpu_ipv6_udp = { + "sub_casename": "mac_ipv4_udp_gtpu_ipv6_udp", + "rule": "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000540000000000110000C0A80014C0A80015000008680040000030FF0030000000006000000000081100CDCD910A222254988475111139001010CDCD910A2222549884751111390020210000000000080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 / end actions rss queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP_GTPU_IPv6_UDP["basic"], + "action": {"save_hash": "ipv4_gtpu_ipv6_udp"}, + }, + { + "send_packet": MAC_IPv4_UDP_GTPU_IPv6_UDP["mismatch"], + "action": {"check_hash_different": "ipv4_gtpu_ipv6_udp"}, + }, + { + "send_packet": MAC_IPv4_UDP_GTPU_IPv6_UDP["match"], + "action": {"check_hash_same": "ipv4_gtpu_ipv6_udp"}, + }, + ], +} + +MAC_IPv4_UDP_GTPU_EH_IPv4_UDP_sysmetric = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/UDP()/Raw("x"*20)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.21", dst="192.168.1.20")/UDP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.21", dst="192.168.0.20")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/UDP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.21", dst="192.168.0.20")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(QFI=0x34)/IP(src="192.168.1.21", dst="192.168.1.20")/UDP()/Raw("x"*20)', + ], +} +# Test case 9: IAVF_RSS_MAC/IPv4/UDP/GTPU/EH/IPv4/UDP_innersysmetric +mac_ipv4_udp_gtpu_eh_ipv4_udp_sysmetric = { + "sub_casename": "mac_ipv4_udp_gtpu_eh_ipv4_udp_sysmetric ", + "rule": "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000440000000000110000C0A80014C0A80014000008680030000034FF00240000000000000085010000004500001C0000000000110000C0A80114C0A801150000000000080000 pattern mask 0000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFF0000000000000000 / end actions rss func symmetric_toeplitz queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP_GTPU_EH_IPv4_UDP_sysmetric["basic"], + "action": {"save_hash": "ipv6_gtpu_eh_ipv4_tcp"}, + }, + { + "send_packet": MAC_IPv4_UDP_GTPU_EH_IPv4_UDP_sysmetric["match"], + "action": {"check_hash_same": "ipv6_gtpu_eh_ipv4_tcp"}, + }, + ], +} + +MAC_IPv4_UDP_GTPU_UL_IPv4 = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/Raw("x"*20)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.10.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.11.20", dst="192.168.1.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.11.21")/Raw("x"*20)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.10.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/Raw("x"*20)', + ], +} +# Test case 10: IAVF_RSS_MAC/IPv4/UDP/GTPU/UL/IPv4_inner-l3-dst-only +mac_ipv4_udp_gtpu_ul_ipv4 = { + "sub_casename": "mac_ipv4_udp_gtpu_ul_ipv4", + "rule": "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500003C0000000000110000C0A80014C0A80015000008680028000034FF001C000000000000008501100000450000140000000000000000C0A80114C0A80115 pattern mask 000000000000000000000000000000000000000000000000000000000000FFFFFFFF000000000000000000000000000000000000000000F000000000000000000000000000000000000000000000 / end actions rss queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP_GTPU_UL_IPv4["basic"], + "action": {"save_hash": "ipv4_gtpu_ul_ipv4"}, + }, + { + "send_packet": MAC_IPv4_UDP_GTPU_UL_IPv4["mismatch"], + "action": {"check_hash_different": "ipv4_gtpu_ul_ipv4"}, + }, + { + "send_packet": MAC_IPv4_UDP_GTPU_UL_IPv4["match"], + "action": {"check_hash_same": "ipv4_gtpu_ul_ipv4"}, + }, + ], +} + +MAC_IPv4_UDP_GTPU_DL_IPv4_TCP = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.10.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.10.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.11.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.21", dst="192.168.1.21")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.22")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x123)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.22")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x123)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.22")/TCP()/Raw("x"*20)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="191.168.1.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=0, P=1, QFI=0x34)/IP(src="192.161.1.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.20", dst="192.168.0.21")/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x12345678)/GTPPDUSessionContainer(type=1, P=1, QFI=0x34)/IP(src="192.168.1.20", dst="192.168.1.21")/TCP()/Raw("x"*20)', + ], +} +# Test case 11: IAVF_RSS_MAC/IPv4/UDP/GTPU/DL/IPv4/TCP_un-word-aligned key +mac_ipv4_udp_gtpu_dl_ipv4_tcp = { + "sub_casename": "mac_ipv4_udp_gtpu_dl_ipv4_tcp", + "rule": "flow create 1 ingress pattern raw pattern spec 0011223344550000000000020800450000500000000000110000C0A80014C0A8001500000868003C000034FF0030000000000000008501000000450000280000000000060000C0A80114C0A801150000000000000000000000005000000000000000 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F00000000000000000000000000000FFFF0000000000000000000000000000000000000000000000000000 / end actions rss queues end / end", + "test": [ + { + "send_packet": MAC_IPv4_UDP_GTPU_DL_IPv4_TCP["basic"], + "action": {"save_hash": "ipv4_gtpu_dl_ipv4_tcp"}, + }, + { + "send_packet": MAC_IPv4_UDP_GTPU_DL_IPv4_TCP["mismatch"], + "action": {"check_hash_different": "ipv4_gtpu_dl_ipv4_tcp"}, + }, + { + "send_packet": MAC_IPv4_UDP_GTPU_DL_IPv4_TCP["match"], + "action": {"check_hash_same": "ipv4_gtpu_dl_ipv4_tcp"}, + }, + ], +} + +vf1_mac = "00:11:22:33:44:55" +# tester send pcaket port +tPort = 0 +# dut receive packet port +dPort = 1 +port_topology = {"port_id": dPort, "tport_id": tPort} + + +class TestIavfRssProtocolAgnosticFlow(TestCase): + """ + E810 enable Protocol agnostic flow offloading + """ + + def set_up_all(self): + """ + Run at the start of each test suite. + """ + self.skip_case("ICE" in self.nic, "%s nic not support this suite" % self.nic) + self.dports = self.dut.get_ports(self.nic) + # Verify that enough ports are available + self.verify(len(self.dports) >= 1, "Insufficient ports") + self.pf_interface = self.dut.ports_info[self.dports[0]]["intf"] + self.pmd_output = PmdOutput(self.dut) + self.tester_ifaces = [ + self.tester.get_interface(self.dut.ports_map[port]) for port in self.dports + ] + self.rxq = 16 + self.pkt = Packet() + self.rsspro = RssProcessing( + self, self.pmd_output, self.tester_ifaces, rxq=self.rxq + ) + self.create_iavf() + + @skip_unsupported_pkg("os default") + def set_up(self): + """ + Run before each test case. + """ + self.launch_testpmd() + + def create_iavf(self): + self.dut.restore_interfaces() + self.dut.generate_sriov_vfs_by_port(self.dports[0], 2) + # set VF0 as trust + self.dut.send_expect("ip link set %s vf 0 trust on" % self.pf_interface, "#") + self.sriov_vfs_port = self.dut.ports_info[self.dports[0]]["vfs_port"] + self.vf_pci0 = self.sriov_vfs_port[0].pci + self.vf_pci1 = self.sriov_vfs_port[1].pci + try: + for port in self.sriov_vfs_port: + port.bind_driver(self.drivername) + self.dut.send_expect("ifconfig %s up" % self.pf_interface, "# ") + self.dut.send_expect( + "ip link set %s vf 1 mac %s" % (self.pf_interface, vf1_mac), "# " + ) + except Exception as e: + self.destroy_iavf() + raise Exception(e) + + def launch_testpmd(self): + """ + launch testpmd with the command + """ + params = "--rxq={0} --txq={0} --disable-rss --txd=384 --rxd=384".format( + self.rxq + ) + eal_params = '-a {},cap=dcf -a {} --log-level="pmd,7"'.format( + self.vf_pci0, self.vf_pci1 + ) + self.pmd_output.start_testpmd(param=params, eal_param=eal_params) + self.pmd_output.execute_cmd("set fwd rxonly") + self.pmd_output.execute_cmd("set verbose 1") + self.pmd_output.execute_cmd("port config 0 udp_tunnel_port add vxlan 0x12b5") + self.pmd_output.execute_cmd("start") + self.pmd_output.wait_link_status_up(0) + + def destroy_iavf(self): + self.dut.destroy_sriov_vfs_by_port(self.dports[0]) + self.dut.bind_interfaces_linux(self.drivername) + + def send_pkt_get_output(self, pkts, port_id=0, tport_id=0, count=1, interval=0): + tx_port = self.tester_ifaces[tport_id] if tport_id else self.tester_ifaces[0] + self.logger.info("----------send packet-------------") + self.logger.info("{}".format(pkts)) + self.pkt.update_pkt(pkts) + self.pkt.send_pkt( + crb=self.tester, + tx_port=tx_port, + count=count, + interval=interval, + ) + out = self.pmd_output.get_output(timeout=1) + pkt_pattern = ( + "port\s%d/queue\s\d+:\sreceived\s(\d+)\spackets.+?\n.*length=\d{2,}\s" + % port_id + ) + reveived_data = re.findall(pkt_pattern, out) + reveived_pkts = sum(map(int, [i[0] for i in reveived_data])) + if isinstance(pkts, list): + self.verify( + reveived_pkts == len(pkts) * count, + "expect received %d pkts, but get %d instead" + % (len(pkts) * count, reveived_pkts), + ) + else: + self.verify( + reveived_pkts == 1 * count, + "expect received %d pkts, but get %d instead" + % (1 * count, reveived_pkts), + ) + return out + + def handle_tests(self, tests, port_id=0, tport_id=0): + out = "" + for test in tests: + if "send_packet" in test: + out = self.send_pkt_get_output( + test["send_packet"], port_id=port_id, tport_id=tport_id + ) + if "action" in test: + self.rsspro.handle_actions(out, test["action"], port_id) + + def handle_rss_case(self, case_info): + # clear hash_records before each sub case + self.hash_records = {} + self.error_msgs = [] + self.current_saved_hash = "" + sub_case_name = case_info.get("sub_casename") + self.logger.info( + "===================Test sub case: {}================".format(sub_case_name) + ) + # received packet port id + port_id = case_info.get("port_id") if case_info.get("port_id") else 0 + # send packet port id + tport_id = case_info.get("tport_id") if case_info.get("tport_id") else 0 + rules = case_info.get("rule") if case_info.get("rule") else [] + rule_ids = [] + if "pre-test" in case_info: + self.logger.info("------------handle pre-test--------------") + self.handle_tests(case_info["pre-test"], port_id=port_id, tport_id=tport_id) + + # handle tests + tests = case_info["test"] + self.logger.info("------------handle test--------------") + # validate rule + if rules: + self.rsspro.validate_rule(rule=rules, check_stats=True) + rule_ids = self.rsspro.create_rule(rule=case_info["rule"], check_stats=True) + self.rsspro.check_rule(port_id=port_id, rule_list=rule_ids) + self.handle_tests(tests, port_id=port_id, tport_id=tport_id) + + # handle post-test + if "post-test" in case_info: + self.logger.info("------------handle post-test--------------") + self.rsspro.destroy_rule(port_id=port_id, rule_id=rule_ids) + self.rsspro.check_rule(port_id=port_id, stats=False) + self.rsspro.handle_tests(case_info["post-test"], port_id=port_id) + if self.error_msgs: + self.verify( + False, + " ".join([errs.replace("'", " ") for errs in self.error_msgs[:500]]), + ) + + def rte_flow(self, case_list, func_name, **kwargs): + """ + main flow of case: + 1. iterate the case list and do the below steps: + a. get the subcase name and init dict to save result + b. call method by func name to execute case step + c. record case result and err msg if case failed + d. clear flow rule + 2. calculate the case passing rate according to the result dict + 3. record case result and pass rate in the case log file + 4. verify whether the case pass rate is equal to 100, if not, mark the case as failed and raise the err msg + :param case_list: case list, each item is a subcase of case + :param func_name: hadle case method name, eg: + 'flow_rule_operate': a method of 'FlowRuleProcessing' class, + used to handle flow rule related suites,such as fdir and switch_filter + 'handle_rss_distribute_cases': a method of 'RssProcessing' class, + used to handle rss related suites + :return: + usage: + for flow rule related: + rte_flow(caselist, flow_rule_operate) + for rss related: + rte_flow(caselist, handle_rss_distribute_cases) + """ + if not isinstance(case_list, list): + case_list = [case_list] + test_results = dict() + for case in case_list: + case_name = case.get("sub_casename") + test_results[case_name] = {} + try: + self.logger.info("{0} case_name:{1} {0}".format("*" * 20, case_name)) + case.update(kwargs) + func_name(case) + except Exception: + test_results[case_name]["result"] = "failed" + test_results[case_name]["err"] = re.sub( + r"['\r\n]", "", str(traceback.format_exc(limit=1)) + ).replace("\\\\", "\\") + self.logger.info( + ( + RED( + "case failed:{}, err:{}".format( + case_name, traceback.format_exc() + ) + ) + ) + ) + else: + test_results[case_name]["result"] = "passed" + self.logger.info((GREEN("case passed: {}".format(case_name)))) + finally: + check_param = case.get("check_param") + if check_param: + port_id = check_param.get("port_id") + else: + port_id = case.get("port_id") if case.get("port_id") else 0 + self.pmd_output.execute_cmd("flow flush %s" % port_id) + pass_rate = ( + round( + sum(1 for k in test_results if "passed" in test_results[k]["result"]) + / len(test_results), + 4, + ) + * 100 + ) + self.logger.info( + [ + "{}:{}".format(sub_name, test_results[sub_name]["result"]) + for sub_name in test_results + ] + ) + self.logger.info("pass rate is: {}".format(pass_rate)) + msg = [ + "subcase_name:{}:{},err:{}".format( + name, test_results[name].get("result"), test_results[name].get("err") + ) + for name in test_results.keys() + if "failed" in test_results[name]["result"] + ] + self.verify( + int(pass_rate) == 100, + "some subcases failed, detail as below:{}".format(msg), + ) + + def test_multi_rules_mac_ipv4_udp_vxlan_ipv6(self): + """ + Test case 12: IAVF_RSS_multi-rules_MAC/IPv4/UDP/VXLAN/IPv6 + """ + rules = [ + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004C00000000001100000101010102020202000012B50038000008000000000000006000000000000000CDCD910A222254988475111139001010CDCD910A222254988475111139002021 pattern mask 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF / end actions rss queues end / end", + "flow create 1 ingress pattern raw pattern spec 00112233445500000000000208004500004C00000000001100000101010102020202000012B50038000008000000000000006000000000000000CDCD910A222254988475111139001010CDCD910A222254988475111139002021 pattern mask 00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF00000000000000000000000000000000 / end actions rss queues end / end", + ] + MAC_IPv4_UDP_VXLAN_IPv6 = { + "basic": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/("X"*480)', + ], + "match": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1010", dst="CDCD:910A:2222:5498:8475:1111:3900:2022")/("X"*480)', + ], + "mismatch": [ + 'Ether(dst="00:11:22:33:44:55")/IP()/UDP()/VXLAN()/IPv6(src="CDCD:910A:2222:5498:8475:1111:3900:1011", dst="CDCD:910A:2222:5498:8475:1111:3900:2021")/("X"*480)', + ], + } + tests = [ + { + "send_packet": MAC_IPv4_UDP_VXLAN_IPv6["basic"], + "action": {"save_hash": "ipv4_udp_vxlan_ipv6"}, + }, + { + "send_packet": MAC_IPv4_UDP_VXLAN_IPv6["mismatch"], + "action": {"check_hash_different": "ipv4_udp_vxlan_ipv6"}, + }, + { + "send_packet": MAC_IPv4_UDP_VXLAN_IPv6["match"], + "action": {"check_hash_same": "ipv4_udp_vxlan_ipv6"}, + }, + ] + # create rule + self.rsspro.create_rule(rules, check_stats=True) + self.rsspro.error_msgs = [] + self.rsspro.error_msgs = [] + self.handle_tests(tests, port_id=dPort, tport_id=tPort) + if self.rsspro.error_msgs: + self.verify( + False, + " ".join( + [errs.replace("'", " ") for errs in self.rsspro.error_msgs[:500]] + ), + ) + + def test_mac_ipv4_udp_gtpu_dl_ipv4_tcp(self): + """ + Test case 11: IAVF_RSS_MAC/IPv4/UDP/GTPU/DL/IPv4/TCP_un-word-aligned key + """ + func_name = self.handle_rss_case + self.rte_flow(mac_ipv4_udp_gtpu_dl_ipv4_tcp, func_name, **port_topology) + + def test_mac_ipv4_udp_gtpu_ul_ipv4(self): + """ + Test case 10: IAVF_RSS_MAC/IPv4/UDP/GTPU/UL/IPv4_inner-l3-dst-only + """ + func_name = self.handle_rss_case + self.rte_flow(mac_ipv4_udp_gtpu_ul_ipv4, func_name, **port_topology) + + def test_mac_ipv4_udp_gtpu_eh_ipv4_udp_sysmetric(self): + """ + Test case 9: IAVF_RSS_MAC/IPv4/GTPU/EH/IPv4/DUP_innersysmetric + """ + func_name = self.handle_rss_case + self.rte_flow( + mac_ipv4_udp_gtpu_eh_ipv4_udp_sysmetric, func_name, **port_topology + ) + + def test_mac_ipv4_udp_gtpu_ipv6_udp(self): + """ + # Test case 8: IAVF_RSS_MAC/IPv4/UDP/GTPU/IPv6/UDP_outer-l3 + """ + func_name = self.handle_rss_case + self.rte_flow(mac_ipv4_udp_gtpu_ipv6_udp, func_name, **port_topology) + + def test_mac_ipv4_udp_gtpu_ipv4(self): + """ + Test case 7: IAVF_RSS_MAC/IPv4/UDP/GTPU/IPv4 + """ + func_name = self.handle_rss_case + self.rte_flow(mac_ipv4_udp_gtpu_ipv4, func_name, **port_topology) + + def test_mac_ipv4_udp_vxlan_mac_ipv4(self): + """ + Test case 6: IAVF_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4_inner-l3-src-only + """ + func_name = self.handle_rss_case + self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4, func_name, **port_topology) + + def test_mac_ipv4_udp_vxlan_mac_ipv4_sysmetric(self): + """ + Test case 5: IAVF_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4_sysmetric + """ + func_name = self.handle_rss_case + self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4_sysmetric, func_name, **port_topology) + + def test_mac_ipv4_udp_vxlan_mac_ipv4_udp(self): + """ + Test case 4: IAVF_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4/UDP + """ + func_name = self.handle_rss_case + self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4_udp, func_name, **port_topology) + + def test_mac_ipv4_udp_vxlan_mac_ipv4_pay(self): + """ + Test case 3: IAVF_RSS_MAC/IPv4/UDP/VXLAN/MAC/IPv4/PAY + """ + func_name = self.handle_rss_case + self.rte_flow(mac_ipv4_udp_vxlan_mac_ipv4_pay, func_name, **port_topology) + + def test_mac_ipv6_tcp_sysmetric(self): + """ + Test case 2: IAVF_RSS_MAC/IPv6/TCP_sysmetric + """ + func_name = self.handle_rss_case + self.rte_flow(mac_ipv6_tcp_sysmetric, func_name, **port_topology) + + def test_mac_ipv4_udp(self): + """ + Test case 1: IAVF_RSS_MAC/IPv4/UDP + """ + func_name = self.handle_rss_case + self.rte_flow(mac_ipv4_udp, func_name, **port_topology) + + def tear_down(self): + """ + Run after each test case. + """ + try: + self.pmd_output.quit() + except: + self.dut.kill_all() + + def tear_down_all(self): + """ + Run after each test suite. + """ + self.dut.kill_all() + self.destroy_iavf()