From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR01-HE1-obe.outbound.protection.outlook.com (mail-he1eur01on0078.outbound.protection.outlook.com [104.47.0.78]) by dpdk.org (Postfix) with ESMTP id C7D821B2C1 for ; Thu, 18 Jan 2018 14:38:39 +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=V+QUGpXP290aICbxSFrI0UoyMyqUENRPeugulVvynXRZikWNObU0S1kiqh9wWjds53Z9HC1LO+a/2YuBVntT6X0lQUbDKk9TanQ5pnRuRt6vPQAPps8ZYjwKQag/LLo2Rw17iDKhJOH1ozAoouvA7xxOP816lPUPsS8/fY6ncrA= Received: from mellanox.com (37.142.13.130) by VI1PR0502MB3886.eurprd05.prod.outlook.com (2603:10a6:803:c::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.407.7; Thu, 18 Jan 2018 13:38:32 +0000 From: Ophir Munk To: dev@dpdk.org, Pascal Mazon Cc: Thomas Monjalon , Olga Shern , Ophir Munk Date: Thu, 18 Jan 2018 13:38:06 +0000 Message-Id: <1516282691-29698-2-git-send-email-ophirmu@mellanox.com> X-Mailer: git-send-email 1.8.3.1 In-Reply-To: <1516282691-29698-1-git-send-email-ophirmu@mellanox.com> References: <1515692751-25257-1-git-send-email-ophirmu@mellanox.com> <1516282691-29698-1-git-send-email-ophirmu@mellanox.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [37.142.13.130] X-ClientProxiedBy: VI1PR0802CA0042.eurprd08.prod.outlook.com (2603:10a6:800:a9::28) To VI1PR0502MB3886.eurprd05.prod.outlook.com (2603:10a6:803:c::11) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: dc330135-96e6-4be1-0bbf-08d55e78c4ac X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(7020095)(4652020)(48565401081)(5600026)(4604075)(2017052603307)(7153060)(7193020); SRVR:VI1PR0502MB3886; X-Microsoft-Exchange-Diagnostics: 1; VI1PR0502MB3886; 3:Odu9+QAGST8uIfdut77eAHF8O7cuaRapukauPyXAR2skhYlukfBoO4HJrlXQTBmo864IYlc1wCEJfpo+tAz++5olzK8k+YtmSU9piUz5gcUIHbRADJA+M/1jjVqRZA6Bgg5xixkldWBGqNe4bl+aKjXWjXGojGSkqPERaJIloJN2/WCgCDjXxoLpzFmAqUzPeZEgm1UAOzxXTXc+tNumGGfS6e5bGQGKzfoBbW+PjEgQww+bAHghbpjrBKXQAntH; 25:dIOhEH7TYotVjbK6rDupHwNN0ZjD02LT8fr7U52/44s9hNuzdLDkLPCu6ZG14HWkBHbZOLbhXNWHHsk1Br0pk2KUZhJXPc4+AIx2B98eYYcT+vm73UI2Gd+opBf0AEeKUSRIlMsRWBFrU3yjSKRPKTeJMJayn+z73wK/RP+UlR6USdj435ms1fBsHJH4T741d8mCPEfJnMnxJFq8OXoB6RfWACMMC4cEZ15wW3rJSoxckrHZ2nVYRCEgi99F44MPzUbVe9uK8ScNzLSJ/KWCtVSCs4dtkRQVeXPtrMOzEkvMpGniFE7xiwErRJSItCqT/+pghZiUlqaRrDHHb9jL0Q==; 31:KnsuIzSO8O3hsNd3mj6CSLbR8jexhzfnHaH9iMsUGls4kwYBQLtH6xiJ0KEcAn+S704AAQX+wkcOzNuHfRl0SMJlg870iqjWl+/DvM24MG54LIDZxFIr9zrJCfEyBEjE6kXzXTG/6ey2IE4gFwRsPOZ/HcgsT8oiaruXru0yVFI01HwxXPcGkJQs7jnOb9jrpk4oJFE4uacv2ihHlhfqaoRId5hraTBXeWxqvuD+z4o= X-MS-TrafficTypeDiagnostic: VI1PR0502MB3886: Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=ophirmu@mellanox.com; X-LD-Processed: a652971c-7d2e-4d9b-a6a4-d149256f461b,ExtAddr X-Microsoft-Exchange-Diagnostics: 1; VI1PR0502MB3886; 20:2TEfZmakhuSIDfwAqgxcbMTE4dhgiaqcuRJtI7K/DHliz862IXqMZmc3crq1xQSBh9mMJfnsXKqdBj1sZWOzhYCXtcw5yW1ap8ZasPFxCAoBl1ve3/lCFaDSDX+jhkgfRWwDogpYAKKc2MGFh9QZxz+fzpctXajgsJHU2JydVV1QCKRey98qj5w6XZaALe/8unKCIe8AfhIQZE3eJZx2y62YcMaUc77OZ6n8rWMrn3nlcQvVPsOpAT0ZQpJ7Rfs9+WUhCNl+c7E13vY3BieQzGNse1nOlaI9fJXCDYkp8yNrSt6v5DaXLcYt8nl+cA4nTu+ESUoBSy28XCfBseJoxGa1w/V2/+5PDzs2jvxV1bervucr55nzlX0JegF/pV/CI4/7n7XZxR6Q/BnyIQhtm3vdU8tXIIvi2RvYSpXn6lgNbyJQtiqodo/gxXVbSnorgAjs4KByXkmPoMYRR6u+x+iR+v15fM3VZ6fbPF6F0P79bhJBWyPshQk46i3awZmF; 4:WXgEu3JeTf3FvarcuiefHizfI6cClLLU5zQzf3TcDSHNzmYOpEhkej7qli2HqFxT2xmEyKz0677kaRUizzkoWrUOHJIGsWHjT9vJEnlcwvpLoqgiGZqOL40QQkNHi04WWc0pLs+On9z36lkPl+83/5oqJpMpGKUmRGXXhizjOQmyLNlIMGlYavKeqCNtTolhjjIds3Ra80udeDXZuJl8FsWbxk3omkpQpFEW/TInmWFi8UDeE4gSNpijEDsw+J4xn+KuMpgijnA28H3gEavfEQ== 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)(3231023)(2400062)(944501161)(3002001)(10201501046)(93006095)(93001095)(6055026)(6041268)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123560045)(20161123564045)(20161123562045)(20161123558120)(6072148)(201708071742011); SRVR:VI1PR0502MB3886; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:VI1PR0502MB3886; X-Forefront-PRVS: 05568D1FF7 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(346002)(39380400002)(376002)(396003)(366004)(39860400002)(189003)(199004)(48376002)(33026002)(305945005)(6116002)(478600001)(3846002)(106356001)(66066001)(50466002)(7736002)(8676002)(81166006)(21086003)(8936002)(97736004)(16526018)(4720700003)(68736007)(6666003)(51416003)(7696005)(52116002)(81156014)(4326008)(36756003)(50226002)(26005)(69596002)(105586002)(53936002)(5660300001)(25786009)(59450400001)(386003)(316002)(47776003)(76176011)(2906002)(55016002)(2950100002)(54906003)(86362001)(16586007)(107886003)(6916009); DIR:OUT; SFP:1101; SCL:1; SRVR:VI1PR0502MB3886; 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; VI1PR0502MB3886; 23:E/3ukTjmn3xD614eZ9KUhbxSzSB7A+c97DkbUL8?= =?us-ascii?Q?kEM7qzu4HLH6PUIB237pH1SMqHh++z2tFib/E3lJxKpk6DSmVL6XfXCRnQvH?= =?us-ascii?Q?LhF6CfjU8Y/+I08ArOjBJ7BsvY6QSSk6GJWNJ1PTgeqv96EXFHCMkMdFSmfC?= =?us-ascii?Q?HANST9AI7mGUCnu6fEMtVqbLc5CElQ2cD1N46Gju/hynNcAPKKjCEjJxKafE?= =?us-ascii?Q?PCgwqeIFWS4RImHeEB/HXC3tpY6sICUqfKEEcAyrnSTx7IeYu8BGNiCFwVTu?= =?us-ascii?Q?FlgCcRfSUIQqJYEBvbrk+3QOpLYB2EhUviqyLc1abEcHkFBcyDgPzx0btV+r?= =?us-ascii?Q?89BnJWwZR78Hj7WkXV/5TrKMuspbR2EPUplI7DY0V4K2XEdrnsrzySipsJOC?= =?us-ascii?Q?bM8/cBinrefAbsmymTW0IY6LeXCnZpl6+uzXAcBDY8XEVvDT1BJ/0AIC1yF9?= =?us-ascii?Q?XW7spous/u9Co0oqzm76JvHRtUqQ213imGUR4qiwjKTNaPlAZic8/CjoTNOa?= =?us-ascii?Q?g1Q2ejLdiGgxrbMUoEipXsvLi7wTK82Z34v8L8lOTlX5fNJrvvg09oKARd9G?= =?us-ascii?Q?6QHc7B8Al/VppxJITLGDs7VJeia9RaKreC1DBASzDoisd1xGXHjLR/48wqjc?= =?us-ascii?Q?2L1014AGMgc6pcB7ZcsMpOmbn7mp5j4i0h41fqIjH6/wsY0G5PmluCsdVLpt?= =?us-ascii?Q?oYiQzZuJ539nHL/eu4koZsKL25P5P2wzZcAz4jfFPR4XXfd0nkOFktc85LCu?= =?us-ascii?Q?rvSZikjTUSrCsjd7qUdqzF+ZdjuuVgg3+SseTcs+45B7DfLXWsZIaH6aB09F?= =?us-ascii?Q?BIv+Ejxj2hP+8umQkl59hQWpkagMOWAACaWUgH8M+RtW+y3XXmI15UozIst+?= =?us-ascii?Q?73JGhu9/oOZwLKTOABkgDwSFCedwc878UmxAogPbt18+q7HsplFyYo6lV7Dt?= =?us-ascii?Q?BZtMg+fm2chHVoFv8997QYX9QXdeAF9w6Qct2A3tdgWDtUNYHJ/N3+POht+X?= =?us-ascii?Q?xGyZfKfqUonw3ZRK4gKfUE2VkxTso9P1FTdPQnvaj1N7mg9DsCeUpXwsiVlT?= =?us-ascii?Q?eePfoW1iwyRhrg+evnuPMmKFbOmqouU+nkBRtunXxfa5R1y42bjH0NHnD3MJ?= =?us-ascii?Q?NHeRkXeucgwKmNnGYarahMgiE/maCuUPFZSSaa0F56UpfjCz27x1aF72bmpJ?= =?us-ascii?Q?Y3YJD7rwqEGOYixIk3Z95QjiQ5P/3sdiTPpRsmGj6lhptZKKTfd1BkM4WpA?= =?us-ascii?Q?=3D=3D?= X-Microsoft-Exchange-Diagnostics: 1; VI1PR0502MB3886; 6:Q3GD6T4fwFPRSyw7CmkOQR17b02tohUeuuSnDjmfpj193PO1c++xm1fs6LuwaPY+iIxs+f4ggs6o2vnfA1wpVFG1srHGGzr5g1RHStcEmQM2bBw+3UJOrzLkMrcnpoH9VJhKmFWGb9CxRpy1C93Npt0AwKaCCzZ9UvlGpIk3EI4SIczVeollZNbBLD900I5etpy/EFvUrGLTmU+H6qZ3LnZU0qH6u+7bp5RqediKp5dv5K8uPOVCrMOIbgKxBYMGQYdLuKgmvbelcFyttLEa1bDyD9Q0aey0Y7J0EnxIdq0eV1XVQ7JN7nMA7xTMWuU8E6JNLXLbMFF6FTIysYzyjvaqbAStlOZwbOmADRs6Njo=; 5:ThwGfmLCtngcbmfqJ5mb0/zFBYCjL9BiKX9/3nowoeCRx6E09p9qilysahRb9P4dVD+kdcBRXWPI18doNvCQSYy1US4yDq2YBrDtl7RA5LywC4nTpUyB79xz+D/5dID7NZ/mTS2ATdm3YYEfg86n+TYnyQnEWK5xQkqDIsCAi1E=; 24:LNTRLiFwvyUA7sEprKnhwlVR13HtaDTh4Vyc/AsI9pBdGe7hHfdtW62ho1T8yAbdqvk/vAeWPJlqMn5ZUUeRVorgFpsj5eCdQ1+fbxP58O0=; 7:qNhB/baKvct8jJBg/eZClC8JkSWH7NPtG+YMzcF/BWs3wWc/TiGUrD2OzDPNBKJ4ucEVS1a17wTRyVtvumhMk4wY97sv8bqJDVRaEcrh6MgQ6WJqNliNHxCbdoWSJtuQwjA/gkuXOSG4Y7cK77aGHzVYy5jZjQ78GK/ySH9gA3oOBpG92EacwVhRIAlxD6/i0C3Cqpfkhu+P/WrUOjVMuJXu2reROjXy0d0yNf1+qlicx7FKaUdJ+x0wk9ZeQuOb SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Jan 2018 13:38:32.5707 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: dc330135-96e6-4be1-0bbf-08d55e78c4ac X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0502MB3886 Subject: [dpdk-dev] [PATCH v5 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: , X-List-Received-Date: Thu, 18 Jan 2018 13:38:40 -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