xref: /linux/include/trace/events/tcp.h (revision 3124591f686115aca25d772c2ccb7b1e202c3197)
1 /* SPDX-License-Identifier: GPL-2.0 */
2 #undef TRACE_SYSTEM
3 #define TRACE_SYSTEM tcp
4 
5 #if !defined(_TRACE_TCP_H) || defined(TRACE_HEADER_MULTI_READ)
6 #define _TRACE_TCP_H
7 
8 #include <linux/ipv6.h>
9 #include <linux/tcp.h>
10 #include <linux/tracepoint.h>
11 #include <net/ipv6.h>
12 #include <net/tcp.h>
13 #include <linux/sock_diag.h>
14 
15 /*
16  * tcp event with arguments sk and skb
17  *
18  * Note: this class requires a valid sk pointer; while skb pointer could
19  *       be NULL.
20  */
21 DECLARE_EVENT_CLASS(tcp_event_sk_skb,
22 
23 	TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
24 
25 	TP_ARGS(sk, skb),
26 
27 	TP_STRUCT__entry(
28 		__field(const void *, skbaddr)
29 		__field(const void *, skaddr)
30 		__field(int, state)
31 		__field(__u16, sport)
32 		__field(__u16, dport)
33 		__field(__u16, family)
34 		__array(__u8, saddr, 4)
35 		__array(__u8, daddr, 4)
36 		__array(__u8, saddr_v6, 16)
37 		__array(__u8, daddr_v6, 16)
38 	),
39 
40 	TP_fast_assign(
41 		const struct inet_sock *inet = inet_sk(sk);
42 		__be32 *p32;
43 
44 		__entry->skbaddr = skb;
45 		__entry->skaddr = sk;
46 		__entry->state = sk->sk_state;
47 
48 		__entry->sport = ntohs(inet->inet_sport);
49 		__entry->dport = ntohs(inet->inet_dport);
50 		__entry->family = sk->sk_family;
51 
52 		p32 = (__be32 *) __entry->saddr;
53 		*p32 = inet->inet_saddr;
54 
55 		p32 = (__be32 *) __entry->daddr;
56 		*p32 =  inet->inet_daddr;
57 
58 		TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr,
59 			      sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
60 	),
61 
62 	TP_printk("skbaddr=%p skaddr=%p family=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c state=%s",
63 		  __entry->skbaddr, __entry->skaddr,
64 		  show_family_name(__entry->family),
65 		  __entry->sport, __entry->dport, __entry->saddr, __entry->daddr,
66 		  __entry->saddr_v6, __entry->daddr_v6,
67 		  show_tcp_state_name(__entry->state))
68 );
69 
70 DEFINE_EVENT(tcp_event_sk_skb, tcp_retransmit_skb,
71 
72 	TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
73 
74 	TP_ARGS(sk, skb)
75 );
76 
77 /*
78  * skb of trace_tcp_send_reset is the skb that caused RST. In case of
79  * active reset, skb should be NULL
80  */
81 DEFINE_EVENT(tcp_event_sk_skb, tcp_send_reset,
82 
83 	TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
84 
85 	TP_ARGS(sk, skb)
86 );
87 
88 /*
89  * tcp event with arguments sk
90  *
91  * Note: this class requires a valid sk pointer.
92  */
93 DECLARE_EVENT_CLASS(tcp_event_sk,
94 
95 	TP_PROTO(struct sock *sk),
96 
97 	TP_ARGS(sk),
98 
99 	TP_STRUCT__entry(
100 		__field(const void *, skaddr)
101 		__field(__u16, sport)
102 		__field(__u16, dport)
103 		__field(__u16, family)
104 		__array(__u8, saddr, 4)
105 		__array(__u8, daddr, 4)
106 		__array(__u8, saddr_v6, 16)
107 		__array(__u8, daddr_v6, 16)
108 		__field(__u64, sock_cookie)
109 	),
110 
111 	TP_fast_assign(
112 		struct inet_sock *inet = inet_sk(sk);
113 		__be32 *p32;
114 
115 		__entry->skaddr = sk;
116 
117 		__entry->sport = ntohs(inet->inet_sport);
118 		__entry->dport = ntohs(inet->inet_dport);
119 		__entry->family = sk->sk_family;
120 
121 		p32 = (__be32 *) __entry->saddr;
122 		*p32 = inet->inet_saddr;
123 
124 		p32 = (__be32 *) __entry->daddr;
125 		*p32 =  inet->inet_daddr;
126 
127 		TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr,
128 			       sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
129 
130 		__entry->sock_cookie = sock_gen_cookie(sk);
131 	),
132 
133 	TP_printk("family=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c sock_cookie=%llx",
134 		  show_family_name(__entry->family),
135 		  __entry->sport, __entry->dport,
136 		  __entry->saddr, __entry->daddr,
137 		  __entry->saddr_v6, __entry->daddr_v6,
138 		  __entry->sock_cookie)
139 );
140 
141 DEFINE_EVENT(tcp_event_sk, tcp_receive_reset,
142 
143 	TP_PROTO(struct sock *sk),
144 
145 	TP_ARGS(sk)
146 );
147 
148 DEFINE_EVENT(tcp_event_sk, tcp_destroy_sock,
149 
150 	TP_PROTO(struct sock *sk),
151 
152 	TP_ARGS(sk)
153 );
154 
155 DEFINE_EVENT(tcp_event_sk, tcp_rcv_space_adjust,
156 
157 	TP_PROTO(struct sock *sk),
158 
159 	TP_ARGS(sk)
160 );
161 
162 TRACE_EVENT(tcp_retransmit_synack,
163 
164 	TP_PROTO(const struct sock *sk, const struct request_sock *req),
165 
166 	TP_ARGS(sk, req),
167 
168 	TP_STRUCT__entry(
169 		__field(const void *, skaddr)
170 		__field(const void *, req)
171 		__field(__u16, sport)
172 		__field(__u16, dport)
173 		__field(__u16, family)
174 		__array(__u8, saddr, 4)
175 		__array(__u8, daddr, 4)
176 		__array(__u8, saddr_v6, 16)
177 		__array(__u8, daddr_v6, 16)
178 	),
179 
180 	TP_fast_assign(
181 		struct inet_request_sock *ireq = inet_rsk(req);
182 		__be32 *p32;
183 
184 		__entry->skaddr = sk;
185 		__entry->req = req;
186 
187 		__entry->sport = ireq->ir_num;
188 		__entry->dport = ntohs(ireq->ir_rmt_port);
189 		__entry->family = sk->sk_family;
190 
191 		p32 = (__be32 *) __entry->saddr;
192 		*p32 = ireq->ir_loc_addr;
193 
194 		p32 = (__be32 *) __entry->daddr;
195 		*p32 = ireq->ir_rmt_addr;
196 
197 		TP_STORE_ADDRS(__entry, ireq->ir_loc_addr, ireq->ir_rmt_addr,
198 			      ireq->ir_v6_loc_addr, ireq->ir_v6_rmt_addr);
199 	),
200 
201 	TP_printk("family=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c",
202 		  show_family_name(__entry->family),
203 		  __entry->sport, __entry->dport,
204 		  __entry->saddr, __entry->daddr,
205 		  __entry->saddr_v6, __entry->daddr_v6)
206 );
207 
208 #include <trace/events/net_probe_common.h>
209 
210 TRACE_EVENT(tcp_probe,
211 
212 	TP_PROTO(struct sock *sk, struct sk_buff *skb),
213 
214 	TP_ARGS(sk, skb),
215 
216 	TP_STRUCT__entry(
217 		/* sockaddr_in6 is always bigger than sockaddr_in */
218 		__array(__u8, saddr, sizeof(struct sockaddr_in6))
219 		__array(__u8, daddr, sizeof(struct sockaddr_in6))
220 		__field(__u16, sport)
221 		__field(__u16, dport)
222 		__field(__u16, family)
223 		__field(__u32, mark)
224 		__field(__u16, data_len)
225 		__field(__u32, snd_nxt)
226 		__field(__u32, snd_una)
227 		__field(__u32, snd_cwnd)
228 		__field(__u32, ssthresh)
229 		__field(__u32, snd_wnd)
230 		__field(__u32, srtt)
231 		__field(__u32, rcv_wnd)
232 		__field(__u64, sock_cookie)
233 		__field(const void *, skbaddr)
234 		__field(const void *, skaddr)
235 	),
236 
237 	TP_fast_assign(
238 		const struct tcphdr *th = (const struct tcphdr *)skb->data;
239 		const struct inet_sock *inet = inet_sk(sk);
240 		const struct tcp_sock *tp = tcp_sk(sk);
241 
242 		memset(__entry->saddr, 0, sizeof(struct sockaddr_in6));
243 		memset(__entry->daddr, 0, sizeof(struct sockaddr_in6));
244 
245 		TP_STORE_ADDR_PORTS(__entry, inet, sk);
246 
247 		/* For filtering use */
248 		__entry->sport = ntohs(inet->inet_sport);
249 		__entry->dport = ntohs(inet->inet_dport);
250 		__entry->mark = skb->mark;
251 		__entry->family = sk->sk_family;
252 
253 		__entry->data_len = skb->len - __tcp_hdrlen(th);
254 		__entry->snd_nxt = tp->snd_nxt;
255 		__entry->snd_una = tp->snd_una;
256 		__entry->snd_cwnd = tcp_snd_cwnd(tp);
257 		__entry->snd_wnd = tp->snd_wnd;
258 		__entry->rcv_wnd = tp->rcv_wnd;
259 		__entry->ssthresh = tcp_current_ssthresh(sk);
260 		__entry->srtt = tp->srtt_us >> 3;
261 		__entry->sock_cookie = sock_gen_cookie(sk);
262 
263 		__entry->skbaddr = skb;
264 		__entry->skaddr = sk;
265 	),
266 
267 	TP_printk("family=%s src=%pISpc dest=%pISpc mark=%#x data_len=%d snd_nxt=%#x snd_una=%#x snd_cwnd=%u ssthresh=%u snd_wnd=%u srtt=%u rcv_wnd=%u sock_cookie=%llx skbaddr=%p skaddr=%p",
268 		  show_family_name(__entry->family),
269 		  __entry->saddr, __entry->daddr, __entry->mark,
270 		  __entry->data_len, __entry->snd_nxt, __entry->snd_una,
271 		  __entry->snd_cwnd, __entry->ssthresh, __entry->snd_wnd,
272 		  __entry->srtt, __entry->rcv_wnd, __entry->sock_cookie,
273 		  __entry->skbaddr, __entry->skaddr)
274 );
275 
276 #define TP_STORE_ADDR_PORTS_SKB_V4(__entry, skb)			\
277 	do {								\
278 		const struct tcphdr *th = (const struct tcphdr *)skb->data; \
279 		struct sockaddr_in *v4 = (void *)__entry->saddr;	\
280 									\
281 		v4->sin_family = AF_INET;				\
282 		v4->sin_port = th->source;				\
283 		v4->sin_addr.s_addr = ip_hdr(skb)->saddr;		\
284 		v4 = (void *)__entry->daddr;				\
285 		v4->sin_family = AF_INET;				\
286 		v4->sin_port = th->dest;				\
287 		v4->sin_addr.s_addr = ip_hdr(skb)->daddr;		\
288 	} while (0)
289 
290 #if IS_ENABLED(CONFIG_IPV6)
291 
292 #define TP_STORE_ADDR_PORTS_SKB(__entry, skb)				\
293 	do {								\
294 		const struct iphdr *iph = ip_hdr(skb);			\
295 									\
296 		if (iph->version == 6) {				\
297 			const struct tcphdr *th = (const struct tcphdr *)skb->data; \
298 			struct sockaddr_in6 *v6 = (void *)__entry->saddr; \
299 									\
300 			v6->sin6_family = AF_INET6;			\
301 			v6->sin6_port = th->source;			\
302 			v6->sin6_addr = ipv6_hdr(skb)->saddr;		\
303 			v6 = (void *)__entry->daddr;			\
304 			v6->sin6_family = AF_INET6;			\
305 			v6->sin6_port = th->dest;			\
306 			v6->sin6_addr = ipv6_hdr(skb)->daddr;		\
307 		} else							\
308 			TP_STORE_ADDR_PORTS_SKB_V4(__entry, skb);	\
309 	} while (0)
310 
311 #else
312 
313 #define TP_STORE_ADDR_PORTS_SKB(__entry, skb)		\
314 	TP_STORE_ADDR_PORTS_SKB_V4(__entry, skb)
315 
316 #endif
317 
318 /*
319  * tcp event with only skb
320  */
321 DECLARE_EVENT_CLASS(tcp_event_skb,
322 
323 	TP_PROTO(const struct sk_buff *skb),
324 
325 	TP_ARGS(skb),
326 
327 	TP_STRUCT__entry(
328 		__field(const void *, skbaddr)
329 		__array(__u8, saddr, sizeof(struct sockaddr_in6))
330 		__array(__u8, daddr, sizeof(struct sockaddr_in6))
331 	),
332 
333 	TP_fast_assign(
334 		__entry->skbaddr = skb;
335 
336 		memset(__entry->saddr, 0, sizeof(struct sockaddr_in6));
337 		memset(__entry->daddr, 0, sizeof(struct sockaddr_in6));
338 
339 		TP_STORE_ADDR_PORTS_SKB(__entry, skb);
340 	),
341 
342 	TP_printk("skbaddr=%p src=%pISpc dest=%pISpc",
343 		  __entry->skbaddr, __entry->saddr, __entry->daddr)
344 );
345 
346 DEFINE_EVENT(tcp_event_skb, tcp_bad_csum,
347 
348 	TP_PROTO(const struct sk_buff *skb),
349 
350 	TP_ARGS(skb)
351 );
352 
353 TRACE_EVENT(tcp_cong_state_set,
354 
355 	TP_PROTO(struct sock *sk, const u8 ca_state),
356 
357 	TP_ARGS(sk, ca_state),
358 
359 	TP_STRUCT__entry(
360 		__field(const void *, skaddr)
361 		__field(__u16, sport)
362 		__field(__u16, dport)
363 		__field(__u16, family)
364 		__array(__u8, saddr, 4)
365 		__array(__u8, daddr, 4)
366 		__array(__u8, saddr_v6, 16)
367 		__array(__u8, daddr_v6, 16)
368 		__field(__u8, cong_state)
369 	),
370 
371 	TP_fast_assign(
372 		struct inet_sock *inet = inet_sk(sk);
373 		__be32 *p32;
374 
375 		__entry->skaddr = sk;
376 
377 		__entry->sport = ntohs(inet->inet_sport);
378 		__entry->dport = ntohs(inet->inet_dport);
379 		__entry->family = sk->sk_family;
380 
381 		p32 = (__be32 *) __entry->saddr;
382 		*p32 = inet->inet_saddr;
383 
384 		p32 = (__be32 *) __entry->daddr;
385 		*p32 =  inet->inet_daddr;
386 
387 		TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr,
388 			   sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
389 
390 		__entry->cong_state = ca_state;
391 	),
392 
393 	TP_printk("family=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c cong_state=%u",
394 		  show_family_name(__entry->family),
395 		  __entry->sport, __entry->dport,
396 		  __entry->saddr, __entry->daddr,
397 		  __entry->saddr_v6, __entry->daddr_v6,
398 		  __entry->cong_state)
399 );
400 
401 #endif /* _TRACE_TCP_H */
402 
403 /* This part must be outside protection */
404 #include <trace/define_trace.h>
405