git: a00718e1dfcd - main - Implement SIOCGIFRSSKEY and SIOCGIFRSSHASH and mlx5en(4).
Hans Petter Selasky
hselasky at FreeBSD.org
Fri Jan 8 11:39:30 UTC 2021
The branch main has been updated by hselasky:
URL: https://cgit.FreeBSD.org/src/commit/?id=a00718e1dfcd9b1f0a1b2706f552cd003ea082d8
commit a00718e1dfcd9b1f0a1b2706f552cd003ea082d8
Author: Hans Petter Selasky <hselasky at FreeBSD.org>
AuthorDate: 2021-01-08 11:12:02 +0000
Commit: Hans Petter Selasky <hselasky at FreeBSD.org>
CommitDate: 2021-01-08 11:35:55 +0000
Implement SIOCGIFRSSKEY and SIOCGIFRSSHASH and mlx5en(4).
MFC after: 1 week
Sponsored by: Mellanox Technologies // NVIDIA Networking
---
sys/dev/mlx5/mlx5_en/mlx5_en_main.c | 62 ++++++++++++++++++++++++++++++-------
1 file changed, 51 insertions(+), 11 deletions(-)
diff --git a/sys/dev/mlx5/mlx5_en/mlx5_en_main.c b/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
index c23335eb712e..37a494e35629 100644
--- a/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
+++ b/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
@@ -2756,6 +2756,31 @@ mlx5e_close_rqt(struct mlx5e_priv *priv)
mlx5_cmd_exec(priv->mdev, in, sizeof(in), out, sizeof(out));
}
+#define MLX5E_RSS_KEY_SIZE (10 * 4) /* bytes */
+
+static void
+mlx5e_get_rss_key(void *key_ptr)
+{
+#ifdef RSS
+ rss_getkey(key_ptr);
+#else
+ static const u32 rsskey[] = {
+ cpu_to_be32(0xD181C62C),
+ cpu_to_be32(0xF7F4DB5B),
+ cpu_to_be32(0x1983A2FC),
+ cpu_to_be32(0x943E1ADB),
+ cpu_to_be32(0xD9389E6B),
+ cpu_to_be32(0xD1039C2C),
+ cpu_to_be32(0xA74499AD),
+ cpu_to_be32(0x593D56D9),
+ cpu_to_be32(0xF3253C06),
+ cpu_to_be32(0x2ADC1FFC),
+ };
+ CTASSERT(sizeof(rsskey) == MLX5E_RSS_KEY_SIZE);
+ memcpy(key_ptr, rsskey, MLX5E_RSS_KEY_SIZE);
+#endif
+}
+
static void
mlx5e_build_tir_ctx(struct mlx5e_priv *priv, u32 * tirc, int tt)
{
@@ -2807,26 +2832,19 @@ mlx5e_build_tir_ctx(struct mlx5e_priv *priv, u32 * tirc, int tt)
MLX5_SET(tirc, tirc, rx_hash_fn,
MLX5_TIRC_RX_HASH_FN_HASH_TOEPLITZ);
hkey = (__be32 *) MLX5_ADDR_OF(tirc, tirc, rx_hash_toeplitz_key);
+
+ CTASSERT(MLX5_FLD_SZ_BYTES(tirc, rx_hash_toeplitz_key) >=
+ MLX5E_RSS_KEY_SIZE);
#ifdef RSS
/*
* The FreeBSD RSS implementation does currently not
* support symmetric Toeplitz hashes:
*/
MLX5_SET(tirc, tirc, rx_hash_symmetric, 0);
- rss_getkey((uint8_t *)hkey);
#else
MLX5_SET(tirc, tirc, rx_hash_symmetric, 1);
- hkey[0] = cpu_to_be32(0xD181C62C);
- hkey[1] = cpu_to_be32(0xF7F4DB5B);
- hkey[2] = cpu_to_be32(0x1983A2FC);
- hkey[3] = cpu_to_be32(0x943E1ADB);
- hkey[4] = cpu_to_be32(0xD9389E6B);
- hkey[5] = cpu_to_be32(0xD1039C2C);
- hkey[6] = cpu_to_be32(0xA74499AD);
- hkey[7] = cpu_to_be32(0x593D56D9);
- hkey[8] = cpu_to_be32(0xF3253C06);
- hkey[9] = cpu_to_be32(0x2ADC1FFC);
#endif
+ mlx5e_get_rss_key(hkey);
break;
}
@@ -3259,6 +3277,8 @@ mlx5e_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
struct ifreq *ifr;
struct ifdownreason *ifdr;
struct ifi2creq i2c;
+ struct ifrsskey *ifrk;
+ struct ifrsshash *ifrh;
int error = 0;
int mask = 0;
int size_read = 0;
@@ -3541,6 +3561,26 @@ err_i2c:
ifdr->ifdr_reason = IFDR_REASON_MSG;
break;
+ case SIOCGIFRSSKEY:
+ ifrk = (struct ifrsskey *)data;
+ ifrk->ifrk_func = RSS_FUNC_TOEPLITZ;
+ ifrk->ifrk_keylen = MLX5E_RSS_KEY_SIZE;
+ CTASSERT(sizeof(ifrk->ifrk_key) >= MLX5E_RSS_KEY_SIZE);
+ mlx5e_get_rss_key(ifrk->ifrk_key);
+ break;
+
+ case SIOCGIFRSSHASH:
+ ifrh = (struct ifrsshash *)data;
+ ifrh->ifrh_func = RSS_FUNC_TOEPLITZ;
+ ifrh->ifrh_types =
+ RSS_TYPE_IPV4 |
+ RSS_TYPE_TCP_IPV4 |
+ RSS_TYPE_UDP_IPV4 |
+ RSS_TYPE_IPV6 |
+ RSS_TYPE_TCP_IPV6 |
+ RSS_TYPE_UDP_IPV6;
+ break;
+
default:
error = ether_ioctl(ifp, command, data);
break;
More information about the dev-commits-src-main
mailing list