blob: 03699ba716230882db91bf8d2bbc11d12099accd [file] [log] [blame]
Cong Wange0861012017-10-13 13:03:16 -07001#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
Song Liue8fce232017-10-23 09:20:27 -070012#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
Song Liuf6e37b22017-10-23 09:20:22 -070028/*
29 * tcp event with arguments sk and skb
30 *
31 * Note: this class requires a valid sk pointer; while skb pointer could
32 * be NULL.
33 */
34DECLARE_EVENT_CLASS(tcp_event_sk_skb,
Cong Wange0861012017-10-13 13:03:16 -070035
Song Liu7344e292017-10-23 09:20:23 -070036 TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
Cong Wange0861012017-10-13 13:03:16 -070037
38 TP_ARGS(sk, skb),
39
40 TP_STRUCT__entry(
Song Liu7344e292017-10-23 09:20:23 -070041 __field(const void *, skbaddr)
42 __field(const void *, skaddr)
Cong Wange0861012017-10-13 13:03:16 -070043 __field(__u16, sport)
44 __field(__u16, dport)
45 __array(__u8, saddr, 4)
46 __array(__u8, daddr, 4)
47 __array(__u8, saddr_v6, 16)
48 __array(__u8, daddr_v6, 16)
49 ),
50
51 TP_fast_assign(
Cong Wange0861012017-10-13 13:03:16 -070052 struct inet_sock *inet = inet_sk(sk);
53 struct in6_addr *pin6;
54 __be32 *p32;
55
56 __entry->skbaddr = skb;
57 __entry->skaddr = sk;
58
59 __entry->sport = ntohs(inet->inet_sport);
60 __entry->dport = ntohs(inet->inet_dport);
61
62 p32 = (__be32 *) __entry->saddr;
63 *p32 = inet->inet_saddr;
64
65 p32 = (__be32 *) __entry->daddr;
66 *p32 = inet->inet_daddr;
67
David Ahern89005672017-10-18 08:17:29 -070068#if IS_ENABLED(CONFIG_IPV6)
69 if (sk->sk_family == AF_INET6) {
Cong Wange0861012017-10-13 13:03:16 -070070 pin6 = (struct in6_addr *)__entry->saddr_v6;
David Ahern386fd5d2017-10-16 15:32:07 -070071 *pin6 = sk->sk_v6_rcv_saddr;
Cong Wange0861012017-10-13 13:03:16 -070072 pin6 = (struct in6_addr *)__entry->daddr_v6;
David Ahern386fd5d2017-10-16 15:32:07 -070073 *pin6 = sk->sk_v6_daddr;
David Ahern89005672017-10-18 08:17:29 -070074 } else
75#endif
76 {
Cong Wange0861012017-10-13 13:03:16 -070077 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);
81 }
82 ),
83
David Ahernfb6ff752017-10-16 14:24:02 -070084 TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c",
Cong Wange0861012017-10-13 13:03:16 -070085 __entry->sport, __entry->dport, __entry->saddr, __entry->daddr,
86 __entry->saddr_v6, __entry->daddr_v6)
87);
88
Song Liuf6e37b22017-10-23 09:20:22 -070089DEFINE_EVENT(tcp_event_sk_skb, tcp_retransmit_skb,
90
Song Liu7344e292017-10-23 09:20:23 -070091 TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
Song Liuf6e37b22017-10-23 09:20:22 -070092
93 TP_ARGS(sk, skb)
94);
95
Song Liuc24b14c2017-10-23 09:20:24 -070096/*
97 * skb of trace_tcp_send_reset is the skb that caused RST. In case of
98 * active reset, skb should be NULL
99 */
100DEFINE_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
Song Liu59415212017-10-23 09:20:25 -0700107/*
108 * tcp event with arguments sk
109 *
110 * Note: this class requires a valid sk pointer.
111 */
112DECLARE_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 struct in6_addr *pin6;
131 __be32 *p32;
132
133 __entry->skaddr = sk;
134
135 __entry->sport = ntohs(inet->inet_sport);
136 __entry->dport = ntohs(inet->inet_dport);
137
138 p32 = (__be32 *) __entry->saddr;
139 *p32 = inet->inet_saddr;
140
141 p32 = (__be32 *) __entry->daddr;
142 *p32 = inet->inet_daddr;
143
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;
150 } else
151#endif
152 {
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);
157 }
158 ),
159
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)
164);
165
166DEFINE_EVENT(tcp_event_sk, tcp_receive_reset,
167
168 TP_PROTO(const struct sock *sk),
169
170 TP_ARGS(sk)
171);
172
Song Liue1a4aa52017-10-23 09:20:26 -0700173DEFINE_EVENT(tcp_event_sk, tcp_destroy_sock,
174
175 TP_PROTO(const struct sock *sk),
176
177 TP_ARGS(sk)
178);
179
Song Liue8fce232017-10-23 09:20:27 -0700180TRACE_EVENT(tcp_set_state,
181
182 TP_PROTO(const struct sock *sk, const int oldstate, const int newstate),
183
184 TP_ARGS(sk, oldstate, newstate),
185
186 TP_STRUCT__entry(
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)
196 ),
197
198 TP_fast_assign(
199 struct inet_sock *inet = inet_sk(sk);
200 struct in6_addr *pin6;
201 __be32 *p32;
202
203 __entry->skaddr = sk;
204 __entry->oldstate = oldstate;
205 __entry->newstate = newstate;
206
207 __entry->sport = ntohs(inet->inet_sport);
208 __entry->dport = ntohs(inet->inet_dport);
209
210 p32 = (__be32 *) __entry->saddr;
211 *p32 = inet->inet_saddr;
212
213 p32 = (__be32 *) __entry->daddr;
214 *p32 = inet->inet_daddr;
215
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;
222 } else
223#endif
224 {
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);
229 }
230 ),
231
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))
238);
239
Cong Wange0861012017-10-13 13:03:16 -0700240#endif /* _TRACE_TCP_H */
241
242/* This part must be outside protection */
243#include <trace/define_trace.h>