2 #define TRACE_SYSTEM tcp
4 #if !defined(_TRACE_TCP_H) || defined(TRACE_HEADER_MULTI_READ)
7 #include <linux/ipv6.h>
9 #include <linux/tracepoint.h>
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))
29 * tcp event with arguments sk and skb
31 * Note: this class requires a valid sk pointer; while skb pointer could
34 DECLARE_EVENT_CLASS(tcp_event_sk_skb,
36 TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
41 __field(const void *, skbaddr)
42 __field(const void *, skaddr)
45 __array(__u8, saddr, 4)
46 __array(__u8, daddr, 4)
47 __array(__u8, saddr_v6, 16)
48 __array(__u8, daddr_v6, 16)
52 struct inet_sock *inet = inet_sk(sk);
53 struct in6_addr *pin6;
56 __entry->skbaddr = skb;
59 __entry->sport = ntohs(inet->inet_sport);
60 __entry->dport = ntohs(inet->inet_dport);
62 p32 = (__be32 *) __entry->saddr;
63 *p32 = inet->inet_saddr;
65 p32 = (__be32 *) __entry->daddr;
66 *p32 = inet->inet_daddr;
68 #if IS_ENABLED(CONFIG_IPV6)
69 if (sk->sk_family == AF_INET6) {
70 pin6 = (struct in6_addr *)__entry->saddr_v6;
71 *pin6 = sk->sk_v6_rcv_saddr;
72 pin6 = (struct in6_addr *)__entry->daddr_v6;
73 *pin6 = sk->sk_v6_daddr;
77 pin6 = (struct in6_addr *)__entry->saddr_v6;
78 ipv6_addr_set_v4mapped(inet->inet_saddr, pin6);
79 pin6 = (struct in6_addr *)__entry->daddr_v6;
80 ipv6_addr_set_v4mapped(inet->inet_daddr, pin6);
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)
89 DEFINE_EVENT(tcp_event_sk_skb, tcp_retransmit_skb,
91 TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
97 * skb of trace_tcp_send_reset is the skb that caused RST. In case of
98 * active reset, skb should be NULL
100 DEFINE_EVENT(tcp_event_sk_skb, tcp_send_reset,
102 TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
108 * tcp event with arguments sk
110 * Note: this class requires a valid sk pointer.
112 DECLARE_EVENT_CLASS(tcp_event_sk,
114 TP_PROTO(const struct sock *sk),
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)
129 struct inet_sock *inet = inet_sk(sk);
130 struct in6_addr *pin6;
133 __entry->skaddr = sk;
135 __entry->sport = ntohs(inet->inet_sport);
136 __entry->dport = ntohs(inet->inet_dport);
138 p32 = (__be32 *) __entry->saddr;
139 *p32 = inet->inet_saddr;
141 p32 = (__be32 *) __entry->daddr;
142 *p32 = inet->inet_daddr;
144 #if IS_ENABLED(CONFIG_IPV6)
145 if (sk->sk_family == AF_INET6) {
146 pin6 = (struct in6_addr *)__entry->saddr_v6;
147 *pin6 = sk->sk_v6_rcv_saddr;
148 pin6 = (struct in6_addr *)__entry->daddr_v6;
149 *pin6 = sk->sk_v6_daddr;
153 pin6 = (struct in6_addr *)__entry->saddr_v6;
154 ipv6_addr_set_v4mapped(inet->inet_saddr, pin6);
155 pin6 = (struct in6_addr *)__entry->daddr_v6;
156 ipv6_addr_set_v4mapped(inet->inet_daddr, pin6);
160 TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c",
161 __entry->sport, __entry->dport,
162 __entry->saddr, __entry->daddr,
163 __entry->saddr_v6, __entry->daddr_v6)
166 DEFINE_EVENT(tcp_event_sk, tcp_receive_reset,
168 TP_PROTO(const struct sock *sk),
173 DEFINE_EVENT(tcp_event_sk, tcp_destroy_sock,
175 TP_PROTO(const struct sock *sk),
180 TRACE_EVENT(tcp_set_state,
182 TP_PROTO(const struct sock *sk, const int oldstate, const int newstate),
184 TP_ARGS(sk, oldstate, newstate),
187 __field(const void *, skaddr)
188 __field(int, oldstate)
189 __field(int, newstate)
190 __field(__u16, sport)
191 __field(__u16, dport)
192 __array(__u8, saddr, 4)
193 __array(__u8, daddr, 4)
194 __array(__u8, saddr_v6, 16)
195 __array(__u8, daddr_v6, 16)
199 struct inet_sock *inet = inet_sk(sk);
200 struct in6_addr *pin6;
203 __entry->skaddr = sk;
204 __entry->oldstate = oldstate;
205 __entry->newstate = newstate;
207 __entry->sport = ntohs(inet->inet_sport);
208 __entry->dport = ntohs(inet->inet_dport);
210 p32 = (__be32 *) __entry->saddr;
211 *p32 = inet->inet_saddr;
213 p32 = (__be32 *) __entry->daddr;
214 *p32 = inet->inet_daddr;
216 #if IS_ENABLED(CONFIG_IPV6)
217 if (sk->sk_family == AF_INET6) {
218 pin6 = (struct in6_addr *)__entry->saddr_v6;
219 *pin6 = sk->sk_v6_rcv_saddr;
220 pin6 = (struct in6_addr *)__entry->daddr_v6;
221 *pin6 = sk->sk_v6_daddr;
225 pin6 = (struct in6_addr *)__entry->saddr_v6;
226 ipv6_addr_set_v4mapped(inet->inet_saddr, pin6);
227 pin6 = (struct in6_addr *)__entry->daddr_v6;
228 ipv6_addr_set_v4mapped(inet->inet_daddr, pin6);
232 TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c oldstate=%s newstate=%s",
233 __entry->sport, __entry->dport,
234 __entry->saddr, __entry->daddr,
235 __entry->saddr_v6, __entry->daddr_v6,
236 show_tcp_state_name(__entry->oldstate),
237 show_tcp_state_name(__entry->newstate))
240 TRACE_EVENT(tcp_retransmit_synack,
242 TP_PROTO(const struct sock *sk, const struct request_sock *req),
247 __field(const void *, skaddr)
248 __field(const void *, req)
249 __field(__u16, sport)
250 __field(__u16, dport)
251 __array(__u8, saddr, 4)
252 __array(__u8, daddr, 4)
253 __array(__u8, saddr_v6, 16)
254 __array(__u8, daddr_v6, 16)
258 struct inet_request_sock *ireq = inet_rsk(req);
259 struct in6_addr *pin6;
262 __entry->skaddr = sk;
265 __entry->sport = ireq->ir_num;
266 __entry->dport = ntohs(ireq->ir_rmt_port);
268 p32 = (__be32 *) __entry->saddr;
269 *p32 = ireq->ir_loc_addr;
271 p32 = (__be32 *) __entry->daddr;
272 *p32 = ireq->ir_rmt_addr;
274 #if IS_ENABLED(CONFIG_IPV6)
275 if (sk->sk_family == AF_INET6) {
276 pin6 = (struct in6_addr *)__entry->saddr_v6;
277 *pin6 = ireq->ir_v6_loc_addr;
278 pin6 = (struct in6_addr *)__entry->daddr_v6;
279 *pin6 = ireq->ir_v6_rmt_addr;
283 pin6 = (struct in6_addr *)__entry->saddr_v6;
284 ipv6_addr_set_v4mapped(ireq->ir_loc_addr, pin6);
285 pin6 = (struct in6_addr *)__entry->daddr_v6;
286 ipv6_addr_set_v4mapped(ireq->ir_rmt_addr, pin6);
290 TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c",
291 __entry->sport, __entry->dport,
292 __entry->saddr, __entry->daddr,
293 __entry->saddr_v6, __entry->daddr_v6)
296 #endif /* _TRACE_TCP_H */
298 /* This part must be outside protection */
299 #include <trace/define_trace.h>