From patchwork Sat Jan 20 21:11:32 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ophir Munk X-Patchwork-Id: 34159 X-Patchwork-Delegate: ferruh.yigit@amd.com Return-Path: X-Original-To: patchwork@dpdk.org Delivered-To: patchwork@dpdk.org Received: from [92.243.14.124] (localhost [127.0.0.1]) by dpdk.org (Postfix) with ESMTP id E24ACA490; Sat, 20 Jan 2018 22:11:56 +0100 (CET) Received: from EUR03-DB5-obe.outbound.protection.outlook.com (mail-eopbgr40040.outbound.protection.outlook.com [40.107.4.40]) by dpdk.org (Postfix) with ESMTP id 3B61F1E35 for ; Sat, 20 Jan 2018 22:11:50 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=VEodklhyZIJ+XICDAV0nONxcOgLz6nhN3JFdFz9mAHo=; b=cSbn7lOHKvU1FnnASBQ6NztYnEij75sLg+sGMiWsq5JSsRJHt3WB3WjUwUQQuI0dltbiX5Dvnhfz7ztRIbw7f2qvMaXIwv8cLbobVxCg2/j1KUUM7DGhDFZ6rB6bzYB6038TZGXoHcnnk4Sff5B7BNYRu8Z7IaNdvTlW4q6rwfE= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ophirmu@mellanox.com; Received: from mellanox.com (37.142.13.130) by AM0PR0502MB3875.eurprd05.prod.outlook.com (2603:10a6:208:20::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.407.7; Sat, 20 Jan 2018 21:11:48 +0000 From: Ophir Munk To: dev@dpdk.org, Pascal Mazon Cc: Thomas Monjalon , Olga Shern , Ophir Munk Date: Sat, 20 Jan 2018 21:11:32 +0000 Message-Id: <1516482697-8348-2-git-send-email-ophirmu@mellanox.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1516482697-8348-1-git-send-email-ophirmu@mellanox.com> References: <1516282691-29698-1-git-send-email-ophirmu@mellanox.com> <1516482697-8348-1-git-send-email-ophirmu@mellanox.com> MIME-Version: 1.0 X-Originating-IP: [37.142.13.130] X-ClientProxiedBy: VI1PR08CA0212.eurprd08.prod.outlook.com (2603:10a6:802:15::21) To AM0PR0502MB3875.eurprd05.prod.outlook.com (2603:10a6:208:20::17) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 72cf38c6-9fd7-49e1-836f-08d5604a6b84 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:AM0PR0502MB3875; X-Microsoft-Exchange-Diagnostics: 1; AM0PR0502MB3875; 3:dVHkEL2Vo4N2B1w1ecCyyTIsTkzc6AZD18dQz0W/BotaRYqLsdPqrvNgBe0zyRpNzhPhMs3xg2VTOSphHgfyMWLOIuxLg51LJvkQwI9JeqFFOqWmzzW10mnACx3L3jWSkvJ/IDlCbhBeLRYGFBTpuEUdqoGw0bQ6e75nW6QRysYPqQzSxhfzlMldyQMFmhoe6cBgr21EwNCGmWLi7KKo79XQ4gzgZwGHhXoswYp1fNOQ0A6jsgTMFWJr5VD+9yxC; 25:LWaKFChE06lRj84u8rfdPsINNALkh2D2jULND4vE6jsdh3evyzgrRtD6Ecud4QbT7VfBeCwGYyWBHhMcqn1eUdbty738ouY/mZ7BLu9zoHBIrPTTTkjvdRY82JpG53AIKT6Rl/Ne5aVLVsk4JXCnKpnTjKutnSpujAD6SLSNBPF3y6MpLc+13UQdLN0nRqjbFjIvqjexQcNEn9z5K2BrTKHsLWQRWKJWHIJo7xQRvfue2cEtgDx2rep9BdiZUlTvm8eKesgncIsXHsYx5mmalI64Aod3DMndSvVt6KF6Kc0Ep5DT3b6LlkOhaqgsfQFmFfy1MpceAOs5SiZHX0Ekqg==; 31:X+Gfg357Sm1kHifVPacjV0pESmXUk11izhCjtxehQMY40jPBugdvG9YdXZH71qZt0hGVBd4PoxDIyskeWDYEwoU6yAydJvLqSQYzOCeIhaM7ndJChj2g9QiRIMBmMZHB3vIWtMcMjHZguv2KrfBNOMS9w2kWmcDK893LR3gbHBPujsah3MaO9cJZwr3O8rhqj71zeeepwUWQW745IDstMikJ4H45eG/jJjA1xJw6AzQ= X-MS-TrafficTypeDiagnostic: AM0PR0502MB3875: X-LD-Processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr X-Microsoft-Exchange-Diagnostics: 1; AM0PR0502MB3875; 20:fQDPIzINodZt9/ul/7RF9kN7xVQgh/E2SqBWUhspWeHqPxkFIwzwFTYvd22A1DLV1F4iKEGKWwYfoPdoD7pEnV4FQlvQmnd6LqCvDYEqiNWZAEVbUaBUUvfHZr4PCh5mV6oxVgU274VlvMJzD0r9TU8lIWEUVlw+u0+y6Y8J5WdTif5vb3aj81CWn1JFvKAFr8Myvo+4x+6vhmkwaTvoMActSpeBgVNWtLr3O7YBpKV2rjAM7zuLbYsryEB4Untbauvd0nljhbPyCBl1FjspmUYIhT8KnoO9Bg3L16mutZXVQH724VyFcQiTFqJiMY3n1dOmolK3yo2eI05ZHxnx270HiBkJyBKzVhoovcgqOfzlr++IJvWGVStDH6mc+/qoZwtEIsXip7XrShDuUm+y47IDPqbGT1O10jR65wrZ+bD2R7VIFJ91lOYzjPNkyyzmMU+QWXKgq9dOTPVmWfeeR4sxotvL/THjpyShYu0rHyRgs3hO6ZEdifUJGy9yutH9; 4:oJ++UIxlNoHjwqKAyqdksuT2HJ2RQGTAhweWTJhzkkJ5leMkoTtjc+Dv+lZnTAwSpoSqCY0MmC6U7gVpv5I/QQJ+0YimKavq7fSlyZeX0p5GrSwlXpWRb1IQ7JXP5C8zuxwerW8yW4naksiMldQK8DrwW0CSAjMyWh1r9N5ALDmKsWvQi3HxVDXTEA8tNcqZcGPtq5AAyQFvVLoF20ChrQSUfgCiLtHNQ92Nld8tiM+xgNYYjLIw860YbozVByG2fIvGx6XhJUYSFQJAVQQP0g== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040501)(2401047)(8121501046)(5005006)(3231023)(2400081)(944501161)(93006095)(93001095)(10201501046)(3002001)(6055026)(6041288)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123564045)(20161123558120)(20161123562045)(6072148)(201708071742011); SRVR:AM0PR0502MB3875; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:AM0PR0502MB3875; X-Forefront-PRVS: 0558D3C5AC X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(39860400002)(366004)(396003)(346002)(39380400002)(376002)(189003)(199004)(25786009)(4326008)(478600001)(7696005)(66066001)(47776003)(107886003)(76176011)(52116002)(51416003)(97736004)(2906002)(21086003)(26005)(316002)(54906003)(86362001)(16586007)(16526018)(8676002)(81166006)(81156014)(59450400001)(5660300001)(50226002)(3846002)(36756003)(69596002)(7736002)(305945005)(386003)(6116002)(6666003)(105586002)(6916009)(4720700003)(50466002)(53936002)(33026002)(68736007)(2950100002)(106356001)(8936002)(48376002)(55016002); DIR:OUT; SFP:1101; SCL:1; SRVR:AM0PR0502MB3875; H:mellanox.com; FPR:; SPF:None; PTR:InfoNoRecords; MX:1; A:1; LANG:en; Received-SPF: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; AM0PR0502MB3875; 23:IZvwI6piIFnd17H9hq/wThTYThAQzW4Ab1ORwaK?= 3EJAbeXcSbCglECRX96sVjRWdcYLaadsT7j86RVGsveFaoAlRdFM7oduJvyp9kbS9oohOvCQ18IrZW1dfjJZ4YxB1p/Lhf9WkOmYzS6uPMz/1SpKUHui1eZ5EPljXh8wuipBvlLwY+B+TADuW7o9P2iJEUxm20JZrBLEKV3F8DrFm5NmnQ0YP5NTC5G6SoMTTz93TAWJjY+iVMahbrs2AmoaxwjXXELKKd+DsU5WhLg0zA+OaJ0bkvdzI9i+QU2h+cjyzUw8M2uALe+MI/RQMMnKZ5qU621oRVvGXvrax2EslPW50oXQnnBgJJlchF09WmaxptkMmgityXBq76e5i7+L/zuhzsl8Vu/SMP/JBx7sSBv+AVyQ82byYsQc+kxMFpio5+PWT085j6zaA3U3esVViTSvpfKcIX4eLy5SZ1s5YHGvR/XECfAsfrnYIWdDa0Oayq03gRfzDnyqEeu/AcTIWjI+8i7J9D8fskVnrDoIvgJdLwKZ3YUERkVpvQ8JbiAOHXxfXNo75lqPpsg5bmKDh2q2lswtyK3VKLhPDyHD+B4qxhApHBpLeTdkI48FrM7+4wrlKCd7flnk20MUBVWYowSavE7JE2s+SCZdlMcJYIO387OqzLaiFhtcO+W1DWo0qtWRzjvFOQTW4fVrkxhA1XRjfP8LDP55aR7qYFyrLfTMCGa/cgYENLXMWjnW9/KTJiWRpSVbVHzIe8IuktkK3lMn7ZtgHfr3OZgu7ukp6zgqG+fTq0Q6/Xi5GXQP5yE6FnB4CmkcAqE/6kT/oOGwjFb4ra3jbuOWKPA6FgKykX1XvXf/Y4qF3jiEZRwofrt1KRO0X8T8dYtlZUAdDPrqmpteFLsybeJh3zCPb4Egpf6jZ14jZY/1ldf4Dx5i5eZMV4vOjNw20BtkgEaCTDP1T0vBuOGyNW1hhphkV8/vdQq5/lj4cBFUm2Fgj84VxhAObvZq/XlrTzL3rLTNSNtWhphPAP8SuPzvZd2ujnnlNmcWzVUN0eA8FfeAcM7MUOJfcqiZYltHs1Bk9noixfzSBqxlUlkMskMjnfptCBUSfUkiiFrW1WUKCpnONsbuxH5U/7eShIpdkAsajRZLUVf0i3Vrb5BmOavE+h4S5jn0younBMyQvQgljWv6YFyusaSAKPgr0cL/iHuMxi+MDseucWRHbbrxQbhBnDQ89TqSzaA== X-Microsoft-Exchange-Diagnostics: 1; AM0PR0502MB3875; 6:0gFgYvt1gIPc3XuPTB3nz9vwannE3ybeAkqPdA94Rc1IM7OPeTtl1QklMTlWI5SL9LFF6SAanq3RcRvPl+QeIuN2Wda0C8+zj1mftyRS5+UDeTr3QOus6vNBYBG2wuaBGP0qHdHrwU5RB5th2FkcYKg6qMdRjo6Zy46105ro++sNSvlZc8gML854J6jDwj2evdM5tYeq5Cn8PHIpGmnKxfkS+QkHDfUmTF3QRbXNgibEAxRyyC2KQOAFItLKApIcd4LMlJzlzhcZkc47ldcWXhR/PLpyzN73RyPrPBpNpVLppLBLjrWGq3gA0oZ4/Kv5g2ibaD8fnE964ZzIqDUhM4cnQ3JFx3Ll8XO3xs1WYUY=; 5:DXihlEM+pqwkLLECEDAEK9hczTdEEyS2NHrmBHi/abRKKJjerykaIddp2IG0atmlgQPPKKly2DqJhTZqf5OXwrsTF8/as2Ai9+gXmfHuVWFJbDQpYWqPmwHNoReyKg8oInr1Mv42lbWVBgZs7C0RONrLt69n90ljv1WqqQI6/j0=; 24:Lr6xwblhRT6b+uucEaiw746Gn8VAam/yOoQSKT9ANpFYExvfrNAJDTwydBt+uQ3VbDXDq7me4GTaX1azItph8JLbs0lPOi8fjA/y+ylvNNY=; 7:NlIdighi1ZMz6kp14MuZhn/xKPK+MKn8G+CzLjALVUCtT1+FzX+H5bBBRx020+PSupkCHttprgOqOWuCPPXKAPZ35u1s0wQqLgEV9yi7UuwouCf1g6wp8Bvg7L/rhZOyqMiwqTsA+JP8EQRuRUWk10a8EVQkEOgVbsgfAEloRQM4mGaXQz5rWBHhTmHZKWiljF7fcBtGdk+1UqR2A/tLYcNVLNJ3xEzEqeau8thP/mhC4M98KZ7/woMR180CABEt SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 20 Jan 2018 21:11:48.1110 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 72cf38c6-9fd7-49e1-836f-08d5604a6b84 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR0502MB3875 Subject: [dpdk-dev] [PATCH v6 1/6] net/tap: support actions for different classifiers X-BeenThere: dev@dpdk.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: DPDK patches and discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dev-bounces@dpdk.org Sender: "dev" Add a generic TC actions handling for TC actions: "mirred", "gact", "skbedit". This will be useful when introducing BPF actions, as it uses TCA_BPF_ACT instead of TCA_FLOWER_ACT Signed-off-by: Ophir Munk Acked-by: Pascal Mazon --- drivers/net/tap/Makefile | 8 ++ drivers/net/tap/rte_eth_tap.h | 4 +- drivers/net/tap/tap_flow.c | 224 +++++++++++++++++++++++++----------------- 3 files changed, 145 insertions(+), 91 deletions(-) diff --git a/drivers/net/tap/Makefile b/drivers/net/tap/Makefile index fd4195f..fbf84e1 100644 --- a/drivers/net/tap/Makefile +++ b/drivers/net/tap/Makefile @@ -12,6 +12,12 @@ EXPORT_MAP := rte_pmd_tap_version.map LIBABIVER := 1 +# +# TAP_MAX_QUEUES must be a power of 2 +# +ifeq ($(TAP_MAX_QUEUES),) + TAP_MAX_QUEUES = 16 +endif CFLAGS += -O3 CFLAGS += -I$(SRCDIR) CFLAGS += -I. @@ -20,6 +26,8 @@ LDLIBS += -lrte_eal -lrte_mbuf -lrte_mempool -lrte_ring LDLIBS += -lrte_ethdev -lrte_net -lrte_kvargs -lrte_hash LDLIBS += -lrte_bus_vdev +CFLAGS += -DTAP_MAX_QUEUES=$(TAP_MAX_QUEUES) + # # all source are stored in SRCS-y # diff --git a/drivers/net/tap/rte_eth_tap.h b/drivers/net/tap/rte_eth_tap.h index 829f32f..202b3cd 100644 --- a/drivers/net/tap/rte_eth_tap.h +++ b/drivers/net/tap/rte_eth_tap.h @@ -45,7 +45,7 @@ #include #ifdef IFF_MULTI_QUEUE -#define RTE_PMD_TAP_MAX_QUEUES 16 +#define RTE_PMD_TAP_MAX_QUEUES TAP_MAX_QUEUES #else #define RTE_PMD_TAP_MAX_QUEUES 1 #endif @@ -90,6 +90,8 @@ struct pmd_internals { int ioctl_sock; /* socket for ioctl calls */ int nlsk_fd; /* Netlink socket fd */ int flow_isolate; /* 1 if flow isolation is enabled */ + int flower_support; /* 1 if kernel supports, else 0 */ + int flower_vlan_support; /* 1 if kernel supports, else 0 */ LIST_HEAD(tap_flows, rte_flow) flows; /* rte_flow rules */ /* implicit rte_flow rules set when a remote device is active */ LIST_HEAD(tap_implicit_flows, rte_flow) implicit_flows; diff --git a/drivers/net/tap/tap_flow.c b/drivers/net/tap/tap_flow.c index 90b2654..d2a69a7 100644 --- a/drivers/net/tap/tap_flow.c +++ b/drivers/net/tap/tap_flow.c @@ -33,6 +33,7 @@ #include #include +#include #include #include @@ -104,6 +105,19 @@ struct remote_rule { int mirred; }; +struct action_data { + char id[16]; + + union { + struct tc_gact gact; + struct tc_mirred mirred; + struct skbedit { + struct tc_skbedit skbedit; + uint16_t queue; + } skbedit; + }; +}; + static int tap_flow_create_eth(const struct rte_flow_item *item, void *data); static int tap_flow_create_vlan(const struct rte_flow_item *item, void *data); static int tap_flow_create_ipv4(const struct rte_flow_item *item, void *data); @@ -819,111 +833,89 @@ tap_flow_item_validate(const struct rte_flow_item *item, } /** - * Transform a DROP/PASSTHRU action item in the provided flow for TC. + * Configure the kernel with a TC action and its configured parameters + * Handled actions: "gact", "mirred", "skbedit", "bpf" * - * @param[in, out] flow - * Flow to be filled. - * @param[in] action - * Appropriate action to be set in the TCA_GACT_PARMS structure. + * @param[in] flow + * Pointer to rte flow containing the netlink message * - * @return - * 0 if checks are alright, -1 otherwise. - */ -static int -add_action_gact(struct rte_flow *flow, int action) -{ - struct nlmsg *msg = &flow->msg; - size_t act_index = 1; - struct tc_gact p = { - .action = action - }; - - if (tap_nlattr_nested_start(msg, TCA_FLOWER_ACT) < 0) - return -1; - if (tap_nlattr_nested_start(msg, act_index++) < 0) - return -1; - tap_nlattr_add(&msg->nh, TCA_ACT_KIND, sizeof("gact"), "gact"); - if (tap_nlattr_nested_start(msg, TCA_ACT_OPTIONS) < 0) - return -1; - tap_nlattr_add(&msg->nh, TCA_GACT_PARMS, sizeof(p), &p); - tap_nlattr_nested_finish(msg); /* nested TCA_ACT_OPTIONS */ - tap_nlattr_nested_finish(msg); /* nested act_index */ - tap_nlattr_nested_finish(msg); /* nested TCA_FLOWER_ACT */ - return 0; -} - -/** - * Transform a MIRRED action item in the provided flow for TC. + * @param[in, out] act_index + * Pointer to action sequence number in the TC command * - * @param[in, out] flow - * Flow to be filled. - * @param[in] ifindex - * Netdevice ifindex, where to mirror/redirect packet to. - * @param[in] action_type - * Either TCA_EGRESS_REDIR for redirection or TCA_EGRESS_MIRROR for mirroring. + * @param[in] adata + * Pointer to struct holding the action parameters * * @return - * 0 if checks are alright, -1 otherwise. + * -1 on failure, 0 on success */ static int -add_action_mirred(struct rte_flow *flow, uint16_t ifindex, uint16_t action_type) +add_action(struct rte_flow *flow, size_t *act_index, struct action_data *adata) { struct nlmsg *msg = &flow->msg; - size_t act_index = 1; - struct tc_mirred p = { - .eaction = action_type, - .ifindex = ifindex, - }; - if (tap_nlattr_nested_start(msg, TCA_FLOWER_ACT) < 0) - return -1; - if (tap_nlattr_nested_start(msg, act_index++) < 0) + if (tap_nlattr_nested_start(msg, (*act_index)++) < 0) return -1; - tap_nlattr_add(&msg->nh, TCA_ACT_KIND, sizeof("mirred"), "mirred"); + + tap_nlattr_add(&msg->nh, TCA_ACT_KIND, + strlen(adata->id) + 1, adata->id); if (tap_nlattr_nested_start(msg, TCA_ACT_OPTIONS) < 0) return -1; - if (action_type == TCA_EGRESS_MIRROR) - p.action = TC_ACT_PIPE; - else /* REDIRECT */ - p.action = TC_ACT_STOLEN; - tap_nlattr_add(&msg->nh, TCA_MIRRED_PARMS, sizeof(p), &p); + if (strcmp("gact", adata->id) == 0) { + tap_nlattr_add(&msg->nh, TCA_GACT_PARMS, sizeof(adata->gact), + &adata->gact); + } else if (strcmp("mirred", adata->id) == 0) { + if (adata->mirred.eaction == TCA_EGRESS_MIRROR) + adata->mirred.action = TC_ACT_PIPE; + else /* REDIRECT */ + adata->mirred.action = TC_ACT_STOLEN; + tap_nlattr_add(&msg->nh, TCA_MIRRED_PARMS, + sizeof(adata->mirred), + &adata->mirred); + } else if (strcmp("skbedit", adata->id) == 0) { + tap_nlattr_add(&msg->nh, TCA_SKBEDIT_PARMS, + sizeof(adata->skbedit.skbedit), + &adata->skbedit.skbedit); + tap_nlattr_add16(&msg->nh, TCA_SKBEDIT_QUEUE_MAPPING, + adata->skbedit.queue); + } else { + return -1; + } tap_nlattr_nested_finish(msg); /* nested TCA_ACT_OPTIONS */ tap_nlattr_nested_finish(msg); /* nested act_index */ - tap_nlattr_nested_finish(msg); /* nested TCA_FLOWER_ACT */ return 0; } /** - * Transform a QUEUE action item in the provided flow for TC. + * Helper function to send a serie of TC actions to the kernel * - * @param[in, out] flow - * Flow to be filled. - * @param[in] queue - * Queue id to use. + * @param[in] flow + * Pointer to rte flow containing the netlink message + * + * @param[in] nb_actions + * Number of actions in an array of action structs + * + * @param[in] data + * Pointer to an array of action structs + * + * @param[in] classifier_actions + * The classifier on behave of which the actions are configured * * @return - * 0 if checks are alright, -1 otherwise. + * -1 on failure, 0 on success */ static int -add_action_skbedit(struct rte_flow *flow, uint16_t queue) +add_actions(struct rte_flow *flow, int nb_actions, struct action_data *data, + int classifier_action) { struct nlmsg *msg = &flow->msg; size_t act_index = 1; - struct tc_skbedit p = { - .action = TC_ACT_PIPE - }; + int i; - if (tap_nlattr_nested_start(msg, TCA_FLOWER_ACT) < 0) - return -1; - if (tap_nlattr_nested_start(msg, act_index++) < 0) + if (tap_nlattr_nested_start(msg, classifier_action) < 0) return -1; - tap_nlattr_add(&msg->nh, TCA_ACT_KIND, sizeof("skbedit"), "skbedit"); - if (tap_nlattr_nested_start(msg, TCA_ACT_OPTIONS) < 0) - return -1; - tap_nlattr_add(&msg->nh, TCA_SKBEDIT_PARMS, sizeof(p), &p); - tap_nlattr_add16(&msg->nh, TCA_SKBEDIT_QUEUE_MAPPING, queue); - tap_nlattr_nested_finish(msg); /* nested TCA_ACT_OPTIONS */ - tap_nlattr_nested_finish(msg); /* nested act_index */ + for (i = 0; i < nb_actions; i++) + if (add_action(flow, &act_index, data + i) < 0) + return -1; tap_nlattr_nested_finish(msg); /* nested TCA_FLOWER_ACT */ return 0; } @@ -1056,7 +1048,12 @@ priv_flow_process(struct pmd_internals *pmd, } } if (mirred && flow) { - uint16_t if_index = pmd->if_index; + struct action_data adata = { + .id = "mirred", + .mirred = { + .eaction = mirred, + }, + }; /* * If attr->egress && mirred, then this is a special @@ -1064,9 +1061,13 @@ priv_flow_process(struct pmd_internals *pmd, * redirect packets coming from the DPDK App, out * through the remote netdevice. */ - if (attr->egress) - if_index = pmd->remote_if_index; - if (add_action_mirred(flow, if_index, mirred) < 0) + adata.mirred.ifindex = attr->ingress ? pmd->if_index : + pmd->remote_if_index; + if (mirred == TCA_EGRESS_MIRROR) + adata.mirred.action = TC_ACT_PIPE; + else + adata.mirred.action = TC_ACT_STOLEN; + if (add_actions(flow, 1, &adata, TCA_FLOWER_ACT) < 0) goto exit_action_not_supported; else goto end; @@ -1080,14 +1081,33 @@ priv_flow_process(struct pmd_internals *pmd, if (action) goto exit_action_not_supported; action = 1; - if (flow) - err = add_action_gact(flow, TC_ACT_SHOT); + if (flow) { + struct action_data adata = { + .id = "gact", + .gact = { + .action = TC_ACT_SHOT, + }, + }; + + err = add_actions(flow, 1, &adata, + TCA_FLOWER_ACT); + } } else if (actions->type == RTE_FLOW_ACTION_TYPE_PASSTHRU) { if (action) goto exit_action_not_supported; action = 1; - if (flow) - err = add_action_gact(flow, TC_ACT_UNSPEC); + if (flow) { + struct action_data adata = { + .id = "gact", + .gact = { + /* continue */ + .action = TC_ACT_UNSPEC, + }, + }; + + err = add_actions(flow, 1, &adata, + TCA_FLOWER_ACT); + } } else if (actions->type == RTE_FLOW_ACTION_TYPE_QUEUE) { const struct rte_flow_action_queue *queue = (const struct rte_flow_action_queue *) @@ -1099,22 +1119,46 @@ priv_flow_process(struct pmd_internals *pmd, if (!queue || (queue->index > pmd->dev->data->nb_rx_queues - 1)) goto exit_action_not_supported; - if (flow) - err = add_action_skbedit(flow, queue->index); + if (flow) { + struct action_data adata = { + .id = "skbedit", + .skbedit = { + .skbedit = { + .action = TC_ACT_PIPE, + }, + .queue = queue->index, + }, + }; + + err = add_actions(flow, 1, &adata, + TCA_FLOWER_ACT); + } } else if (actions->type == RTE_FLOW_ACTION_TYPE_RSS) { /* Fake RSS support. */ const struct rte_flow_action_rss *rss = (const struct rte_flow_action_rss *) actions->conf; - if (action) + if (action++) goto exit_action_not_supported; - action = 1; + if (!rss || rss->num < 1 || (rss->queue[0] > pmd->dev->data->nb_rx_queues - 1)) goto exit_action_not_supported; - if (flow) - err = add_action_skbedit(flow, rss->queue[0]); + if (flow) { + struct action_data adata = { + .id = "skbedit", + .skbedit = { + .skbedit = { + .action = TC_ACT_PIPE, + }, + .queue = rss->queue[0], + }, + }; + + err = add_actions(flow, 1, &adata, + TCA_FLOWER_ACT); + } } else { goto exit_action_not_supported; }