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