1c3fde1bdSMasami Hiramatsu /* SPDX-License-Identifier: GPL-2.0 */ 2e086101bSCong Wang #undef TRACE_SYSTEM 3e086101bSCong Wang #define TRACE_SYSTEM tcp 4e086101bSCong Wang 5e086101bSCong Wang #if !defined(_TRACE_TCP_H) || defined(TRACE_HEADER_MULTI_READ) 6e086101bSCong Wang #define _TRACE_TCP_H 7e086101bSCong Wang 8e086101bSCong Wang #include <linux/ipv6.h> 9e086101bSCong Wang #include <linux/tcp.h> 10e086101bSCong Wang #include <linux/tracepoint.h> 11e086101bSCong Wang #include <net/ipv6.h> 12c3fde1bdSMasami Hiramatsu #include <net/tcp.h> 136163849dSYafang Shao #include <linux/sock_diag.h> 14e086101bSCong Wang 156a6b0b99SMat Martineau #define TP_STORE_V4MAPPED(__entry, saddr, daddr) \ 166a6b0b99SMat Martineau do { \ 176a6b0b99SMat Martineau struct in6_addr *pin6; \ 186a6b0b99SMat Martineau \ 196a6b0b99SMat Martineau pin6 = (struct in6_addr *)__entry->saddr_v6; \ 206a6b0b99SMat Martineau ipv6_addr_set_v4mapped(saddr, pin6); \ 216a6b0b99SMat Martineau pin6 = (struct in6_addr *)__entry->daddr_v6; \ 226a6b0b99SMat Martineau ipv6_addr_set_v4mapped(daddr, pin6); \ 236a6b0b99SMat Martineau } while (0) 246a6b0b99SMat Martineau 256a6b0b99SMat Martineau #if IS_ENABLED(CONFIG_IPV6) 266a6b0b99SMat Martineau #define TP_STORE_ADDRS(__entry, saddr, daddr, saddr6, daddr6) \ 276a6b0b99SMat Martineau do { \ 286a6b0b99SMat Martineau if (sk->sk_family == AF_INET6) { \ 296a6b0b99SMat Martineau struct in6_addr *pin6; \ 306a6b0b99SMat Martineau \ 316a6b0b99SMat Martineau pin6 = (struct in6_addr *)__entry->saddr_v6; \ 326a6b0b99SMat Martineau *pin6 = saddr6; \ 336a6b0b99SMat Martineau pin6 = (struct in6_addr *)__entry->daddr_v6; \ 346a6b0b99SMat Martineau *pin6 = daddr6; \ 356a6b0b99SMat Martineau } else { \ 366a6b0b99SMat Martineau TP_STORE_V4MAPPED(__entry, saddr, daddr); \ 376a6b0b99SMat Martineau } \ 386a6b0b99SMat Martineau } while (0) 396a6b0b99SMat Martineau #else 406a6b0b99SMat Martineau #define TP_STORE_ADDRS(__entry, saddr, daddr, saddr6, daddr6) \ 416a6b0b99SMat Martineau TP_STORE_V4MAPPED(__entry, saddr, daddr) 426a6b0b99SMat Martineau #endif 436a6b0b99SMat Martineau 44f6e37b25SSong Liu /* 45f6e37b25SSong Liu * tcp event with arguments sk and skb 46f6e37b25SSong Liu * 47f6e37b25SSong Liu * Note: this class requires a valid sk pointer; while skb pointer could 48f6e37b25SSong Liu * be NULL. 49f6e37b25SSong Liu */ 50f6e37b25SSong Liu DECLARE_EVENT_CLASS(tcp_event_sk_skb, 51e086101bSCong Wang 527344e29fSSong Liu TP_PROTO(const struct sock *sk, const struct sk_buff *skb), 53e086101bSCong Wang 54e086101bSCong Wang TP_ARGS(sk, skb), 55e086101bSCong Wang 56e086101bSCong Wang TP_STRUCT__entry( 577344e29fSSong Liu __field(const void *, skbaddr) 587344e29fSSong Liu __field(const void *, skaddr) 59af4325ecSYafang Shao __field(int, state) 60e086101bSCong Wang __field(__u16, sport) 61e086101bSCong Wang __field(__u16, dport) 623dd344eaSHariharan Ananthakrishnan __field(__u16, family) 63e086101bSCong Wang __array(__u8, saddr, 4) 64e086101bSCong Wang __array(__u8, daddr, 4) 65e086101bSCong Wang __array(__u8, saddr_v6, 16) 66e086101bSCong Wang __array(__u8, daddr_v6, 16) 67e086101bSCong Wang ), 68e086101bSCong Wang 69e086101bSCong Wang TP_fast_assign( 70abc17a11SEric Dumazet const struct inet_sock *inet = inet_sk(sk); 71e086101bSCong Wang __be32 *p32; 72e086101bSCong Wang 73e086101bSCong Wang __entry->skbaddr = skb; 74e086101bSCong Wang __entry->skaddr = sk; 75af4325ecSYafang Shao __entry->state = sk->sk_state; 76e086101bSCong Wang 77e086101bSCong Wang __entry->sport = ntohs(inet->inet_sport); 78e086101bSCong Wang __entry->dport = ntohs(inet->inet_dport); 793dd344eaSHariharan Ananthakrishnan __entry->family = sk->sk_family; 80e086101bSCong Wang 81e086101bSCong Wang p32 = (__be32 *) __entry->saddr; 82e086101bSCong Wang *p32 = inet->inet_saddr; 83e086101bSCong Wang 84e086101bSCong Wang p32 = (__be32 *) __entry->daddr; 85e086101bSCong Wang *p32 = inet->inet_daddr; 86e086101bSCong Wang 876a6b0b99SMat Martineau TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr, 886a6b0b99SMat Martineau sk->sk_v6_rcv_saddr, sk->sk_v6_daddr); 89e086101bSCong Wang ), 90e086101bSCong Wang 913dd344eaSHariharan Ananthakrishnan TP_printk("family=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c state=%s", 923dd344eaSHariharan Ananthakrishnan show_family_name(__entry->family), 93e086101bSCong Wang __entry->sport, __entry->dport, __entry->saddr, __entry->daddr, 94af4325ecSYafang Shao __entry->saddr_v6, __entry->daddr_v6, 95af4325ecSYafang Shao show_tcp_state_name(__entry->state)) 96e086101bSCong Wang ); 97e086101bSCong Wang 98f6e37b25SSong Liu DEFINE_EVENT(tcp_event_sk_skb, tcp_retransmit_skb, 99f6e37b25SSong Liu 1007344e29fSSong Liu TP_PROTO(const struct sock *sk, const struct sk_buff *skb), 101f6e37b25SSong Liu 102f6e37b25SSong Liu TP_ARGS(sk, skb) 103f6e37b25SSong Liu ); 104f6e37b25SSong Liu 105c24b14c4SSong Liu /* 106c24b14c4SSong Liu * skb of trace_tcp_send_reset is the skb that caused RST. In case of 107c24b14c4SSong Liu * active reset, skb should be NULL 108c24b14c4SSong Liu */ 109c24b14c4SSong Liu DEFINE_EVENT(tcp_event_sk_skb, tcp_send_reset, 110c24b14c4SSong Liu 111c24b14c4SSong Liu TP_PROTO(const struct sock *sk, const struct sk_buff *skb), 112c24b14c4SSong Liu 113c24b14c4SSong Liu TP_ARGS(sk, skb) 114c24b14c4SSong Liu ); 115c24b14c4SSong Liu 1165941521cSSong Liu /* 1175941521cSSong Liu * tcp event with arguments sk 1185941521cSSong Liu * 1195941521cSSong Liu * Note: this class requires a valid sk pointer. 1205941521cSSong Liu */ 1215941521cSSong Liu DECLARE_EVENT_CLASS(tcp_event_sk, 1225941521cSSong Liu 1236163849dSYafang Shao TP_PROTO(struct sock *sk), 1245941521cSSong Liu 1255941521cSSong Liu TP_ARGS(sk), 1265941521cSSong Liu 1275941521cSSong Liu TP_STRUCT__entry( 1285941521cSSong Liu __field(const void *, skaddr) 1295941521cSSong Liu __field(__u16, sport) 1305941521cSSong Liu __field(__u16, dport) 1313dd344eaSHariharan Ananthakrishnan __field(__u16, family) 1325941521cSSong Liu __array(__u8, saddr, 4) 1335941521cSSong Liu __array(__u8, daddr, 4) 1345941521cSSong Liu __array(__u8, saddr_v6, 16) 1355941521cSSong Liu __array(__u8, daddr_v6, 16) 1366163849dSYafang Shao __field(__u64, sock_cookie) 1375941521cSSong Liu ), 1385941521cSSong Liu 1395941521cSSong Liu TP_fast_assign( 1405941521cSSong Liu struct inet_sock *inet = inet_sk(sk); 1415941521cSSong Liu __be32 *p32; 1425941521cSSong Liu 1435941521cSSong Liu __entry->skaddr = sk; 1445941521cSSong Liu 1455941521cSSong Liu __entry->sport = ntohs(inet->inet_sport); 1465941521cSSong Liu __entry->dport = ntohs(inet->inet_dport); 1473dd344eaSHariharan Ananthakrishnan __entry->family = sk->sk_family; 1485941521cSSong Liu 1495941521cSSong Liu p32 = (__be32 *) __entry->saddr; 1505941521cSSong Liu *p32 = inet->inet_saddr; 1515941521cSSong Liu 1525941521cSSong Liu p32 = (__be32 *) __entry->daddr; 1535941521cSSong Liu *p32 = inet->inet_daddr; 1545941521cSSong Liu 1556a6b0b99SMat Martineau TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr, 1566a6b0b99SMat Martineau sk->sk_v6_rcv_saddr, sk->sk_v6_daddr); 1576163849dSYafang Shao 1586163849dSYafang Shao __entry->sock_cookie = sock_gen_cookie(sk); 1595941521cSSong Liu ), 1605941521cSSong Liu 1613dd344eaSHariharan Ananthakrishnan TP_printk("family=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c sock_cookie=%llx", 1623dd344eaSHariharan Ananthakrishnan show_family_name(__entry->family), 1635941521cSSong Liu __entry->sport, __entry->dport, 1645941521cSSong Liu __entry->saddr, __entry->daddr, 1656163849dSYafang Shao __entry->saddr_v6, __entry->daddr_v6, 1666163849dSYafang Shao __entry->sock_cookie) 1675941521cSSong Liu ); 1685941521cSSong Liu 1695941521cSSong Liu DEFINE_EVENT(tcp_event_sk, tcp_receive_reset, 1705941521cSSong Liu 1716163849dSYafang Shao TP_PROTO(struct sock *sk), 1725941521cSSong Liu 1735941521cSSong Liu TP_ARGS(sk) 1745941521cSSong Liu ); 1755941521cSSong Liu 176e1a4aa50SSong Liu DEFINE_EVENT(tcp_event_sk, tcp_destroy_sock, 177e1a4aa50SSong Liu 1786163849dSYafang Shao TP_PROTO(struct sock *sk), 1796163849dSYafang Shao 1806163849dSYafang Shao TP_ARGS(sk) 1816163849dSYafang Shao ); 1826163849dSYafang Shao 1836163849dSYafang Shao DEFINE_EVENT(tcp_event_sk, tcp_rcv_space_adjust, 1846163849dSYafang Shao 1856163849dSYafang Shao TP_PROTO(struct sock *sk), 186e1a4aa50SSong Liu 187e1a4aa50SSong Liu TP_ARGS(sk) 188e1a4aa50SSong Liu ); 189e1a4aa50SSong Liu 190cf34ce3dSSong Liu TRACE_EVENT(tcp_retransmit_synack, 191cf34ce3dSSong Liu 192cf34ce3dSSong Liu TP_PROTO(const struct sock *sk, const struct request_sock *req), 193cf34ce3dSSong Liu 194cf34ce3dSSong Liu TP_ARGS(sk, req), 195cf34ce3dSSong Liu 196cf34ce3dSSong Liu TP_STRUCT__entry( 197cf34ce3dSSong Liu __field(const void *, skaddr) 198cf34ce3dSSong Liu __field(const void *, req) 199cf34ce3dSSong Liu __field(__u16, sport) 200cf34ce3dSSong Liu __field(__u16, dport) 2013dd344eaSHariharan Ananthakrishnan __field(__u16, family) 202cf34ce3dSSong Liu __array(__u8, saddr, 4) 203cf34ce3dSSong Liu __array(__u8, daddr, 4) 204cf34ce3dSSong Liu __array(__u8, saddr_v6, 16) 205cf34ce3dSSong Liu __array(__u8, daddr_v6, 16) 206cf34ce3dSSong Liu ), 207cf34ce3dSSong Liu 208cf34ce3dSSong Liu TP_fast_assign( 209cf34ce3dSSong Liu struct inet_request_sock *ireq = inet_rsk(req); 210cf34ce3dSSong Liu __be32 *p32; 211cf34ce3dSSong Liu 212cf34ce3dSSong Liu __entry->skaddr = sk; 213cf34ce3dSSong Liu __entry->req = req; 214cf34ce3dSSong Liu 215cf34ce3dSSong Liu __entry->sport = ireq->ir_num; 216cf34ce3dSSong Liu __entry->dport = ntohs(ireq->ir_rmt_port); 2173dd344eaSHariharan Ananthakrishnan __entry->family = sk->sk_family; 218cf34ce3dSSong Liu 219cf34ce3dSSong Liu p32 = (__be32 *) __entry->saddr; 220cf34ce3dSSong Liu *p32 = ireq->ir_loc_addr; 221cf34ce3dSSong Liu 222cf34ce3dSSong Liu p32 = (__be32 *) __entry->daddr; 223cf34ce3dSSong Liu *p32 = ireq->ir_rmt_addr; 224cf34ce3dSSong Liu 2256a6b0b99SMat Martineau TP_STORE_ADDRS(__entry, ireq->ir_loc_addr, ireq->ir_rmt_addr, 2266a6b0b99SMat Martineau ireq->ir_v6_loc_addr, ireq->ir_v6_rmt_addr); 227cf34ce3dSSong Liu ), 228cf34ce3dSSong Liu 2293dd344eaSHariharan Ananthakrishnan TP_printk("family=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c", 2303dd344eaSHariharan Ananthakrishnan show_family_name(__entry->family), 231cf34ce3dSSong Liu __entry->sport, __entry->dport, 232cf34ce3dSSong Liu __entry->saddr, __entry->daddr, 233cf34ce3dSSong Liu __entry->saddr_v6, __entry->daddr_v6) 234cf34ce3dSSong Liu ); 235cf34ce3dSSong Liu 236ee549be6SMasami Hiramatsu #include <trace/events/net_probe_common.h> 237c3fde1bdSMasami Hiramatsu 238c3fde1bdSMasami Hiramatsu TRACE_EVENT(tcp_probe, 239c3fde1bdSMasami Hiramatsu 240c3fde1bdSMasami Hiramatsu TP_PROTO(struct sock *sk, struct sk_buff *skb), 241c3fde1bdSMasami Hiramatsu 242c3fde1bdSMasami Hiramatsu TP_ARGS(sk, skb), 243c3fde1bdSMasami Hiramatsu 244c3fde1bdSMasami Hiramatsu TP_STRUCT__entry( 245c3fde1bdSMasami Hiramatsu /* sockaddr_in6 is always bigger than sockaddr_in */ 246c3fde1bdSMasami Hiramatsu __array(__u8, saddr, sizeof(struct sockaddr_in6)) 247c3fde1bdSMasami Hiramatsu __array(__u8, daddr, sizeof(struct sockaddr_in6)) 248c3fde1bdSMasami Hiramatsu __field(__u16, sport) 249c3fde1bdSMasami Hiramatsu __field(__u16, dport) 2503dd344eaSHariharan Ananthakrishnan __field(__u16, family) 251c3fde1bdSMasami Hiramatsu __field(__u32, mark) 2522d68c074SYafang Shao __field(__u16, data_len) 253c3fde1bdSMasami Hiramatsu __field(__u32, snd_nxt) 254c3fde1bdSMasami Hiramatsu __field(__u32, snd_una) 255c3fde1bdSMasami Hiramatsu __field(__u32, snd_cwnd) 256c3fde1bdSMasami Hiramatsu __field(__u32, ssthresh) 257c3fde1bdSMasami Hiramatsu __field(__u32, snd_wnd) 258c3fde1bdSMasami Hiramatsu __field(__u32, srtt) 259c3fde1bdSMasami Hiramatsu __field(__u32, rcv_wnd) 2606163849dSYafang Shao __field(__u64, sock_cookie) 261c3fde1bdSMasami Hiramatsu ), 262c3fde1bdSMasami Hiramatsu 263c3fde1bdSMasami Hiramatsu TP_fast_assign( 2643d97d88eSYafang Shao const struct tcphdr *th = (const struct tcphdr *)skb->data; 265c3fde1bdSMasami Hiramatsu const struct inet_sock *inet = inet_sk(sk); 2663d97d88eSYafang Shao const struct tcp_sock *tp = tcp_sk(sk); 267c3fde1bdSMasami Hiramatsu 268c3fde1bdSMasami Hiramatsu memset(__entry->saddr, 0, sizeof(struct sockaddr_in6)); 269c3fde1bdSMasami Hiramatsu memset(__entry->daddr, 0, sizeof(struct sockaddr_in6)); 270c3fde1bdSMasami Hiramatsu 271c3fde1bdSMasami Hiramatsu TP_STORE_ADDR_PORTS(__entry, inet, sk); 272c3fde1bdSMasami Hiramatsu 273c3fde1bdSMasami Hiramatsu /* For filtering use */ 274c3fde1bdSMasami Hiramatsu __entry->sport = ntohs(inet->inet_sport); 275c3fde1bdSMasami Hiramatsu __entry->dport = ntohs(inet->inet_dport); 276c3fde1bdSMasami Hiramatsu __entry->mark = skb->mark; 2773dd344eaSHariharan Ananthakrishnan __entry->family = sk->sk_family; 278c3fde1bdSMasami Hiramatsu 2793d97d88eSYafang Shao __entry->data_len = skb->len - __tcp_hdrlen(th); 280c3fde1bdSMasami Hiramatsu __entry->snd_nxt = tp->snd_nxt; 281c3fde1bdSMasami Hiramatsu __entry->snd_una = tp->snd_una; 28240570375SEric Dumazet __entry->snd_cwnd = tcp_snd_cwnd(tp); 283c3fde1bdSMasami Hiramatsu __entry->snd_wnd = tp->snd_wnd; 284c3fde1bdSMasami Hiramatsu __entry->rcv_wnd = tp->rcv_wnd; 285c3fde1bdSMasami Hiramatsu __entry->ssthresh = tcp_current_ssthresh(sk); 286c3fde1bdSMasami Hiramatsu __entry->srtt = tp->srtt_us >> 3; 2876163849dSYafang Shao __entry->sock_cookie = sock_gen_cookie(sk); 288c3fde1bdSMasami Hiramatsu ), 289c3fde1bdSMasami Hiramatsu 2903dd344eaSHariharan Ananthakrishnan TP_printk("family=%s 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", 2913dd344eaSHariharan Ananthakrishnan show_family_name(__entry->family), 292c3fde1bdSMasami Hiramatsu __entry->saddr, __entry->daddr, __entry->mark, 2932d68c074SYafang Shao __entry->data_len, __entry->snd_nxt, __entry->snd_una, 294c3fde1bdSMasami Hiramatsu __entry->snd_cwnd, __entry->ssthresh, __entry->snd_wnd, 2956163849dSYafang Shao __entry->srtt, __entry->rcv_wnd, __entry->sock_cookie) 296c3fde1bdSMasami Hiramatsu ); 297c3fde1bdSMasami Hiramatsu 298709c0314SJakub Kicinski #define TP_STORE_ADDR_PORTS_SKB_V4(__entry, skb) \ 299709c0314SJakub Kicinski do { \ 300709c0314SJakub Kicinski const struct tcphdr *th = (const struct tcphdr *)skb->data; \ 301709c0314SJakub Kicinski struct sockaddr_in *v4 = (void *)__entry->saddr; \ 302709c0314SJakub Kicinski \ 303709c0314SJakub Kicinski v4->sin_family = AF_INET; \ 304709c0314SJakub Kicinski v4->sin_port = th->source; \ 305709c0314SJakub Kicinski v4->sin_addr.s_addr = ip_hdr(skb)->saddr; \ 306709c0314SJakub Kicinski v4 = (void *)__entry->daddr; \ 307709c0314SJakub Kicinski v4->sin_family = AF_INET; \ 308709c0314SJakub Kicinski v4->sin_port = th->dest; \ 309709c0314SJakub Kicinski v4->sin_addr.s_addr = ip_hdr(skb)->daddr; \ 310709c0314SJakub Kicinski } while (0) 311709c0314SJakub Kicinski 312709c0314SJakub Kicinski #if IS_ENABLED(CONFIG_IPV6) 313709c0314SJakub Kicinski 314709c0314SJakub Kicinski #define TP_STORE_ADDR_PORTS_SKB(__entry, skb) \ 315709c0314SJakub Kicinski do { \ 316709c0314SJakub Kicinski const struct iphdr *iph = ip_hdr(skb); \ 317709c0314SJakub Kicinski \ 318709c0314SJakub Kicinski if (iph->version == 6) { \ 319709c0314SJakub Kicinski const struct tcphdr *th = (const struct tcphdr *)skb->data; \ 320709c0314SJakub Kicinski struct sockaddr_in6 *v6 = (void *)__entry->saddr; \ 321709c0314SJakub Kicinski \ 322709c0314SJakub Kicinski v6->sin6_family = AF_INET6; \ 323709c0314SJakub Kicinski v6->sin6_port = th->source; \ 324709c0314SJakub Kicinski v6->sin6_addr = ipv6_hdr(skb)->saddr; \ 325709c0314SJakub Kicinski v6 = (void *)__entry->daddr; \ 326709c0314SJakub Kicinski v6->sin6_family = AF_INET6; \ 327709c0314SJakub Kicinski v6->sin6_port = th->dest; \ 328709c0314SJakub Kicinski v6->sin6_addr = ipv6_hdr(skb)->daddr; \ 329709c0314SJakub Kicinski } else \ 330709c0314SJakub Kicinski TP_STORE_ADDR_PORTS_SKB_V4(__entry, skb); \ 331709c0314SJakub Kicinski } while (0) 332709c0314SJakub Kicinski 333709c0314SJakub Kicinski #else 334709c0314SJakub Kicinski 335709c0314SJakub Kicinski #define TP_STORE_ADDR_PORTS_SKB(__entry, skb) \ 336709c0314SJakub Kicinski TP_STORE_ADDR_PORTS_SKB_V4(__entry, skb) 337709c0314SJakub Kicinski 338709c0314SJakub Kicinski #endif 339709c0314SJakub Kicinski 340709c0314SJakub Kicinski /* 341709c0314SJakub Kicinski * tcp event with only skb 342709c0314SJakub Kicinski */ 343709c0314SJakub Kicinski DECLARE_EVENT_CLASS(tcp_event_skb, 344709c0314SJakub Kicinski 345709c0314SJakub Kicinski TP_PROTO(const struct sk_buff *skb), 346709c0314SJakub Kicinski 347709c0314SJakub Kicinski TP_ARGS(skb), 348709c0314SJakub Kicinski 349709c0314SJakub Kicinski TP_STRUCT__entry( 350709c0314SJakub Kicinski __field(const void *, skbaddr) 351709c0314SJakub Kicinski __array(__u8, saddr, sizeof(struct sockaddr_in6)) 352709c0314SJakub Kicinski __array(__u8, daddr, sizeof(struct sockaddr_in6)) 353709c0314SJakub Kicinski ), 354709c0314SJakub Kicinski 355709c0314SJakub Kicinski TP_fast_assign( 356709c0314SJakub Kicinski __entry->skbaddr = skb; 357709c0314SJakub Kicinski 358709c0314SJakub Kicinski memset(__entry->saddr, 0, sizeof(struct sockaddr_in6)); 359709c0314SJakub Kicinski memset(__entry->daddr, 0, sizeof(struct sockaddr_in6)); 360709c0314SJakub Kicinski 361709c0314SJakub Kicinski TP_STORE_ADDR_PORTS_SKB(__entry, skb); 362709c0314SJakub Kicinski ), 363709c0314SJakub Kicinski 364709c0314SJakub Kicinski TP_printk("src=%pISpc dest=%pISpc", __entry->saddr, __entry->daddr) 365709c0314SJakub Kicinski ); 366709c0314SJakub Kicinski 367709c0314SJakub Kicinski DEFINE_EVENT(tcp_event_skb, tcp_bad_csum, 368709c0314SJakub Kicinski 369709c0314SJakub Kicinski TP_PROTO(const struct sk_buff *skb), 370709c0314SJakub Kicinski 371709c0314SJakub Kicinski TP_ARGS(skb) 372709c0314SJakub Kicinski ); 373709c0314SJakub Kicinski 37415fcdf6aSPing Gan TRACE_EVENT(tcp_cong_state_set, 37515fcdf6aSPing Gan 37615fcdf6aSPing Gan TP_PROTO(struct sock *sk, const u8 ca_state), 37715fcdf6aSPing Gan 37815fcdf6aSPing Gan TP_ARGS(sk, ca_state), 37915fcdf6aSPing Gan 38015fcdf6aSPing Gan TP_STRUCT__entry( 38115fcdf6aSPing Gan __field(const void *, skaddr) 38215fcdf6aSPing Gan __field(__u16, sport) 38315fcdf6aSPing Gan __field(__u16, dport) 384*8a70ed95SEric Dumazet __field(__u16, family) 38515fcdf6aSPing Gan __array(__u8, saddr, 4) 38615fcdf6aSPing Gan __array(__u8, daddr, 4) 38715fcdf6aSPing Gan __array(__u8, saddr_v6, 16) 38815fcdf6aSPing Gan __array(__u8, daddr_v6, 16) 38915fcdf6aSPing Gan __field(__u8, cong_state) 39015fcdf6aSPing Gan ), 39115fcdf6aSPing Gan 39215fcdf6aSPing Gan TP_fast_assign( 39315fcdf6aSPing Gan struct inet_sock *inet = inet_sk(sk); 39415fcdf6aSPing Gan __be32 *p32; 39515fcdf6aSPing Gan 39615fcdf6aSPing Gan __entry->skaddr = sk; 39715fcdf6aSPing Gan 39815fcdf6aSPing Gan __entry->sport = ntohs(inet->inet_sport); 39915fcdf6aSPing Gan __entry->dport = ntohs(inet->inet_dport); 400*8a70ed95SEric Dumazet __entry->family = sk->sk_family; 40115fcdf6aSPing Gan 40215fcdf6aSPing Gan p32 = (__be32 *) __entry->saddr; 40315fcdf6aSPing Gan *p32 = inet->inet_saddr; 40415fcdf6aSPing Gan 40515fcdf6aSPing Gan p32 = (__be32 *) __entry->daddr; 40615fcdf6aSPing Gan *p32 = inet->inet_daddr; 40715fcdf6aSPing Gan 40815fcdf6aSPing Gan TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr, 40915fcdf6aSPing Gan sk->sk_v6_rcv_saddr, sk->sk_v6_daddr); 41015fcdf6aSPing Gan 41115fcdf6aSPing Gan __entry->cong_state = ca_state; 41215fcdf6aSPing Gan ), 41315fcdf6aSPing Gan 414*8a70ed95SEric Dumazet TP_printk("family=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c cong_state=%u", 415*8a70ed95SEric Dumazet show_family_name(__entry->family), 41615fcdf6aSPing Gan __entry->sport, __entry->dport, 41715fcdf6aSPing Gan __entry->saddr, __entry->daddr, 41815fcdf6aSPing Gan __entry->saddr_v6, __entry->daddr_v6, 41915fcdf6aSPing Gan __entry->cong_state) 42015fcdf6aSPing Gan ); 42115fcdf6aSPing Gan 422e086101bSCong Wang #endif /* _TRACE_TCP_H */ 423e086101bSCong Wang 424e086101bSCong Wang /* This part must be outside protection */ 425e086101bSCong Wang #include <trace/define_trace.h> 426