|
34 | 34 | #include <net/xdp_sock_drv.h>
|
35 | 35 | #include "en/xdp.h"
|
36 | 36 | #include "en/params.h"
|
| 37 | +#include <linux/bitfield.h> |
37 | 38 |
|
38 | 39 | int mlx5e_xdp_max_mtu(struct mlx5e_params *params, struct mlx5e_xsk_param *xsk)
|
39 | 40 | {
|
@@ -169,15 +170,72 @@ static int mlx5e_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp)
|
169 | 170 | return 0;
|
170 | 171 | }
|
171 | 172 |
|
| 173 | +/* Mapping HW RSS Type bits CQE_RSS_HTYPE_IP + CQE_RSS_HTYPE_L4 into 4-bits*/ |
| 174 | +#define RSS_TYPE_MAX_TABLE 16 /* 4-bits max 16 entries */ |
| 175 | +#define RSS_L4 GENMASK(1, 0) |
| 176 | +#define RSS_L3 GENMASK(3, 2) /* Same as CQE_RSS_HTYPE_IP */ |
| 177 | + |
| 178 | +/* Valid combinations of CQE_RSS_HTYPE_IP + CQE_RSS_HTYPE_L4 sorted numerical */ |
| 179 | +enum mlx5_rss_hash_type { |
| 180 | + RSS_TYPE_NO_HASH = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IP_NONE) | |
| 181 | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_NONE)), |
| 182 | + RSS_TYPE_L3_IPV4 = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | |
| 183 | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_NONE)), |
| 184 | + RSS_TYPE_L4_IPV4_TCP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | |
| 185 | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_TCP)), |
| 186 | + RSS_TYPE_L4_IPV4_UDP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | |
| 187 | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_UDP)), |
| 188 | + RSS_TYPE_L4_IPV4_IPSEC = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV4) | |
| 189 | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_IPSEC)), |
| 190 | + RSS_TYPE_L3_IPV6 = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | |
| 191 | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_NONE)), |
| 192 | + RSS_TYPE_L4_IPV6_TCP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | |
| 193 | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_TCP)), |
| 194 | + RSS_TYPE_L4_IPV6_UDP = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | |
| 195 | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_UDP)), |
| 196 | + RSS_TYPE_L4_IPV6_IPSEC = (FIELD_PREP_CONST(RSS_L3, CQE_RSS_IPV6) | |
| 197 | + FIELD_PREP_CONST(RSS_L4, CQE_RSS_L4_IPSEC)), |
| 198 | +}; |
| 199 | + |
| 200 | +/* Invalid combinations will simply return zero, allows no boundary checks */ |
| 201 | +static const enum xdp_rss_hash_type mlx5_xdp_rss_type[RSS_TYPE_MAX_TABLE] = { |
| 202 | + [RSS_TYPE_NO_HASH] = XDP_RSS_TYPE_NONE, |
| 203 | + [1] = XDP_RSS_TYPE_NONE, /* Implicit zero */ |
| 204 | + [2] = XDP_RSS_TYPE_NONE, /* Implicit zero */ |
| 205 | + [3] = XDP_RSS_TYPE_NONE, /* Implicit zero */ |
| 206 | + [RSS_TYPE_L3_IPV4] = XDP_RSS_TYPE_L3_IPV4, |
| 207 | + [RSS_TYPE_L4_IPV4_TCP] = XDP_RSS_TYPE_L4_IPV4_TCP, |
| 208 | + [RSS_TYPE_L4_IPV4_UDP] = XDP_RSS_TYPE_L4_IPV4_UDP, |
| 209 | + [RSS_TYPE_L4_IPV4_IPSEC] = XDP_RSS_TYPE_L4_IPV4_IPSEC, |
| 210 | + [RSS_TYPE_L3_IPV6] = XDP_RSS_TYPE_L3_IPV6, |
| 211 | + [RSS_TYPE_L4_IPV6_TCP] = XDP_RSS_TYPE_L4_IPV6_TCP, |
| 212 | + [RSS_TYPE_L4_IPV6_UDP] = XDP_RSS_TYPE_L4_IPV6_UDP, |
| 213 | + [RSS_TYPE_L4_IPV6_IPSEC] = XDP_RSS_TYPE_L4_IPV6_IPSEC, |
| 214 | + [12] = XDP_RSS_TYPE_NONE, /* Implicit zero */ |
| 215 | + [13] = XDP_RSS_TYPE_NONE, /* Implicit zero */ |
| 216 | + [14] = XDP_RSS_TYPE_NONE, /* Implicit zero */ |
| 217 | + [15] = XDP_RSS_TYPE_NONE, /* Implicit zero */ |
| 218 | +}; |
| 219 | + |
172 | 220 | static int mlx5e_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash,
|
173 | 221 | enum xdp_rss_hash_type *rss_type)
|
174 | 222 | {
|
175 | 223 | const struct mlx5e_xdp_buff *_ctx = (void *)ctx;
|
| 224 | + const struct mlx5_cqe64 *cqe = _ctx->cqe; |
| 225 | + u32 hash_type, l4_type, ip_type, lookup; |
176 | 226 |
|
177 | 227 | if (unlikely(!(_ctx->xdp.rxq->dev->features & NETIF_F_RXHASH)))
|
178 | 228 | return -ENODATA;
|
179 | 229 |
|
180 |
| - *hash = be32_to_cpu(_ctx->cqe->rss_hash_result); |
| 230 | + *hash = be32_to_cpu(cqe->rss_hash_result); |
| 231 | + |
| 232 | + hash_type = cqe->rss_hash_type; |
| 233 | + BUILD_BUG_ON(CQE_RSS_HTYPE_IP != RSS_L3); /* same mask */ |
| 234 | + ip_type = hash_type & CQE_RSS_HTYPE_IP; |
| 235 | + l4_type = FIELD_GET(CQE_RSS_HTYPE_L4, hash_type); |
| 236 | + lookup = ip_type | l4_type; |
| 237 | + *rss_type = mlx5_xdp_rss_type[lookup]; |
| 238 | + |
181 | 239 | return 0;
|
182 | 240 | }
|
183 | 241 |
|
|
0 commit comments