xref: /openbmc/linux/include/trace/events/tcp.h (revision 2d68c074)
1c3fde1bdSMasami Hiramatsu /* SPDX-License-Identifier: GPL-2.0 */
2e086101bSCong Wang #undef TRACE_SYSTEM
3e086101bSCong Wang #define TRACE_SYSTEM tcp
4e086101bSCong Wang 
5e086101bSCong Wang #if !defined(_TRACE_TCP_H) || defined(TRACE_HEADER_MULTI_READ)
6e086101bSCong Wang #define _TRACE_TCP_H
7e086101bSCong Wang 
8e086101bSCong Wang #include <linux/ipv6.h>
9e086101bSCong Wang #include <linux/tcp.h>
10e086101bSCong Wang #include <linux/tracepoint.h>
11e086101bSCong Wang #include <net/ipv6.h>
12c3fde1bdSMasami Hiramatsu #include <net/tcp.h>
136163849dSYafang Shao #include <linux/sock_diag.h>
14e086101bSCong Wang 
156a6b0b99SMat Martineau #define TP_STORE_V4MAPPED(__entry, saddr, daddr)		\
166a6b0b99SMat Martineau 	do {							\
176a6b0b99SMat Martineau 		struct in6_addr *pin6;				\
186a6b0b99SMat Martineau 								\
196a6b0b99SMat Martineau 		pin6 = (struct in6_addr *)__entry->saddr_v6;	\
206a6b0b99SMat Martineau 		ipv6_addr_set_v4mapped(saddr, pin6);		\
216a6b0b99SMat Martineau 		pin6 = (struct in6_addr *)__entry->daddr_v6;	\
226a6b0b99SMat Martineau 		ipv6_addr_set_v4mapped(daddr, pin6);		\
236a6b0b99SMat Martineau 	} while (0)
246a6b0b99SMat Martineau 
256a6b0b99SMat Martineau #if IS_ENABLED(CONFIG_IPV6)
266a6b0b99SMat Martineau #define TP_STORE_ADDRS(__entry, saddr, daddr, saddr6, daddr6)		\
276a6b0b99SMat Martineau 	do {								\
286a6b0b99SMat Martineau 		if (sk->sk_family == AF_INET6) {			\
296a6b0b99SMat Martineau 			struct in6_addr *pin6;				\
306a6b0b99SMat Martineau 									\
316a6b0b99SMat Martineau 			pin6 = (struct in6_addr *)__entry->saddr_v6;	\
326a6b0b99SMat Martineau 			*pin6 = saddr6;					\
336a6b0b99SMat Martineau 			pin6 = (struct in6_addr *)__entry->daddr_v6;	\
346a6b0b99SMat Martineau 			*pin6 = daddr6;					\
356a6b0b99SMat Martineau 		} else {						\
366a6b0b99SMat Martineau 			TP_STORE_V4MAPPED(__entry, saddr, daddr);	\
376a6b0b99SMat Martineau 		}							\
386a6b0b99SMat Martineau 	} while (0)
396a6b0b99SMat Martineau #else
406a6b0b99SMat Martineau #define TP_STORE_ADDRS(__entry, saddr, daddr, saddr6, daddr6)	\
416a6b0b99SMat Martineau 	TP_STORE_V4MAPPED(__entry, saddr, daddr)
426a6b0b99SMat Martineau #endif
436a6b0b99SMat Martineau 
44f6e37b25SSong Liu /*
45f6e37b25SSong Liu  * tcp event with arguments sk and skb
46f6e37b25SSong Liu  *
47f6e37b25SSong Liu  * Note: this class requires a valid sk pointer; while skb pointer could
48f6e37b25SSong Liu  *       be NULL.
49f6e37b25SSong Liu  */
50f6e37b25SSong Liu DECLARE_EVENT_CLASS(tcp_event_sk_skb,
51e086101bSCong Wang 
527344e29fSSong Liu 	TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
53e086101bSCong Wang 
54e086101bSCong Wang 	TP_ARGS(sk, skb),
55e086101bSCong Wang 
56e086101bSCong Wang 	TP_STRUCT__entry(
577344e29fSSong Liu 		__field(const void *, skbaddr)
587344e29fSSong Liu 		__field(const void *, skaddr)
59e086101bSCong Wang 		__field(__u16, sport)
60e086101bSCong Wang 		__field(__u16, dport)
61e086101bSCong Wang 		__array(__u8, saddr, 4)
62e086101bSCong Wang 		__array(__u8, daddr, 4)
63e086101bSCong Wang 		__array(__u8, saddr_v6, 16)
64e086101bSCong Wang 		__array(__u8, daddr_v6, 16)
65e086101bSCong Wang 	),
66e086101bSCong Wang 
67e086101bSCong Wang 	TP_fast_assign(
68e086101bSCong Wang 		struct inet_sock *inet = inet_sk(sk);
69e086101bSCong Wang 		__be32 *p32;
70e086101bSCong Wang 
71e086101bSCong Wang 		__entry->skbaddr = skb;
72e086101bSCong Wang 		__entry->skaddr = sk;
73e086101bSCong Wang 
74e086101bSCong Wang 		__entry->sport = ntohs(inet->inet_sport);
75e086101bSCong Wang 		__entry->dport = ntohs(inet->inet_dport);
76e086101bSCong Wang 
77e086101bSCong Wang 		p32 = (__be32 *) __entry->saddr;
78e086101bSCong Wang 		*p32 = inet->inet_saddr;
79e086101bSCong Wang 
80e086101bSCong Wang 		p32 = (__be32 *) __entry->daddr;
81e086101bSCong Wang 		*p32 =  inet->inet_daddr;
82e086101bSCong Wang 
836a6b0b99SMat Martineau 		TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr,
846a6b0b99SMat Martineau 			      sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
85e086101bSCong Wang 	),
86e086101bSCong Wang 
87fb6ff75eSDavid Ahern 	TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c",
88e086101bSCong Wang 		  __entry->sport, __entry->dport, __entry->saddr, __entry->daddr,
89e086101bSCong Wang 		  __entry->saddr_v6, __entry->daddr_v6)
90e086101bSCong Wang );
91e086101bSCong Wang 
92f6e37b25SSong Liu DEFINE_EVENT(tcp_event_sk_skb, tcp_retransmit_skb,
93f6e37b25SSong Liu 
947344e29fSSong Liu 	TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
95f6e37b25SSong Liu 
96f6e37b25SSong Liu 	TP_ARGS(sk, skb)
97f6e37b25SSong Liu );
98f6e37b25SSong Liu 
99c24b14c4SSong Liu /*
100c24b14c4SSong Liu  * skb of trace_tcp_send_reset is the skb that caused RST. In case of
101c24b14c4SSong Liu  * active reset, skb should be NULL
102c24b14c4SSong Liu  */
103c24b14c4SSong Liu DEFINE_EVENT(tcp_event_sk_skb, tcp_send_reset,
104c24b14c4SSong Liu 
105c24b14c4SSong Liu 	TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
106c24b14c4SSong Liu 
107c24b14c4SSong Liu 	TP_ARGS(sk, skb)
108c24b14c4SSong Liu );
109c24b14c4SSong Liu 
1105941521cSSong Liu /*
1115941521cSSong Liu  * tcp event with arguments sk
1125941521cSSong Liu  *
1135941521cSSong Liu  * Note: this class requires a valid sk pointer.
1145941521cSSong Liu  */
1155941521cSSong Liu DECLARE_EVENT_CLASS(tcp_event_sk,
1165941521cSSong Liu 
1176163849dSYafang Shao 	TP_PROTO(struct sock *sk),
1185941521cSSong Liu 
1195941521cSSong Liu 	TP_ARGS(sk),
1205941521cSSong Liu 
1215941521cSSong Liu 	TP_STRUCT__entry(
1225941521cSSong Liu 		__field(const void *, skaddr)
1235941521cSSong Liu 		__field(__u16, sport)
1245941521cSSong Liu 		__field(__u16, dport)
1255941521cSSong Liu 		__array(__u8, saddr, 4)
1265941521cSSong Liu 		__array(__u8, daddr, 4)
1275941521cSSong Liu 		__array(__u8, saddr_v6, 16)
1285941521cSSong Liu 		__array(__u8, daddr_v6, 16)
1296163849dSYafang Shao 		__field(__u64, sock_cookie)
1305941521cSSong Liu 	),
1315941521cSSong Liu 
1325941521cSSong Liu 	TP_fast_assign(
1335941521cSSong Liu 		struct inet_sock *inet = inet_sk(sk);
1345941521cSSong Liu 		__be32 *p32;
1355941521cSSong Liu 
1365941521cSSong Liu 		__entry->skaddr = sk;
1375941521cSSong Liu 
1385941521cSSong Liu 		__entry->sport = ntohs(inet->inet_sport);
1395941521cSSong Liu 		__entry->dport = ntohs(inet->inet_dport);
1405941521cSSong Liu 
1415941521cSSong Liu 		p32 = (__be32 *) __entry->saddr;
1425941521cSSong Liu 		*p32 = inet->inet_saddr;
1435941521cSSong Liu 
1445941521cSSong Liu 		p32 = (__be32 *) __entry->daddr;
1455941521cSSong Liu 		*p32 =  inet->inet_daddr;
1465941521cSSong Liu 
1476a6b0b99SMat Martineau 		TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr,
1486a6b0b99SMat Martineau 			       sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
1496163849dSYafang Shao 
1506163849dSYafang Shao 		__entry->sock_cookie = sock_gen_cookie(sk);
1515941521cSSong Liu 	),
1525941521cSSong Liu 
1536163849dSYafang Shao 	TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c sock_cookie=%llx",
1545941521cSSong Liu 		  __entry->sport, __entry->dport,
1555941521cSSong Liu 		  __entry->saddr, __entry->daddr,
1566163849dSYafang Shao 		  __entry->saddr_v6, __entry->daddr_v6,
1576163849dSYafang Shao 		  __entry->sock_cookie)
1585941521cSSong Liu );
1595941521cSSong Liu 
1605941521cSSong Liu DEFINE_EVENT(tcp_event_sk, tcp_receive_reset,
1615941521cSSong Liu 
1626163849dSYafang Shao 	TP_PROTO(struct sock *sk),
1635941521cSSong Liu 
1645941521cSSong Liu 	TP_ARGS(sk)
1655941521cSSong Liu );
1665941521cSSong Liu 
167e1a4aa50SSong Liu DEFINE_EVENT(tcp_event_sk, tcp_destroy_sock,
168e1a4aa50SSong Liu 
1696163849dSYafang Shao 	TP_PROTO(struct sock *sk),
1706163849dSYafang Shao 
1716163849dSYafang Shao 	TP_ARGS(sk)
1726163849dSYafang Shao );
1736163849dSYafang Shao 
1746163849dSYafang Shao DEFINE_EVENT(tcp_event_sk, tcp_rcv_space_adjust,
1756163849dSYafang Shao 
1766163849dSYafang Shao 	TP_PROTO(struct sock *sk),
177e1a4aa50SSong Liu 
178e1a4aa50SSong Liu 	TP_ARGS(sk)
179e1a4aa50SSong Liu );
180e1a4aa50SSong Liu 
181cf34ce3dSSong Liu TRACE_EVENT(tcp_retransmit_synack,
182cf34ce3dSSong Liu 
183cf34ce3dSSong Liu 	TP_PROTO(const struct sock *sk, const struct request_sock *req),
184cf34ce3dSSong Liu 
185cf34ce3dSSong Liu 	TP_ARGS(sk, req),
186cf34ce3dSSong Liu 
187cf34ce3dSSong Liu 	TP_STRUCT__entry(
188cf34ce3dSSong Liu 		__field(const void *, skaddr)
189cf34ce3dSSong Liu 		__field(const void *, req)
190cf34ce3dSSong Liu 		__field(__u16, sport)
191cf34ce3dSSong Liu 		__field(__u16, dport)
192cf34ce3dSSong Liu 		__array(__u8, saddr, 4)
193cf34ce3dSSong Liu 		__array(__u8, daddr, 4)
194cf34ce3dSSong Liu 		__array(__u8, saddr_v6, 16)
195cf34ce3dSSong Liu 		__array(__u8, daddr_v6, 16)
196cf34ce3dSSong Liu 	),
197cf34ce3dSSong Liu 
198cf34ce3dSSong Liu 	TP_fast_assign(
199cf34ce3dSSong Liu 		struct inet_request_sock *ireq = inet_rsk(req);
200cf34ce3dSSong Liu 		__be32 *p32;
201cf34ce3dSSong Liu 
202cf34ce3dSSong Liu 		__entry->skaddr = sk;
203cf34ce3dSSong Liu 		__entry->req = req;
204cf34ce3dSSong Liu 
205cf34ce3dSSong Liu 		__entry->sport = ireq->ir_num;
206cf34ce3dSSong Liu 		__entry->dport = ntohs(ireq->ir_rmt_port);
207cf34ce3dSSong Liu 
208cf34ce3dSSong Liu 		p32 = (__be32 *) __entry->saddr;
209cf34ce3dSSong Liu 		*p32 = ireq->ir_loc_addr;
210cf34ce3dSSong Liu 
211cf34ce3dSSong Liu 		p32 = (__be32 *) __entry->daddr;
212cf34ce3dSSong Liu 		*p32 = ireq->ir_rmt_addr;
213cf34ce3dSSong Liu 
2146a6b0b99SMat Martineau 		TP_STORE_ADDRS(__entry, ireq->ir_loc_addr, ireq->ir_rmt_addr,
2156a6b0b99SMat Martineau 			      ireq->ir_v6_loc_addr, ireq->ir_v6_rmt_addr);
216cf34ce3dSSong Liu 	),
217cf34ce3dSSong Liu 
218cf34ce3dSSong Liu 	TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c",
219cf34ce3dSSong Liu 		  __entry->sport, __entry->dport,
220cf34ce3dSSong Liu 		  __entry->saddr, __entry->daddr,
221cf34ce3dSSong Liu 		  __entry->saddr_v6, __entry->daddr_v6)
222cf34ce3dSSong Liu );
223cf34ce3dSSong Liu 
224ee549be6SMasami Hiramatsu #include <trace/events/net_probe_common.h>
225c3fde1bdSMasami Hiramatsu 
226c3fde1bdSMasami Hiramatsu TRACE_EVENT(tcp_probe,
227c3fde1bdSMasami Hiramatsu 
228c3fde1bdSMasami Hiramatsu 	TP_PROTO(struct sock *sk, struct sk_buff *skb),
229c3fde1bdSMasami Hiramatsu 
230c3fde1bdSMasami Hiramatsu 	TP_ARGS(sk, skb),
231c3fde1bdSMasami Hiramatsu 
232c3fde1bdSMasami Hiramatsu 	TP_STRUCT__entry(
233c3fde1bdSMasami Hiramatsu 		/* sockaddr_in6 is always bigger than sockaddr_in */
234c3fde1bdSMasami Hiramatsu 		__array(__u8, saddr, sizeof(struct sockaddr_in6))
235c3fde1bdSMasami Hiramatsu 		__array(__u8, daddr, sizeof(struct sockaddr_in6))
236c3fde1bdSMasami Hiramatsu 		__field(__u16, sport)
237c3fde1bdSMasami Hiramatsu 		__field(__u16, dport)
238c3fde1bdSMasami Hiramatsu 		__field(__u32, mark)
2392d68c074SYafang Shao 		__field(__u16, data_len)
240c3fde1bdSMasami Hiramatsu 		__field(__u32, snd_nxt)
241c3fde1bdSMasami Hiramatsu 		__field(__u32, snd_una)
242c3fde1bdSMasami Hiramatsu 		__field(__u32, snd_cwnd)
243c3fde1bdSMasami Hiramatsu 		__field(__u32, ssthresh)
244c3fde1bdSMasami Hiramatsu 		__field(__u32, snd_wnd)
245c3fde1bdSMasami Hiramatsu 		__field(__u32, srtt)
246c3fde1bdSMasami Hiramatsu 		__field(__u32, rcv_wnd)
2476163849dSYafang Shao 		__field(__u64, sock_cookie)
248c3fde1bdSMasami Hiramatsu 	),
249c3fde1bdSMasami Hiramatsu 
250c3fde1bdSMasami Hiramatsu 	TP_fast_assign(
251c3fde1bdSMasami Hiramatsu 		const struct tcp_sock *tp = tcp_sk(sk);
252c3fde1bdSMasami Hiramatsu 		const struct inet_sock *inet = inet_sk(sk);
253c3fde1bdSMasami Hiramatsu 
254c3fde1bdSMasami Hiramatsu 		memset(__entry->saddr, 0, sizeof(struct sockaddr_in6));
255c3fde1bdSMasami Hiramatsu 		memset(__entry->daddr, 0, sizeof(struct sockaddr_in6));
256c3fde1bdSMasami Hiramatsu 
257c3fde1bdSMasami Hiramatsu 		TP_STORE_ADDR_PORTS(__entry, inet, sk);
258c3fde1bdSMasami Hiramatsu 
259c3fde1bdSMasami Hiramatsu 		/* For filtering use */
260c3fde1bdSMasami Hiramatsu 		__entry->sport = ntohs(inet->inet_sport);
261c3fde1bdSMasami Hiramatsu 		__entry->dport = ntohs(inet->inet_dport);
262c3fde1bdSMasami Hiramatsu 		__entry->mark = skb->mark;
263c3fde1bdSMasami Hiramatsu 
2642d68c074SYafang Shao 		__entry->data_len = skb->len - tcp_hdrlen(skb);
265c3fde1bdSMasami Hiramatsu 		__entry->snd_nxt = tp->snd_nxt;
266c3fde1bdSMasami Hiramatsu 		__entry->snd_una = tp->snd_una;
267c3fde1bdSMasami Hiramatsu 		__entry->snd_cwnd = tp->snd_cwnd;
268c3fde1bdSMasami Hiramatsu 		__entry->snd_wnd = tp->snd_wnd;
269c3fde1bdSMasami Hiramatsu 		__entry->rcv_wnd = tp->rcv_wnd;
270c3fde1bdSMasami Hiramatsu 		__entry->ssthresh = tcp_current_ssthresh(sk);
271c3fde1bdSMasami Hiramatsu 		__entry->srtt = tp->srtt_us >> 3;
2726163849dSYafang Shao 		__entry->sock_cookie = sock_gen_cookie(sk);
273c3fde1bdSMasami Hiramatsu 	),
274c3fde1bdSMasami Hiramatsu 
2752d68c074SYafang Shao 	TP_printk("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",
276c3fde1bdSMasami Hiramatsu 		  __entry->saddr, __entry->daddr, __entry->mark,
2772d68c074SYafang Shao 		  __entry->data_len, __entry->snd_nxt, __entry->snd_una,
278c3fde1bdSMasami Hiramatsu 		  __entry->snd_cwnd, __entry->ssthresh, __entry->snd_wnd,
2796163849dSYafang Shao 		  __entry->srtt, __entry->rcv_wnd, __entry->sock_cookie)
280c3fde1bdSMasami Hiramatsu );
281c3fde1bdSMasami Hiramatsu 
282e086101bSCong Wang #endif /* _TRACE_TCP_H */
283e086101bSCong Wang 
284e086101bSCong Wang /* This part must be outside protection */
285e086101bSCong Wang #include <trace/define_trace.h>
286