|
| 1 | +/* SPDX-License-Identifier: GPL-2.0 */ |
| 2 | +#undef TRACE_SYSTEM |
| 3 | +#define TRACE_SYSTEM sockmap |
| 4 | + |
| 5 | +#if !defined(_TRACE_SOCKMAP_H) || defined(TRACE_HEADER_MULTI_READ) |
| 6 | +#define _TRACE_SOCKMAP_H |
| 7 | + |
| 8 | +#include <linux/tracepoint.h> |
| 9 | +#include <linux/bpf.h> |
| 10 | +#include <linux/skmsg.h> |
| 11 | + |
| 12 | +#ifndef __TRACE_SOCKMAP_HELPER_ONCE_ONLY |
| 13 | +#define __TRACE_SOCKMAP_HELPER_ONCE_ONLY |
| 14 | + |
| 15 | +enum sockmap_direct_type { |
| 16 | + SOCKMAP_REDIR_NONE = 0, |
| 17 | + SOCKMAP_REDIR_INGRESS, |
| 18 | + SOCKMAP_REDIR_EGRESS, |
| 19 | +}; |
| 20 | + |
| 21 | +enum sockmap_data_type { |
| 22 | + SOCKMAP_MSG = 0, |
| 23 | + SOCKMAP_SKB, |
| 24 | +}; |
| 25 | + |
| 26 | +#endif /* end __TRACE_SOCKMAP_HELPER_ONCE_ONLY */ |
| 27 | + |
| 28 | +TRACE_DEFINE_ENUM(SOCKMAP_MSG); |
| 29 | +TRACE_DEFINE_ENUM(SOCKMAP_SKB); |
| 30 | +TRACE_DEFINE_ENUM(SOCKMAP_REDIR_NONE); |
| 31 | +TRACE_DEFINE_ENUM(SOCKMAP_REDIR_INGRESS); |
| 32 | +TRACE_DEFINE_ENUM(SOCKMAP_REDIR_EGRESS); |
| 33 | + |
| 34 | +TRACE_DEFINE_ENUM(__SK_DROP); |
| 35 | +TRACE_DEFINE_ENUM(__SK_PASS); |
| 36 | +TRACE_DEFINE_ENUM(__SK_REDIRECT); |
| 37 | +TRACE_DEFINE_ENUM(__SK_NONE); |
| 38 | + |
| 39 | +#define show_redirect_type(x) \ |
| 40 | + __print_symbolic(x, \ |
| 41 | + { SOCKMAP_REDIR_NONE, "none" }, \ |
| 42 | + { SOCKMAP_REDIR_INGRESS, "ingress" }, \ |
| 43 | + { SOCKMAP_REDIR_EGRESS, "egress" }) |
| 44 | + |
| 45 | +#define show_act(x) \ |
| 46 | + __print_symbolic(x, \ |
| 47 | + { __SK_DROP, "DROP" }, \ |
| 48 | + { __SK_PASS, "PASS" }, \ |
| 49 | + { __SK_REDIRECT, "REDIRECT" }, \ |
| 50 | + { __SK_NONE, "NONE" }) |
| 51 | + |
| 52 | +#define show_data_type(x) \ |
| 53 | + __print_symbolic(x, \ |
| 54 | + { SOCKMAP_MSG, "msg" }, \ |
| 55 | + { SOCKMAP_SKB, "skb" }) |
| 56 | + |
| 57 | +#define trace_sockmap_skmsg_redirect(sk, prog, msg, act) \ |
| 58 | + trace_sockmap_redirect((sk), SOCKMAP_MSG, (prog), \ |
| 59 | + (msg)->sg.size, (act), \ |
| 60 | + sk_msg_to_ingress(msg)) |
| 61 | + |
| 62 | +#define trace_sockmap_skb_redirect(sk, prog, skb, act) \ |
| 63 | + trace_sockmap_redirect((sk), SOCKMAP_SKB, (prog), \ |
| 64 | + (skb)->len, (act), \ |
| 65 | + skb_bpf_ingress(skb)) |
| 66 | + |
| 67 | +#define trace_sockmap_skb_strp_parse(sk, prog, skb, ret) \ |
| 68 | + trace_sockmap_strparser((sk), (prog), (skb)->len, (ret)) |
| 69 | + |
| 70 | +TRACE_EVENT(sockmap_redirect, |
| 71 | + |
| 72 | + TP_PROTO(const struct sock *sk, enum sockmap_data_type type, |
| 73 | + const struct bpf_prog *prog, int len, int act, |
| 74 | + bool ingress), |
| 75 | + |
| 76 | + TP_ARGS(sk, type, prog, len, act, ingress), |
| 77 | + |
| 78 | + TP_STRUCT__entry( |
| 79 | + __field(const void *, sk) |
| 80 | + __field(unsigned long, ino) |
| 81 | + __field(unsigned int, netns_ino) |
| 82 | + __field(__u16, family) |
| 83 | + __field(__u16, protocol) |
| 84 | + __field(int, prog_id) |
| 85 | + __field(int, len) |
| 86 | + __field(int, act) |
| 87 | + __field(enum sockmap_data_type, type) |
| 88 | + __field(enum sockmap_direct_type, redir) |
| 89 | + ), |
| 90 | + |
| 91 | + TP_fast_assign( |
| 92 | + /* 'redir' is undefined if action is not REDIRECT */ |
| 93 | + enum sockmap_direct_type redir = SOCKMAP_REDIR_NONE; |
| 94 | + |
| 95 | + if (act == __SK_REDIRECT) { |
| 96 | + if (ingress) |
| 97 | + redir = SOCKMAP_REDIR_INGRESS; |
| 98 | + else |
| 99 | + redir = SOCKMAP_REDIR_EGRESS; |
| 100 | + } |
| 101 | + __entry->sk = sk; |
| 102 | + __entry->ino = sock_i_ino((struct sock *)sk); |
| 103 | + __entry->netns_ino = sock_net(sk)->ns.inum; |
| 104 | + __entry->type = type; |
| 105 | + __entry->family = sk->sk_family; |
| 106 | + __entry->protocol = sk->sk_protocol; |
| 107 | + __entry->prog_id = prog->aux->id; |
| 108 | + __entry->len = len; |
| 109 | + __entry->act = act; |
| 110 | + __entry->redir = redir; |
| 111 | + ), |
| 112 | + |
| 113 | + TP_printk("sk=%p, netns=%u, inode=%lu, family=%u, protocol=%u," |
| 114 | + " prog_id=%d, len=%d, type=%s, action=%s, redirect_type=%s", |
| 115 | + __entry->sk, __entry->netns_ino, __entry->ino, |
| 116 | + __entry->family, __entry->protocol, __entry->prog_id, |
| 117 | + __entry->len, show_data_type(__entry->type), |
| 118 | + show_act(__entry->act), show_redirect_type(__entry->redir)) |
| 119 | +); |
| 120 | + |
| 121 | +TRACE_EVENT(sockmap_strparser, |
| 122 | + |
| 123 | + TP_PROTO(const struct sock *sk, const struct bpf_prog *prog, |
| 124 | + int in_len, int full_len), |
| 125 | + |
| 126 | + TP_ARGS(sk, prog, in_len, full_len), |
| 127 | + |
| 128 | + TP_STRUCT__entry( |
| 129 | + __field(const void *, sk) |
| 130 | + __field(unsigned long, ino) |
| 131 | + __field(unsigned int, netns_ino) |
| 132 | + __field(__u16, family) |
| 133 | + __field(__u16, protocol) |
| 134 | + __field(int, prog_id) |
| 135 | + __field(int, in_len) |
| 136 | + __field(int, full_len) |
| 137 | + ), |
| 138 | + |
| 139 | + TP_fast_assign( |
| 140 | + __entry->sk = sk; |
| 141 | + __entry->ino = sock_i_ino((struct sock *)sk); |
| 142 | + __entry->netns_ino = sock_net(sk)->ns.inum; |
| 143 | + __entry->family = sk->sk_family; |
| 144 | + __entry->protocol = sk->sk_protocol; |
| 145 | + __entry->prog_id = prog->aux->id; |
| 146 | + __entry->in_len = in_len; |
| 147 | + __entry->full_len = full_len; |
| 148 | + ), |
| 149 | + |
| 150 | + TP_printk("sk=%p, netns=%u, inode=%lu, family=%u, protocol=%u," |
| 151 | + " prog_id=%d, in_len=%d, full_len=%d", |
| 152 | + __entry->sk, __entry->netns_ino, __entry->ino, |
| 153 | + __entry->family, __entry->protocol, __entry->prog_id, |
| 154 | + __entry->in_len, __entry->full_len) |
| 155 | +); |
| 156 | +#endif /* _TRACE_SOCKMAP_H */ |
| 157 | + |
| 158 | +#include <trace/define_trace.h> |
0 commit comments