From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from EUR03-DB5-obe.outbound.protection.outlook.com (mail-eopbgr40049.outbound.protection.outlook.com [40.107.4.49]) by dpdk.org (Postfix) with ESMTP id 047B21B16A for ; Thu, 18 Oct 2018 20:29:53 +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=PqYXZ8ILHUPVN+M7iPEPzJ0k8u/iaOfId2gDjDtqA50=; b=iui4eyF3YFrevVQQ4iiiFbBps/uhc1V5U737rrTWLfHfagzNww3NRw6uBjZfi6g6WdpgBJG9kdPUsRv/rx8iGQd1whvNjq2iE83CfXbTQK2lTdSUMjL9uUHmsFH2zxno+VgHET3Cl32opjYrdGB0nQbwyJkROGMPakL+3tHPG2k= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=motih@mellanox.com; Received: from localhost.localdomain (37.142.13.130) by AM0PR05MB4435.eurprd05.prod.outlook.com (2603:10a6:208:5a::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.1207.21; Thu, 18 Oct 2018 18:29:50 +0000 From: Moti Haimovsky To: shahafs@mellanox.com Cc: dev@dpdk.org, Moti Haimovsky Date: Thu, 18 Oct 2018 21:29:20 +0300 Message-Id: <1539887363-27858-2-git-send-email-motih@mellanox.com> X-Mailer: git-send-email 1.7.1 In-Reply-To: <1539797092-2395-4-git-send-email-motih@mellanox.com> References: <1539797092-2395-4-git-send-email-motih@mellanox.com> MIME-Version: 1.0 Content-Type: text/plain X-Originating-IP: [37.142.13.130] X-ClientProxiedBy: LO2P265CA0168.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:9::36) To AM0PR05MB4435.eurprd05.prod.outlook.com (2603:10a6:208:5a::20) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 5e5d91e1-1ecb-4b3f-2fa7-08d63527b123 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:AM0PR05MB4435; X-Microsoft-Exchange-Diagnostics: 1; AM0PR05MB4435; 3:Xdz9pQPARsXk7SWwG/XRxLBsxpnTs42oayd9sYemdbSg3Aeuua+ci+HB2jy2dTxhdDakhLloKdR+j1XbYll359uiLcjaVH9QrLrrd+uW1+7z9LWv3FoJolI9KJ3u9/x1KUjfsOZaQRFwbE1RjHCiN+6hF2TqQ4Vj5JAEvnZEaa5OLSg+/RbLVUaGZas+qwcelrt9QZHAJ4/6p/8JXBbum4atEfREeTUm8o32eNc37Rjxdp9gnU0CV0wzng9OOREd; 25:ZAxPptXCUjH2p9AlCDq5CvGcifjvqDhCyISGVJNX8dl9U6+3eMCbqiBIO8ma/bVn34ZoGDHR4NFcCQGA++S0/YGWnvRXXWmTFA2aEKHWO4VXNLJ0AnmlyiSd0JcV3iaUtw07yz9xbhU3nqdimz9mGhIa/0ymyn5svtOOxmlOUGuNpMR1gmh3YyeEBsFlzkE91V9O2QPT+oelPFk+mTknQ0baqWwBnZKmYP2sanpWUT1oNA8DLoWETMSo8HRlLl102sOJxLxVg2YtaY0gaDLlGuZ8LoUe7K4vUXlrVsuAxc48mLscZC72VtXLRtw91/2/WMWuAznax0ZKHW6amOZILA==; 31:3dod1wKT5I74+6xSZiCqFcYJkMFqku+h3nvOskHRKib2NOAcccerdWt43ek4rlqGKHH9IbDqEk36TLdJ7QA9mFaiKQwkRL3IFYkiFoOiZ0guHdx91Sz2zgxCyntJijiO5Sf0xuhMl/iUiAEzx2BkCOEmSHSv7ogJZJBPR9FyHAP06tKgArzDKgYbozIaBaCGFmerX/PTkB1MQGFJjzxcE7QE5ADXJDfPMI6nDXwIXOg= X-MS-TrafficTypeDiagnostic: AM0PR05MB4435: X-Microsoft-Exchange-Diagnostics: 1; AM0PR05MB4435; 20:QuD+cBcMCoQfm8qMbmGxkMZwYALLvx7Hm/F4mggfhzdswgQ3aiCX8IZOJs32Wk4HIGC2Xx46KLaF79aKolvMRyGWXoD+J4WOjAS4x2OiYE/SswVW4flxV5E7VbmaUBN1YERyqvfK27EoScrXogWoKI+VQIp8KwszZXIXT7fhMzbJ/3Y09AJmcTUEhvlB6y+eiZBHPX9VoNZnYoEDz43Y4QZDsHmJIdoqWe3znPJJ7Wdq33yeCR5y8EHQMNt/nJE8oUqqcK48oCtT/9O5j7iM02HAfuE3TgQgkYSSaD9h0WJBPTc0e5WwQGo8LzLosjZ7Z6XKdNxnK9+APgCwzbo2Sy2dsNIh1TvewC5kJEbEr9gzEcbMf1byshdhCFhYnuNOTirN65gqYNZvnJ10mDdL5uH5ZVaDJyNAc7EVMSphW+G32agVG3tDkeeriV03m789aXS8f0mL34rrCmbe95r/T1t0rI/MgK9HUBAK4++UQSnVUJVIVkEPENuDCPAAJ+Ut; 4:Q1HfP5yCCEC4G+uJXs7lXHgL21vpUrn/HO/SbMQb0otidOqvvE9BY0suUCzdlNbSKWvaqJWac7fTdmUd37VveO7HPFjmuyLzhuPsNtanPErF7inCcXGwquPAwM7YGeHAiCFJ1ZhGYE0xMRka8X4VXl3OQ2RjE9jWNfsep2wxfhQoSh9mQesYrlXM9bwcjWC4a3pBoDLMsa4XsJ5Ze9h7s0s5kv/y8PTI1guJoS4FFU4dJBqts/s12GsJKU8EYjDG2OnyL2RpYcg39f1LPhIx03u4EkJPzc8az3tOsuVbWLC1Hjy4wpG9kSDiE2wr/ihk 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)(20161123560045)(20161123564045)(20161123562045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(201708071742011)(7699051)(76991095); SRVR:AM0PR05MB4435; BCL:0; PCL:0; RULEID:; SRVR:AM0PR05MB4435; X-Forefront-PRVS: 08296C9B35 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(6069001)(39860400002)(136003)(396003)(376002)(346002)(366004)(199004)(189003)(3846002)(51416003)(37006003)(2906002)(6636002)(11346002)(76176011)(446003)(2351001)(5660300001)(53936002)(48376002)(6116002)(50466002)(47776003)(478600001)(6512007)(186003)(2616005)(6506007)(105586002)(26005)(14444005)(386003)(50226002)(106356001)(486006)(956004)(16526019)(2361001)(6666004)(97736004)(81166006)(36756003)(81156014)(8936002)(6486002)(4326008)(52116002)(107886003)(66066001)(68736007)(25786009)(69590400006)(16586007)(8676002)(305945005)(316002)(34206002)(86362001)(7736002)(476003); DIR:OUT; SFP:1101; SCL:1; SRVR:AM0PR05MB4435; H:localhost.localdomain; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; MX:1; Received-SPF: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: =?us-ascii?Q?1; AM0PR05MB4435; 23:1uYN8pckV5xXuugf6WVo7R6u2bgGj0BJU3H/WkoZt?= =?us-ascii?Q?A5eQbrm2I02vdHwWvJaE1KpKl3IE1u6qDZb17zVgXml/0sleNAzvIneMxQwI?= =?us-ascii?Q?6psrdQkOUrToMYXXgqHOSdl9naG+bjs/iSPtgw2A+hEry4BkhMlBOLzLiQMr?= =?us-ascii?Q?T7+q+ddALvSQKx+44z5WgLidx7zSz10CjA5Idhe2IveX5dD6frabtvTV2uSo?= =?us-ascii?Q?nfmQrEHVZyG0rDAwub0DCIt0/uHrIqTq0yFAYJW6tvuDuLWX53Q5ImgXYplV?= =?us-ascii?Q?DWh492NgUkVZTyWJ08JXpHPcfm0LVyHsB70hm9jXHYoNSU/0vIyEmBxfjQKa?= =?us-ascii?Q?7j4AWsBxHlANreSZrCxp9hQEFXGLVl78B42hGSzPvIR+/mKW937JRtsITxiC?= =?us-ascii?Q?WTjI6WWvtC6VtnSjzbZwP0hZfOpu6MkyjTuKo67WNsM7SzKGMTqfipwCMWSI?= =?us-ascii?Q?xiO19nsPI1FEB9palIVUI3b77Zk/wVKYJ3EQr0hpQcnWW11VjL9BzoJmk8yh?= =?us-ascii?Q?N5VIIk9Gr2Q+tSBZPNRQfirQH/KLM6WwnmasAkqGOvFm/mMd5nP0BFjuh1nO?= =?us-ascii?Q?yGU3QtCJvl/ju7cj1ZoHYFo8mHbadNcw5hTmrClR24oGEJUvqBy6+8N56WAU?= =?us-ascii?Q?4FeIJdMiMdFXGnQGIYM8vQY5FydL9td73HhXBnDYBCjZy9r/eCtJ43Hqrxb+?= =?us-ascii?Q?HccjqawmQKPxmzqVWaPPXtiCyq23nbUsfQdB5rxRXh4r+/k2Xstux6LJ13zL?= =?us-ascii?Q?lKsOCio76+l6Cr0f/YRSmdwsvR5tmiMVrvui3VAA492vHlKOAAx00CJI3N6W?= =?us-ascii?Q?na9/VM2xUyNk2I8erGKB6h2SfTu/xzZei9KEuORfThvHu12clPUcgRgAmj4D?= =?us-ascii?Q?6DA0kGU9esuP7hA37wqVjy+TdvZOZ1T/dol2OHtNv2Kp2MgapyAA9tRwOsWL?= =?us-ascii?Q?XT0tMetQlbrBzm+Z1zttdt61XQrbNF9t6O0VnMVQWIvQCK7KrgX9ABpnTios?= =?us-ascii?Q?aknJTIgGvA19t1SpVqIXHYZuSrMeFG2ikiKK9nsAzDHvvVKh3goafj5qaKzL?= =?us-ascii?Q?lH4+bITPpAVGfGZLR4FjNyUTj3NmFUcU1ZAntLtBSGsuqW9RtLulB/fyn0SR?= =?us-ascii?Q?fgSBSeTizpSYJYNwTg8LC+NzhCZMmMjkZgZnk35LvzwgZXrhj1uyjx7U3mPk?= =?us-ascii?Q?ZqpM7e9AamJxZmHTgsS0QQiEhSB67wL+HuBOBWUUbcOE0vmpYZzDRTQRfAeg?= =?us-ascii?Q?wmY0DsMjDKfq2eCymeJZBhrjymCo7n5CEbIsEYb/6RJFKg93pS58z5s00RIf?= =?us-ascii?Q?dlnF4BeDoBVmrszY2DVaHzKayx9I1IU71SlOVELoRyr?= X-Microsoft-Antispam-Message-Info: 9qxADrKdTl5NOUEZFEgrRMp9eh1afgyeefJxQ+GKmy26v2Yn2fNlZgqUy5hJ5oF26t5380HLk4Fil6CGNgkkMQEvwiyrDzigxGXwipZTtNxIv4XdhbwxglA3sjDLlOMIDru3VikLZGAVH5SBKwxXCWNIbiXeQ57CqoLwJHzM3o6/lcZGPlzHaax6wPD2AIgA1mGYTzAQu2+1SKWJDBv18TuIcHVA3fuYiETjtSRwN6NHtBAeo6ORSylImilTquGPU7R3rH+Om53OpTuOKswYMFSi322gT5ZbHIj70wjBGJRQ1yDeyF3wlWnnRKUXEzjucwS3ZIPkniMtYetsnYt44DyrHjRmfiy/nzjj/4EBm3w= X-Microsoft-Exchange-Diagnostics: 1; AM0PR05MB4435; 6:oSD6pQZNsVjb40bRJd3g7dYJHcc2a3JNTbemDlN+VMO5rRr8YxgSdpUPP9WOaeeI9ol8E7KciGdPrtTA/7wGzyBjKsT5caVAwmjDXKQwUC3fgW5P0ffH7kPknyxVZRHtzqdM5IGVaruKlqn9AVFUVgdyG59djFRlK28QF9z1zJe2nPUhplWaKKJgD8RftKJzWiCiFjU5tE0nsOjIjCeqB7CWGGP2Qt4LKtDyiUqBFt7cy0+X3Abu2yatXDQ4htOmmr3DViCkeHGuC+p2dukPyV8Rd+pvQBNskuxqxXzZ2axt402uDvdr6f7ipHfE7Yv4FwXd+ex+RCmBTyRbTMUZjEA6JdtVc3t3zrp0oIz0YmroKiGvw1ZsWEJTq7cS8p30pEgCjXCMpb1WEUhwLUUsAC2r5AGfcnAxZd0qk05ZBrSFZCf+zOQhWX2QPnM6graCDhqjqhvva8bFjghzRsfQSg==; 5:oyQAaZCg3xG0HfipbxYkSIfSbMJ8A8qf08JJJUc9KHPjU0BAhVURodMbxISnX2SD8J0eZd8dYS9oIeqG1b+Mi/2ZpWu1McKnjZN5TyZowJ1j7Qnv0Kyrt/p9h0ylDMSzJW0qtcOCYZK0GKG/BuKvyLjBHX3mU3vifQAoGjf+XD4=; 7:VhPEJj6DduR0vn7ZHOamyCOrsTG6UckeCjCKsLRqRm19/fvxUBNUof3LOozKFp7h8ZlRFaIrb1/emDdPay05rkfW8he+GE305kKtLlrhnyB+kRcgYoWp/+brAk7qIaWVGyugBEIaUc7yrf6wkSLRuUaRE/YvQ39GddySLiAs+LCvXSxNhVzxkZEjSEvTUTxNfF3niNiRHI7jJal9aN4YdlIYo/RcXJ1Q2Xa0fVfl1savu6zn5jMDvnDCQKQb5QSl SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 18 Oct 2018 18:29:50.7691 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 5e5d91e1-1ecb-4b3f-2fa7-08d63527b123 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR05MB4435 Subject: [dpdk-dev] [PATCH v5 1/4] 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: Thu, 18 Oct 2018 18:29:53 -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 --- v5: * Split the patch, this patch introduces the new infrastructure and performs only basic initializations. data path modifications are now performed in a separate patch. 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 | 20 ++++---- drivers/net/mlx5/mlx5.h | 4 +- drivers/net/mlx5/mlx5_flow.h | 9 ++-- drivers/net/mlx5/mlx5_flow_tcf.c | 105 +++++++++++++++++++++++++++++++-------- 4 files changed, 99 insertions(+), 39 deletions(-) diff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c index 795a219..2c96080 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,16 +1155,16 @@ error.message = "cannot retrieve network interface index"; } else { - err = mlx5_flow_tcf_init(priv->mnl_socket, ifindex, - &error); + err = mlx5_flow_tcf_init(priv->tcf_context, + ifindex, &error); } if (err) { DRV_LOG(WARNING, "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 d45fe8d..ee75a80 100644 --- a/drivers/net/mlx5/mlx5_flow.h +++ b/drivers/net/mlx5/mlx5_flow.h @@ -243,7 +243,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. */ @@ -350,9 +349,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 131b62b..5ce2d5f 100644 --- a/drivers/net/mlx5/mlx5_flow_tcf.c +++ b/drivers/net/mlx5/mlx5_flow_tcf.c @@ -235,6 +235,19 @@ struct tc_pedit_sel { #define TTL_LEN 1 #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; @@ -2153,7 +2166,7 @@ struct pedit_parser { struct rte_flow_error *error) { struct priv *priv = dev->data->dev_private; - struct mnl_socket *nl = priv->mnl_socket; + struct mnl_socket *nl = priv->tcf_context->nl; struct mlx5_flow *dev_flow; struct nlmsghdr *nlh; @@ -2182,7 +2195,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 mnl_socket *nl = priv->tcf_context->nl; struct mlx5_flow *dev_flow; struct nlmsghdr *nlh; @@ -2234,10 +2247,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 ctx + * Pointer to tc-flower context to use. * @param ifindex * Index of network interface to initialize. * @param[out] error @@ -2247,11 +2297,12 @@ 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 *ctx, + unsigned int ifindex, struct rte_flow_error *error) { struct nlmsghdr *nlh; struct tcmsg *tcm; + struct mnl_socket *nl = ctx->nl; alignas(struct nlmsghdr) uint8_t buf[mnl_nlmsg_size(sizeof(*tcm) + 128)]; @@ -2290,37 +2341,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