1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #undef TRACE_SYSTEM 3*4882a593Smuzhiyun #define TRACE_SYSTEM tcp 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #if !defined(_TRACE_TCP_H) || defined(TRACE_HEADER_MULTI_READ) 6*4882a593Smuzhiyun #define _TRACE_TCP_H 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/ipv6.h> 9*4882a593Smuzhiyun #include <linux/tcp.h> 10*4882a593Smuzhiyun #include <linux/tracepoint.h> 11*4882a593Smuzhiyun #include <net/ipv6.h> 12*4882a593Smuzhiyun #include <net/tcp.h> 13*4882a593Smuzhiyun #include <linux/sock_diag.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #define TP_STORE_V4MAPPED(__entry, saddr, daddr) \ 16*4882a593Smuzhiyun do { \ 17*4882a593Smuzhiyun struct in6_addr *pin6; \ 18*4882a593Smuzhiyun \ 19*4882a593Smuzhiyun pin6 = (struct in6_addr *)__entry->saddr_v6; \ 20*4882a593Smuzhiyun ipv6_addr_set_v4mapped(saddr, pin6); \ 21*4882a593Smuzhiyun pin6 = (struct in6_addr *)__entry->daddr_v6; \ 22*4882a593Smuzhiyun ipv6_addr_set_v4mapped(daddr, pin6); \ 23*4882a593Smuzhiyun } while (0) 24*4882a593Smuzhiyun 25*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_IPV6) 26*4882a593Smuzhiyun #define TP_STORE_ADDRS(__entry, saddr, daddr, saddr6, daddr6) \ 27*4882a593Smuzhiyun do { \ 28*4882a593Smuzhiyun if (sk->sk_family == AF_INET6) { \ 29*4882a593Smuzhiyun struct in6_addr *pin6; \ 30*4882a593Smuzhiyun \ 31*4882a593Smuzhiyun pin6 = (struct in6_addr *)__entry->saddr_v6; \ 32*4882a593Smuzhiyun *pin6 = saddr6; \ 33*4882a593Smuzhiyun pin6 = (struct in6_addr *)__entry->daddr_v6; \ 34*4882a593Smuzhiyun *pin6 = daddr6; \ 35*4882a593Smuzhiyun } else { \ 36*4882a593Smuzhiyun TP_STORE_V4MAPPED(__entry, saddr, daddr); \ 37*4882a593Smuzhiyun } \ 38*4882a593Smuzhiyun } while (0) 39*4882a593Smuzhiyun #else 40*4882a593Smuzhiyun #define TP_STORE_ADDRS(__entry, saddr, daddr, saddr6, daddr6) \ 41*4882a593Smuzhiyun TP_STORE_V4MAPPED(__entry, saddr, daddr) 42*4882a593Smuzhiyun #endif 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /* 45*4882a593Smuzhiyun * tcp event with arguments sk and skb 46*4882a593Smuzhiyun * 47*4882a593Smuzhiyun * Note: this class requires a valid sk pointer; while skb pointer could 48*4882a593Smuzhiyun * be NULL. 49*4882a593Smuzhiyun */ 50*4882a593Smuzhiyun DECLARE_EVENT_CLASS(tcp_event_sk_skb, 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun TP_PROTO(const struct sock *sk, const struct sk_buff *skb), 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun TP_ARGS(sk, skb), 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun TP_STRUCT__entry( 57*4882a593Smuzhiyun __field(const void *, skbaddr) 58*4882a593Smuzhiyun __field(const void *, skaddr) 59*4882a593Smuzhiyun __field(int, state) 60*4882a593Smuzhiyun __field(__u16, sport) 61*4882a593Smuzhiyun __field(__u16, dport) 62*4882a593Smuzhiyun __array(__u8, saddr, 4) 63*4882a593Smuzhiyun __array(__u8, daddr, 4) 64*4882a593Smuzhiyun __array(__u8, saddr_v6, 16) 65*4882a593Smuzhiyun __array(__u8, daddr_v6, 16) 66*4882a593Smuzhiyun ), 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun TP_fast_assign( 69*4882a593Smuzhiyun struct inet_sock *inet = inet_sk(sk); 70*4882a593Smuzhiyun __be32 *p32; 71*4882a593Smuzhiyun 72*4882a593Smuzhiyun __entry->skbaddr = skb; 73*4882a593Smuzhiyun __entry->skaddr = sk; 74*4882a593Smuzhiyun __entry->state = sk->sk_state; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun __entry->sport = ntohs(inet->inet_sport); 77*4882a593Smuzhiyun __entry->dport = ntohs(inet->inet_dport); 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun p32 = (__be32 *) __entry->saddr; 80*4882a593Smuzhiyun *p32 = inet->inet_saddr; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun p32 = (__be32 *) __entry->daddr; 83*4882a593Smuzhiyun *p32 = inet->inet_daddr; 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr, 86*4882a593Smuzhiyun sk->sk_v6_rcv_saddr, sk->sk_v6_daddr); 87*4882a593Smuzhiyun ), 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c state=%s", 90*4882a593Smuzhiyun __entry->sport, __entry->dport, __entry->saddr, __entry->daddr, 91*4882a593Smuzhiyun __entry->saddr_v6, __entry->daddr_v6, 92*4882a593Smuzhiyun show_tcp_state_name(__entry->state)) 93*4882a593Smuzhiyun ); 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun DEFINE_EVENT(tcp_event_sk_skb, tcp_retransmit_skb, 96*4882a593Smuzhiyun 97*4882a593Smuzhiyun TP_PROTO(const struct sock *sk, const struct sk_buff *skb), 98*4882a593Smuzhiyun 99*4882a593Smuzhiyun TP_ARGS(sk, skb) 100*4882a593Smuzhiyun ); 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun /* 103*4882a593Smuzhiyun * skb of trace_tcp_send_reset is the skb that caused RST. In case of 104*4882a593Smuzhiyun * active reset, skb should be NULL 105*4882a593Smuzhiyun */ 106*4882a593Smuzhiyun DEFINE_EVENT(tcp_event_sk_skb, tcp_send_reset, 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun TP_PROTO(const struct sock *sk, const struct sk_buff *skb), 109*4882a593Smuzhiyun 110*4882a593Smuzhiyun TP_ARGS(sk, skb) 111*4882a593Smuzhiyun ); 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun /* 114*4882a593Smuzhiyun * tcp event with arguments sk 115*4882a593Smuzhiyun * 116*4882a593Smuzhiyun * Note: this class requires a valid sk pointer. 117*4882a593Smuzhiyun */ 118*4882a593Smuzhiyun DECLARE_EVENT_CLASS(tcp_event_sk, 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun TP_PROTO(struct sock *sk), 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun TP_ARGS(sk), 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun TP_STRUCT__entry( 125*4882a593Smuzhiyun __field(const void *, skaddr) 126*4882a593Smuzhiyun __field(__u16, sport) 127*4882a593Smuzhiyun __field(__u16, dport) 128*4882a593Smuzhiyun __array(__u8, saddr, 4) 129*4882a593Smuzhiyun __array(__u8, daddr, 4) 130*4882a593Smuzhiyun __array(__u8, saddr_v6, 16) 131*4882a593Smuzhiyun __array(__u8, daddr_v6, 16) 132*4882a593Smuzhiyun __field(__u64, sock_cookie) 133*4882a593Smuzhiyun ), 134*4882a593Smuzhiyun 135*4882a593Smuzhiyun TP_fast_assign( 136*4882a593Smuzhiyun struct inet_sock *inet = inet_sk(sk); 137*4882a593Smuzhiyun __be32 *p32; 138*4882a593Smuzhiyun 139*4882a593Smuzhiyun __entry->skaddr = sk; 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun __entry->sport = ntohs(inet->inet_sport); 142*4882a593Smuzhiyun __entry->dport = ntohs(inet->inet_dport); 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun p32 = (__be32 *) __entry->saddr; 145*4882a593Smuzhiyun *p32 = inet->inet_saddr; 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun p32 = (__be32 *) __entry->daddr; 148*4882a593Smuzhiyun *p32 = inet->inet_daddr; 149*4882a593Smuzhiyun 150*4882a593Smuzhiyun TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr, 151*4882a593Smuzhiyun sk->sk_v6_rcv_saddr, sk->sk_v6_daddr); 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun __entry->sock_cookie = sock_gen_cookie(sk); 154*4882a593Smuzhiyun ), 155*4882a593Smuzhiyun 156*4882a593Smuzhiyun TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c sock_cookie=%llx", 157*4882a593Smuzhiyun __entry->sport, __entry->dport, 158*4882a593Smuzhiyun __entry->saddr, __entry->daddr, 159*4882a593Smuzhiyun __entry->saddr_v6, __entry->daddr_v6, 160*4882a593Smuzhiyun __entry->sock_cookie) 161*4882a593Smuzhiyun ); 162*4882a593Smuzhiyun 163*4882a593Smuzhiyun DEFINE_EVENT(tcp_event_sk, tcp_receive_reset, 164*4882a593Smuzhiyun 165*4882a593Smuzhiyun TP_PROTO(struct sock *sk), 166*4882a593Smuzhiyun 167*4882a593Smuzhiyun TP_ARGS(sk) 168*4882a593Smuzhiyun ); 169*4882a593Smuzhiyun 170*4882a593Smuzhiyun DEFINE_EVENT(tcp_event_sk, tcp_destroy_sock, 171*4882a593Smuzhiyun 172*4882a593Smuzhiyun TP_PROTO(struct sock *sk), 173*4882a593Smuzhiyun 174*4882a593Smuzhiyun TP_ARGS(sk) 175*4882a593Smuzhiyun ); 176*4882a593Smuzhiyun 177*4882a593Smuzhiyun DEFINE_EVENT(tcp_event_sk, tcp_rcv_space_adjust, 178*4882a593Smuzhiyun 179*4882a593Smuzhiyun TP_PROTO(struct sock *sk), 180*4882a593Smuzhiyun 181*4882a593Smuzhiyun TP_ARGS(sk) 182*4882a593Smuzhiyun ); 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun TRACE_EVENT(tcp_retransmit_synack, 185*4882a593Smuzhiyun 186*4882a593Smuzhiyun TP_PROTO(const struct sock *sk, const struct request_sock *req), 187*4882a593Smuzhiyun 188*4882a593Smuzhiyun TP_ARGS(sk, req), 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun TP_STRUCT__entry( 191*4882a593Smuzhiyun __field(const void *, skaddr) 192*4882a593Smuzhiyun __field(const void *, req) 193*4882a593Smuzhiyun __field(__u16, sport) 194*4882a593Smuzhiyun __field(__u16, dport) 195*4882a593Smuzhiyun __array(__u8, saddr, 4) 196*4882a593Smuzhiyun __array(__u8, daddr, 4) 197*4882a593Smuzhiyun __array(__u8, saddr_v6, 16) 198*4882a593Smuzhiyun __array(__u8, daddr_v6, 16) 199*4882a593Smuzhiyun ), 200*4882a593Smuzhiyun 201*4882a593Smuzhiyun TP_fast_assign( 202*4882a593Smuzhiyun struct inet_request_sock *ireq = inet_rsk(req); 203*4882a593Smuzhiyun __be32 *p32; 204*4882a593Smuzhiyun 205*4882a593Smuzhiyun __entry->skaddr = sk; 206*4882a593Smuzhiyun __entry->req = req; 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun __entry->sport = ireq->ir_num; 209*4882a593Smuzhiyun __entry->dport = ntohs(ireq->ir_rmt_port); 210*4882a593Smuzhiyun 211*4882a593Smuzhiyun p32 = (__be32 *) __entry->saddr; 212*4882a593Smuzhiyun *p32 = ireq->ir_loc_addr; 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun p32 = (__be32 *) __entry->daddr; 215*4882a593Smuzhiyun *p32 = ireq->ir_rmt_addr; 216*4882a593Smuzhiyun 217*4882a593Smuzhiyun TP_STORE_ADDRS(__entry, ireq->ir_loc_addr, ireq->ir_rmt_addr, 218*4882a593Smuzhiyun ireq->ir_v6_loc_addr, ireq->ir_v6_rmt_addr); 219*4882a593Smuzhiyun ), 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c", 222*4882a593Smuzhiyun __entry->sport, __entry->dport, 223*4882a593Smuzhiyun __entry->saddr, __entry->daddr, 224*4882a593Smuzhiyun __entry->saddr_v6, __entry->daddr_v6) 225*4882a593Smuzhiyun ); 226*4882a593Smuzhiyun 227*4882a593Smuzhiyun #include <trace/events/net_probe_common.h> 228*4882a593Smuzhiyun 229*4882a593Smuzhiyun TRACE_EVENT(tcp_probe, 230*4882a593Smuzhiyun 231*4882a593Smuzhiyun TP_PROTO(struct sock *sk, struct sk_buff *skb), 232*4882a593Smuzhiyun 233*4882a593Smuzhiyun TP_ARGS(sk, skb), 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun TP_STRUCT__entry( 236*4882a593Smuzhiyun /* sockaddr_in6 is always bigger than sockaddr_in */ 237*4882a593Smuzhiyun __array(__u8, saddr, sizeof(struct sockaddr_in6)) 238*4882a593Smuzhiyun __array(__u8, daddr, sizeof(struct sockaddr_in6)) 239*4882a593Smuzhiyun __field(__u16, sport) 240*4882a593Smuzhiyun __field(__u16, dport) 241*4882a593Smuzhiyun __field(__u32, mark) 242*4882a593Smuzhiyun __field(__u16, data_len) 243*4882a593Smuzhiyun __field(__u32, snd_nxt) 244*4882a593Smuzhiyun __field(__u32, snd_una) 245*4882a593Smuzhiyun __field(__u32, snd_cwnd) 246*4882a593Smuzhiyun __field(__u32, ssthresh) 247*4882a593Smuzhiyun __field(__u32, snd_wnd) 248*4882a593Smuzhiyun __field(__u32, srtt) 249*4882a593Smuzhiyun __field(__u32, rcv_wnd) 250*4882a593Smuzhiyun __field(__u64, sock_cookie) 251*4882a593Smuzhiyun ), 252*4882a593Smuzhiyun 253*4882a593Smuzhiyun TP_fast_assign( 254*4882a593Smuzhiyun const struct tcphdr *th = (const struct tcphdr *)skb->data; 255*4882a593Smuzhiyun const struct inet_sock *inet = inet_sk(sk); 256*4882a593Smuzhiyun const struct tcp_sock *tp = tcp_sk(sk); 257*4882a593Smuzhiyun 258*4882a593Smuzhiyun memset(__entry->saddr, 0, sizeof(struct sockaddr_in6)); 259*4882a593Smuzhiyun memset(__entry->daddr, 0, sizeof(struct sockaddr_in6)); 260*4882a593Smuzhiyun 261*4882a593Smuzhiyun TP_STORE_ADDR_PORTS(__entry, inet, sk); 262*4882a593Smuzhiyun 263*4882a593Smuzhiyun /* For filtering use */ 264*4882a593Smuzhiyun __entry->sport = ntohs(inet->inet_sport); 265*4882a593Smuzhiyun __entry->dport = ntohs(inet->inet_dport); 266*4882a593Smuzhiyun __entry->mark = skb->mark; 267*4882a593Smuzhiyun 268*4882a593Smuzhiyun __entry->data_len = skb->len - __tcp_hdrlen(th); 269*4882a593Smuzhiyun __entry->snd_nxt = tp->snd_nxt; 270*4882a593Smuzhiyun __entry->snd_una = tp->snd_una; 271*4882a593Smuzhiyun __entry->snd_cwnd = tp->snd_cwnd; 272*4882a593Smuzhiyun __entry->snd_wnd = tp->snd_wnd; 273*4882a593Smuzhiyun __entry->rcv_wnd = tp->rcv_wnd; 274*4882a593Smuzhiyun __entry->ssthresh = tcp_current_ssthresh(sk); 275*4882a593Smuzhiyun __entry->srtt = tp->srtt_us >> 3; 276*4882a593Smuzhiyun __entry->sock_cookie = sock_gen_cookie(sk); 277*4882a593Smuzhiyun ), 278*4882a593Smuzhiyun 279*4882a593Smuzhiyun TP_printk("src=%pISpc dest=%pISpc mark=%#x data_len=%d snd_nxt=%#x snd_una=%#x snd_cwnd=%u ssthresh=%u snd_wnd=%u srtt=%u rcv_wnd=%u sock_cookie=%llx", 280*4882a593Smuzhiyun __entry->saddr, __entry->daddr, __entry->mark, 281*4882a593Smuzhiyun __entry->data_len, __entry->snd_nxt, __entry->snd_una, 282*4882a593Smuzhiyun __entry->snd_cwnd, __entry->ssthresh, __entry->snd_wnd, 283*4882a593Smuzhiyun __entry->srtt, __entry->rcv_wnd, __entry->sock_cookie) 284*4882a593Smuzhiyun ); 285*4882a593Smuzhiyun 286*4882a593Smuzhiyun #endif /* _TRACE_TCP_H */ 287*4882a593Smuzhiyun 288*4882a593Smuzhiyun /* This part must be outside protection */ 289*4882a593Smuzhiyun #include <trace/define_trace.h> 290