blob: c83c71187719d20a738df151e130d3691661409a [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 Liuf6e37b22017-10-23 09:20:22 -070012/*
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 */
18DECLARE_EVENT_CLASS(tcp_event_sk_skb,
Cong Wange0861012017-10-13 13:03:16 -070019
Song Liu7344e292017-10-23 09:20:23 -070020 TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
Cong Wange0861012017-10-13 13:03:16 -070021
22 TP_ARGS(sk, skb),
23
24 TP_STRUCT__entry(
Song Liu7344e292017-10-23 09:20:23 -070025 __field(const void *, skbaddr)
26 __field(const void *, skaddr)
Cong Wange0861012017-10-13 13:03:16 -070027 __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(
Cong Wange0861012017-10-13 13:03:16 -070036 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
David Ahern89005672017-10-18 08:17:29 -070052#if IS_ENABLED(CONFIG_IPV6)
53 if (sk->sk_family == AF_INET6) {
Cong Wange0861012017-10-13 13:03:16 -070054 pin6 = (struct in6_addr *)__entry->saddr_v6;
David Ahern386fd5d2017-10-16 15:32:07 -070055 *pin6 = sk->sk_v6_rcv_saddr;
Cong Wange0861012017-10-13 13:03:16 -070056 pin6 = (struct in6_addr *)__entry->daddr_v6;
David Ahern386fd5d2017-10-16 15:32:07 -070057 *pin6 = sk->sk_v6_daddr;
David Ahern89005672017-10-18 08:17:29 -070058 } else
59#endif
60 {
Cong Wange0861012017-10-13 13:03:16 -070061 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
David Ahernfb6ff752017-10-16 14:24:02 -070068 TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c",
Cong Wange0861012017-10-13 13:03:16 -070069 __entry->sport, __entry->dport, __entry->saddr, __entry->daddr,
70 __entry->saddr_v6, __entry->daddr_v6)
71);
72
Song Liuf6e37b22017-10-23 09:20:22 -070073DEFINE_EVENT(tcp_event_sk_skb, tcp_retransmit_skb,
74
Song Liu7344e292017-10-23 09:20:23 -070075 TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
Song Liuf6e37b22017-10-23 09:20:22 -070076
77 TP_ARGS(sk, skb)
78);
79
Song Liuc24b14c2017-10-23 09:20:24 -070080/*
81 * skb of trace_tcp_send_reset is the skb that caused RST. In case of
82 * active reset, skb should be NULL
83 */
84DEFINE_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
Song Liu59415212017-10-23 09:20:25 -070091/*
92 * tcp event with arguments sk
93 *
94 * Note: this class requires a valid sk pointer.
95 */
96DECLARE_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
150DEFINE_EVENT(tcp_event_sk, tcp_receive_reset,
151
152 TP_PROTO(const struct sock *sk),
153
154 TP_ARGS(sk)
155);
156
Cong Wange0861012017-10-13 13:03:16 -0700157#endif /* _TRACE_TCP_H */
158
159/* This part must be outside protection */
160#include <trace/define_trace.h>