]>
Commit | Line | Data |
---|---|---|
e086101b CW |
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 | ||
e8fce239 SL |
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 | ||
6a6b0b99 MM |
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 | ||
f6e37b25 SL |
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, | |
e086101b | 64 | |
7344e29f | 65 | TP_PROTO(const struct sock *sk, const struct sk_buff *skb), |
e086101b CW |
66 | |
67 | TP_ARGS(sk, skb), | |
68 | ||
69 | TP_STRUCT__entry( | |
7344e29f SL |
70 | __field(const void *, skbaddr) |
71 | __field(const void *, skaddr) | |
e086101b CW |
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( | |
e086101b | 81 | struct inet_sock *inet = inet_sk(sk); |
e086101b CW |
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 | ||
6a6b0b99 MM |
96 | TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr, |
97 | sk->sk_v6_rcv_saddr, sk->sk_v6_daddr); | |
e086101b CW |
98 | ), |
99 | ||
fb6ff75e | 100 | TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c", |
e086101b CW |
101 | __entry->sport, __entry->dport, __entry->saddr, __entry->daddr, |
102 | __entry->saddr_v6, __entry->daddr_v6) | |
103 | ); | |
104 | ||
f6e37b25 SL |
105 | DEFINE_EVENT(tcp_event_sk_skb, tcp_retransmit_skb, |
106 | ||
7344e29f | 107 | TP_PROTO(const struct sock *sk, const struct sk_buff *skb), |
f6e37b25 SL |
108 | |
109 | TP_ARGS(sk, skb) | |
110 | ); | |
111 | ||
c24b14c4 SL |
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 | ||
5941521c SL |
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); | |
5941521c SL |
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 | ||
6a6b0b99 MM |
159 | TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr, |
160 | sk->sk_v6_rcv_saddr, sk->sk_v6_daddr); | |
5941521c SL |
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 | ||
e1a4aa50 SL |
176 | DEFINE_EVENT(tcp_event_sk, tcp_destroy_sock, |
177 | ||
178 | TP_PROTO(const struct sock *sk), | |
179 | ||
180 | TP_ARGS(sk) | |
181 | ); | |
182 | ||
e8fce239 SL |
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); | |
e8fce239 SL |
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 | ||
6a6b0b99 MM |
218 | TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr, |
219 | sk->sk_v6_rcv_saddr, sk->sk_v6_daddr); | |
e8fce239 SL |
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 | ||
cf34ce3d SL |
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); | |
cf34ce3d SL |
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 | ||
6a6b0b99 MM |
263 | TP_STORE_ADDRS(__entry, ireq->ir_loc_addr, ireq->ir_rmt_addr, |
264 | ireq->ir_v6_loc_addr, ireq->ir_v6_rmt_addr); | |
cf34ce3d SL |
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 | ||
e086101b CW |
273 | #endif /* _TRACE_TCP_H */ |
274 | ||
275 | /* This part must be outside protection */ | |
276 | #include <trace/define_trace.h> |