Skip to content

Commit d0f89c4

Browse files
committed
Daniel Borkmann says: ==================== pull-request: bpf 2023-04-13 We've added 6 non-merge commits during the last 1 day(s) which contain a total of 14 files changed, 205 insertions(+), 38 deletions(-). The main changes are: 1) One late straggler fix on the XDP hints side which fixes bpf_xdp_metadata_rx_hash kfunc API before the release goes out in order to provide information on the RSS hash type, from Jesper Dangaard Brouer. * tag 'for-netdev' of https://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf: selftests/bpf: Adjust bpf_xdp_metadata_rx_hash for new arg mlx4: bpf_xdp_metadata_rx_hash add xdp rss hash type veth: bpf_xdp_metadata_rx_hash add xdp rss hash type mlx5: bpf_xdp_metadata_rx_hash add xdp rss hash type xdp: rss hash types representation selftests/bpf: xdp_hw_metadata remove bpf_printk and add counters ==================== Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Jakub Kicinski <[email protected]>
2 parents 0646dc3 + b65ef48 commit d0f89c4

File tree

14 files changed

+205
-38
lines changed

14 files changed

+205
-38
lines changed

drivers/net/ethernet/mellanox/mlx4/en_rx.c

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -681,14 +681,32 @@ int mlx4_en_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp)
681681
return 0;
682682
}
683683

684-
int mlx4_en_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash)
684+
int mlx4_en_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash,
685+
enum xdp_rss_hash_type *rss_type)
685686
{
686687
struct mlx4_en_xdp_buff *_ctx = (void *)ctx;
688+
struct mlx4_cqe *cqe = _ctx->cqe;
689+
enum xdp_rss_hash_type xht = 0;
690+
__be16 status;
687691

688692
if (unlikely(!(_ctx->dev->features & NETIF_F_RXHASH)))
689693
return -ENODATA;
690694

691-
*hash = be32_to_cpu(_ctx->cqe->immed_rss_invalid);
695+
*hash = be32_to_cpu(cqe->immed_rss_invalid);
696+
status = cqe->status;
697+
if (status & cpu_to_be16(MLX4_CQE_STATUS_TCP))
698+
xht = XDP_RSS_L4_TCP;
699+
if (status & cpu_to_be16(MLX4_CQE_STATUS_UDP))
700+
xht = XDP_RSS_L4_UDP;
701+
if (status & cpu_to_be16(MLX4_CQE_STATUS_IPV4 | MLX4_CQE_STATUS_IPV4F))
702+
xht |= XDP_RSS_L3_IPV4;
703+
if (status & cpu_to_be16(MLX4_CQE_STATUS_IPV6)) {
704+
xht |= XDP_RSS_L3_IPV6;
705+
if (cqe->ipv6_ext_mask)
706+
xht |= XDP_RSS_L3_DYNHDR;
707+
}
708+
*rss_type = xht;
709+
692710
return 0;
693711
}
694712

drivers/net/ethernet/mellanox/mlx4/mlx4_en.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -798,7 +798,8 @@ int mlx4_en_netdev_event(struct notifier_block *this,
798798

799799
struct xdp_md;
800800
int mlx4_en_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp);
801-
int mlx4_en_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash);
801+
int mlx4_en_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash,
802+
enum xdp_rss_hash_type *rss_type);
802803

