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