tcp.h 7.0 KB

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