xref: /linux/include/trace/events/tcp.h (revision a37fbe666c016fd89e4460d0ebfcea05baba46dc)
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 /*
277  * tcp event with only skb
278  */
279 DECLARE_EVENT_CLASS(tcp_event_skb,
280 
281 	TP_PROTO(const struct sk_buff *skb),
282 
283 	TP_ARGS(skb),
284 
285 	TP_STRUCT__entry(
286 		__field(const void *, skbaddr)
287 		__array(__u8, saddr, sizeof(struct sockaddr_in6))
288 		__array(__u8, daddr, sizeof(struct sockaddr_in6))
289 	),
290 
291 	TP_fast_assign(
292 		const struct tcphdr *th = (const struct tcphdr *)skb->data;
293 		__entry->skbaddr = skb;
294 
295 		memset(__entry->saddr, 0, sizeof(struct sockaddr_in6));
296 		memset(__entry->daddr, 0, sizeof(struct sockaddr_in6));
297 
298 		TP_STORE_ADDR_PORTS_SKB(__entry, skb, th);
299 	),
300 
301 	TP_printk("skbaddr=%p src=%pISpc dest=%pISpc",
302 		  __entry->skbaddr, __entry->saddr, __entry->daddr)
303 );
304 
305 DEFINE_EVENT(tcp_event_skb, tcp_bad_csum,
306 
307 	TP_PROTO(const struct sk_buff *skb),
308 
309 	TP_ARGS(skb)
310 );
311 
312 TRACE_EVENT(tcp_cong_state_set,
313 
314 	TP_PROTO(struct sock *sk, const u8 ca_state),
315 
316 	TP_ARGS(sk, ca_state),
317 
318 	TP_STRUCT__entry(
319 		__field(const void *, skaddr)
320 		__field(__u16, sport)
321 		__field(__u16, dport)
322 		__field(__u16, family)
323 		__array(__u8, saddr, 4)
324 		__array(__u8, daddr, 4)
325 		__array(__u8, saddr_v6, 16)
326 		__array(__u8, daddr_v6, 16)
327 		__field(__u8, cong_state)
328 	),
329 
330 	TP_fast_assign(
331 		struct inet_sock *inet = inet_sk(sk);
332 		__be32 *p32;
333 
334 		__entry->skaddr = sk;
335 
336 		__entry->sport = ntohs(inet->inet_sport);
337 		__entry->dport = ntohs(inet->inet_dport);
338 		__entry->family = sk->sk_family;
339 
340 		p32 = (__be32 *) __entry->saddr;
341 		*p32 = inet->inet_saddr;
342 
343 		p32 = (__be32 *) __entry->daddr;
344 		*p32 =  inet->inet_daddr;
345 
346 		TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr,
347 			   sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
348 
349 		__entry->cong_state = ca_state;
350 	),
351 
352 	TP_printk("family=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c cong_state=%u",
353 		  show_family_name(__entry->family),
354 		  __entry->sport, __entry->dport,
355 		  __entry->saddr, __entry->daddr,
356 		  __entry->saddr_v6, __entry->daddr_v6,
357 		  __entry->cong_state)
358 );
359 
360 #endif /* _TRACE_TCP_H */
361 
362 /* This part must be outside protection */
363 #include <trace/define_trace.h>
364