Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
3847ce32 SM |
2 | #undef TRACE_SYSTEM |
3 | #define TRACE_SYSTEM sock | |
4 | ||
5 | #if !defined(_TRACE_SOCK_H) || defined(TRACE_HEADER_MULTI_READ) | |
6 | #define _TRACE_SOCK_H | |
7 | ||
8 | #include <net/sock.h> | |
563e0bb0 | 9 | #include <net/ipv6.h> |
3847ce32 | 10 | #include <linux/tracepoint.h> |
563e0bb0 YS |
11 | #include <linux/ipv6.h> |
12 | #include <linux/tcp.h> | |
13 | ||
0c3b34d8 YS |
14 | #define family_names \ |
15 | EM(AF_INET) \ | |
16 | EMe(AF_INET6) | |
17 | ||
18 | /* The protocol traced by inet_sock_set_state */ | |
563e0bb0 YS |
19 | #define inet_protocol_names \ |
20 | EM(IPPROTO_TCP) \ | |
21 | EM(IPPROTO_DCCP) \ | |
faf391c3 MM |
22 | EM(IPPROTO_SCTP) \ |
23 | EMe(IPPROTO_MPTCP) | |
563e0bb0 YS |
24 | |
25 | #define tcp_state_names \ | |
26 | EM(TCP_ESTABLISHED) \ | |
27 | EM(TCP_SYN_SENT) \ | |
28 | EM(TCP_SYN_RECV) \ | |
29 | EM(TCP_FIN_WAIT1) \ | |
30 | EM(TCP_FIN_WAIT2) \ | |
31 | EM(TCP_TIME_WAIT) \ | |
32 | EM(TCP_CLOSE) \ | |
33 | EM(TCP_CLOSE_WAIT) \ | |
34 | EM(TCP_LAST_ACK) \ | |
35 | EM(TCP_LISTEN) \ | |
36 | EM(TCP_CLOSING) \ | |
37 | EMe(TCP_NEW_SYN_RECV) | |
38 | ||
d6f19938 YS |
39 | #define skmem_kind_names \ |
40 | EM(SK_MEM_SEND) \ | |
41 | EMe(SK_MEM_RECV) | |
42 | ||
563e0bb0 YS |
43 | /* enums need to be exported to user space */ |
44 | #undef EM | |
45 | #undef EMe | |
46 | #define EM(a) TRACE_DEFINE_ENUM(a); | |
47 | #define EMe(a) TRACE_DEFINE_ENUM(a); | |
48 | ||
0c3b34d8 | 49 | family_names |
563e0bb0 YS |
50 | inet_protocol_names |
51 | tcp_state_names | |
d6f19938 | 52 | skmem_kind_names |
563e0bb0 YS |
53 | |
54 | #undef EM | |
55 | #undef EMe | |
56 | #define EM(a) { a, #a }, | |
57 | #define EMe(a) { a, #a } | |
58 | ||
0c3b34d8 YS |
59 | #define show_family_name(val) \ |
60 | __print_symbolic(val, family_names) | |
61 | ||
563e0bb0 YS |
62 | #define show_inet_protocol_name(val) \ |
63 | __print_symbolic(val, inet_protocol_names) | |
64 | ||
65 | #define show_tcp_state_name(val) \ | |
66 | __print_symbolic(val, tcp_state_names) | |
3847ce32 | 67 | |
d6f19938 YS |
68 | #define show_skmem_kind_names(val) \ |
69 | __print_symbolic(val, skmem_kind_names) | |
70 | ||
3847ce32 SM |
71 | TRACE_EVENT(sock_rcvqueue_full, |
72 | ||
73 | TP_PROTO(struct sock *sk, struct sk_buff *skb), | |
74 | ||
75 | TP_ARGS(sk, skb), | |
76 | ||
77 | TP_STRUCT__entry( | |
78 | __field(int, rmem_alloc) | |
79 | __field(unsigned int, truesize) | |
80 | __field(int, sk_rcvbuf) | |
81 | ), | |
82 | ||
83 | TP_fast_assign( | |
84 | __entry->rmem_alloc = atomic_read(&sk->sk_rmem_alloc); | |
85 | __entry->truesize = skb->truesize; | |
ebb3b78d | 86 | __entry->sk_rcvbuf = READ_ONCE(sk->sk_rcvbuf); |
3847ce32 SM |
87 | ), |
88 | ||
89 | TP_printk("rmem_alloc=%d truesize=%u sk_rcvbuf=%d", | |
90 | __entry->rmem_alloc, __entry->truesize, __entry->sk_rcvbuf) | |
91 | ); | |
92 | ||
93 | TRACE_EVENT(sock_exceed_buf_limit, | |
94 | ||
d6f19938 | 95 | TP_PROTO(struct sock *sk, struct proto *prot, long allocated, int kind), |
3847ce32 | 96 | |
d6f19938 | 97 | TP_ARGS(sk, prot, allocated, kind), |
3847ce32 SM |
98 | |
99 | TP_STRUCT__entry( | |
100 | __array(char, name, 32) | |
820b8963 | 101 | __array(long, sysctl_mem, 3) |
3847ce32 SM |
102 | __field(long, allocated) |
103 | __field(int, sysctl_rmem) | |
104 | __field(int, rmem_alloc) | |
d6f19938 YS |
105 | __field(int, sysctl_wmem) |
106 | __field(int, wmem_alloc) | |
107 | __field(int, wmem_queued) | |
108 | __field(int, kind) | |
3847ce32 SM |
109 | ), |
110 | ||
111 | TP_fast_assign( | |
112 | strncpy(__entry->name, prot->name, 32); | |
820b8963 SRG |
113 | __entry->sysctl_mem[0] = READ_ONCE(prot->sysctl_mem[0]); |
114 | __entry->sysctl_mem[1] = READ_ONCE(prot->sysctl_mem[1]); | |
115 | __entry->sysctl_mem[2] = READ_ONCE(prot->sysctl_mem[2]); | |
3847ce32 | 116 | __entry->allocated = allocated; |
a3dcaf17 | 117 | __entry->sysctl_rmem = sk_get_rmem0(sk, prot); |
3847ce32 | 118 | __entry->rmem_alloc = atomic_read(&sk->sk_rmem_alloc); |
d6f19938 YS |
119 | __entry->sysctl_wmem = sk_get_wmem0(sk, prot); |
120 | __entry->wmem_alloc = refcount_read(&sk->sk_wmem_alloc); | |
ab4e846a | 121 | __entry->wmem_queued = READ_ONCE(sk->sk_wmem_queued); |
d6f19938 | 122 | __entry->kind = kind; |
3847ce32 SM |
123 | ), |
124 | ||
d6f19938 | 125 | TP_printk("proto:%s sysctl_mem=%ld,%ld,%ld allocated=%ld sysctl_rmem=%d rmem_alloc=%d sysctl_wmem=%d wmem_alloc=%d wmem_queued=%d kind=%s", |
3847ce32 SM |
126 | __entry->name, |
127 | __entry->sysctl_mem[0], | |
128 | __entry->sysctl_mem[1], | |
129 | __entry->sysctl_mem[2], | |
130 | __entry->allocated, | |
131 | __entry->sysctl_rmem, | |
d6f19938 YS |
132 | __entry->rmem_alloc, |
133 | __entry->sysctl_wmem, | |
134 | __entry->wmem_alloc, | |
135 | __entry->wmem_queued, | |
136 | show_skmem_kind_names(__entry->kind) | |
137 | ) | |
3847ce32 SM |
138 | ); |
139 | ||
563e0bb0 YS |
140 | TRACE_EVENT(inet_sock_set_state, |
141 | ||
142 | TP_PROTO(const struct sock *sk, const int oldstate, const int newstate), | |
143 | ||
144 | TP_ARGS(sk, oldstate, newstate), | |
145 | ||
146 | TP_STRUCT__entry( | |
147 | __field(const void *, skaddr) | |
148 | __field(int, oldstate) | |
149 | __field(int, newstate) | |
150 | __field(__u16, sport) | |
151 | __field(__u16, dport) | |
0c3b34d8 | 152 | __field(__u16, family) |
bf976514 | 153 | __field(__u16, protocol) |
563e0bb0 YS |
154 | __array(__u8, saddr, 4) |
155 | __array(__u8, daddr, 4) | |
156 | __array(__u8, saddr_v6, 16) | |
157 | __array(__u8, daddr_v6, 16) | |
158 | ), | |
159 | ||
160 | TP_fast_assign( | |
161 | struct inet_sock *inet = inet_sk(sk); | |
162 | struct in6_addr *pin6; | |
163 | __be32 *p32; | |
164 | ||
165 | __entry->skaddr = sk; | |
166 | __entry->oldstate = oldstate; | |
167 | __entry->newstate = newstate; | |
168 | ||
0c3b34d8 | 169 | __entry->family = sk->sk_family; |
563e0bb0 YS |
170 | __entry->protocol = sk->sk_protocol; |
171 | __entry->sport = ntohs(inet->inet_sport); | |
172 | __entry->dport = ntohs(inet->inet_dport); | |
173 | ||
174 | p32 = (__be32 *) __entry->saddr; | |
175 | *p32 = inet->inet_saddr; | |
176 | ||
177 | p32 = (__be32 *) __entry->daddr; | |
178 | *p32 = inet->inet_daddr; | |
179 | ||
180 | #if IS_ENABLED(CONFIG_IPV6) | |
181 | if (sk->sk_family == AF_INET6) { | |
182 | pin6 = (struct in6_addr *)__entry->saddr_v6; | |
183 | *pin6 = sk->sk_v6_rcv_saddr; | |
184 | pin6 = (struct in6_addr *)__entry->daddr_v6; | |
185 | *pin6 = sk->sk_v6_daddr; | |
186 | } else | |
187 | #endif | |
188 | { | |
189 | pin6 = (struct in6_addr *)__entry->saddr_v6; | |
190 | ipv6_addr_set_v4mapped(inet->inet_saddr, pin6); | |
191 | pin6 = (struct in6_addr *)__entry->daddr_v6; | |
192 | ipv6_addr_set_v4mapped(inet->inet_daddr, pin6); | |
193 | } | |
194 | ), | |
195 | ||
0c3b34d8 YS |
196 | TP_printk("family=%s protocol=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c oldstate=%s newstate=%s", |
197 | show_family_name(__entry->family), | |
563e0bb0 YS |
198 | show_inet_protocol_name(__entry->protocol), |
199 | __entry->sport, __entry->dport, | |
200 | __entry->saddr, __entry->daddr, | |
201 | __entry->saddr_v6, __entry->daddr_v6, | |
202 | show_tcp_state_name(__entry->oldstate), | |
203 | show_tcp_state_name(__entry->newstate)) | |
204 | ); | |
205 | ||
e6a3e443 AA |
206 | TRACE_EVENT(inet_sk_error_report, |
207 | ||
208 | TP_PROTO(const struct sock *sk), | |
209 | ||
210 | TP_ARGS(sk), | |
211 | ||
212 | TP_STRUCT__entry( | |
213 | __field(int, error) | |
214 | __field(__u16, sport) | |
215 | __field(__u16, dport) | |
216 | __field(__u16, family) | |
217 | __field(__u16, protocol) | |
218 | __array(__u8, saddr, 4) | |
219 | __array(__u8, daddr, 4) | |
220 | __array(__u8, saddr_v6, 16) | |
221 | __array(__u8, daddr_v6, 16) | |
222 | ), | |
223 | ||
224 | TP_fast_assign( | |
225 | struct inet_sock *inet = inet_sk(sk); | |
226 | struct in6_addr *pin6; | |
227 | __be32 *p32; | |
228 | ||
229 | __entry->error = sk->sk_err; | |
230 | __entry->family = sk->sk_family; | |
231 | __entry->protocol = sk->sk_protocol; | |
232 | __entry->sport = ntohs(inet->inet_sport); | |
233 | __entry->dport = ntohs(inet->inet_dport); | |
234 | ||
235 | p32 = (__be32 *) __entry->saddr; | |
236 | *p32 = inet->inet_saddr; | |
237 | ||
238 | p32 = (__be32 *) __entry->daddr; | |
239 | *p32 = inet->inet_daddr; | |
240 | ||
241 | #if IS_ENABLED(CONFIG_IPV6) | |
242 | if (sk->sk_family == AF_INET6) { | |
243 | pin6 = (struct in6_addr *)__entry->saddr_v6; | |
244 | *pin6 = sk->sk_v6_rcv_saddr; | |
245 | pin6 = (struct in6_addr *)__entry->daddr_v6; | |
246 | *pin6 = sk->sk_v6_daddr; | |
247 | } else | |
248 | #endif | |
249 | { | |
250 | pin6 = (struct in6_addr *)__entry->saddr_v6; | |
251 | ipv6_addr_set_v4mapped(inet->inet_saddr, pin6); | |
252 | pin6 = (struct in6_addr *)__entry->daddr_v6; | |
253 | ipv6_addr_set_v4mapped(inet->inet_daddr, pin6); | |
254 | } | |
255 | ), | |
256 | ||
257 | TP_printk("family=%s protocol=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c error=%d", | |
258 | show_family_name(__entry->family), | |
259 | show_inet_protocol_name(__entry->protocol), | |
260 | __entry->sport, __entry->dport, | |
261 | __entry->saddr, __entry->daddr, | |
262 | __entry->saddr_v6, __entry->daddr_v6, | |
263 | __entry->error) | |
264 | ); | |
265 | ||
40e0b090 PY |
266 | TRACE_EVENT(sk_data_ready, |
267 | ||
268 | TP_PROTO(const struct sock *sk), | |
269 | ||
270 | TP_ARGS(sk), | |
271 | ||
272 | TP_STRUCT__entry( | |
273 | __field(const void *, skaddr) | |
274 | __field(__u16, family) | |
275 | __field(__u16, protocol) | |
276 | __field(unsigned long, ip) | |
277 | ), | |
278 | ||
279 | TP_fast_assign( | |
280 | __entry->skaddr = sk; | |
281 | __entry->family = sk->sk_family; | |
282 | __entry->protocol = sk->sk_protocol; | |
283 | __entry->ip = _RET_IP_; | |
284 | ), | |
285 | ||
286 | TP_printk("family=%u protocol=%u func=%ps", | |
287 | __entry->family, __entry->protocol, (void *)__entry->ip) | |
288 | ); | |
289 | ||
6e6eda44 YC |
290 | /* |
291 | * sock send/recv msg length | |
292 | */ | |
293 | DECLARE_EVENT_CLASS(sock_msg_length, | |
294 | ||
295 | TP_PROTO(struct sock *sk, int ret, int flags), | |
296 | ||
297 | TP_ARGS(sk, ret, flags), | |
298 | ||
299 | TP_STRUCT__entry( | |
300 | __field(void *, sk) | |
301 | __field(__u16, family) | |
302 | __field(__u16, protocol) | |
303 | __field(int, ret) | |
304 | __field(int, flags) | |
305 | ), | |
306 | ||
307 | TP_fast_assign( | |
308 | __entry->sk = sk; | |
309 | __entry->family = sk->sk_family; | |
310 | __entry->protocol = sk->sk_protocol; | |
311 | __entry->ret = ret; | |
312 | __entry->flags = flags; | |
313 | ), | |
314 | ||
315 | TP_printk("sk address = %p, family = %s protocol = %s, length = %d, error = %d, flags = 0x%x", | |
316 | __entry->sk, show_family_name(__entry->family), | |
317 | show_inet_protocol_name(__entry->protocol), | |
318 | !(__entry->flags & MSG_PEEK) ? | |
319 | (__entry->ret > 0 ? __entry->ret : 0) : 0, | |
320 | __entry->ret < 0 ? __entry->ret : 0, | |
321 | __entry->flags) | |
322 | ); | |
323 | ||
324 | DEFINE_EVENT(sock_msg_length, sock_send_length, | |
325 | TP_PROTO(struct sock *sk, int ret, int flags), | |
326 | ||
327 | TP_ARGS(sk, ret, flags) | |
328 | ); | |
329 | ||
330 | DEFINE_EVENT(sock_msg_length, sock_recv_length, | |
331 | TP_PROTO(struct sock *sk, int ret, int flags), | |
332 | ||
333 | TP_ARGS(sk, ret, flags) | |
334 | ); | |
3847ce32 SM |
335 | #endif /* _TRACE_SOCK_H */ |
336 | ||
337 | /* This part must be outside protection */ | |
338 | #include <trace/define_trace.h> |