From: Adam Kiripolsky Date: Tue, 14 Jan 2025 11:58:47 +0000 (+0100) Subject: dpdk/rss: add rte_flow rss support for mlx5 X-Git-Tag: suricata-8.0.0-beta1~468 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d9a6d5dc46fec326fa28b7bf107346db3410e0a1;p=thirdparty%2Fsuricata.git dpdk/rss: add rte_flow rss support for mlx5 The configuration of this rule is the same as for ixgbe driver except the hash function is not RTE_ETH_HASH_FUNCTION_DEFAULT but RTE_ETH_HASH_FUNCTION_TOEPLITZ. The syntax in dpdk-testpmd for this rule with attributes: port index == 0 used rx queue indices == 0 1 2 3 == 6d5a symmetric hash key is as follows: "flow create 0 ingress pattern eth / end actions rss types ipv4 ipv6 end queues 0 1 2 3 end key key_len 40 func toeplitz / end" Ticket: 7337 --- diff --git a/src/Makefile.am b/src/Makefile.am index 1c2c98d311..3540b31869 100755 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -482,6 +482,7 @@ noinst_HEADERS = \ util-dpdk-i40e.h \ util-dpdk-ice.h \ util-dpdk-ixgbe.h \ + util-dpdk-mlx5.h \ util-dpdk-bonding.h \ util-dpdk-rss.h \ util-ebpf.h \ @@ -1037,6 +1038,7 @@ libsuricata_c_a_SOURCES = \ util-dpdk-i40e.c \ util-dpdk-ice.c \ util-dpdk-ixgbe.c \ + util-dpdk-mlx5.c \ util-dpdk-bonding.c \ util-dpdk-rss.c \ util-ebpf.c \ diff --git a/src/source-dpdk.c b/src/source-dpdk.c index 4a608b7519..d77a536030 100644 --- a/src/source-dpdk.c +++ b/src/source-dpdk.c @@ -90,6 +90,7 @@ TmEcode NoDPDKSupportExit(ThreadVars *tv, const void *initdata, void **data) #include "util-dpdk-i40e.h" #include "util-dpdk-ice.h" #include "util-dpdk-ixgbe.h" +#include "util-dpdk-mlx5.h" #include "util-dpdk-bonding.h" #include @@ -200,6 +201,8 @@ static void DevicePostStartPMDSpecificActions(DPDKThreadVars *ptv, const char *d ixgbeDeviceSetRSS(ptv->port_id, ptv->threads, ptv->livedev->dev); else if (strcmp(driver_name, "net_ice") == 0) iceDeviceSetRSS(ptv->port_id, ptv->threads, ptv->livedev->dev); + else if (strcmp(driver_name, "mlx5_pci") == 0) + mlx5DeviceSetRSS(ptv->port_id, ptv->threads, ptv->livedev->dev); } static void DevicePreClosePMDSpecificActions(DPDKThreadVars *ptv, const char *driver_name) @@ -212,7 +215,8 @@ static void DevicePreClosePMDSpecificActions(DPDKThreadVars *ptv, const char *dr #if RTE_VERSION > RTE_VERSION_NUM(20, 0, 0, 0) strcmp(driver_name, "net_i40e") == 0 || #endif /* RTE_VERSION > RTE_VERSION_NUM(20, 0, 0, 0) */ - strcmp(driver_name, "net_ixgbe") == 0 || strcmp(driver_name, "net_ice") == 0) { + strcmp(driver_name, "net_ixgbe") == 0 || strcmp(driver_name, "net_ice") == 0 || + strcmp(driver_name, "mlx5_pci") == 0) { // Flush the RSS rules that have been inserted in the post start section struct rte_flow_error flush_error = { 0 }; int32_t retval = rte_flow_flush(ptv->port_id, &flush_error); diff --git a/src/util-dpdk-mlx5.c b/src/util-dpdk-mlx5.c new file mode 100644 index 0000000000..2009af4f4f --- /dev/null +++ b/src/util-dpdk-mlx5.c @@ -0,0 +1,76 @@ +/* Copyright (C) 2025 Open Information Security Foundation + * + * You can copy, redistribute or modify this Program under the terms of + * the GNU General Public License version 2 as published by the Free + * Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +/** + * \defgroup dpdk DPDK NVIDIA mlx5 driver helpers functions + * + * @{ + */ + +/** + * \file + * + * \author Adam Kiripolsky + * + * DPDK driver's helper functions + * + */ + +#include "util-debug.h" +#include "util-dpdk.h" +#include "util-dpdk-bonding.h" +#include "util-dpdk-mlx5.h" +#include "util-dpdk-rss.h" + +#ifdef HAVE_DPDK + +#define MLX5_RSS_HKEY_LEN 40 + +int mlx5DeviceSetRSS(int port_id, int nb_rx_queues, char *port_name) +{ + uint16_t queues[RTE_MAX_QUEUES_PER_PORT]; + struct rte_flow_error flush_error = { 0 }; + struct rte_eth_rss_conf rss_conf = { + .rss_key = RSS_HKEY, + .rss_key_len = MLX5_RSS_HKEY_LEN, + }; + + if (nb_rx_queues < 1) { + FatalError("The number of queues for RSS configuration must be " + "configured with a positive number"); + } + + struct rte_flow_action_rss rss_action_conf = + DPDKInitRSSAction(rss_conf, nb_rx_queues, queues, RTE_ETH_HASH_FUNCTION_TOEPLITZ, true); + + int retval = DPDKCreateRSSFlowGeneric(port_id, port_name, rss_action_conf); + if (retval != 0) { + retval = rte_flow_flush(port_id, &flush_error); + if (retval != 0) { + SCLogError("%s: unable to flush rte_flow rules: %s Flush error msg: %s", port_name, + rte_strerror(-retval), flush_error.message); + } + return retval; + } + + return 0; +} + +#endif /* HAVE_DPDK */ +/** + * @} + */ diff --git a/src/util-dpdk-mlx5.h b/src/util-dpdk-mlx5.h new file mode 100644 index 0000000000..e51593a223 --- /dev/null +++ b/src/util-dpdk-mlx5.h @@ -0,0 +1,35 @@ +/* Copyright (C) 2025 Open Information Security Foundation + * + * You can copy, redistribute or modify this Program under the terms of + * the GNU General Public License version 2 as published by the Free + * Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * version 2 along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + * 02110-1301, USA. + */ + +/** + * \file + * + * \author Adam Kiripolsky + */ + +#ifndef UTIL_DPDK_MLX5_H +#define UTIL_DPDK_MLX5_H + +#include "suricata-common.h" + +#ifdef HAVE_DPDK + +int mlx5DeviceSetRSS(int port_id, int nb_rx_queues, char *port_name); + +#endif /* HAVE_DPDK */ + +#endif /* UTIL_DPDK_MLX5_H */ diff --git a/src/util-dpdk-rss.c b/src/util-dpdk-rss.c index f84840c396..9a74defa16 100644 --- a/src/util-dpdk-rss.c +++ b/src/util-dpdk-rss.c @@ -108,7 +108,8 @@ int DPDKCreateRSSFlowGeneric( action[0].conf = &rss_conf; action[1].type = RTE_FLOW_ACTION_TYPE_END; - pattern[0].type = RTE_FLOW_ITEM_TYPE_END; + pattern[0].type = RTE_FLOW_ITEM_TYPE_ETH; + pattern[1].type = RTE_FLOW_ITEM_TYPE_END; struct rte_flow *flow = rte_flow_create(port_id, &attr, pattern, action, &flow_error); if (flow == NULL) {