Skip to content

Commit 5acaee0

Browse files
jrfastabdavem330
authored andcommitted
xdp: add trace event for xdp redirect
This adds a trace event for xdp redirect which may help when debugging XDP programs that use redirect bpf commands. Signed-off-by: John Fastabend <[email protected]> Acked-by: Daniel Borkmann <[email protected]> Acked-by: Jesper Dangaard Brouer <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 6453073 commit 5acaee0

File tree

4 files changed

+43
-7
lines changed

4 files changed

+43
-7
lines changed

drivers/net/ethernet/intel/ixgbe/ixgbe_main.c

+1-1
Original file line numberDiff line numberDiff line change
@@ -2232,7 +2232,7 @@ static struct sk_buff *ixgbe_run_xdp(struct ixgbe_adapter *adapter,
22322232
result = ixgbe_xmit_xdp_ring(adapter, xdp);
22332233
break;
22342234
case XDP_REDIRECT:
2235-
err = xdp_do_redirect(adapter->netdev, xdp);
2235+
err = xdp_do_redirect(adapter->netdev, xdp, xdp_prog);
22362236
if (!err)
22372237
result = IXGBE_XDP_TX;
22382238
else

include/linux/filter.h

+3-1
Original file line numberDiff line numberDiff line change
@@ -713,7 +713,9 @@ struct bpf_prog *bpf_patch_insn_single(struct bpf_prog *prog, u32 off,
713713
const struct bpf_insn *patch, u32 len);
714714

715715
int xdp_do_generic_redirect(struct net_device *dev, struct sk_buff *skb);
716-
int xdp_do_redirect(struct net_device *dev, struct xdp_buff *xdp);
716+
int xdp_do_redirect(struct net_device *dev,
717+
struct xdp_buff *xdp,
718+
struct bpf_prog *prog);
717719

718720
void bpf_warn_invalid_xdp_action(u32 act);
719721
void bpf_warn_invalid_xdp_redirect(u32 ifindex);

include/trace/events/xdp.h

+30-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@
1212
FN(ABORTED) \
1313
FN(DROP) \
1414
FN(PASS) \
15-
FN(TX)
15+
FN(TX) \
16+
FN(REDIRECT)
1617

1718
#define __XDP_ACT_TP_FN(x) \
1819
TRACE_DEFINE_ENUM(XDP_##x);
@@ -48,6 +49,34 @@ TRACE_EVENT(xdp_exception,
4849
__print_symbolic(__entry->act, __XDP_ACT_SYM_TAB))
4950
);
5051

52+
TRACE_EVENT(xdp_redirect,
53+
54+
TP_PROTO(const struct net_device *from,
55+
const struct net_device *to,
56+
const struct bpf_prog *xdp, u32 act),
57+
58+
TP_ARGS(from, to, xdp, act),
59+
60+
TP_STRUCT__entry(
61+
__string(name_from, from->name)
62+
__string(name_to, to->name)
63+
__array(u8, prog_tag, 8)
64+
__field(u32, act)
65+
),
66+
67+
TP_fast_assign(
68+
BUILD_BUG_ON(sizeof(__entry->prog_tag) != sizeof(xdp->tag));
69+
memcpy(__entry->prog_tag, xdp->tag, sizeof(xdp->tag));
70+
__assign_str(name_from, from->name);
71+
__assign_str(name_to, to->name);
72+
__entry->act = act;
73+
),
74+
75+
TP_printk("prog=%s from=%s to=%s action=%s",
76+
__print_hex_str(__entry->prog_tag, 8),
77+
__get_str(name_from), __get_str(name_to),
78+
__print_symbolic(__entry->act, __XDP_ACT_SYM_TAB))
79+
);
5180
#endif /* _TRACE_XDP_H */
5281

5382
#include <trace/define_trace.h>

net/core/filter.c

+9-4
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
#include <net/sock_reuseport.h>
5656
#include <net/busy_poll.h>
5757
#include <net/tcp.h>
58+
#include <linux/bpf_trace.h>
5859

5960
/**
6061
* sk_filter_trim_cap - run a packet through a socket filter
@@ -2422,18 +2423,22 @@ static int __bpf_tx_xdp(struct net_device *dev, struct xdp_buff *xdp)
24222423
return -EOPNOTSUPP;
24232424
}
24242425

2425-
int xdp_do_redirect(struct net_device *dev, struct xdp_buff *xdp)
2426+
int xdp_do_redirect(struct net_device *dev, struct xdp_buff *xdp,
2427+
struct bpf_prog *xdp_prog)
24262428
{
24272429
struct redirect_info *ri = this_cpu_ptr(&redirect_info);
2430+
struct net_device *fwd;
24282431

2429-
dev = dev_get_by_index_rcu(dev_net(dev), ri->ifindex);
2432+
fwd = dev_get_by_index_rcu(dev_net(dev), ri->ifindex);
24302433
ri->ifindex = 0;
2431-
if (unlikely(!dev)) {
2434+
if (unlikely(!fwd)) {
24322435
bpf_warn_invalid_xdp_redirect(ri->ifindex);
24332436
return -EINVAL;
24342437
}
24352438

2436-
return __bpf_tx_xdp(dev, xdp);
2439+
trace_xdp_redirect(dev, fwd, xdp_prog, XDP_REDIRECT);
2440+
2441+
return __bpf_tx_xdp(fwd, xdp);
24372442
}
24382443
EXPORT_SYMBOL_GPL(xdp_do_redirect);
24392444

0 commit comments

Comments
 (0)