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