Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
3847ce32 SM |
2 | #undef TRACE_SYSTEM |
3 | #define TRACE_SYSTEM sock | |
4 | ||
5 | #if !defined(_TRACE_SOCK_H) || defined(TRACE_HEADER_MULTI_READ) | |
6 | #define _TRACE_SOCK_H | |
7 | ||
8 | #include <net/sock.h> | |
563e0bb0 | 9 | #include <net/ipv6.h> |
3847ce32 | 10 | #include <linux/tracepoint.h> |
563e0bb0 YS |
11 | #include <linux/ipv6.h> |
12 | #include <linux/tcp.h> | |
13 | ||
0c3b34d8 YS |
14 | #define family_names \ |
15 | EM(AF_INET) \ | |
16 | EMe(AF_INET6) | |
17 | ||
18 | /* The protocol traced by inet_sock_set_state */ | |
563e0bb0 YS |
19 | #define inet_protocol_names \ |
20 | EM(IPPROTO_TCP) \ | |
21 | EM(IPPROTO_DCCP) \ | |
22 | EMe(IPPROTO_SCTP) | |
23 | ||
24 | #define tcp_state_names \ | |
25 | EM(TCP_ESTABLISHED) \ | |
26 | EM(TCP_SYN_SENT) \ | |
27 | EM(TCP_SYN_RECV) \ | |
28 | EM(TCP_FIN_WAIT1) \ | |
29 | EM(TCP_FIN_WAIT2) \ | |
30 | EM(TCP_TIME_WAIT) \ | |
31 | EM(TCP_CLOSE) \ | |
32 | EM(TCP_CLOSE_WAIT) \ | |
33 | EM(TCP_LAST_ACK) \ | |
34 | EM(TCP_LISTEN) \ | |
35 | EM(TCP_CLOSING) \ | |
36 | EMe(TCP_NEW_SYN_RECV) | |
37 | ||
d6f19938 YS |
38 | #define skmem_kind_names \ |
39 | EM(SK_MEM_SEND) \ | |
40 | EMe(SK_MEM_RECV) | |
41 | ||
563e0bb0 YS |
42 | /* enums need to be exported to user space */ |
43 | #undef EM | |
44 | #undef EMe | |
45 | #define EM(a) TRACE_DEFINE_ENUM(a); | |
46 | #define EMe(a) TRACE_DEFINE_ENUM(a); | |
47 | ||
0c3b34d8 | 48 | family_names |
563e0bb0 YS |
49 | inet_protocol_names |
50 | tcp_state_names | |
d6f19938 | 51 | skmem_kind_names |
563e0bb0 YS |
52 | |
53 | #undef EM | |
54 | #undef EMe | |
55 | #define EM(a) { a, #a }, | |
56 | #define EMe(a) { a, #a } | |
57 | ||
0c3b34d8 YS |
58 | #define show_family_name(val) \ |
59 | __print_symbolic(val, family_names) | |
60 | ||
563e0bb0 YS |
61 | #define show_inet_protocol_name(val) \ |
62 | __print_symbolic(val, inet_protocol_names) | |
63 | ||
64 | #define show_tcp_state_name(val) \ | |
65 | __print_symbolic(val, tcp_state_names) | |
3847ce32 | 66 | |
d6f19938 YS |
67 | #define show_skmem_kind_names(val) \ |
68 | __print_symbolic(val, skmem_kind_names) | |
69 | ||
3847ce32 SM |
70 | TRACE_EVENT(sock_rcvqueue_full, |
71 | ||
72 | TP_PROTO(struct sock *sk, struct sk_buff *skb), | |
73 | ||
74 | TP_ARGS(sk, skb), | |
75 | ||
76 | TP_STRUCT__entry( | |
77 | __field(int, rmem_alloc) | |
78 | __field(unsigned int, truesize) | |
79 | __field(int, sk_rcvbuf) | |
80 | ), | |
81 | ||
82 | TP_fast_assign( | |
83 | __entry->rmem_alloc = atomic_read(&sk->sk_rmem_alloc); | |
84 | __entry->truesize = skb->truesize; | |
ebb3b78d | 85 | __entry->sk_rcvbuf = READ_ONCE(sk->sk_rcvbuf); |
3847ce32 SM |
86 | ), |
87 | ||
88 | TP_printk("rmem_alloc=%d truesize=%u sk_rcvbuf=%d", | |
89 | __entry->rmem_alloc, __entry->truesize, __entry->sk_rcvbuf) | |
90 | ); | |
91 | ||
92 | TRACE_EVENT(sock_exceed_buf_limit, | |
93 | ||
d6f19938 | 94 | TP_PROTO(struct sock *sk, struct proto *prot, long allocated, int kind), |
3847ce32 | 95 | |
d6f19938 | 96 | TP_ARGS(sk, prot, allocated, kind), |
3847ce32 SM |
97 | |
98 | TP_STRUCT__entry( | |
99 | __array(char, name, 32) | |
100 | __field(long *, sysctl_mem) | |
101 | __field(long, allocated) | |
102 | __field(int, sysctl_rmem) | |
103 | __field(int, rmem_alloc) | |
d6f19938 YS |
104 | __field(int, sysctl_wmem) |
105 | __field(int, wmem_alloc) | |
106 | __field(int, wmem_queued) | |
107 | __field(int, kind) | |
3847ce32 SM |
108 | ), |
109 | ||
110 | TP_fast_assign( | |
111 | strncpy(__entry->name, prot->name, 32); | |
112 | __entry->sysctl_mem = prot->sysctl_mem; | |
113 | __entry->allocated = allocated; | |
a3dcaf17 | 114 | __entry->sysctl_rmem = sk_get_rmem0(sk, prot); |
3847ce32 | 115 | __entry->rmem_alloc = atomic_read(&sk->sk_rmem_alloc); |
d6f19938 YS |
116 | __entry->sysctl_wmem = sk_get_wmem0(sk, prot); |
117 | __entry->wmem_alloc = refcount_read(&sk->sk_wmem_alloc); | |
ab4e846a | 118 | __entry->wmem_queued = READ_ONCE(sk->sk_wmem_queued); |
d6f19938 | 119 | __entry->kind = kind; |
3847ce32 SM |
120 | ), |
121 | ||
d6f19938 | 122 | TP_printk("proto:%s sysctl_mem=%ld,%ld,%ld allocated=%ld sysctl_rmem=%d rmem_alloc=%d sysctl_wmem=%d wmem_alloc=%d wmem_queued=%d kind=%s", |
3847ce32 SM |
123 | __entry->name, |
124 | __entry->sysctl_mem[0], | |
125 | __entry->sysctl_mem[1], | |
126 | __entry->sysctl_mem[2], | |
127 | __entry->allocated, | |
128 | __entry->sysctl_rmem, | |
d6f19938 YS |
129 | __entry->rmem_alloc, |
130 | __entry->sysctl_wmem, | |
131 | __entry->wmem_alloc, | |
132 | __entry->wmem_queued, | |
133 | show_skmem_kind_names(__entry->kind) | |
134 | ) | |
3847ce32 SM |
135 | ); |
136 | ||
563e0bb0 YS |
137 | TRACE_EVENT(inet_sock_set_state, |
138 | ||
139 | TP_PROTO(const struct sock *sk, const int oldstate, const int newstate), | |
140 | ||
141 | TP_ARGS(sk, oldstate, newstate), | |
142 | ||
143 | TP_STRUCT__entry( | |
144 | __field(const void *, skaddr) | |
145 | __field(int, oldstate) | |
146 | __field(int, newstate) | |
147 | __field(__u16, sport) | |
148 | __field(__u16, dport) | |
0c3b34d8 | 149 | __field(__u16, family) |
bf976514 | 150 | __field(__u16, protocol) |
563e0bb0 YS |
151 | __array(__u8, saddr, 4) |
152 | __array(__u8, daddr, 4) | |
153 | __array(__u8, saddr_v6, 16) | |
154 | __array(__u8, daddr_v6, 16) | |
155 | ), | |
156 | ||
157 | TP_fast_assign( | |
158 | struct inet_sock *inet = inet_sk(sk); | |
159 | struct in6_addr *pin6; | |
160 | __be32 *p32; | |
161 | ||
162 | __entry->skaddr = sk; | |
163 | __entry->oldstate = oldstate; | |
164 | __entry->newstate = newstate; | |
165 | ||
0c3b34d8 | 166 | __entry->family = sk->sk_family; |
563e0bb0 YS |
167 | __entry->protocol = sk->sk_protocol; |
168 | __entry->sport = ntohs(inet->inet_sport); | |
169 | __entry->dport = ntohs(inet->inet_dport); | |
170 | ||
171 | p32 = (__be32 *) __entry->saddr; | |
172 | *p32 = inet->inet_saddr; | |
173 | ||
174 | p32 = (__be32 *) __entry->daddr; | |
175 | *p32 = inet->inet_daddr; | |
176 | ||
177 | #if IS_ENABLED(CONFIG_IPV6) | |
178 | if (sk->sk_family == AF_INET6) { | |
179 | pin6 = (struct in6_addr *)__entry->saddr_v6; | |
180 | *pin6 = sk->sk_v6_rcv_saddr; | |
181 | pin6 = (struct in6_addr *)__entry->daddr_v6; | |
182 | *pin6 = sk->sk_v6_daddr; | |
183 | } else | |
184 | #endif | |
185 | { | |
186 | pin6 = (struct in6_addr *)__entry->saddr_v6; | |
187 | ipv6_addr_set_v4mapped(inet->inet_saddr, pin6); | |
188 | pin6 = (struct in6_addr *)__entry->daddr_v6; | |
189 | ipv6_addr_set_v4mapped(inet->inet_daddr, pin6); | |
190 | } | |
191 | ), | |
192 | ||
0c3b34d8 YS |
193 | TP_printk("family=%s protocol=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c oldstate=%s newstate=%s", |
194 | show_family_name(__entry->family), | |
563e0bb0 YS |
195 | show_inet_protocol_name(__entry->protocol), |
196 | __entry->sport, __entry->dport, | |
197 | __entry->saddr, __entry->daddr, | |
198 | __entry->saddr_v6, __entry->daddr_v6, | |
199 | show_tcp_state_name(__entry->oldstate), | |
200 | show_tcp_state_name(__entry->newstate)) | |
201 | ); | |
202 | ||
3847ce32 SM |
203 | #endif /* _TRACE_SOCK_H */ |
204 | ||
205 | /* This part must be outside protection */ | |
206 | #include <trace/define_trace.h> |