803804
/*
804805
* Functions for time stamping

drivers/net/ethernet/mellanox/mlx5/core/en/xdp.c

Lines changed: 61 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
#include <net/xdp_sock_drv.h>
3535
#include "en/xdp.h"
3636
#include "en/params.h"
37+
#include <linux/bitfield.h>
3738

3839
int mlx5e_xdp_max_mtu(struct mlx5e_params *params, struct mlx5e_xsk_param *xsk)
3940
{
@@ -169,14 +170,72 @@ static int mlx5e_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp)
169170
return 0;
170171
}
171172

172-
static int mlx5e_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash)
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+
220+
static int mlx5e_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash,
221+
enum xdp_rss_hash_type *rss_type)
173222
{
174223
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;
175226

176227
if (unlikely(!(_ctx->xdp.rxq->dev->features & NETIF_F_RXHASH)))
177228
return -ENODATA;
178229

179-
*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+
180239
return 0;
181240
}
182241

drivers/net/veth.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1648,14 +1648,18 @@ static int veth_xdp_rx_timestamp(const struct xdp_md *ctx, u64 *timestamp)
16481648
return 0;
16491649
}
16501650

1651-
static int veth_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash)
1651+
static int veth_xdp_rx_hash(const struct xdp_md *ctx, u32 *hash,
1652+
enum xdp_rss_hash_type *rss_type)
16521653
{
16531654
struct veth_xdp_buff *_ctx = (void *)ctx;
1655+
struct sk_buff *skb = _ctx->skb;
16541656

1655-
if (!_ctx->skb)
1657+
if (!skb)
16561658
return -ENODATA;
16571659

1658-
*hash = skb_get_hash(_ctx->skb);
1660+
*hash = skb_get_hash(skb);
1661+
*rss_type = skb->l4_hash ? XDP_RSS_TYPE_L4_ANY : XDP_RSS_TYPE_NONE;
1662+
16591663
return 0;
16601664
}
16611665

include/linux/mlx5/device.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
#include <linux/types.h>
3737
#include <rdma/ib_verbs.h>
3838
#include <linux/mlx5/mlx5_ifc.h>
39+
#include <linux/bitfield.h>
3940

4041
#if defined(__LITTLE_ENDIAN)
4142
#define MLX5_SET_HOST_ENDIANNESS 0
@@ -980,14 +981,23 @@ enum {
980981
};
981982

982983
enum {
983-
CQE_RSS_HTYPE_IP = 0x3 << 2,
984+
CQE_RSS_HTYPE_IP = GENMASK(3, 2),
984985
/* cqe->rss_hash_type[3:2] - IP destination selected for hash
985986
* (00 = none, 01 = IPv4, 10 = IPv6, 11 = Reserved)
986987
*/
987-
CQE_RSS_HTYPE_L4 = 0x3 << 6,
988+
CQE_RSS_IP_NONE = 0x0,
989+
CQE_RSS_IPV4 = 0x1,
990+
CQE_RSS_IPV6 = 0x2,
991+
CQE_RSS_RESERVED = 0x3,
992+
993+
CQE_RSS_HTYPE_L4 = GENMASK(7, 6),
988994
/* cqe->rss_hash_type[7:6] - L4 destination selected for hash
989995
* (00 = none, 01 = TCP. 10 = UDP, 11 = IPSEC.SPI
990996
*/
997+
CQE_RSS_L4_NONE = 0x0,
998+
CQE_RSS_L4_TCP = 0x1,
999+
CQE_RSS_L4_UDP = 0x2,
1000+
CQE_RSS_L4_IPSEC = 0x3,
9911001
};
9921002

