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) 59e086101bSCong Wang __field(__u16, sport) 60e086101bSCong Wang __field(__u16, dport) 61e086101bSCong Wang __array(__u8, saddr, 4) 62e086101bSCong Wang __array(__u8, daddr, 4) 63e086101bSCong Wang __array(__u8, saddr_v6, 16) 64e086101bSCong Wang __array(__u8, daddr_v6, 16) 65e086101bSCong Wang ), 66e086101bSCong Wang 67e086101bSCong Wang TP_fast_assign( 68e086101bSCong Wang struct inet_sock *inet = inet_sk(sk); 69e086101bSCong Wang __be32 *p32; 70e086101bSCong Wang 71e086101bSCong Wang __entry->skbaddr = skb; 72e086101bSCong Wang __entry->skaddr = sk; 73e086101bSCong Wang 74e086101bSCong Wang __entry->sport = ntohs(inet->inet_sport); 75e086101bSCong Wang __entry->dport = ntohs(inet->inet_dport); 76e086101bSCong Wang 77e086101bSCong Wang p32 = (__be32 *) __entry->saddr; 78e086101bSCong Wang *p32 = inet->inet_saddr; 79e086101bSCong Wang 80e086101bSCong Wang p32 = (__be32 *) __entry->daddr; 81e086101bSCong Wang *p32 = inet->inet_daddr; 82e086101bSCong Wang 836a6b0b99SMat Martineau TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr, 846a6b0b99SMat Martineau sk->sk_v6_rcv_saddr, sk->sk_v6_daddr); 85e086101bSCong Wang ), 86e086101bSCong Wang 87fb6ff75eSDavid Ahern TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c", 88e086101bSCong Wang __entry->sport, __entry->dport, __entry->saddr, __entry->daddr, 89e086101bSCong Wang __entry->saddr_v6, __entry->daddr_v6) 90e086101bSCong Wang ); 91e086101bSCong Wang 92f6e37b25SSong Liu DEFINE_EVENT(tcp_event_sk_skb, tcp_retransmit_skb, 93f6e37b25SSong Liu 947344e29fSSong Liu TP_PROTO(const struct sock *sk, const struct sk_buff *skb), 95f6e37b25SSong Liu 96f6e37b25SSong Liu TP_ARGS(sk, skb) 97f6e37b25SSong Liu ); 98f6e37b25SSong Liu 99c24b14c4SSong Liu /* 100c24b14c4SSong Liu * skb of trace_tcp_send_reset is the skb that caused RST. In case of 101c24b14c4SSong Liu * active reset, skb should be NULL 102c24b14c4SSong Liu */ 103c24b14c4SSong Liu DEFINE_EVENT(tcp_event_sk_skb, tcp_send_reset, 104c24b14c4SSong Liu 105c24b14c4SSong Liu TP_PROTO(const struct sock *sk, const struct sk_buff *skb), 106c24b14c4SSong Liu 107c24b14c4SSong Liu TP_ARGS(sk, skb) 108c24b14c4SSong Liu ); 109c24b14c4SSong Liu 1105941521cSSong Liu /* 1115941521cSSong Liu * tcp event with arguments sk 1125941521cSSong Liu * 1135941521cSSong Liu * Note: this class requires a valid sk pointer. 1145941521cSSong Liu */ 1155941521cSSong Liu DECLARE_EVENT_CLASS(tcp_event_sk, 1165941521cSSong Liu 1176163849dSYafang Shao TP_PROTO(struct sock *sk), 1185941521cSSong Liu 1195941521cSSong Liu TP_ARGS(sk), 1205941521cSSong Liu 1215941521cSSong Liu TP_STRUCT__entry( 1225941521cSSong Liu __field(const void *, skaddr) 1235941521cSSong Liu __field(__u16, sport) 1245941521cSSong Liu __field(__u16, dport) 1255941521cSSong Liu __array(__u8, saddr, 4) 1265941521cSSong Liu __array(__u8, daddr, 4) 1275941521cSSong Liu __array(__u8, saddr_v6, 16) 1285941521cSSong Liu __array(__u8, daddr_v6, 16) 1296163849dSYafang Shao __field(__u64, sock_cookie) 1305941521cSSong Liu ), 1315941521cSSong Liu 1325941521cSSong Liu TP_fast_assign( 1335941521cSSong Liu struct inet_sock *inet = inet_sk(sk); 1345941521cSSong Liu __be32 *p32; 1355941521cSSong Liu 1365941521cSSong Liu __entry->skaddr = sk; 1375941521cSSong Liu 1385941521cSSong Liu __entry->sport = ntohs(inet->inet_sport); 1395941521cSSong Liu __entry->dport = ntohs(inet->inet_dport); 1405941521cSSong Liu 1415941521cSSong Liu p32 = (__be32 *) __entry->saddr; 1425941521cSSong Liu *p32 = inet->inet_saddr; 1435941521cSSong Liu 1445941521cSSong Liu p32 = (__be32 *) __entry->daddr; 1455941521cSSong Liu *p32 = inet->inet_daddr; 1465941521cSSong Liu 1476a6b0b99SMat Martineau TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr, 1486a6b0b99SMat Martineau sk->sk_v6_rcv_saddr, sk->sk_v6_daddr); 1496163849dSYafang Shao 1506163849dSYafang Shao __entry->sock_cookie = sock_gen_cookie(sk); 1515941521cSSong Liu ), 1525941521cSSong Liu 1536163849dSYafang Shao TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c sock_cookie=%llx", 1545941521cSSong Liu __entry->sport, __entry->dport, 1555941521cSSong Liu __entry->saddr, __entry->daddr, 1566163849dSYafang Shao __entry->saddr_v6, __entry->daddr_v6, 1576163849dSYafang Shao __entry->sock_cookie) 1585941521cSSong Liu ); 1595941521cSSong Liu 1605941521cSSong Liu DEFINE_EVENT(tcp_event_sk, tcp_receive_reset, 1615941521cSSong Liu 1626163849dSYafang Shao TP_PROTO(struct sock *sk), 1635941521cSSong Liu 1645941521cSSong Liu TP_ARGS(sk) 1655941521cSSong Liu ); 1665941521cSSong Liu 167e1a4aa50SSong Liu DEFINE_EVENT(tcp_event_sk, tcp_destroy_sock, 168e1a4aa50SSong Liu 1696163849dSYafang Shao TP_PROTO(struct sock *sk), 1706163849dSYafang Shao 1716163849dSYafang Shao TP_ARGS(sk) 1726163849dSYafang Shao ); 1736163849dSYafang Shao 1746163849dSYafang Shao DEFINE_EVENT(tcp_event_sk, tcp_rcv_space_adjust, 1756163849dSYafang Shao 1766163849dSYafang Shao TP_PROTO(struct sock *sk), 177e1a4aa50SSong Liu 178e1a4aa50SSong Liu TP_ARGS(sk) 179e1a4aa50SSong Liu ); 180e1a4aa50SSong Liu 181cf34ce3dSSong Liu TRACE_EVENT(tcp_retransmit_synack, 182cf34ce3dSSong Liu 183cf34ce3dSSong Liu TP_PROTO(const struct sock *sk, const struct request_sock *req), 184cf34ce3dSSong Liu 185cf34ce3dSSong Liu TP_ARGS(sk, req), 186cf34ce3dSSong Liu 187cf34ce3dSSong Liu TP_STRUCT__entry( 188cf34ce3dSSong Liu __field(const void *, skaddr) 189cf34ce3dSSong Liu __field(const void *, req) 190cf34ce3dSSong Liu __field(__u16, sport) 191cf34ce3dSSong Liu __field(__u16, dport) 192cf34ce3dSSong Liu __array(__u8, saddr, 4) 193cf34ce3dSSong Liu __array(__u8, daddr, 4) 194cf34ce3dSSong Liu __array(__u8, saddr_v6, 16) 195cf34ce3dSSong Liu __array(__u8, daddr_v6, 16) 196cf34ce3dSSong Liu ), 197cf34ce3dSSong Liu 198cf34ce3dSSong Liu TP_fast_assign( 199cf34ce3dSSong Liu struct inet_request_sock *ireq = inet_rsk(req); 200cf34ce3dSSong Liu __be32 *p32; 201cf34ce3dSSong Liu 202cf34ce3dSSong Liu __entry->skaddr = sk; 203cf34ce3dSSong Liu __entry->req = req; 204cf34ce3dSSong Liu 205cf34ce3dSSong Liu __entry->sport = ireq->ir_num; 206cf34ce3dSSong Liu __entry->dport = ntohs(ireq->ir_rmt_port); 207cf34ce3dSSong Liu 208cf34ce3dSSong Liu p32 = (__be32 *) __entry->saddr; 209cf34ce3dSSong Liu *p32 = ireq->ir_loc_addr; 210cf34ce3dSSong Liu 211cf34ce3dSSong Liu p32 = (__be32 *) __entry->daddr; 212cf34ce3dSSong Liu *p32 = ireq->ir_rmt_addr; 213cf34ce3dSSong Liu 2146a6b0b99SMat Martineau TP_STORE_ADDRS(__entry, ireq->ir_loc_addr, ireq->ir_rmt_addr, 2156a6b0b99SMat Martineau ireq->ir_v6_loc_addr, ireq->ir_v6_rmt_addr); 216cf34ce3dSSong Liu ), 217cf34ce3dSSong Liu 218cf34ce3dSSong Liu TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c", 219cf34ce3dSSong Liu __entry->sport, __entry->dport, 220cf34ce3dSSong Liu __entry->saddr, __entry->daddr, 221cf34ce3dSSong Liu __entry->saddr_v6, __entry->daddr_v6) 222cf34ce3dSSong Liu ); 223cf34ce3dSSong Liu 224ee549be6SMasami Hiramatsu #include <trace/events/net_probe_common.h> 225c3fde1bdSMasami Hiramatsu 226c3fde1bdSMasami Hiramatsu TRACE_EVENT(tcp_probe, 227c3fde1bdSMasami Hiramatsu 228c3fde1bdSMasami Hiramatsu TP_PROTO(struct sock *sk, struct sk_buff *skb), 229c3fde1bdSMasami Hiramatsu 230c3fde1bdSMasami Hiramatsu TP_ARGS(sk, skb), 231c3fde1bdSMasami Hiramatsu 232c3fde1bdSMasami Hiramatsu TP_STRUCT__entry( 233c3fde1bdSMasami Hiramatsu /* sockaddr_in6 is always bigger than sockaddr_in */ 234c3fde1bdSMasami Hiramatsu __array(__u8, saddr, sizeof(struct sockaddr_in6)) 235c3fde1bdSMasami Hiramatsu __array(__u8, daddr, sizeof(struct sockaddr_in6)) 236c3fde1bdSMasami Hiramatsu __field(__u16, sport) 237c3fde1bdSMasami Hiramatsu __field(__u16, dport) 238c3fde1bdSMasami Hiramatsu __field(__u32, mark) 2392d68c074SYafang Shao __field(__u16, data_len) 240c3fde1bdSMasami Hiramatsu __field(__u32, snd_nxt) 241c3fde1bdSMasami Hiramatsu __field(__u32, snd_una) 242c3fde1bdSMasami Hiramatsu __field(__u32, snd_cwnd) 243c3fde1bdSMasami Hiramatsu __field(__u32, ssthresh) 244c3fde1bdSMasami Hiramatsu __field(__u32, snd_wnd) 245c3fde1bdSMasami Hiramatsu __field(__u32, srtt) 246c3fde1bdSMasami Hiramatsu __field(__u32, rcv_wnd) 2476163849dSYafang Shao __field(__u64, sock_cookie) 248c3fde1bdSMasami Hiramatsu ), 249c3fde1bdSMasami Hiramatsu 250c3fde1bdSMasami Hiramatsu TP_fast_assign( 251c3fde1bdSMasami Hiramatsu const struct tcp_sock *tp = tcp_sk(sk); 252c3fde1bdSMasami Hiramatsu const struct inet_sock *inet = inet_sk(sk); 253c3fde1bdSMasami Hiramatsu 254c3fde1bdSMasami Hiramatsu memset(__entry->saddr, 0, sizeof(struct sockaddr_in6)); 255c3fde1bdSMasami Hiramatsu memset(__entry->daddr, 0, sizeof(struct sockaddr_in6)); 256c3fde1bdSMasami Hiramatsu 257c3fde1bdSMasami Hiramatsu TP_STORE_ADDR_PORTS(__entry, inet, sk); 258c3fde1bdSMasami Hiramatsu 259c3fde1bdSMasami Hiramatsu /* For filtering use */ 260c3fde1bdSMasami Hiramatsu __entry->sport = ntohs(inet->inet_sport); 261c3fde1bdSMasami Hiramatsu __entry->dport = ntohs(inet->inet_dport); 262c3fde1bdSMasami Hiramatsu __entry->mark = skb->mark; 263c3fde1bdSMasami Hiramatsu 2642d68c074SYafang Shao __entry->data_len = skb->len - tcp_hdrlen(skb); 265c3fde1bdSMasami Hiramatsu __entry->snd_nxt = tp->snd_nxt; 266c3fde1bdSMasami Hiramatsu __entry->snd_una = tp->snd_una; 267c3fde1bdSMasami Hiramatsu __entry->snd_cwnd = tp->snd_cwnd; 268c3fde1bdSMasami Hiramatsu __entry->snd_wnd = tp->snd_wnd; 269c3fde1bdSMasami Hiramatsu __entry->rcv_wnd = tp->rcv_wnd; 270c3fde1bdSMasami Hiramatsu __entry->ssthresh = tcp_current_ssthresh(sk); 271c3fde1bdSMasami Hiramatsu __entry->srtt = tp->srtt_us >> 3; 2726163849dSYafang Shao __entry->sock_cookie = sock_gen_cookie(sk); 273c3fde1bdSMasami Hiramatsu ), 274c3fde1bdSMasami Hiramatsu 2752d68c074SYafang Shao 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", 276c3fde1bdSMasami Hiramatsu __entry->saddr, __entry->daddr, __entry->mark, 2772d68c074SYafang Shao __entry->data_len, __entry->snd_nxt, __entry->snd_una, 278c3fde1bdSMasami Hiramatsu __entry->snd_cwnd, __entry->ssthresh, __entry->snd_wnd, 2796163849dSYafang Shao __entry->srtt, __entry->rcv_wnd, __entry->sock_cookie) 280c3fde1bdSMasami Hiramatsu ); 281c3fde1bdSMasami Hiramatsu 282e086101bSCong Wang #endif /* _TRACE_TCP_H */ 283e086101bSCong Wang 284e086101bSCong Wang /* This part must be outside protection */ 285e086101bSCong Wang #include <trace/define_trace.h> 286