0001
0002 #undef TRACE_SYSTEM
0003 #define TRACE_SYSTEM tcp
0004
0005 #if !defined(_TRACE_TCP_H) || defined(TRACE_HEADER_MULTI_READ)
0006 #define _TRACE_TCP_H
0007
0008 #include <linux/ipv6.h>
0009 #include <linux/tcp.h>
0010 #include <linux/tracepoint.h>
0011 #include <net/ipv6.h>
0012 #include <net/tcp.h>
0013 #include <linux/sock_diag.h>
0014
0015 #define TP_STORE_V4MAPPED(__entry, saddr, daddr) \
0016 do { \
0017 struct in6_addr *pin6; \
0018 \
0019 pin6 = (struct in6_addr *)__entry->saddr_v6; \
0020 ipv6_addr_set_v4mapped(saddr, pin6); \
0021 pin6 = (struct in6_addr *)__entry->daddr_v6; \
0022 ipv6_addr_set_v4mapped(daddr, pin6); \
0023 } while (0)
0024
0025 #if IS_ENABLED(CONFIG_IPV6)
0026 #define TP_STORE_ADDRS(__entry, saddr, daddr, saddr6, daddr6) \
0027 do { \
0028 if (sk->sk_family == AF_INET6) { \
0029 struct in6_addr *pin6; \
0030 \
0031 pin6 = (struct in6_addr *)__entry->saddr_v6; \
0032 *pin6 = saddr6; \
0033 pin6 = (struct in6_addr *)__entry->daddr_v6; \
0034 *pin6 = daddr6; \
0035 } else { \
0036 TP_STORE_V4MAPPED(__entry, saddr, daddr); \
0037 } \
0038 } while (0)
0039 #else
0040 #define TP_STORE_ADDRS(__entry, saddr, daddr, saddr6, daddr6) \
0041 TP_STORE_V4MAPPED(__entry, saddr, daddr)
0042 #endif
0043
0044
0045
0046
0047
0048
0049
0050 DECLARE_EVENT_CLASS(tcp_event_sk_skb,
0051
0052 TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
0053
0054 TP_ARGS(sk, skb),
0055
0056 TP_STRUCT__entry(
0057 __field(const void *, skbaddr)
0058 __field(const void *, skaddr)
0059 __field(int, state)
0060 __field(__u16, sport)
0061 __field(__u16, dport)
0062 __field(__u16, family)
0063 __array(__u8, saddr, 4)
0064 __array(__u8, daddr, 4)
0065 __array(__u8, saddr_v6, 16)
0066 __array(__u8, daddr_v6, 16)
0067 ),
0068
0069 TP_fast_assign(
0070 struct inet_sock *inet = inet_sk(sk);
0071 __be32 *p32;
0072
0073 __entry->skbaddr = skb;
0074 __entry->skaddr = sk;
0075 __entry->state = sk->sk_state;
0076
0077 __entry->sport = ntohs(inet->inet_sport);
0078 __entry->dport = ntohs(inet->inet_dport);
0079 __entry->family = sk->sk_family;
0080
0081 p32 = (__be32 *) __entry->saddr;
0082 *p32 = inet->inet_saddr;
0083
0084 p32 = (__be32 *) __entry->daddr;
0085 *p32 = inet->inet_daddr;
0086
0087 TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr,
0088 sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
0089 ),
0090
0091 TP_printk("family=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c state=%s",
0092 show_family_name(__entry->family),
0093 __entry->sport, __entry->dport, __entry->saddr, __entry->daddr,
0094 __entry->saddr_v6, __entry->daddr_v6,
0095 show_tcp_state_name(__entry->state))
0096 );
0097
0098 DEFINE_EVENT(tcp_event_sk_skb, tcp_retransmit_skb,
0099
0100 TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
0101
0102 TP_ARGS(sk, skb)
0103 );
0104
0105
0106
0107
0108
0109 DEFINE_EVENT(tcp_event_sk_skb, tcp_send_reset,
0110
0111 TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
0112
0113 TP_ARGS(sk, skb)
0114 );
0115
0116
0117
0118
0119
0120
0121 DECLARE_EVENT_CLASS(tcp_event_sk,
0122
0123 TP_PROTO(struct sock *sk),
0124
0125 TP_ARGS(sk),
0126
0127 TP_STRUCT__entry(
0128 __field(const void *, skaddr)
0129 __field(__u16, sport)
0130 __field(__u16, dport)
0131 __field(__u16, family)
0132 __array(__u8, saddr, 4)
0133 __array(__u8, daddr, 4)
0134 __array(__u8, saddr_v6, 16)
0135 __array(__u8, daddr_v6, 16)
0136 __field(__u64, sock_cookie)
0137 ),
0138
0139 TP_fast_assign(
0140 struct inet_sock *inet = inet_sk(sk);
0141 __be32 *p32;
0142
0143 __entry->skaddr = sk;
0144
0145 __entry->sport = ntohs(inet->inet_sport);
0146 __entry->dport = ntohs(inet->inet_dport);
0147 __entry->family = sk->sk_family;
0148
0149 p32 = (__be32 *) __entry->saddr;
0150 *p32 = inet->inet_saddr;
0151
0152 p32 = (__be32 *) __entry->daddr;
0153 *p32 = inet->inet_daddr;
0154
0155 TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr,
0156 sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
0157
0158 __entry->sock_cookie = sock_gen_cookie(sk);
0159 ),
0160
0161 TP_printk("family=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c sock_cookie=%llx",
0162 show_family_name(__entry->family),
0163 __entry->sport, __entry->dport,
0164 __entry->saddr, __entry->daddr,
0165 __entry->saddr_v6, __entry->daddr_v6,
0166 __entry->sock_cookie)
0167 );
0168
0169 DEFINE_EVENT(tcp_event_sk, tcp_receive_reset,
0170
0171 TP_PROTO(struct sock *sk),
0172
0173 TP_ARGS(sk)
0174 );
0175
0176 DEFINE_EVENT(tcp_event_sk, tcp_destroy_sock,
0177
0178 TP_PROTO(struct sock *sk),
0179
0180 TP_ARGS(sk)
0181 );
0182
0183 DEFINE_EVENT(tcp_event_sk, tcp_rcv_space_adjust,
0184
0185 TP_PROTO(struct sock *sk),
0186
0187 TP_ARGS(sk)
0188 );
0189
0190 TRACE_EVENT(tcp_retransmit_synack,
0191
0192 TP_PROTO(const struct sock *sk, const struct request_sock *req),
0193
0194 TP_ARGS(sk, req),
0195
0196 TP_STRUCT__entry(
0197 __field(const void *, skaddr)
0198 __field(const void *, req)
0199 __field(__u16, sport)
0200 __field(__u16, dport)
0201 __field(__u16, family)
0202 __array(__u8, saddr, 4)
0203 __array(__u8, daddr, 4)
0204 __array(__u8, saddr_v6, 16)
0205 __array(__u8, daddr_v6, 16)
0206 ),
0207
0208 TP_fast_assign(
0209 struct inet_request_sock *ireq = inet_rsk(req);
0210 __be32 *p32;
0211
0212 __entry->skaddr = sk;
0213 __entry->req = req;
0214
0215 __entry->sport = ireq->ir_num;
0216 __entry->dport = ntohs(ireq->ir_rmt_port);
0217 __entry->family = sk->sk_family;
0218
0219 p32 = (__be32 *) __entry->saddr;
0220 *p32 = ireq->ir_loc_addr;
0221
0222 p32 = (__be32 *) __entry->daddr;
0223 *p32 = ireq->ir_rmt_addr;
0224
0225 TP_STORE_ADDRS(__entry, ireq->ir_loc_addr, ireq->ir_rmt_addr,
0226 ireq->ir_v6_loc_addr, ireq->ir_v6_rmt_addr);
0227 ),
0228
0229 TP_printk("family=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c",
0230 show_family_name(__entry->family),
0231 __entry->sport, __entry->dport,
0232 __entry->saddr, __entry->daddr,
0233 __entry->saddr_v6, __entry->daddr_v6)
0234 );
0235
0236 #include <trace/events/net_probe_common.h>
0237
0238 TRACE_EVENT(tcp_probe,
0239
0240 TP_PROTO(struct sock *sk, struct sk_buff *skb),
0241
0242 TP_ARGS(sk, skb),
0243
0244 TP_STRUCT__entry(
0245
0246 __array(__u8, saddr, sizeof(struct sockaddr_in6))
0247 __array(__u8, daddr, sizeof(struct sockaddr_in6))
0248 __field(__u16, sport)
0249 __field(__u16, dport)
0250 __field(__u16, family)
0251 __field(__u32, mark)
0252 __field(__u16, data_len)
0253 __field(__u32, snd_nxt)
0254 __field(__u32, snd_una)
0255 __field(__u32, snd_cwnd)
0256 __field(__u32, ssthresh)
0257 __field(__u32, snd_wnd)
0258 __field(__u32, srtt)
0259 __field(__u32, rcv_wnd)
0260 __field(__u64, sock_cookie)
0261 ),
0262
0263 TP_fast_assign(
0264 const struct tcphdr *th = (const struct tcphdr *)skb->data;
0265 const struct inet_sock *inet = inet_sk(sk);
0266 const struct tcp_sock *tp = tcp_sk(sk);
0267
0268 memset(__entry->saddr, 0, sizeof(struct sockaddr_in6));
0269 memset(__entry->daddr, 0, sizeof(struct sockaddr_in6));
0270
0271 TP_STORE_ADDR_PORTS(__entry, inet, sk);
0272
0273
0274 __entry->sport = ntohs(inet->inet_sport);
0275 __entry->dport = ntohs(inet->inet_dport);
0276 __entry->mark = skb->mark;
0277 __entry->family = sk->sk_family;
0278
0279 __entry->data_len = skb->len - __tcp_hdrlen(th);
0280 __entry->snd_nxt = tp->snd_nxt;
0281 __entry->snd_una = tp->snd_una;
0282 __entry->snd_cwnd = tcp_snd_cwnd(tp);
0283 __entry->snd_wnd = tp->snd_wnd;
0284 __entry->rcv_wnd = tp->rcv_wnd;
0285 __entry->ssthresh = tcp_current_ssthresh(sk);
0286 __entry->srtt = tp->srtt_us >> 3;
0287 __entry->sock_cookie = sock_gen_cookie(sk);
0288 ),
0289
0290 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",
0291 show_family_name(__entry->family),
0292 __entry->saddr, __entry->daddr, __entry->mark,
0293 __entry->data_len, __entry->snd_nxt, __entry->snd_una,
0294 __entry->snd_cwnd, __entry->ssthresh, __entry->snd_wnd,
0295 __entry->srtt, __entry->rcv_wnd, __entry->sock_cookie)
0296 );
0297
0298 #define TP_STORE_ADDR_PORTS_SKB_V4(__entry, skb) \
0299 do { \
0300 const struct tcphdr *th = (const struct tcphdr *)skb->data; \
0301 struct sockaddr_in *v4 = (void *)__entry->saddr; \
0302 \
0303 v4->sin_family = AF_INET; \
0304 v4->sin_port = th->source; \
0305 v4->sin_addr.s_addr = ip_hdr(skb)->saddr; \
0306 v4 = (void *)__entry->daddr; \
0307 v4->sin_family = AF_INET; \
0308 v4->sin_port = th->dest; \
0309 v4->sin_addr.s_addr = ip_hdr(skb)->daddr; \
0310 } while (0)
0311
0312 #if IS_ENABLED(CONFIG_IPV6)
0313
0314 #define TP_STORE_ADDR_PORTS_SKB(__entry, skb) \
0315 do { \
0316 const struct iphdr *iph = ip_hdr(skb); \
0317 \
0318 if (iph->version == 6) { \
0319 const struct tcphdr *th = (const struct tcphdr *)skb->data; \
0320 struct sockaddr_in6 *v6 = (void *)__entry->saddr; \
0321 \
0322 v6->sin6_family = AF_INET6; \
0323 v6->sin6_port = th->source; \
0324 v6->sin6_addr = ipv6_hdr(skb)->saddr; \
0325 v6 = (void *)__entry->daddr; \
0326 v6->sin6_family = AF_INET6; \
0327 v6->sin6_port = th->dest; \
0328 v6->sin6_addr = ipv6_hdr(skb)->daddr; \
0329 } else \
0330 TP_STORE_ADDR_PORTS_SKB_V4(__entry, skb); \
0331 } while (0)
0332
0333 #else
0334
0335 #define TP_STORE_ADDR_PORTS_SKB(__entry, skb) \
0336 TP_STORE_ADDR_PORTS_SKB_V4(__entry, skb)
0337
0338 #endif
0339
0340
0341
0342
0343 DECLARE_EVENT_CLASS(tcp_event_skb,
0344
0345 TP_PROTO(const struct sk_buff *skb),
0346
0347 TP_ARGS(skb),
0348
0349 TP_STRUCT__entry(
0350 __field(const void *, skbaddr)
0351 __array(__u8, saddr, sizeof(struct sockaddr_in6))
0352 __array(__u8, daddr, sizeof(struct sockaddr_in6))
0353 ),
0354
0355 TP_fast_assign(
0356 __entry->skbaddr = skb;
0357
0358 memset(__entry->saddr, 0, sizeof(struct sockaddr_in6));
0359 memset(__entry->daddr, 0, sizeof(struct sockaddr_in6));
0360
0361 TP_STORE_ADDR_PORTS_SKB(__entry, skb);
0362 ),
0363
0364 TP_printk("src=%pISpc dest=%pISpc", __entry->saddr, __entry->daddr)
0365 );
0366
0367 DEFINE_EVENT(tcp_event_skb, tcp_bad_csum,
0368
0369 TP_PROTO(const struct sk_buff *skb),
0370
0371 TP_ARGS(skb)
0372 );
0373
0374 TRACE_EVENT(tcp_cong_state_set,
0375
0376 TP_PROTO(struct sock *sk, const u8 ca_state),
0377
0378 TP_ARGS(sk, ca_state),
0379
0380 TP_STRUCT__entry(
0381 __field(const void *, skaddr)
0382 __field(__u16, sport)
0383 __field(__u16, dport)
0384 __array(__u8, saddr, 4)
0385 __array(__u8, daddr, 4)
0386 __array(__u8, saddr_v6, 16)
0387 __array(__u8, daddr_v6, 16)
0388 __field(__u8, cong_state)
0389 ),
0390
0391 TP_fast_assign(
0392 struct inet_sock *inet = inet_sk(sk);
0393 __be32 *p32;
0394
0395 __entry->skaddr = sk;
0396
0397 __entry->sport = ntohs(inet->inet_sport);
0398 __entry->dport = ntohs(inet->inet_dport);
0399
0400 p32 = (__be32 *) __entry->saddr;
0401 *p32 = inet->inet_saddr;
0402
0403 p32 = (__be32 *) __entry->daddr;
0404 *p32 = inet->inet_daddr;
0405
0406 TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr,
0407 sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
0408
0409 __entry->cong_state = ca_state;
0410 ),
0411
0412 TP_printk("sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c cong_state=%u",
0413 __entry->sport, __entry->dport,
0414 __entry->saddr, __entry->daddr,
0415 __entry->saddr_v6, __entry->daddr_v6,
0416 __entry->cong_state)
0417 );
0418
0419 #endif
0420
0421
0422 #include <trace/define_trace.h>