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