9931003
enum {

include/linux/netdevice.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1624,7 +1624,8 @@ struct net_device_ops {
16241624

16251625
struct xdp_metadata_ops {
16261626
int (*xmo_rx_timestamp)(const struct xdp_md *ctx, u64 *timestamp);
1627-
int (*xmo_rx_hash)(const struct xdp_md *ctx, u32 *hash);
1627+
int (*xmo_rx_hash)(const struct xdp_md *ctx, u32 *hash,
1628+
enum xdp_rss_hash_type *rss_type);
16281629
};
16291630

16301631
/**

include/net/xdp.h

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
#include <linux/skbuff.h> /* skb_shared_info */
1010
#include <uapi/linux/netdev.h>
11+
#include <linux/bitfield.h>
1112

1213
/**
1314
* DOC: XDP RX-queue information
@@ -425,6 +426,52 @@ XDP_METADATA_KFUNC_xxx
425426
MAX_XDP_METADATA_KFUNC,
426427
};
427428

429+
enum xdp_rss_hash_type {
430+
/* First part: Individual bits for L3/L4 types */
431+
XDP_RSS_L3_IPV4 = BIT(0),
432+
XDP_RSS_L3_IPV6 = BIT(1),
433+
434+
/* The fixed (L3) IPv4 and IPv6 headers can both be followed by
435+
* variable/dynamic headers, IPv4 called Options and IPv6 called
436+
* Extension Headers. HW RSS type can contain this info.
437+
*/
438+
XDP_RSS_L3_DYNHDR = BIT(2),
439+
440+
/* When RSS hash covers L4 then drivers MUST set XDP_RSS_L4 bit in
441+
* addition to the protocol specific bit. This ease interaction with
442+
* SKBs and avoids reserving a fixed mask for future L4 protocol bits.
443+
*/
444+
XDP_RSS_L4 = BIT(3), /* L4 based hash, proto can be unknown */
445+
XDP_RSS_L4_TCP = BIT(4),
446+
XDP_RSS_L4_UDP = BIT(5),
447+
XDP_RSS_L4_SCTP = BIT(6),
448+
XDP_RSS_L4_IPSEC = BIT(7), /* L4 based hash include IPSEC SPI */
449+
450+
/* Second part: RSS hash type combinations used for driver HW mapping */
451+
XDP_RSS_TYPE_NONE = 0,
452+
XDP_RSS_TYPE_L2 = XDP_RSS_TYPE_NONE,
453+
454+
XDP_RSS_TYPE_L3_IPV4 = XDP_RSS_L3_IPV4,
455+
XDP_RSS_TYPE_L3_IPV6 = XDP_RSS_L3_IPV6,
456+
XDP_RSS_TYPE_L3_IPV4_OPT = XDP_RSS_L3_IPV4 | XDP_RSS_L3_DYNHDR,
457+
XDP_RSS_TYPE_L3_IPV6_EX = XDP_RSS_L3_IPV6 | XDP_RSS_L3_DYNHDR,
458+
459+
XDP_RSS_TYPE_L4_ANY = XDP_RSS_L4,
460+
XDP_RSS_TYPE_L4_IPV4_TCP = XDP_RSS_L3_IPV4 | XDP_RSS_L4 | XDP_RSS_L4_TCP,
461+
XDP_RSS_TYPE_L4_IPV4_UDP = XDP_RSS_L3_IPV4 | XDP_RSS_L4 | XDP_RSS_L4_UDP,
462+
XDP_RSS_TYPE_L4_IPV4_SCTP = XDP_RSS_L3_IPV4 | XDP_RSS_L4 | XDP_RSS_L4_SCTP,
463+
XDP_RSS_TYPE_L4_IPV4_IPSEC = XDP_RSS_L3_IPV4 | XDP_RSS_L4 | XDP_RSS_L4_IPSEC,
464+
465+
XDP_RSS_TYPE_L4_IPV6_TCP = XDP_RSS_L3_IPV6 | XDP_RSS_L4 | XDP_RSS_L4_TCP,
466+
XDP_RSS_TYPE_L4_IPV6_UDP = XDP_RSS_L3_IPV6 | XDP_RSS_L4 | XDP_RSS_L4_UDP,
467+
XDP_RSS_TYPE_L4_IPV6_SCTP = XDP_RSS_L3_IPV6 | XDP_RSS_L4 | XDP_RSS_L4_SCTP,
468+
XDP_RSS_TYPE_L4_IPV6_IPSEC = XDP_RSS_L3_IPV6 | XDP_RSS_L4 | XDP_RSS_L4_IPSEC,
469+
470+
XDP_RSS_TYPE_L4_IPV6_TCP_EX = XDP_RSS_TYPE_L4_IPV6_TCP | XDP_RSS_L3_DYNHDR,
471+
XDP_RSS_TYPE_L4_IPV6_UDP_EX = XDP_RSS_TYPE_L4_IPV6_UDP | XDP_RSS_L3_DYNHDR,
472+
XDP_RSS_TYPE_L4_IPV6_SCTP_EX = XDP_RSS_TYPE_L4_IPV6_SCTP | XDP_RSS_L3_DYNHDR,
473+
};
474+
428475
#ifdef CONFIG_NET
429476
u32 bpf_xdp_metadata_kfunc_id(int id);
430477
bool bpf_dev_bound_kfunc_id(u32 btf_id);

net/core/xdp.c

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -734,13 +734,21 @@ __bpf_kfunc int bpf_xdp_metadata_rx_timestamp(const struct xdp_md *ctx, u64 *tim
734734
* bpf_xdp_metadata_rx_hash - Read XDP frame RX hash.
735735
* @ctx: XDP context pointer.
736736
* @hash: Return value pointer.
737+
* @rss_type: Return value pointer for RSS type.
738+
*
739+
* The RSS hash type (@rss_type) specifies what portion of packet headers NIC
740+
* hardware used when calculating RSS hash value. The RSS type can be decoded
741+
* via &enum xdp_rss_hash_type either matching on individual L3/L4 bits
742+
* ``XDP_RSS_L*`` or by combined traditional *RSS Hashing Types*
743+
* ``XDP_RSS_TYPE_L*``.
737744
*
738745
* Return:
739746
* * Returns 0 on success or ``-errno`` on error.
740747
* * ``-EOPNOTSUPP`` : means device driver doesn't implement kfunc
741748
* * ``-ENODATA`` : means no RX-hash available for this frame
742749
*/
743-
__bpf_kfunc int bpf_xdp_metadata_rx_hash(const struct xdp_md *ctx, u32 *hash)
750+
__bpf_kfunc int bpf_xdp_metadata_rx_hash(const struct xdp_md *ctx, u32 *hash,
751+
enum xdp_rss_hash_type *rss_type)
744752
{
745753
return -EOPNOTSUPP;
746754
}

tools/testing/selftests/bpf/prog_tests/xdp_metadata.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,8 @@ static int verify_xsk_metadata(struct xsk *xsk)
273273
if (!ASSERT_NEQ(meta->rx_hash, 0, "rx_hash"))
274274
return -1;
275275

276+
ASSERT_EQ(meta->rx_hash_type, 0, "rx_hash_type");
277+
276278
xsk_ring_cons__release(&xsk->rx, 1);
277279
refill_rx(xsk, comp_addr);
278280

tools/testing/selftests/bpf/progs/xdp_hw_metadata.c

Lines changed: 24 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,14 @@ struct {
1212
__type(value, __u32);
1313
} xsk SEC(".maps");
1414

15+
__u64 pkts_skip = 0;
16+
__u64 pkts_fail = 0;
17+
__u64 pkts_redir = 0;
18+
1519
extern int bpf_xdp_metadata_rx_timestamp(const struct xdp_md *ctx,
1620
__u64 *timestamp) __ksym;
17-
extern int bpf_xdp_metadata_rx_hash(const struct xdp_md *ctx,
18-
__u32 *hash) __ksym;
21+
extern int bpf_xdp_metadata_rx_hash(const struct xdp_md *ctx, __u32 *hash,
22+
enum xdp_rss_hash_type *rss_type) __ksym;
1923

2024
SEC("xdp")
2125
int rx(struct xdp_md *ctx)
@@ -26,7 +30,7 @@ int rx(struct xdp_md *ctx)
2630
struct udphdr *udp = NULL;
2731
struct iphdr *iph = NULL;
2832
struct xdp_meta *meta;
29-
int ret;
33+
int err;
3034

3135
data = (void *)(long)ctx->data;
3236
data_end = (void *)(long)ctx->data_end;
@@ -46,17 +50,20 @@ int rx(struct xdp_md *ctx)
4650
udp = NULL;
4751
}
4852

49-
if (!udp)
53+
if (!udp) {
54+
__sync_add_and_fetch(&pkts_skip, 1);
5055
return XDP_PASS;
56+
}
5157

52-
if (udp->dest != bpf_htons(9091))
58+
/* Forwarding UDP:9091 to AF_XDP */
59+
if (udp->dest != bpf_htons(9091)) {
60+
__sync_add_and_fetch(&pkts_skip, 1);
5361
return XDP_PASS;
62+
}
5463

55-
bpf_printk("forwarding UDP:9091 to AF_XDP");
56-
57-
ret = bpf_xdp_adjust_meta(ctx, -(int)sizeof(struct xdp_meta));
58-
if (ret != 0) {
59-
bpf_printk("bpf_xdp_adjust_meta returned %d", ret);
64+
err = bpf_xdp_adjust_meta(ctx, -(int)sizeof(struct xdp_meta));
65+
if (err) {
66+
__sync_add_and_fetch(&pkts_fail, 1);
6067
return XDP_PASS;
6168
}
6269

@@ -65,20 +72,19 @@ int rx(struct xdp_md *ctx)
6572
meta = data_meta;
6673

6774
if (meta + 1 > data) {
68-
bpf_printk("bpf_xdp_adjust_meta doesn't appear to work");
75+
__sync_add_and_fetch(&pkts_fail, 1);
6976
return XDP_PASS;
7077
}
7178

72-
if (!bpf_xdp_metadata_rx_timestamp(ctx, &meta->rx_timestamp))
73-
bpf_printk("populated rx_timestamp with %llu", meta->rx_timestamp);
74-
else
79+
err = bpf_xdp_metadata_rx_timestamp(ctx, &meta->rx_timestamp);
80+
if (err)
7581
meta->rx_timestamp = 0; /* Used by AF_XDP as not avail signal */
7682

77-
if (!bpf_xdp_metadata_rx_hash(ctx, &meta->rx_hash))
78-
bpf_printk("populated rx_hash with %u", meta->rx_hash);
79-
else
80-
meta->rx_hash = 0; /* Used by AF_XDP as not avail signal */
83+
err = bpf_xdp_metadata_rx_hash(ctx, &meta->rx_hash, &meta->rx_hash_type);
84+
if (err < 0)
85+
meta->rx_hash_err = err; /* Used by AF_XDP as no hash signal */
8186

87+
__sync_add_and_fetch(&pkts_redir, 1);
8288
return bpf_redirect_map(&xsk, ctx->rx_queue_index, XDP_PASS);
8389
}
8490

0 commit comments

Comments
 (0)