From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR03-DB5-obe.outbound.protection.outlook.com (mail-eopbgr40086.outbound.protection.outlook.com [40.107.4.86]) by dpdk.org (Postfix) with ESMTP id 397261B135 for ; Wed, 17 Oct 2018 19:25:19 +0200 (CEST) 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:X-MS-Exchange-SenderADCheck; bh=uT4YfBBxJmIduHA+lXkcRWjycUuVewuTnmInPxwA42s=; b=r+UQkAj+R/ANsbmk08q2AO87KzJagU4h6E4zUuqiTxzGALG5InH/V8RErznXuCagZOcvAo0E2t+56xPWVd0yjus7KR7zgJVELLHZHGq9N897/ElmfEIRJM71vXBze6DEPyYyrkidfURBdZwmop9Hy17Ch6qC7niBoH8TY/svEqE= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=motih@mellanox.com; Received: from localhost.localdomain (37.142.13.130) by AM0PR05MB4436.eurprd05.prod.outlook.com (2603:10a6:208:5a::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1207.23; Wed, 17 Oct 2018 17:25:17 +0000 From: Moti Haimovsky To: shahafs@mellanox.com Cc: dev@dpdk.org, Moti Haimovsky Date: Wed, 17 Oct 2018 20:24:50 +0300 Message-Id: <1539797092-2395-2-git-send-email-motih@mellanox.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1539733797-31468-3-git-send-email-motih@mellanox.com> References: <1539733797-31468-3-git-send-email-motih@mellanox.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [37.142.13.130] X-ClientProxiedBy: LO2P265CA0117.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:c::33) To AM0PR05MB4436.eurprd05.prod.outlook.com (2603:10a6:208:5a::21) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 4473ff64-e23e-4951-b6d0-08d634558231 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: BCL:0; PCL:0; RULEID:(7020095)(4652040)(8989299)(4534185)(4627221)(201703031133081)(201702281549075)(8990200)(5600074)(711020)(4618075)(2017052603328)(7153060)(7193020); SRVR:AM0PR05MB4436; X-Microsoft-Exchange-Diagnostics: 1; AM0PR05MB4436; 3:K4Wz2jNBE4cGk33D4Th/Opk99lzVtwX/4obDJa/lQdCDW8pRw6NurBmj/H/wr0i2ZGmOYCV5i3QOgKefQjiI6r8lJ35OOs9ikE5TCpYEaT5OrfAzQFoSv4eFRFtP/UBIce48B0YW3WX0DNb3ySzoZlF/gtutE8BLFHn0p24cOAJjBfXITZXDmpK/GTpV2eEUGIRl4tLVpOuJ2ftJYpnz7LkSTHpPX4xTDXaczWBzs2q4QPaTlXWTMPSON0JVgI1z; 25:mcJeFDA9ziwhEl9IN20+4Ht6Q/CH/PbMOxxQaf9AKjEuzD+wRwZCh31lxAstrPe66w7W309K65e7Mvn6QC0WNW236tbjE6MBp5ggt+qc43VTVGxMKPjCs0aAjNZUMaA/gMGmAYiVIar1onPdZj2f9Sfzxml1QB6Bb3oOFCAXIEh4H/v5Muv7+z2ywDrVnEXnpzukSl61/XmdK42aqz9+40dvs5uDvnLICHVvnz4kNyNBXQ0uV9wSJe7ef42nwJQl9VNU5lUyI0/cd7ZXo54LwYdt3pWEMQ5kKMS+uxBmk970Oi56ib0QvZJ10odJukyrhlcKPIkQUVyOtx+/SpwMXg==; 31:8xb6e9jPjrh8GUdhsBUUmFlw5pLnJGhUtTuJ3Oy2PD9FHkIn+srT4BVFRj+mibEd8s3sFRdLNvUvTHIQUL2vIT5q9DNtbt8MHq6ICz1J4hfXm0qpgmlkP5YcCLvRCkgYmfdfs5WE7hnpb9VWhEyLsrV/ki6NnHkNBbE+5UF38l4ksVcO6lA+SN94Cecgyt/bcpdrigZQqBtqimM54j/p3HzH9WjdxB6wpzwZpbv58/4= X-MS-TrafficTypeDiagnostic: AM0PR05MB4436: X-Microsoft-Exchange-Diagnostics: 1; AM0PR05MB4436; 20:Rckiz3hupp2iXyA5HkuQ5fsS6neZWVJ0rPO1L8tuYs/ddky+z30l3S2mhJRnqasE3V5ruWGOO5/2FxSujO4nbluQBx4Ncz0tRyx6TP/EJf2Mu2Zm4018wZlfNQQcOTg4dIEko0zI2hzKJLb5YoGkY96BECTXWqlAttU+DaBJEUqs8ifQn9f2uX3daIt4d1trRNxpfjuiBN8C991A7eIawahoV6/qbmi578E5rPEnv43OqX1f1x6ttJb/SQqJQDKk5VJtJVWYlERv6VmZMocilvBMRhsAxWCts1yGKIGFd8ubtbYkKwEJxPqdjkY3PEzGzf4NTs/vADJsPnUOn85dcFu5AGqKvzf21rTcjwUbX8WwhNN3qoYjL6Ywsp2yiATDCP4Ytr17rjzLMm71jZ+bpBLD6A8CKc98Gnkl0eG3YihnCE65j5Hzmq0ayZBoIE888R4Y0mEIrLlk1bRkNzvhj90PCkVg8exwe6Tcfcz61+jX3w7wnScCD1v+yKcS6Qkz; 4:Zv0RAausiQGE5MuWVe/A2ZsZtuG+dX0lPH6Pwd4JjkK6t59qRInRVpbxChS1MKyDclZGmCap+dr2Ig6NIDx6jsOmOq3M2CY9du+jaPx0H7+N6ypmNRji36Hc+Dim4YSswAA55cZ7L/Ut3wBcb0nmlIAWFlD6tK0Sz2/bP74KDlO5SuK7DAhpA0UFKzxHcKNFfOBRWpFnNRVggpCTsxnL7E6gsjDOeRyp4wLGZQkhO6Py6bDPKXz/6/79zhoK/JylD/U6cbDSWxHBgBaAnXJYE9ELTNA0BHMJArw96wXAVKsgQBChkWbFbTNFOPwEGh6s X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(269456686620040); X-MS-Exchange-SenderADCheck: 1 X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(93006095)(93001095)(10201501046)(3231355)(944501410)(52105095)(3002001)(6055026)(149066)(150057)(6041310)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123562045)(20161123558120)(20161123560045)(20161123564045)(201708071742011)(7699051)(76991095); SRVR:AM0PR05MB4436; BCL:0; PCL:0; RULEID:; SRVR:AM0PR05MB4436; X-Forefront-PRVS: 08286A0BE2 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6069001)(366004)(39860400002)(396003)(346002)(376002)(136003)(189003)(199004)(6116002)(36756003)(486006)(6666004)(446003)(6512007)(37006003)(6486002)(86362001)(305945005)(2616005)(7736002)(16586007)(105586002)(11346002)(106356001)(956004)(2351001)(316002)(4326008)(8936002)(6506007)(478600001)(52116002)(53936002)(34206002)(2361001)(26005)(107886003)(386003)(476003)(47776003)(16526019)(97736004)(5660300001)(68736007)(76176011)(66066001)(6636002)(51416003)(14444005)(2906002)(186003)(50466002)(48376002)(25786009)(50226002)(81156014)(3846002)(8676002)(69590400006)(81166006); DIR:OUT; SFP:1101; SCL:1; SRVR:AM0PR05MB4436; H:localhost.localdomain; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; MX:1; A:1; Received-SPF: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; AM0PR05MB4436; 23:JOvwWuHdQk+S586hSVQ72fi9dBZ1MqB5UsRFHj+ht?= =?us-ascii?Q?CK1g+Q7YTIQnOZN1MIZ2754pSvTlh6F8CqOiuFDS23idWz1P+U61NKm+SI6W?= =?us-ascii?Q?CY6sO9pbFwTA3DxRF04zBh3TrA/s18Pq2Olpe1//7pli+Y2Y7DIZjQoBPF9P?= =?us-ascii?Q?UCrZvW4csj30a6pLqP8ESfOHF3uX4LABQD1GCWr+y1xKzYck1kNEL4PFBUxp?= =?us-ascii?Q?TKDgZNJdS+ikcex5iuVEciajlPhTbUwhHX6yqWxnSkgSOgv7hfDen9fKrMxL?= =?us-ascii?Q?w+D5hNXbVs2aLPfcU1hwLNLvYyrZ6MynT+O5HAdy6ojCH5TylpTgqFrNFIKR?= =?us-ascii?Q?azdUbhlNiklDRcv7Vs/7WooEvrx8GLzHlGFX2yewJ/xYXfOmAMkquFB3U5A6?= =?us-ascii?Q?waOaEzYLc8AOpNRYtaHAvUiteTIDRSJ5FPwdCrTe97Ld5hpynLRCrPSPjbyU?= =?us-ascii?Q?XWcE5zJDLoMXG11wQOkvzOWnWFgzwP4iKHgVbTZvu/jNNCzyYFdn37BOADHW?= =?us-ascii?Q?lFcRHB1v55YFrNvnI/0qGhVfAeHuaYeOgu24lmGypTuccyb8Khz93Ly0t4bS?= =?us-ascii?Q?qgJXsnfVfGUqx1Fia1VYYMtH55xjxvzkvEfjwC0DxPYRhyD6wEKAHRGNWa6O?= =?us-ascii?Q?IqcD536At+VaWYW30Pq3C1mONtVam0P+Q/ujaCKFo09Akco3Hl2OjuVOyYhD?= =?us-ascii?Q?hd0j977ClSQjmeG4I+uvdLMy1Q1+AYtNa4F5v9qobkWV+3j4w6OzpVmtjZcX?= =?us-ascii?Q?4EZ9744zDVAe0T4rxmaqTGVDUhmjkO2j5Ih+VsQR2XkP8kgKQPAn9/cHf7gj?= =?us-ascii?Q?nzup6diNFHluNN1ddXrtAn53Bzy9dV0Gc5Q1x3ueuxTyz4JFsiefzHrOBoLO?= =?us-ascii?Q?7cS+6Ya3ZtdqNxv/7u1RVNJevcgpCHpotalRixZrWeli7x2lqEKrAo82pAL8?= =?us-ascii?Q?ZkDrsQoT/ePgbhNxDOXlFc80WdmQwRyjJmmf8iy2j8lgcBGtKko5sp5TLrmv?= =?us-ascii?Q?95KgylJNCZiIj4mh551WcsHENvNwEbyUVpHXIqR5nFm4ulL4HBrk4gTga/Kj?= =?us-ascii?Q?UnNDz0WaBlbCIdR+9hwwHTH/pPQ4pjCmYGg1Szyu7alAhnV4c0ua2gGX87mV?= =?us-ascii?Q?6yWwRLXBCwDDshztA531UeZStFPycr2J9/Mch47+5mXss7hG5RJyphnVk8bk?= =?us-ascii?Q?ad6tQmDDlt6OeQx/mM2+OVsSNV1VDxNP1eDYGwghRLE1ytw6wiBA1awTnzQw?= =?us-ascii?Q?hBDiPDONSUqaS+F4WVfMmVPuX3VaeYyv48fcaE8K8NkWlGHdLdZYBBYmQQM+?= =?us-ascii?Q?HGAbUKB64ZgpTdnUPo72JY4D5bSvQrUiBr+C3nalD7M?= X-Microsoft-Antispam-Message-Info: b1rKHijVfin+9aibVzlJxDtLPmb4czIW56Wl1/QptOGa/azo9lU6NHVMzM0Au5SsXEzOaQjLl0+P0UZdvzcV8XRgoX6cTBcqVhy4jy1gm0r7JJlbXV23HZ5xvl6HmF06DJRDK3x+jGJAd3FQHokgUoYAyzNyYWLS24yxJwYmgjK/SMDGGMaorSlTGFjqU5cbSsU8a0U1TXYC6g68bjF7t910nBj891O8RISlTLUUe/KOlECpmADHKdWR36WSK8HcodcjyLweFmFs985imj+/833xvbBsmoZx6rx7njU490BwelUN3uDzXrGIXBVeNGPmPsRgPS8MPRpG72JGucp1j8KXZ/G3QKiPv8GwYoV1cOw= X-Microsoft-Exchange-Diagnostics: 1; AM0PR05MB4436; 6:QnYr/XvdxWfLjFVgDVIQ7n4UoAPDr5CaPGvMns9KyiZEZTMbjGsfus3UkqP9hSYUwiimGwVz/jFqOGwKMtX2z24aD8TFYJtvRaKZ/qj7J25BRe9B/Q8Cc+rWikmifJBu1Ag4NQ8jb1YAczflGEEjmeX4sA95cLWgVXMwV1tA6k82jOQZ4Y+e5g++kmiDIVMlMF+h9fE+bssQyvRjrNaTwtLjX53B1NdAnOaT0Ff2W/azWuJQE7EcPOrlc4ICdxr3EoCS+d2q+4SiEuPjSLdxUJOTNzyUG6y0HWOTh8eNi0aEf28OPZhjJIrr9AIQwH4/Ku6zJQfCO6tgbdf1TfASiUxIsH6hRme7eSyWJ3A/0SaELSokR6mEicFldZc/SfVesGImbwtV5ZUKBfI8eIM3LnIFaZL0eZLUVN27ZJ58kNJ+kxZ8GgbjxCNYhtN/tUHnz6u5Qqz9fH327UMrlXvSyA==; 5:DkoIR8EkV0SyZo7UyCP6T1yOaoH4S/zRwRpxe/s5Tf64Z2jZgAHVyaxMC7PFI1vH1rZmsP3D86nO3eOxMkPPYU8rV1hxALZHZO2juETNZ4MHEz1XdhoN7ryM/5Yek/cuYedVU9nPaOKRuHrIsHqWDf8i+npSna1P/31D1/Kguxk=; 7:XcJ4QAOk/YfAmL2qoVQyjOM9DsL8Bm7+T6Hnke5o9N/CLealSNPcmdiaU/qbNHrhL0hmHyxxmTqzryFIYz1T3HgFaK3fuaYbpIJ0geg6z7PWHtdc25p7Owps793MUAU7Q9T+QyenTAZQL2nNmFzd02Ja1aNZ5F3bzhelzsvo3vVftzHCS8PQ8xvJHXO6E1AQkazF9y6JWdja1ZP4vBVeFbhANQ8bcenE8UbobjMiv3mCvgT+W6odulZSWRoUNLhr SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 17 Oct 2018 17:25:17.6991 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 4473ff64-e23e-4951-b6d0-08d634558231 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR05MB4436 Subject: [dpdk-dev] [PATCH v4 1/3] net/mlx5: refactor TC-flow infrastructure 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: Wed, 17 Oct 2018 17:25:19 -0000 This commit refactors tc_flow as a preparation to coming commits that sends different type of messages and expect differ type of replies while still using the same underlying routines. Signed-off-by: Moti Haimovsky --- v3: * Rebase on top of d80c8167c4fe ("net/mlx5: fix compilation issue on ARM SOC") v2: * Rebase on top of 3f4722ee01e7 ("net/mlx5: refactor TC-flow infrastructure") --- drivers/net/mlx5/mlx5.c | 18 +++---- drivers/net/mlx5/mlx5.h | 4 +- drivers/net/mlx5/mlx5_flow.h | 9 ++-- drivers/net/mlx5/mlx5_flow_tcf.c | 113 ++++++++++++++++++++++++++++++--------- 4 files changed, 102 insertions(+), 42 deletions(-) diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index 795a219..13f2fd4 100644 --- a/drivers/net/mlx5/mlx5.c +++ b/drivers/net/mlx5/mlx5.c @@ -286,8 +286,8 @@ close(priv->nl_socket_route); if (priv->nl_socket_rdma >= 0) close(priv->nl_socket_rdma); - if (priv->mnl_socket) - mlx5_flow_tcf_socket_destroy(priv->mnl_socket); + if (priv->tcf_context) + mlx5_flow_tcf_context_destroy(priv->tcf_context); ret = mlx5_hrxq_ibv_verify(dev); if (ret) DRV_LOG(WARNING, "port %u some hash Rx queue still remain", @@ -1139,8 +1139,8 @@ claim_zero(mlx5_mac_addr_add(eth_dev, &mac, 0, 0)); if (vf && config.vf_nl_en) mlx5_nl_mac_addr_sync(eth_dev); - priv->mnl_socket = mlx5_flow_tcf_socket_create(); - if (!priv->mnl_socket) { + priv->tcf_context = mlx5_flow_tcf_context_create(); + if (!priv->tcf_context) { err = -rte_errno; DRV_LOG(WARNING, "flow rules relying on switch offloads will not be" @@ -1155,7 +1155,7 @@ error.message = "cannot retrieve network interface index"; } else { - err = mlx5_flow_tcf_init(priv->mnl_socket, ifindex, + err = mlx5_flow_tcf_init(priv->tcf_context, ifindex, &error); } if (err) { @@ -1163,8 +1163,8 @@ "flow rules relying on switch offloads will" " not be supported: %s: %s", error.message, strerror(rte_errno)); - mlx5_flow_tcf_socket_destroy(priv->mnl_socket); - priv->mnl_socket = NULL; + mlx5_flow_tcf_context_destroy(priv->tcf_context); + priv->tcf_context = NULL; } } TAILQ_INIT(&priv->flows); @@ -1219,8 +1219,8 @@ close(priv->nl_socket_route); if (priv->nl_socket_rdma >= 0) close(priv->nl_socket_rdma); - if (priv->mnl_socket) - mlx5_flow_tcf_socket_destroy(priv->mnl_socket); + if (priv->tcf_context) + mlx5_flow_tcf_context_destroy(priv->tcf_context); if (own_domain_id) claim_zero(rte_eth_switch_domain_free(priv->domain_id)); rte_free(priv); diff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h index 2dec88a..d14239c 100644 --- a/drivers/net/mlx5/mlx5.h +++ b/drivers/net/mlx5/mlx5.h @@ -169,7 +169,7 @@ struct mlx5_drop { struct mlx5_rxq_ibv *rxq; /* Verbs Rx queue. */ }; -struct mnl_socket; +struct mlx5_flow_tcf_context; struct priv { LIST_ENTRY(priv) mem_event_cb; /* Called by memory event callback. */ @@ -236,7 +236,7 @@ struct priv { rte_spinlock_t uar_lock[MLX5_UAR_PAGE_NUM_MAX]; /* UAR same-page access control required in 32bit implementations. */ #endif - struct mnl_socket *mnl_socket; /* Libmnl socket. */ + struct mlx5_flow_tcf_context *tcf_context; /* TC flower context. */ }; #define PORT_ID(priv) ((priv)->dev_data->port_id) diff --git a/drivers/net/mlx5/mlx5_flow.h b/drivers/net/mlx5/mlx5_flow.h index 094f666..bb5b5cc 100644 --- a/drivers/net/mlx5/mlx5_flow.h +++ b/drivers/net/mlx5/mlx5_flow.h @@ -239,7 +239,6 @@ struct rte_flow { struct rte_flow_action_rss rss;/**< RSS context. */ uint8_t key[MLX5_RSS_HASH_KEY_LEN]; /**< RSS hash key. */ uint16_t (*queue)[]; /**< Destination queues to redirect traffic to. */ - void *nl_flow; /**< Netlink flow buffer if relevant. */ LIST_HEAD(dev_flows, mlx5_flow) dev_flows; /**< Device flows that are part of the flow. */ uint32_t actions; /**< Bit-fields which mark all detected actions. */ @@ -346,9 +345,9 @@ int mlx5_flow_validate_item_vxlan_gpe(const struct rte_flow_item *item, /* mlx5_flow_tcf.c */ -int mlx5_flow_tcf_init(struct mnl_socket *nl, unsigned int ifindex, - struct rte_flow_error *error); -struct mnl_socket *mlx5_flow_tcf_socket_create(void); -void mlx5_flow_tcf_socket_destroy(struct mnl_socket *nl); +int mlx5_flow_tcf_init(struct mlx5_flow_tcf_context *ctx, + unsigned int ifindex, struct rte_flow_error *error); +struct mlx5_flow_tcf_context *mlx5_flow_tcf_context_create(void); +void mlx5_flow_tcf_context_destroy(struct mlx5_flow_tcf_context *ctx); #endif /* RTE_PMD_MLX5_FLOW_H_ */ diff --git a/drivers/net/mlx5/mlx5_flow_tcf.c b/drivers/net/mlx5/mlx5_flow_tcf.c index 4b51a85..c9dbbc3 100644 --- a/drivers/net/mlx5/mlx5_flow_tcf.c +++ b/drivers/net/mlx5/mlx5_flow_tcf.c @@ -231,6 +231,19 @@ struct tc_pedit_sel { #define TP_PORT_LEN 2 /* Transport Port (UDP/TCP) Length */ #endif +/** + * Structure for holding netlink context. + * Note the size of the message buffer which is MNL_SOCKET_BUFFER_SIZE. + * Using this (8KB) buffer size ensures that netlink messages will never be + * truncated. + */ +struct mlx5_flow_tcf_context { + struct mnl_socket *nl; /* NETLINK_ROUTE libmnl socket. */ + uint32_t seq; /* Message sequence number. */ + uint32_t buf_size; /* Message buffer size. */ + uint8_t *buf; /* Message buffer. */ +}; + /** Empty masks for known item types. */ static const union { struct rte_flow_item_port_id port_id; @@ -1956,8 +1969,8 @@ struct pedit_parser { /** * Send Netlink message with acknowledgment. * - * @param nl - * Libmnl socket to use. + * @param ctx + * Flow context to use. * @param nlh * Message to send. This function always raises the NLM_F_ACK flag before * sending. @@ -1966,12 +1979,13 @@ struct pedit_parser { * 0 on success, a negative errno value otherwise and rte_errno is set. */ static int -flow_tcf_nl_ack(struct mnl_socket *nl, struct nlmsghdr *nlh) +flow_tcf_nl_ack(struct mlx5_flow_tcf_context *ctx, struct nlmsghdr *nlh) { alignas(struct nlmsghdr) uint8_t ans[mnl_nlmsg_size(sizeof(struct nlmsgerr)) + nlh->nlmsg_len - sizeof(*nlh)]; - uint32_t seq = random(); + uint32_t seq = ctx->seq++; + struct mnl_socket *nl = ctx->nl; int ret; nlh->nlmsg_flags |= NLM_F_ACK; @@ -2006,7 +2020,7 @@ struct pedit_parser { struct rte_flow_error *error) { struct priv *priv = dev->data->dev_private; - struct mnl_socket *nl = priv->mnl_socket; + struct mlx5_flow_tcf_context *nl = priv->tcf_context; struct mlx5_flow *dev_flow; struct nlmsghdr *nlh; @@ -2035,7 +2049,7 @@ struct pedit_parser { flow_tcf_remove(struct rte_eth_dev *dev, struct rte_flow *flow) { struct priv *priv = dev->data->dev_private; - struct mnl_socket *nl = priv->mnl_socket; + struct mlx5_flow_tcf_context *nl = priv->tcf_context; struct mlx5_flow *dev_flow; struct nlmsghdr *nlh; @@ -2087,10 +2101,47 @@ struct pedit_parser { }; /** - * Initialize ingress qdisc of a given network interface. + * Create and configure a libmnl socket for Netlink flow rules. + * + * @return + * A valid libmnl socket object pointer on success, NULL otherwise and + * rte_errno is set. + */ +static struct mnl_socket * +flow_tcf_mnl_socket_create(void) +{ + struct mnl_socket *nl = mnl_socket_open(NETLINK_ROUTE); + + if (nl) { + mnl_socket_setsockopt(nl, NETLINK_CAP_ACK, &(int){ 1 }, + sizeof(int)); + if (!mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID)) + return nl; + } + rte_errno = errno; + if (nl) + mnl_socket_close(nl); + return NULL; +} + +/** + * Destroy a libmnl socket. * * @param nl * Libmnl socket of the @p NETLINK_ROUTE kind. + */ +static void +flow_tcf_mnl_socket_destroy(struct mnl_socket *nl) +{ + if (nl) + mnl_socket_close(nl); +} + +/** + * Initialize ingress qdisc of a given network interface. + * + * @param nl + * Pointer to tc-flower context to use. * @param ifindex * Index of network interface to initialize. * @param[out] error @@ -2100,8 +2151,8 @@ struct pedit_parser { * 0 on success, a negative errno value otherwise and rte_errno is set. */ int -mlx5_flow_tcf_init(struct mnl_socket *nl, unsigned int ifindex, - struct rte_flow_error *error) +mlx5_flow_tcf_init(struct mlx5_flow_tcf_context *nl, + unsigned int ifindex, struct rte_flow_error *error) { struct nlmsghdr *nlh; struct tcmsg *tcm; @@ -2143,37 +2194,47 @@ struct pedit_parser { } /** - * Create and configure a libmnl socket for Netlink flow rules. + * Create libmnl context for Netlink flow rules. * * @return * A valid libmnl socket object pointer on success, NULL otherwise and * rte_errno is set. */ -struct mnl_socket * -mlx5_flow_tcf_socket_create(void) +struct mlx5_flow_tcf_context * +mlx5_flow_tcf_context_create(void) { - struct mnl_socket *nl = mnl_socket_open(NETLINK_ROUTE); - - if (nl) { - mnl_socket_setsockopt(nl, NETLINK_CAP_ACK, &(int){ 1 }, - sizeof(int)); - if (!mnl_socket_bind(nl, 0, MNL_SOCKET_AUTOPID)) - return nl; - } - rte_errno = errno; - if (nl) - mnl_socket_close(nl); + struct mlx5_flow_tcf_context *ctx = rte_zmalloc(__func__, + sizeof(*ctx), + sizeof(uint32_t)); + if (!ctx) + goto error; + ctx->nl = flow_tcf_mnl_socket_create(); + if (!ctx->nl) + goto error; + ctx->buf_size = MNL_SOCKET_BUFFER_SIZE; + ctx->buf = rte_zmalloc(__func__, + ctx->buf_size, sizeof(uint32_t)); + if (!ctx->buf) + goto error; + ctx->seq = random(); + return ctx; +error: + mlx5_flow_tcf_context_destroy(ctx); return NULL; } /** - * Destroy a libmnl socket. + * Destroy a libmnl context. * * @param nl * Libmnl socket of the @p NETLINK_ROUTE kind. */ void -mlx5_flow_tcf_socket_destroy(struct mnl_socket *nl) +mlx5_flow_tcf_context_destroy(struct mlx5_flow_tcf_context *ctx) { - mnl_socket_close(nl); + if (!ctx) + return; + flow_tcf_mnl_socket_destroy(ctx->nl); + rte_free(ctx->buf); + rte_free(ctx); } -- 1.8.3.1