From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-ve1eur01on0060.outbound.protection.outlook.com [104.47.1.60]) by dpdk.org (Postfix) with ESMTP id B2E611B01C for ; Thu, 11 Jan 2018 18:46:11 +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=wL+W6E54J/VvfpnzecriCLcf83U9MLqPfaKUsFB3440=; b=yON/AjulZOpylJ8eqxDQRvlX6i4n/cXUX5MBJtJriiaKNgd5iwjtdVbVD8QikSAOUUctga5zIohqiBj4ClAiDZl3kUDLtZGrlZVFFe+otBm3f8D6zdpY/EREnxrO9q684a3EO04PsyT9g78xcoQPQ7nJjFio+66uLzz9FyXulXM= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ophirmu@mellanox.com; Received: from mellanox.com (37.142.13.130) by VI1PR0502MB3885.eurprd05.prod.outlook.com (2603:10a6:803:c::10) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.386.5; Thu, 11 Jan 2018 17:46:09 +0000 From: Ophir Munk To: dev@dpdk.org, Pascal Mazon Cc: Thomas Monjalon , Olga Shern , Ophir Munk Date: Thu, 11 Jan 2018 17:45:47 +0000 Message-Id: <1515692751-25257-2-git-send-email-ophirmu@mellanox.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1515692751-25257-1-git-send-email-ophirmu@mellanox.com> References: <1515567969-27946-1-git-send-email-ophirmu@mellanox.com> <1515692751-25257-1-git-send-email-ophirmu@mellanox.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [37.142.13.130] X-ClientProxiedBy: HE1PR07CA0002.eurprd07.prod.outlook.com (2603:10a6:7:67::12) To VI1PR0502MB3885.eurprd05.prod.outlook.com (2603:10a6:803:c::10) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: d1445c5f-e053-435e-634c-08d5591b3339 X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020069)(4652020)(48565401081)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0502MB3885; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0502MB3885; 3:wLLIYGTnH4h/IYQTmd8bXujunKOoxpuUnNUK+xT8HgQSFvK02Pbqv5zVDIjuKa8qRqlqDPRv77c86E5mSlxPAgvpPnHLYwi9FetaVb4faLYj1Y7C+RQxAmxWRxOnxZJKWtWMSJF2GaFFOAU0ED0kvqTAiRBfGH5CUPuljlWJuYiht3TFsAhLt1NmNmFojHm8beL1Vzzuf0XnKtgZMM3tq7ohPX1ke7fGGyNgygIN1Owai/KYkN/aaH/bH4xmu38r; 25:qQ0TH4Uj96SmH6woSiEMpxIwWUWNN+ZO2+AoFLA6QhEmd0Zpv723CQyrFCQCXX0TgagBmprITkYYkz/bEoM1k/n3J5K8kO6flgI0ZpFCDLYSOC61xFWGnO4CK1Xw8qdnGwF+SCjZW0ACGWP9R/i7bd9RPD+/+pZQEgovujfMRHyxs2vGZKHemfWw2GRzyvgmoO82X7I9FFhzv+k1l6cqBbN18Xuv5b/OM7xu5ouzPDF6/1zZNLbbIzU1O7sg7CT77uDeTkOM7VWvZ8R8QCc1BMZ2YxdVYG3QpJzrtNPO4lBC+JWAfRBvYJBHETLBwHoeDlFUgeMqlKcAQpQ1E8Ndew==; 31:Y1eX69BTQH4X5k8Jn8Tq1ZxBk7c95XeHx9wiqdVKyozRn4ZOIA0dYjcsCCRWAxOOrJWg19UbsJ9MqEK9lzCzPrhLGKxyX8QBmzm02iXThRMi/CN1rwvVX13yluWbmyxrKmzpmJWckeoeZG/mIr+tVavUKMq+4v9j8Gu8q5+2EiPMcW2fqPQOuCQC4PEI3wIKGP+N0QiizmShlqPiylzhGomAjJm2iZAgxBiM4fQ4wIY= X-MS-TrafficTypeDiagnostic: VI1PR0502MB3885: X-LD-Processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr X-Microsoft-Exchange-Diagnostics: 1; VI1PR0502MB3885; 20:znXMBODMjTb96v73lLeJ1ak5vu4DNmrVzHjfdwsIqJqXH01U1d4ggcZppUrLrR7Ml0n5bRYpKSzWcZSbs9+kvMPobp0tTUN3DhRCremk4Tex/s1W53WjbaomGgvfWlIIgBzrRxQN8GdWdtE/0Kh+4ORLh5sqMK+QJxGLXqzyA7Bu7AJtI9NCuZ3udKpHHwk5PJryn9e+JPbZvBfdr032JvyEuCYoM8ndgGkHnhslXCFcS0BnD5Wjo2iPk004GWsW+LG+G9ZYV5AWvYPK+A8eSfli7fcdAnvUCHun6xq8kbWDLFdshLl1PvmkjqwXbtEoeZDrnhyWfdhYG+NUY0KCL5GlFqNyBYUx87LBJNwUmDI/apfFrOQfM9ZdGPMP7N4sMHzTxpSK7lJz3Yz1EVusjqFcZmyGxXLuzS3iqmg7NOynN1wH0ZKRaOsMKyXXlwkDbbGBwXeeSM0bEY73vhTToTZyVd8EJ5xcKNQIPsf71XfgqE1zvol8I+/mBLz2PEyf; 4:5OKn/McRkDqJjK7RewhMirOEfUOSSEeaHFypqY0nHBVNhJkW3S9jgAgcqpFurY/8wtFZRSnLvHgxvsa0tumEzoeL25Oty8qjL1oNK7GKel2ZQ5KPCKMlw8i7p5XtHBjt5XDe+FPWYcv8///pT05GVg0YW4bMJTGoBva6Efg9V8G3wXIYtBqdfRJrcywgzGZBR9gPo6WW+NH+/xNby5vIRIrOPsLBDwkPPhA1nM4YSAE348nc6Hq4RuCb+eI6XzIJjKmauBAil06g78ICC8jseg== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040470)(2401047)(5005006)(8121501046)(10201501046)(3002001)(3231023)(944501134)(93006095)(93001095)(6055026)(6041268)(20161123564045)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123560045)(6072148)(201708071742011); SRVR:VI1PR0502MB3885; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:VI1PR0502MB3885; X-Forefront-PRVS: 0549E6FD50 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(39860400002)(376002)(366004)(396003)(39380400002)(346002)(199004)(189003)(316002)(68736007)(16526018)(97736004)(69596002)(21086003)(16586007)(8676002)(8936002)(81166006)(81156014)(54906003)(50226002)(2906002)(66066001)(3846002)(6116002)(478600001)(47776003)(86362001)(5660300001)(51416003)(52116002)(50466002)(7736002)(305945005)(25786009)(36756003)(7696005)(106356001)(105586002)(386003)(33026002)(53936002)(2950100002)(55016002)(4326008)(4720700003)(107886003)(6666003)(59450400001)(76176011)(48376002)(6916009); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR0502MB3885; H:mellanox.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX: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; VI1PR0502MB3885; 23:zvYwPV+hHdiUX10n0gIF3Z+IUkEOMLLWp1dp6rs?= =?us-ascii?Q?AbmjAAfGkxdHpoNoEJ6XTwiTrBFgegsqEeSOA9wVrH+FbIsfyyMCTAP1PThE?= =?us-ascii?Q?1tj2E+01TUHSXfqHk3puMA3ISUuOIAsfPdFpYTghHEyL5a1arRjC0qTIxaJQ?= =?us-ascii?Q?2Sol8Lt1YJhjbPImQMuHL6dznPK2J2+QSkZQ+Tbm3zbGQG9sfjg5Y8u5K5jl?= =?us-ascii?Q?CHlY+2/JVRlM64Iv/K+2pZIwbr2WdKuFp98ix4RGR0O+Mkh5hOUDOfqullQr?= =?us-ascii?Q?oaLekixkDybfjHhXtTDUo4mEX6RGvRhg0htepjfM25L2nnbZ7Y1wnkNNUDdO?= =?us-ascii?Q?8RjW/b6xJ8sofLzfppjf0VJULhxVixelNz+Ppuf/7VZBrcY1gSYvvuUX298e?= =?us-ascii?Q?Ms4OQDNGPJgeXmEhU0zjVcat6WNUNe7wUUmg7GQ64UjzxIr8xYYsZaADVwr5?= =?us-ascii?Q?tgXFLMFZ09sO2GQkh019gJ1oXgUNFFQOCGpkmLfQCJ1HzuZTShmtBojzn+9A?= =?us-ascii?Q?HH5v2DExyoZi94NFjnSFYZot9FOD5ZSIqn7pb+C5MqGwDr+JEAobrZL6D4mx?= =?us-ascii?Q?QuEGOCxWQiOsWmS/Z0yRxFYySaUeihNajQJZXasdqFqA4hxEpjxKXcFZWaYh?= =?us-ascii?Q?YRvMOfG2+ZhDMLPZ6Ac3YF/dGOgYCFunqrDtJOMHAcvxJjICVYcnrA3wV3wg?= =?us-ascii?Q?E1iQlvlXxBbxmcxXb8kDANZ7lkB+vH7hkyfdhA0tloOQnhBymiILkjpzcw46?= =?us-ascii?Q?VSebWEtDKN97jz0VduiV+bE81cXG2f85rRtR7OaZXTRL1PbUNzffIdlkhpzR?= =?us-ascii?Q?rFLL/owRThLfXBKd9OhHhXI11kU2GpeKkd6MEq7Yz6oNAGU/hetvN83M2OeS?= =?us-ascii?Q?M+5mMrDi/3y/FAim6mNZXd/BTanthwhKkEMCC6ml69Bqo5Wjf/WYd1hug4jx?= =?us-ascii?Q?lJtQNi/r/egbB4xdM9OdoTz9jJHRDh7TlBnrcAlgpeGpCO1r+f8vd0CHJIyR?= =?us-ascii?Q?H5mNc10v8abo4fch0VLu8srIVbBF8wZiMJT7Zh8D+RhN0ciFJDo9hMqKS2OO?= =?us-ascii?Q?ts8ZU2/csjPXQzuJJanbzCZKNCru2J0TUtbIrTJAG3cpMZxIuHpCeYxf0CvE?= =?us-ascii?Q?blYkVwwSEpVNaufUOlGg7kqg5qQ9IT0up5NBCKDvcEEv/1YK8kO6T7mlWy9w?= =?us-ascii?Q?CI+jcQuh/OARYeOq4eYBS5WOTH3F/c3Tq/mp8?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0502MB3885; 6:zgAGzIsf6/yGSJsP2JR2beuTX6Az/LYoMbf8666VJOWEmBn18hsZ6TgLEuZJVS2dBdC0yU2hvrYE2SAuJavVEptNSNmVUVnW31Gn8DAf/zDEDIQljHsTg6wbeC+uVOrxFTTRv+BDI4bQ7BjMXGiHOrgDD9zzkiwq4tyVTYLGQukPNeMLi8reJslmO3NAAZOUKhCSbYKJpS/Fd9gOfllQ248iQ9aN8g7ssKadjyV0A6HSXKdCrE7dD+kKYCeNKi3C4POLsUUhsjPPMSPQfVleuNT7EmT2PCl3OjKVpeQusvyK9Br69X1ahoQYaNfY5FJdGXWS6k8zaw1QKKdL8lv8qfAe2BHt9tkVd+lq6VU5+MI=; 5:e6ufJ3neeqSrtl834vhnIoJ87WGsxBJe8QYUche1kCepBHVXNl250WoFroHnNnFmjNdgueN0PhGFLpzWi9XAuDCJHarUZy93NB6co2a4SML/2vQWht40ObNWdBkBrb5SC745u3r79ap5JaRbE221PRvuCe82sn+FIyFNcpXjsGM=; 24:4u9zZbkLdvR+sIKlBiItnsVNe0xCV3U3HnGMqnV7rIbuUQDPSw+W/ggBx2E8q3n8a0GQsXBPAOL/zWqNENP3+w4kWefMItVBofEEyTbEtZM=; 7:7nxKVaMQ3Bsq+n1byLPEKA+Qcgss8ksE9iOgGCQjx5VFeXrR/34lj6bSbebka0kfWJtw3y9Z+ru0qdz8aR5drn3c0OQhdfDxZpgg1yZ6/cprV/C6bNl95CPI/pKMsfx/liCBB5EtIdJeibvg+QcEBNC7+NS02l74+55gXa8A9f0Rasy6yvaorBii0410TkbbnxRQhG+YBemGXkdIvUtvvgcz3xiY4S5e9SUf7cKDgv11K4vEdezHGcNp4of3nhlj SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 11 Jan 2018 17:46:09.0712 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: d1445c5f-e053-435e-634c-08d5591b3339 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0502MB3885 Subject: [dpdk-dev] [PATCH v4 1/5] 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: , X-List-Received-Date: Thu, 11 Jan 2018 17:46:11 -0000 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 --- 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; } -- 2.7.4