1a67edbf4SDaniel Borkmann #undef TRACE_SYSTEM 2a67edbf4SDaniel Borkmann #define TRACE_SYSTEM xdp 3a67edbf4SDaniel Borkmann 4a67edbf4SDaniel Borkmann #if !defined(_TRACE_XDP_H) || defined(TRACE_HEADER_MULTI_READ) 5a67edbf4SDaniel Borkmann #define _TRACE_XDP_H 6a67edbf4SDaniel Borkmann 7a67edbf4SDaniel Borkmann #include <linux/netdevice.h> 8a67edbf4SDaniel Borkmann #include <linux/filter.h> 9a67edbf4SDaniel Borkmann #include <linux/tracepoint.h> 10a67edbf4SDaniel Borkmann 11a67edbf4SDaniel Borkmann #define __XDP_ACT_MAP(FN) \ 12a67edbf4SDaniel Borkmann FN(ABORTED) \ 13a67edbf4SDaniel Borkmann FN(DROP) \ 14a67edbf4SDaniel Borkmann FN(PASS) \ 155acaee0aSJohn Fastabend FN(TX) \ 165acaee0aSJohn Fastabend FN(REDIRECT) 17a67edbf4SDaniel Borkmann 18a67edbf4SDaniel Borkmann #define __XDP_ACT_TP_FN(x) \ 19a67edbf4SDaniel Borkmann TRACE_DEFINE_ENUM(XDP_##x); 20a67edbf4SDaniel Borkmann #define __XDP_ACT_SYM_FN(x) \ 21a67edbf4SDaniel Borkmann { XDP_##x, #x }, 22a67edbf4SDaniel Borkmann #define __XDP_ACT_SYM_TAB \ 23a67edbf4SDaniel Borkmann __XDP_ACT_MAP(__XDP_ACT_SYM_FN) { -1, 0 } 24a67edbf4SDaniel Borkmann __XDP_ACT_MAP(__XDP_ACT_TP_FN) 25a67edbf4SDaniel Borkmann 26a67edbf4SDaniel Borkmann TRACE_EVENT(xdp_exception, 27a67edbf4SDaniel Borkmann 28a67edbf4SDaniel Borkmann TP_PROTO(const struct net_device *dev, 29a67edbf4SDaniel Borkmann const struct bpf_prog *xdp, u32 act), 30a67edbf4SDaniel Borkmann 31a67edbf4SDaniel Borkmann TP_ARGS(dev, xdp, act), 32a67edbf4SDaniel Borkmann 33a67edbf4SDaniel Borkmann TP_STRUCT__entry( 34a67edbf4SDaniel Borkmann __array(u8, prog_tag, 8) 35a67edbf4SDaniel Borkmann __field(u32, act) 36315ec399SJesper Dangaard Brouer __field(int, ifindex) 37a67edbf4SDaniel Borkmann ), 38a67edbf4SDaniel Borkmann 39a67edbf4SDaniel Borkmann TP_fast_assign( 40a67edbf4SDaniel Borkmann BUILD_BUG_ON(sizeof(__entry->prog_tag) != sizeof(xdp->tag)); 41a67edbf4SDaniel Borkmann memcpy(__entry->prog_tag, xdp->tag, sizeof(xdp->tag)); 42a67edbf4SDaniel Borkmann __entry->act = act; 43315ec399SJesper Dangaard Brouer __entry->ifindex = dev->ifindex; 44a67edbf4SDaniel Borkmann ), 45a67edbf4SDaniel Borkmann 46315ec399SJesper Dangaard Brouer TP_printk("prog=%s action=%s ifindex=%d", 47a67edbf4SDaniel Borkmann __print_hex_str(__entry->prog_tag, 8), 48315ec399SJesper Dangaard Brouer __print_symbolic(__entry->act, __XDP_ACT_SYM_TAB), 49315ec399SJesper Dangaard Brouer __entry->ifindex) 50a67edbf4SDaniel Borkmann ); 51a67edbf4SDaniel Borkmann 52*8d3b778fSJesper Dangaard Brouer DECLARE_EVENT_CLASS(xdp_redirect_template, 535acaee0aSJohn Fastabend 54a8735855SJesper Dangaard Brouer TP_PROTO(const struct net_device *dev, 55c31e5a48SJesper Dangaard Brouer const struct bpf_prog *xdp, 56*8d3b778fSJesper Dangaard Brouer int to_ifindex, int err, 57*8d3b778fSJesper Dangaard Brouer const struct bpf_map *map, u32 map_index), 585acaee0aSJohn Fastabend 59*8d3b778fSJesper Dangaard Brouer TP_ARGS(dev, xdp, to_ifindex, err, map, map_index), 605acaee0aSJohn Fastabend 615acaee0aSJohn Fastabend TP_STRUCT__entry( 625acaee0aSJohn Fastabend __array(u8, prog_tag, 8) 635acaee0aSJohn Fastabend __field(u32, act) 64a8735855SJesper Dangaard Brouer __field(int, ifindex) 654c03bdd7SJesper Dangaard Brouer __field(int, err) 66*8d3b778fSJesper Dangaard Brouer __field(int, to_ifindex) 67*8d3b778fSJesper Dangaard Brouer __field(u32, map_id) 68*8d3b778fSJesper Dangaard Brouer __field(int, map_index) 695acaee0aSJohn Fastabend ), 705acaee0aSJohn Fastabend 715acaee0aSJohn Fastabend TP_fast_assign( 725acaee0aSJohn Fastabend BUILD_BUG_ON(sizeof(__entry->prog_tag) != sizeof(xdp->tag)); 735acaee0aSJohn Fastabend memcpy(__entry->prog_tag, xdp->tag, sizeof(xdp->tag)); 74c31e5a48SJesper Dangaard Brouer __entry->act = XDP_REDIRECT; 75a8735855SJesper Dangaard Brouer __entry->ifindex = dev->ifindex; 764c03bdd7SJesper Dangaard Brouer __entry->err = err; 77*8d3b778fSJesper Dangaard Brouer __entry->to_ifindex = to_ifindex; 78*8d3b778fSJesper Dangaard Brouer __entry->map_id = map ? map->id : 0; 79*8d3b778fSJesper Dangaard Brouer __entry->map_index = map_index; 805acaee0aSJohn Fastabend ), 815acaee0aSJohn Fastabend 82*8d3b778fSJesper Dangaard Brouer TP_printk("prog=%s action=%s ifindex=%d to_ifindex=%d err=%d" 83*8d3b778fSJesper Dangaard Brouer " map_id=%d map_index=%d", 845acaee0aSJohn Fastabend __print_hex_str(__entry->prog_tag, 8), 854c03bdd7SJesper Dangaard Brouer __print_symbolic(__entry->act, __XDP_ACT_SYM_TAB), 86*8d3b778fSJesper Dangaard Brouer __entry->ifindex, __entry->to_ifindex, 87*8d3b778fSJesper Dangaard Brouer __entry->err, 88*8d3b778fSJesper Dangaard Brouer __entry->map_id, __entry->map_index) 895acaee0aSJohn Fastabend ); 90*8d3b778fSJesper Dangaard Brouer 91*8d3b778fSJesper Dangaard Brouer DEFINE_EVENT(xdp_redirect_template, xdp_redirect, 92*8d3b778fSJesper Dangaard Brouer TP_PROTO(const struct net_device *dev, 93*8d3b778fSJesper Dangaard Brouer const struct bpf_prog *xdp, 94*8d3b778fSJesper Dangaard Brouer int to_ifindex, int err, 95*8d3b778fSJesper Dangaard Brouer const struct bpf_map *map, u32 map_index), 96*8d3b778fSJesper Dangaard Brouer TP_ARGS(dev, xdp, to_ifindex, err, map, map_index) 97*8d3b778fSJesper Dangaard Brouer ); 98*8d3b778fSJesper Dangaard Brouer 99*8d3b778fSJesper Dangaard Brouer #define _trace_xdp_redirect(dev, xdp, to, err) \ 100*8d3b778fSJesper Dangaard Brouer trace_xdp_redirect(dev, xdp, to, err, NULL, 0); 101*8d3b778fSJesper Dangaard Brouer 102*8d3b778fSJesper Dangaard Brouer #define trace_xdp_redirect_map(dev, xdp, fwd, err, map, idx) \ 103*8d3b778fSJesper Dangaard Brouer trace_xdp_redirect(dev, xdp, fwd ? fwd->ifindex : 0, err, map, idx); 104*8d3b778fSJesper Dangaard Brouer 105a67edbf4SDaniel Borkmann #endif /* _TRACE_XDP_H */ 106a67edbf4SDaniel Borkmann 107a67edbf4SDaniel Borkmann #include <trace/define_trace.h> 108