xref: /openbmc/linux/include/trace/events/tcp.h (revision c127f98ba9aba1818a6ca3a1da5a24653a10d966)
1 #undef TRACE_SYSTEM
2 #define TRACE_SYSTEM tcp
3 
4 #if !defined(_TRACE_TCP_H) || defined(TRACE_HEADER_MULTI_READ)
5 #define _TRACE_TCP_H
6 
7 #include <linux/ipv6.h>
8 #include <linux/tcp.h>
9 #include <linux/tracepoint.h>
10 #include <net/ipv6.h>
11 
12 #define tcp_state_name(state)	{ state, #state }
13 #define show_tcp_state_name(val)			\
14 	__print_symbolic(val,				\
15 		tcp_state_name(TCP_ESTABLISHED),	\
16 		tcp_state_name(TCP_SYN_SENT),		\
17 		tcp_state_name(TCP_SYN_RECV),		\
18 		tcp_state_name(TCP_FIN_WAIT1),		\
19 		tcp_state_name(TCP_FIN_WAIT2),		\
20 		tcp_state_name(TCP_TIME_WAIT),		\
21 		tcp_state_name(TCP_CLOSE),		\
22 		tcp_state_name(TCP_CLOSE_WAIT),		\
23 		tcp_state_name(TCP_LAST_ACK),		\
24 		tcp_state_name(TCP_LISTEN),		\
25 		tcp_state_name(TCP_CLOSING),		\
26 		tcp_state_name(TCP_NEW_SYN_RECV))
27 
28 #define TP_STORE_V4MAPPED(__entry, saddr, daddr)		\
29 	do {							\
30 		struct in6_addr *pin6;				\
31 								\
32 		pin6 = (struct in6_addr *)__entry->saddr_v6;	\
33 		ipv6_addr_set_v4mapped(saddr, pin6);		\
34 		pin6 = (struct in6_addr *)__entry->daddr_v6;	\
35 		ipv6_addr_set_v4mapped(daddr, pin6);		\
36 	} while (0)
37 
38 #if IS_ENABLED(CONFIG_IPV6)
39 #define TP_STORE_ADDRS(__entry, saddr, daddr, saddr6, daddr6)		\
40 	do {								\
41 		if (sk->sk_family == AF_INET6) {			\
42 			struct in6_addr *pin6;				\
43 									\
44 			pin6 = (struct in6_addr *)__entry->saddr_v6;	\
45 			*pin6 = saddr6;					\
46 			pin6 = (struct in6_addr *)__entry->daddr_v6;	\
47 			*pin6 = daddr6;					\
48 		} else {						\
49 			TP_STORE_V4MAPPED(__entry, saddr, daddr);	\
50 		}							\
51 	} while (0)
52 #else
53 #define TP_STORE_ADDRS(__entry, saddr, daddr, saddr6, daddr6)	\
54 	TP_STORE_V4MAPPED(__entry, saddr, daddr)
55 #endif
56 
57 /*
58  * tcp event with arguments sk and skb
59  *
60  * Note: this class requires a valid sk pointer; while skb pointer could
61  *       be NULL.
62  */
63 DECLARE_EVENT_CLASS(tcp_event_sk_skb,
64 
65 	TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
66 
67 	TP_ARGS(sk, skb),
68 
69 	TP_STRUCT__entry(
70 		__field(const void *, skbaddr)
71 		__field(const void *, skaddr)
72 		__field(__u16, sport)
73 		__field(__u16, dport)
74 		__array(__u8, saddr, 4)
75 		__array(__u8, daddr, 4)
76 		__array(__u8, saddr_v6, 16)
77 		__array(__u8, daddr_v6, 16)
78 	),
79 
80 	TP_fast_assign(
81 		struct inet_sock *inet = inet_sk(sk);
82 		__be32 *p32;
83 
84 		__entry->skbaddr = skb;
85 		__entry->skaddr = sk;
86 
87 		__entry->sport = ntohs(inet->inet_sport);
88 		__entry->dport = ntohs(inet->inet_dport);
89 
90 		p32 = (__be32 *) __entry->saddr;
91 		*p32 = inet->inet_saddr;
92 
93 		p32 = (__be32 *) __entry->daddr;
94 		*p32 =  inet->inet_daddr;
95 
96 		TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr,
97 			      sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
98 	),
99 
100 	TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c",
101 		  __entry->sport, __entry->dport, __entry->saddr, __entry->daddr,
102 		  __entry->saddr_v6, __entry->daddr_v6)
103 );
104 
105 DEFINE_EVENT(tcp_event_sk_skb, tcp_retransmit_skb,
106 
107 	TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
108 
109 	TP_ARGS(sk, skb)
110 );
111 
112 /*
113  * skb of trace_tcp_send_reset is the skb that caused RST. In case of
114  * active reset, skb should be NULL
115  */
116 DEFINE_EVENT(tcp_event_sk_skb, tcp_send_reset,
117 
118 	TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
119 
120 	TP_ARGS(sk, skb)
121 );
122 
123 /*
124  * tcp event with arguments sk
125  *
126  * Note: this class requires a valid sk pointer.
127  */
128 DECLARE_EVENT_CLASS(tcp_event_sk,
129 
130 	TP_PROTO(const struct sock *sk),
131 
132 	TP_ARGS(sk),
133 
134 	TP_STRUCT__entry(
135 		__field(const void *, skaddr)
136 		__field(__u16, sport)
137 		__field(__u16, dport)
138 		__array(__u8, saddr, 4)
139 		__array(__u8, daddr, 4)
140 		__array(__u8, saddr_v6, 16)
141 		__array(__u8, daddr_v6, 16)
142 	),
143 
144 	TP_fast_assign(
145 		struct inet_sock *inet = inet_sk(sk);
146 		__be32 *p32;
147 
148 		__entry->skaddr = sk;
149 
150 		__entry->sport = ntohs(inet->inet_sport);
151 		__entry->dport = ntohs(inet->inet_dport);
152 
153 		p32 = (__be32 *) __entry->saddr;
154 		*p32 = inet->inet_saddr;
155 
156 		p32 = (__be32 *) __entry->daddr;
157 		*p32 =  inet->inet_daddr;
158 
159 		TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr,
160 			       sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
161 	),
162 
163 	TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c",
164 		  __entry->sport, __entry->dport,
165 		  __entry->saddr, __entry->daddr,
166 		  __entry->saddr_v6, __entry->daddr_v6)
167 );
168 
169 DEFINE_EVENT(tcp_event_sk, tcp_receive_reset,
170 
171 	TP_PROTO(const struct sock *sk),
172 
173 	TP_ARGS(sk)
174 );
175 
176 DEFINE_EVENT(tcp_event_sk, tcp_destroy_sock,
177 
178 	TP_PROTO(const struct sock *sk),
179 
180 	TP_ARGS(sk)
181 );
182 
183 TRACE_EVENT(tcp_set_state,
184 
185 	TP_PROTO(const struct sock *sk, const int oldstate, const int newstate),
186 
187 	TP_ARGS(sk, oldstate, newstate),
188 
189 	TP_STRUCT__entry(
190 		__field(const void *, skaddr)
191 		__field(int, oldstate)
192 		__field(int, newstate)
193 		__field(__u16, sport)
194 		__field(__u16, dport)
195 		__array(__u8, saddr, 4)
196 		__array(__u8, daddr, 4)
197 		__array(__u8, saddr_v6, 16)
198 		__array(__u8, daddr_v6, 16)
199 	),
200 
201 	TP_fast_assign(
202 		struct inet_sock *inet = inet_sk(sk);
203 		__be32 *p32;
204 
205 		__entry->skaddr = sk;
206 		__entry->oldstate = oldstate;
207 		__entry->newstate = newstate;
208 
209 		__entry->sport = ntohs(inet->inet_sport);
210 		__entry->dport = ntohs(inet->inet_dport);
211 
212 		p32 = (__be32 *) __entry->saddr;
213 		*p32 = inet->inet_saddr;
214 
215 		p32 = (__be32 *) __entry->daddr;
216 		*p32 =  inet->inet_daddr;
217 
218 		TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr,
219 			       sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
220 	),
221 
222 	TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c oldstate=%s newstate=%s",
223 		  __entry->sport, __entry->dport,
224 		  __entry->saddr, __entry->daddr,
225 		  __entry->saddr_v6, __entry->daddr_v6,
226 		  show_tcp_state_name(__entry->oldstate),
227 		  show_tcp_state_name(__entry->newstate))
228 );
229 
230 TRACE_EVENT(tcp_retransmit_synack,
231 
232 	TP_PROTO(const struct sock *sk, const struct request_sock *req),
233 
234 	TP_ARGS(sk, req),
235 
236 	TP_STRUCT__entry(
237 		__field(const void *, skaddr)
238 		__field(const void *, req)
239 		__field(__u16, sport)
240 		__field(__u16, dport)
241 		__array(__u8, saddr, 4)
242 		__array(__u8, daddr, 4)
243 		__array(__u8, saddr_v6, 16)
244 		__array(__u8, daddr_v6, 16)
245 	),
246 
247 	TP_fast_assign(
248 		struct inet_request_sock *ireq = inet_rsk(req);
249 		__be32 *p32;
250 
251 		__entry->skaddr = sk;
252 		__entry->req = req;
253 
254 		__entry->sport = ireq->ir_num;
255 		__entry->dport = ntohs(ireq->ir_rmt_port);
256 
257 		p32 = (__be32 *) __entry->saddr;
258 		*p32 = ireq->ir_loc_addr;
259 
260 		p32 = (__be32 *) __entry->daddr;
261 		*p32 = ireq->ir_rmt_addr;
262 
263 		TP_STORE_ADDRS(__entry, ireq->ir_loc_addr, ireq->ir_rmt_addr,
264 			      ireq->ir_v6_loc_addr, ireq->ir_v6_rmt_addr);
265 	),
266 
267 	TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c",
268 		  __entry->sport, __entry->dport,
269 		  __entry->saddr, __entry->daddr,
270 		  __entry->saddr_v6, __entry->daddr_v6)
271 );
272 
273 #endif /* _TRACE_TCP_H */
274 
275 /* This part must be outside protection */
276 #include <trace/define_trace.h>
277