mptcp.h 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. /* SPDX-License-Identifier: GPL-2.0 */
  2. #undef TRACE_SYSTEM
  3. #define TRACE_SYSTEM mptcp
  4. #if !defined(_TRACE_MPTCP_H) || defined(TRACE_HEADER_MULTI_READ)
  5. #define _TRACE_MPTCP_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. #include <net/rstreason.h>
  13. #define show_mapping_status(status) \
  14. __print_symbolic(status, \
  15. { 0, "MAPPING_OK" }, \
  16. { 1, "MAPPING_INVALID" }, \
  17. { 2, "MAPPING_EMPTY" }, \
  18. { 3, "MAPPING_DATA_FIN" }, \
  19. { 4, "MAPPING_DUMMY" })
  20. TRACE_EVENT(mptcp_subflow_get_send,
  21. TP_PROTO(struct mptcp_subflow_context *subflow),
  22. TP_ARGS(subflow),
  23. TP_STRUCT__entry(
  24. __field(bool, active)
  25. __field(bool, free)
  26. __field(u32, snd_wnd)
  27. __field(u32, pace)
  28. __field(u8, backup)
  29. __field(u64, ratio)
  30. ),
  31. TP_fast_assign(
  32. struct sock *ssk;
  33. __entry->active = mptcp_subflow_active(subflow);
  34. __entry->backup = subflow->backup || subflow->request_bkup;
  35. if (subflow->tcp_sock && sk_fullsock(subflow->tcp_sock))
  36. __entry->free = sk_stream_memory_free(subflow->tcp_sock);
  37. else
  38. __entry->free = 0;
  39. ssk = mptcp_subflow_tcp_sock(subflow);
  40. if (ssk && sk_fullsock(ssk)) {
  41. __entry->snd_wnd = tcp_sk(ssk)->snd_wnd;
  42. __entry->pace = READ_ONCE(ssk->sk_pacing_rate);
  43. } else {
  44. __entry->snd_wnd = 0;
  45. __entry->pace = 0;
  46. }
  47. if (ssk && sk_fullsock(ssk) && __entry->pace)
  48. __entry->ratio = div_u64((u64)ssk->sk_wmem_queued << 32, __entry->pace);
  49. else
  50. __entry->ratio = 0;
  51. ),
  52. TP_printk("active=%d free=%d snd_wnd=%u pace=%u backup=%u ratio=%llu",
  53. __entry->active, __entry->free,
  54. __entry->snd_wnd, __entry->pace,
  55. __entry->backup, __entry->ratio)
  56. );
  57. DECLARE_EVENT_CLASS(mptcp_dump_mpext,
  58. TP_PROTO(struct mptcp_ext *mpext),
  59. TP_ARGS(mpext),
  60. TP_STRUCT__entry(
  61. __field(u64, data_ack)
  62. __field(u64, data_seq)
  63. __field(u32, subflow_seq)
  64. __field(u16, data_len)
  65. __field(u16, csum)
  66. __field(u8, use_map)
  67. __field(u8, dsn64)
  68. __field(u8, data_fin)
  69. __field(u8, use_ack)
  70. __field(u8, ack64)
  71. __field(u8, mpc_map)
  72. __field(u8, frozen)
  73. __field(u8, reset_transient)
  74. __field(u8, reset_reason)
  75. __field(u8, csum_reqd)
  76. __field(u8, infinite_map)
  77. ),
  78. TP_fast_assign(
  79. __entry->data_ack = mpext->ack64 ? mpext->data_ack : mpext->data_ack32;
  80. __entry->data_seq = mpext->data_seq;
  81. __entry->subflow_seq = mpext->subflow_seq;
  82. __entry->data_len = mpext->data_len;
  83. __entry->csum = (__force u16)mpext->csum;
  84. __entry->use_map = mpext->use_map;
  85. __entry->dsn64 = mpext->dsn64;
  86. __entry->data_fin = mpext->data_fin;
  87. __entry->use_ack = mpext->use_ack;
  88. __entry->ack64 = mpext->ack64;
  89. __entry->mpc_map = mpext->mpc_map;
  90. __entry->frozen = mpext->frozen;
  91. __entry->reset_transient = mpext->reset_transient;
  92. __entry->reset_reason = mpext->reset_reason;
  93. __entry->csum_reqd = mpext->csum_reqd;
  94. __entry->infinite_map = mpext->infinite_map;
  95. ),
  96. TP_printk("data_ack=%llu data_seq=%llu subflow_seq=%u data_len=%u csum=%x use_map=%u dsn64=%u data_fin=%u use_ack=%u ack64=%u mpc_map=%u frozen=%u reset_transient=%u reset_reason=%u csum_reqd=%u infinite_map=%u",
  97. __entry->data_ack, __entry->data_seq,
  98. __entry->subflow_seq, __entry->data_len,
  99. __entry->csum, __entry->use_map,
  100. __entry->dsn64, __entry->data_fin,
  101. __entry->use_ack, __entry->ack64,
  102. __entry->mpc_map, __entry->frozen,
  103. __entry->reset_transient, __entry->reset_reason,
  104. __entry->csum_reqd, __entry->infinite_map)
  105. );
  106. DEFINE_EVENT(mptcp_dump_mpext, mptcp_sendmsg_frag,
  107. TP_PROTO(struct mptcp_ext *mpext),
  108. TP_ARGS(mpext));
  109. DEFINE_EVENT(mptcp_dump_mpext, get_mapping_status,
  110. TP_PROTO(struct mptcp_ext *mpext),
  111. TP_ARGS(mpext));
  112. TRACE_EVENT(ack_update_msk,
  113. TP_PROTO(u64 data_ack, u64 old_snd_una,
  114. u64 new_snd_una, u64 new_wnd_end,
  115. u64 msk_wnd_end),
  116. TP_ARGS(data_ack, old_snd_una,
  117. new_snd_una, new_wnd_end,
  118. msk_wnd_end),
  119. TP_STRUCT__entry(
  120. __field(u64, data_ack)
  121. __field(u64, old_snd_una)
  122. __field(u64, new_snd_una)
  123. __field(u64, new_wnd_end)
  124. __field(u64, msk_wnd_end)
  125. ),
  126. TP_fast_assign(
  127. __entry->data_ack = data_ack;
  128. __entry->old_snd_una = old_snd_una;
  129. __entry->new_snd_una = new_snd_una;
  130. __entry->new_wnd_end = new_wnd_end;
  131. __entry->msk_wnd_end = msk_wnd_end;
  132. ),
  133. TP_printk("data_ack=%llu old_snd_una=%llu new_snd_una=%llu new_wnd_end=%llu msk_wnd_end=%llu",
  134. __entry->data_ack, __entry->old_snd_una,
  135. __entry->new_snd_una, __entry->new_wnd_end,
  136. __entry->msk_wnd_end)
  137. );
  138. TRACE_EVENT(subflow_check_data_avail,
  139. TP_PROTO(__u8 status, struct sk_buff *skb),
  140. TP_ARGS(status, skb),
  141. TP_STRUCT__entry(
  142. __field(u8, status)
  143. __field(const void *, skb)
  144. ),
  145. TP_fast_assign(
  146. __entry->status = status;
  147. __entry->skb = skb;
  148. ),
  149. TP_printk("mapping_status=%s, skb=%p",
  150. show_mapping_status(__entry->status),
  151. __entry->skb)
  152. );
  153. #include <trace/events/net_probe_common.h>
  154. TRACE_EVENT(mptcp_rcvbuf_grow,
  155. TP_PROTO(struct sock *sk, int time),
  156. TP_ARGS(sk, time),
  157. TP_STRUCT__entry(
  158. __field(int, time)
  159. __field(__u32, rtt_us)
  160. __field(__u32, copied)
  161. __field(__u32, inq)
  162. __field(__u32, space)
  163. __field(__u32, ooo_space)
  164. __field(__u32, rcvbuf)
  165. __field(__u32, rcv_wnd)
  166. __field(__u8, scaling_ratio)
  167. __field(__u16, sport)
  168. __field(__u16, dport)
  169. __field(__u16, family)
  170. __array(__u8, saddr, 4)
  171. __array(__u8, daddr, 4)
  172. __array(__u8, saddr_v6, 16)
  173. __array(__u8, daddr_v6, 16)
  174. __field(const void *, skaddr)
  175. ),
  176. TP_fast_assign(
  177. struct mptcp_sock *msk = mptcp_sk(sk);
  178. struct inet_sock *inet = inet_sk(sk);
  179. bool ofo_empty;
  180. __be32 *p32;
  181. __entry->time = time;
  182. __entry->rtt_us = msk->rcvq_space.rtt_us >> 3;
  183. __entry->copied = msk->rcvq_space.copied;
  184. __entry->inq = mptcp_inq_hint(sk);
  185. __entry->space = msk->rcvq_space.space;
  186. ofo_empty = RB_EMPTY_ROOT(&msk->out_of_order_queue);
  187. __entry->ooo_space = ofo_empty ? 0 :
  188. MPTCP_SKB_CB(msk->ooo_last_skb)->end_seq -
  189. msk->ack_seq;
  190. __entry->rcvbuf = sk->sk_rcvbuf;
  191. __entry->rcv_wnd = atomic64_read(&msk->rcv_wnd_sent) -
  192. msk->ack_seq;
  193. __entry->scaling_ratio = msk->scaling_ratio;
  194. __entry->sport = ntohs(inet->inet_sport);
  195. __entry->dport = ntohs(inet->inet_dport);
  196. __entry->family = sk->sk_family;
  197. p32 = (__be32 *)__entry->saddr;
  198. *p32 = inet->inet_saddr;
  199. p32 = (__be32 *)__entry->daddr;
  200. *p32 = inet->inet_daddr;
  201. TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr,
  202. sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
  203. __entry->skaddr = sk;
  204. ),
  205. TP_printk("time=%u rtt_us=%u copied=%u inq=%u space=%u ooo=%u scaling_ratio=%u "
  206. "rcvbuf=%u rcv_wnd=%u family=%d sport=%hu dport=%hu saddr=%pI4 "
  207. "daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c skaddr=%p",
  208. __entry->time, __entry->rtt_us, __entry->copied,
  209. __entry->inq, __entry->space, __entry->ooo_space,
  210. __entry->scaling_ratio, __entry->rcvbuf, __entry->rcv_wnd,
  211. __entry->family, __entry->sport, __entry->dport,
  212. __entry->saddr, __entry->daddr, __entry->saddr_v6,
  213. __entry->daddr_v6, __entry->skaddr)
  214. );
  215. #endif /* _TRACE_MPTCP_H */
  216. /* This part must be outside protection */
  217. #include <trace/define_trace.h>