xref: /openbmc/linux/include/trace/events/sock.h (revision abc17a11)
1b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
23847ce32SSatoru Moriya #undef TRACE_SYSTEM
33847ce32SSatoru Moriya #define TRACE_SYSTEM sock
43847ce32SSatoru Moriya 
53847ce32SSatoru Moriya #if !defined(_TRACE_SOCK_H) || defined(TRACE_HEADER_MULTI_READ)
63847ce32SSatoru Moriya #define _TRACE_SOCK_H
73847ce32SSatoru Moriya 
83847ce32SSatoru Moriya #include <net/sock.h>
9563e0bb0SYafang Shao #include <net/ipv6.h>
103847ce32SSatoru Moriya #include <linux/tracepoint.h>
11563e0bb0SYafang Shao #include <linux/ipv6.h>
12563e0bb0SYafang Shao #include <linux/tcp.h>
13563e0bb0SYafang Shao 
140c3b34d8SYafang Shao #define family_names			\
150c3b34d8SYafang Shao 		EM(AF_INET)				\
160c3b34d8SYafang Shao 		EMe(AF_INET6)
170c3b34d8SYafang Shao 
180c3b34d8SYafang Shao /* The protocol traced by inet_sock_set_state */
19563e0bb0SYafang Shao #define inet_protocol_names		\
20563e0bb0SYafang Shao 		EM(IPPROTO_TCP)			\
21563e0bb0SYafang Shao 		EM(IPPROTO_DCCP)		\
22faf391c3SMat Martineau 		EM(IPPROTO_SCTP)		\
23faf391c3SMat Martineau 		EMe(IPPROTO_MPTCP)
24563e0bb0SYafang Shao 
25563e0bb0SYafang Shao #define tcp_state_names			\
26563e0bb0SYafang Shao 		EM(TCP_ESTABLISHED)		\
27563e0bb0SYafang Shao 		EM(TCP_SYN_SENT)		\
28563e0bb0SYafang Shao 		EM(TCP_SYN_RECV)		\
29563e0bb0SYafang Shao 		EM(TCP_FIN_WAIT1)		\
30563e0bb0SYafang Shao 		EM(TCP_FIN_WAIT2)		\
31563e0bb0SYafang Shao 		EM(TCP_TIME_WAIT)		\
32563e0bb0SYafang Shao 		EM(TCP_CLOSE)			\
33563e0bb0SYafang Shao 		EM(TCP_CLOSE_WAIT)		\
34563e0bb0SYafang Shao 		EM(TCP_LAST_ACK)		\
35563e0bb0SYafang Shao 		EM(TCP_LISTEN)			\
36563e0bb0SYafang Shao 		EM(TCP_CLOSING)			\
37563e0bb0SYafang Shao 		EMe(TCP_NEW_SYN_RECV)
38563e0bb0SYafang Shao 
39d6f19938SYafang Shao #define skmem_kind_names			\
40d6f19938SYafang Shao 		EM(SK_MEM_SEND)			\
41d6f19938SYafang Shao 		EMe(SK_MEM_RECV)
42d6f19938SYafang Shao 
43563e0bb0SYafang Shao /* enums need to be exported to user space */
44563e0bb0SYafang Shao #undef EM
45563e0bb0SYafang Shao #undef EMe
46563e0bb0SYafang Shao #define EM(a)       TRACE_DEFINE_ENUM(a);
47563e0bb0SYafang Shao #define EMe(a)      TRACE_DEFINE_ENUM(a);
48563e0bb0SYafang Shao 
490c3b34d8SYafang Shao family_names
50563e0bb0SYafang Shao inet_protocol_names
51563e0bb0SYafang Shao tcp_state_names
52d6f19938SYafang Shao skmem_kind_names
53563e0bb0SYafang Shao 
54563e0bb0SYafang Shao #undef EM
55563e0bb0SYafang Shao #undef EMe
56563e0bb0SYafang Shao #define EM(a)       { a, #a },
57563e0bb0SYafang Shao #define EMe(a)      { a, #a }
58563e0bb0SYafang Shao 
590c3b34d8SYafang Shao #define show_family_name(val)			\
600c3b34d8SYafang Shao 	__print_symbolic(val, family_names)
610c3b34d8SYafang Shao 
62563e0bb0SYafang Shao #define show_inet_protocol_name(val)    \
63563e0bb0SYafang Shao 	__print_symbolic(val, inet_protocol_names)
64563e0bb0SYafang Shao 
65563e0bb0SYafang Shao #define show_tcp_state_name(val)        \
66563e0bb0SYafang Shao 	__print_symbolic(val, tcp_state_names)
673847ce32SSatoru Moriya 
68d6f19938SYafang Shao #define show_skmem_kind_names(val)	\
69d6f19938SYafang Shao 	__print_symbolic(val, skmem_kind_names)
70d6f19938SYafang Shao 
713847ce32SSatoru Moriya TRACE_EVENT(sock_rcvqueue_full,
723847ce32SSatoru Moriya 
733847ce32SSatoru Moriya 	TP_PROTO(struct sock *sk, struct sk_buff *skb),
743847ce32SSatoru Moriya 
753847ce32SSatoru Moriya 	TP_ARGS(sk, skb),
763847ce32SSatoru Moriya 
773847ce32SSatoru Moriya 	TP_STRUCT__entry(
783847ce32SSatoru Moriya 		__field(int, rmem_alloc)
793847ce32SSatoru Moriya 		__field(unsigned int, truesize)
803847ce32SSatoru Moriya 		__field(int, sk_rcvbuf)
813847ce32SSatoru Moriya 	),
823847ce32SSatoru Moriya 
833847ce32SSatoru Moriya 	TP_fast_assign(
843847ce32SSatoru Moriya 		__entry->rmem_alloc = atomic_read(&sk->sk_rmem_alloc);
853847ce32SSatoru Moriya 		__entry->truesize   = skb->truesize;
86ebb3b78dSEric Dumazet 		__entry->sk_rcvbuf  = READ_ONCE(sk->sk_rcvbuf);
873847ce32SSatoru Moriya 	),
883847ce32SSatoru Moriya 
893847ce32SSatoru Moriya 	TP_printk("rmem_alloc=%d truesize=%u sk_rcvbuf=%d",
903847ce32SSatoru Moriya 		__entry->rmem_alloc, __entry->truesize, __entry->sk_rcvbuf)
913847ce32SSatoru Moriya );
923847ce32SSatoru Moriya 
933847ce32SSatoru Moriya TRACE_EVENT(sock_exceed_buf_limit,
943847ce32SSatoru Moriya 
95d6f19938SYafang Shao 	TP_PROTO(struct sock *sk, struct proto *prot, long allocated, int kind),
963847ce32SSatoru Moriya 
97d6f19938SYafang Shao 	TP_ARGS(sk, prot, allocated, kind),
983847ce32SSatoru Moriya 
993847ce32SSatoru Moriya 	TP_STRUCT__entry(
1003847ce32SSatoru Moriya 		__array(char, name, 32)
101820b8963SSteven Rostedt (Google) 		__array(long, sysctl_mem, 3)
1023847ce32SSatoru Moriya 		__field(long, allocated)
1033847ce32SSatoru Moriya 		__field(int, sysctl_rmem)
1043847ce32SSatoru Moriya 		__field(int, rmem_alloc)
105d6f19938SYafang Shao 		__field(int, sysctl_wmem)
106d6f19938SYafang Shao 		__field(int, wmem_alloc)
107d6f19938SYafang Shao 		__field(int, wmem_queued)
108d6f19938SYafang Shao 		__field(int, kind)
1093847ce32SSatoru Moriya 	),
1103847ce32SSatoru Moriya 
1113847ce32SSatoru Moriya 	TP_fast_assign(
1123847ce32SSatoru Moriya 		strncpy(__entry->name, prot->name, 32);
113820b8963SSteven Rostedt (Google) 		__entry->sysctl_mem[0] = READ_ONCE(prot->sysctl_mem[0]);
114820b8963SSteven Rostedt (Google) 		__entry->sysctl_mem[1] = READ_ONCE(prot->sysctl_mem[1]);
115820b8963SSteven Rostedt (Google) 		__entry->sysctl_mem[2] = READ_ONCE(prot->sysctl_mem[2]);
1163847ce32SSatoru Moriya 		__entry->allocated = allocated;
117a3dcaf17SEric Dumazet 		__entry->sysctl_rmem = sk_get_rmem0(sk, prot);
1183847ce32SSatoru Moriya 		__entry->rmem_alloc = atomic_read(&sk->sk_rmem_alloc);
119d6f19938SYafang Shao 		__entry->sysctl_wmem = sk_get_wmem0(sk, prot);
120d6f19938SYafang Shao 		__entry->wmem_alloc = refcount_read(&sk->sk_wmem_alloc);
121ab4e846aSEric Dumazet 		__entry->wmem_queued = READ_ONCE(sk->sk_wmem_queued);
122d6f19938SYafang Shao 		__entry->kind = kind;
1233847ce32SSatoru Moriya 	),
1243847ce32SSatoru Moriya 
125d6f19938SYafang Shao 	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",
1263847ce32SSatoru Moriya 		__entry->name,
1273847ce32SSatoru Moriya 		__entry->sysctl_mem[0],
1283847ce32SSatoru Moriya 		__entry->sysctl_mem[1],
1293847ce32SSatoru Moriya 		__entry->sysctl_mem[2],
1303847ce32SSatoru Moriya 		__entry->allocated,
1313847ce32SSatoru Moriya 		__entry->sysctl_rmem,
132d6f19938SYafang Shao 		__entry->rmem_alloc,
133d6f19938SYafang Shao 		__entry->sysctl_wmem,
134d6f19938SYafang Shao 		__entry->wmem_alloc,
135d6f19938SYafang Shao 		__entry->wmem_queued,
136d6f19938SYafang Shao 		show_skmem_kind_names(__entry->kind)
137d6f19938SYafang Shao 	)
1383847ce32SSatoru Moriya );
1393847ce32SSatoru Moriya 
140563e0bb0SYafang Shao TRACE_EVENT(inet_sock_set_state,
141563e0bb0SYafang Shao 
142563e0bb0SYafang Shao 	TP_PROTO(const struct sock *sk, const int oldstate, const int newstate),
143563e0bb0SYafang Shao 
144563e0bb0SYafang Shao 	TP_ARGS(sk, oldstate, newstate),
145563e0bb0SYafang Shao 
146563e0bb0SYafang Shao 	TP_STRUCT__entry(
147563e0bb0SYafang Shao 		__field(const void *, skaddr)
148563e0bb0SYafang Shao 		__field(int, oldstate)
149563e0bb0SYafang Shao 		__field(int, newstate)
150563e0bb0SYafang Shao 		__field(__u16, sport)
151563e0bb0SYafang Shao 		__field(__u16, dport)
1520c3b34d8SYafang Shao 		__field(__u16, family)
153bf976514SMat Martineau 		__field(__u16, protocol)
154563e0bb0SYafang Shao 		__array(__u8, saddr, 4)
155563e0bb0SYafang Shao 		__array(__u8, daddr, 4)
156563e0bb0SYafang Shao 		__array(__u8, saddr_v6, 16)
157563e0bb0SYafang Shao 		__array(__u8, daddr_v6, 16)
158563e0bb0SYafang Shao 	),
159563e0bb0SYafang Shao 
160563e0bb0SYafang Shao 	TP_fast_assign(
161*abc17a11SEric Dumazet 		const struct inet_sock *inet = inet_sk(sk);
162563e0bb0SYafang Shao 		struct in6_addr *pin6;
163563e0bb0SYafang Shao 		__be32 *p32;
164563e0bb0SYafang Shao 
165563e0bb0SYafang Shao 		__entry->skaddr = sk;
166563e0bb0SYafang Shao 		__entry->oldstate = oldstate;
167563e0bb0SYafang Shao 		__entry->newstate = newstate;
168563e0bb0SYafang Shao 
1690c3b34d8SYafang Shao 		__entry->family = sk->sk_family;
170563e0bb0SYafang Shao 		__entry->protocol = sk->sk_protocol;
171563e0bb0SYafang Shao 		__entry->sport = ntohs(inet->inet_sport);
172563e0bb0SYafang Shao 		__entry->dport = ntohs(inet->inet_dport);
173563e0bb0SYafang Shao 
174563e0bb0SYafang Shao 		p32 = (__be32 *) __entry->saddr;
175563e0bb0SYafang Shao 		*p32 = inet->inet_saddr;
176563e0bb0SYafang Shao 
177563e0bb0SYafang Shao 		p32 = (__be32 *) __entry->daddr;
178563e0bb0SYafang Shao 		*p32 =  inet->inet_daddr;
179563e0bb0SYafang Shao 
180563e0bb0SYafang Shao #if IS_ENABLED(CONFIG_IPV6)
181563e0bb0SYafang Shao 		if (sk->sk_family == AF_INET6) {
182563e0bb0SYafang Shao 			pin6 = (struct in6_addr *)__entry->saddr_v6;
183563e0bb0SYafang Shao 			*pin6 = sk->sk_v6_rcv_saddr;
184563e0bb0SYafang Shao 			pin6 = (struct in6_addr *)__entry->daddr_v6;
185563e0bb0SYafang Shao 			*pin6 = sk->sk_v6_daddr;
186563e0bb0SYafang Shao 		} else
187563e0bb0SYafang Shao #endif
188563e0bb0SYafang Shao 		{
189563e0bb0SYafang Shao 			pin6 = (struct in6_addr *)__entry->saddr_v6;
190563e0bb0SYafang Shao 			ipv6_addr_set_v4mapped(inet->inet_saddr, pin6);
191563e0bb0SYafang Shao 			pin6 = (struct in6_addr *)__entry->daddr_v6;
192563e0bb0SYafang Shao 			ipv6_addr_set_v4mapped(inet->inet_daddr, pin6);
193563e0bb0SYafang Shao 		}
194563e0bb0SYafang Shao 	),
195563e0bb0SYafang Shao 
1960c3b34d8SYafang Shao 	TP_printk("family=%s protocol=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c oldstate=%s newstate=%s",
1970c3b34d8SYafang Shao 			show_family_name(__entry->family),
198563e0bb0SYafang Shao 			show_inet_protocol_name(__entry->protocol),
199563e0bb0SYafang Shao 			__entry->sport, __entry->dport,
200563e0bb0SYafang Shao 			__entry->saddr, __entry->daddr,
201563e0bb0SYafang Shao 			__entry->saddr_v6, __entry->daddr_v6,
202563e0bb0SYafang Shao 			show_tcp_state_name(__entry->oldstate),
203563e0bb0SYafang Shao 			show_tcp_state_name(__entry->newstate))
204563e0bb0SYafang Shao );
205563e0bb0SYafang Shao 
206e6a3e443SAlexander Aring TRACE_EVENT(inet_sk_error_report,
207e6a3e443SAlexander Aring 
208e6a3e443SAlexander Aring 	TP_PROTO(const struct sock *sk),
209e6a3e443SAlexander Aring 
210e6a3e443SAlexander Aring 	TP_ARGS(sk),
211e6a3e443SAlexander Aring 
212e6a3e443SAlexander Aring 	TP_STRUCT__entry(
213e6a3e443SAlexander Aring 		__field(int, error)
214e6a3e443SAlexander Aring 		__field(__u16, sport)
215e6a3e443SAlexander Aring 		__field(__u16, dport)
216e6a3e443SAlexander Aring 		__field(__u16, family)
217e6a3e443SAlexander Aring 		__field(__u16, protocol)
218e6a3e443SAlexander Aring 		__array(__u8, saddr, 4)
219e6a3e443SAlexander Aring 		__array(__u8, daddr, 4)
220e6a3e443SAlexander Aring 		__array(__u8, saddr_v6, 16)
221e6a3e443SAlexander Aring 		__array(__u8, daddr_v6, 16)
222e6a3e443SAlexander Aring 	),
223e6a3e443SAlexander Aring 
224e6a3e443SAlexander Aring 	TP_fast_assign(
225*abc17a11SEric Dumazet 		const struct inet_sock *inet = inet_sk(sk);
226e6a3e443SAlexander Aring 		struct in6_addr *pin6;
227e6a3e443SAlexander Aring 		__be32 *p32;
228e6a3e443SAlexander Aring 
229e6a3e443SAlexander Aring 		__entry->error = sk->sk_err;
230e6a3e443SAlexander Aring 		__entry->family = sk->sk_family;
231e6a3e443SAlexander Aring 		__entry->protocol = sk->sk_protocol;
232e6a3e443SAlexander Aring 		__entry->sport = ntohs(inet->inet_sport);
233e6a3e443SAlexander Aring 		__entry->dport = ntohs(inet->inet_dport);
234e6a3e443SAlexander Aring 
235e6a3e443SAlexander Aring 		p32 = (__be32 *) __entry->saddr;
236e6a3e443SAlexander Aring 		*p32 = inet->inet_saddr;
237e6a3e443SAlexander Aring 
238e6a3e443SAlexander Aring 		p32 = (__be32 *) __entry->daddr;
239e6a3e443SAlexander Aring 		*p32 =  inet->inet_daddr;
240e6a3e443SAlexander Aring 
241e6a3e443SAlexander Aring #if IS_ENABLED(CONFIG_IPV6)
242e6a3e443SAlexander Aring 		if (sk->sk_family == AF_INET6) {
243e6a3e443SAlexander Aring 			pin6 = (struct in6_addr *)__entry->saddr_v6;
244e6a3e443SAlexander Aring 			*pin6 = sk->sk_v6_rcv_saddr;
245e6a3e443SAlexander Aring 			pin6 = (struct in6_addr *)__entry->daddr_v6;
246e6a3e443SAlexander Aring 			*pin6 = sk->sk_v6_daddr;
247e6a3e443SAlexander Aring 		} else
248e6a3e443SAlexander Aring #endif
249e6a3e443SAlexander Aring 		{
250e6a3e443SAlexander Aring 			pin6 = (struct in6_addr *)__entry->saddr_v6;
251e6a3e443SAlexander Aring 			ipv6_addr_set_v4mapped(inet->inet_saddr, pin6);
252e6a3e443SAlexander Aring 			pin6 = (struct in6_addr *)__entry->daddr_v6;
253e6a3e443SAlexander Aring 			ipv6_addr_set_v4mapped(inet->inet_daddr, pin6);
254e6a3e443SAlexander Aring 		}
255e6a3e443SAlexander Aring 	),
256e6a3e443SAlexander Aring 
257e6a3e443SAlexander Aring 	TP_printk("family=%s protocol=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c error=%d",
258e6a3e443SAlexander Aring 		  show_family_name(__entry->family),
259e6a3e443SAlexander Aring 		  show_inet_protocol_name(__entry->protocol),
260e6a3e443SAlexander Aring 		  __entry->sport, __entry->dport,
261e6a3e443SAlexander Aring 		  __entry->saddr, __entry->daddr,
262e6a3e443SAlexander Aring 		  __entry->saddr_v6, __entry->daddr_v6,
263e6a3e443SAlexander Aring 		  __entry->error)
264e6a3e443SAlexander Aring );
265e6a3e443SAlexander Aring 
26640e0b090SPeilin Ye TRACE_EVENT(sk_data_ready,
26740e0b090SPeilin Ye 
26840e0b090SPeilin Ye 	TP_PROTO(const struct sock *sk),
26940e0b090SPeilin Ye 
27040e0b090SPeilin Ye 	TP_ARGS(sk),
27140e0b090SPeilin Ye 
27240e0b090SPeilin Ye 	TP_STRUCT__entry(
27340e0b090SPeilin Ye 		__field(const void *, skaddr)
27440e0b090SPeilin Ye 		__field(__u16, family)
27540e0b090SPeilin Ye 		__field(__u16, protocol)
27640e0b090SPeilin Ye 		__field(unsigned long, ip)
27740e0b090SPeilin Ye 	),
27840e0b090SPeilin Ye 
27940e0b090SPeilin Ye 	TP_fast_assign(
28040e0b090SPeilin Ye 		__entry->skaddr = sk;
28140e0b090SPeilin Ye 		__entry->family = sk->sk_family;
28240e0b090SPeilin Ye 		__entry->protocol = sk->sk_protocol;
28340e0b090SPeilin Ye 		__entry->ip = _RET_IP_;
28440e0b090SPeilin Ye 	),
28540e0b090SPeilin Ye 
28640e0b090SPeilin Ye 	TP_printk("family=%u protocol=%u func=%ps",
28740e0b090SPeilin Ye 		  __entry->family, __entry->protocol, (void *)__entry->ip)
28840e0b090SPeilin Ye );
28940e0b090SPeilin Ye 
2906e6eda44SYunhui Cui /*
2916e6eda44SYunhui Cui  * sock send/recv msg length
2926e6eda44SYunhui Cui  */
2936e6eda44SYunhui Cui DECLARE_EVENT_CLASS(sock_msg_length,
2946e6eda44SYunhui Cui 
2956e6eda44SYunhui Cui 	TP_PROTO(struct sock *sk, int ret, int flags),
2966e6eda44SYunhui Cui 
2976e6eda44SYunhui Cui 	TP_ARGS(sk, ret, flags),
2986e6eda44SYunhui Cui 
2996e6eda44SYunhui Cui 	TP_STRUCT__entry(
3006e6eda44SYunhui Cui 		__field(void *, sk)
3016e6eda44SYunhui Cui 		__field(__u16, family)
3026e6eda44SYunhui Cui 		__field(__u16, protocol)
3036e6eda44SYunhui Cui 		__field(int, ret)
3046e6eda44SYunhui Cui 		__field(int, flags)
3056e6eda44SYunhui Cui 	),
3066e6eda44SYunhui Cui 
3076e6eda44SYunhui Cui 	TP_fast_assign(
3086e6eda44SYunhui Cui 		__entry->sk = sk;
3096e6eda44SYunhui Cui 		__entry->family = sk->sk_family;
3106e6eda44SYunhui Cui 		__entry->protocol = sk->sk_protocol;
3116e6eda44SYunhui Cui 		__entry->ret = ret;
3126e6eda44SYunhui Cui 		__entry->flags = flags;
3136e6eda44SYunhui Cui 	),
3146e6eda44SYunhui Cui 
3156e6eda44SYunhui Cui 	TP_printk("sk address = %p, family = %s protocol = %s, length = %d, error = %d, flags = 0x%x",
3166e6eda44SYunhui Cui 		  __entry->sk, show_family_name(__entry->family),
3176e6eda44SYunhui Cui 		  show_inet_protocol_name(__entry->protocol),
3186e6eda44SYunhui Cui 		  !(__entry->flags & MSG_PEEK) ?
3196e6eda44SYunhui Cui 		  (__entry->ret > 0 ? __entry->ret : 0) : 0,
3206e6eda44SYunhui Cui 		  __entry->ret < 0 ? __entry->ret : 0,
3216e6eda44SYunhui Cui 		  __entry->flags)
3226e6eda44SYunhui Cui );
3236e6eda44SYunhui Cui 
3246e6eda44SYunhui Cui DEFINE_EVENT(sock_msg_length, sock_send_length,
3256e6eda44SYunhui Cui 	TP_PROTO(struct sock *sk, int ret, int flags),
3266e6eda44SYunhui Cui 
3276e6eda44SYunhui Cui 	TP_ARGS(sk, ret, flags)
3286e6eda44SYunhui Cui );
3296e6eda44SYunhui Cui 
3306e6eda44SYunhui Cui DEFINE_EVENT(sock_msg_length, sock_recv_length,
3316e6eda44SYunhui Cui 	TP_PROTO(struct sock *sk, int ret, int flags),
3326e6eda44SYunhui Cui 
3336e6eda44SYunhui Cui 	TP_ARGS(sk, ret, flags)
3346e6eda44SYunhui Cui );
3353847ce32SSatoru Moriya #endif /* _TRACE_SOCK_H */
3363847ce32SSatoru Moriya 
3373847ce32SSatoru Moriya /* This part must be outside protection */
3383847ce32SSatoru Moriya #include <trace/define_trace.h>
339