tcp.h 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839
  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. #include <net/rstreason.h>
  13. TRACE_EVENT(tcp_retransmit_skb,
  14. TP_PROTO(const struct sock *sk, const struct sk_buff *skb, int err),
  15. TP_ARGS(sk, skb, err),
  16. TP_STRUCT__entry(
  17. __field(const void *, skbaddr)
  18. __field(const void *, skaddr)
  19. __field(int, state)
  20. __field(__u16, sport)
  21. __field(__u16, dport)
  22. __field(__u16, family)
  23. __array(__u8, saddr, 4)
  24. __array(__u8, daddr, 4)
  25. __array(__u8, saddr_v6, 16)
  26. __array(__u8, daddr_v6, 16)
  27. __field(int, err)
  28. ),
  29. TP_fast_assign(
  30. const struct inet_sock *inet = inet_sk(sk);
  31. __be32 *p32;
  32. __entry->skbaddr = skb;
  33. __entry->skaddr = sk;
  34. __entry->state = sk->sk_state;
  35. __entry->sport = ntohs(inet->inet_sport);
  36. __entry->dport = ntohs(inet->inet_dport);
  37. __entry->family = sk->sk_family;
  38. p32 = (__be32 *) __entry->saddr;
  39. *p32 = inet->inet_saddr;
  40. p32 = (__be32 *) __entry->daddr;
  41. *p32 = inet->inet_daddr;
  42. TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr,
  43. sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
  44. __entry->err = err;
  45. ),
  46. TP_printk("skbaddr=%p skaddr=%p family=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c state=%s err=%d",
  47. __entry->skbaddr, __entry->skaddr,
  48. show_family_name(__entry->family),
  49. __entry->sport, __entry->dport, __entry->saddr, __entry->daddr,
  50. __entry->saddr_v6, __entry->daddr_v6,
  51. show_tcp_state_name(__entry->state),
  52. __entry->err)
  53. );
  54. #undef FN
  55. #define FN(reason) TRACE_DEFINE_ENUM(SK_RST_REASON_##reason);
  56. DEFINE_RST_REASON(FN, FN)
  57. #undef FN
  58. #undef FNe
  59. #define FN(reason) { SK_RST_REASON_##reason, #reason },
  60. #define FNe(reason) { SK_RST_REASON_##reason, #reason }
  61. /*
  62. * skb of trace_tcp_send_reset is the skb that caused RST. In case of
  63. * active reset, skb should be NULL
  64. */
  65. TRACE_EVENT(tcp_send_reset,
  66. TP_PROTO(const struct sock *sk,
  67. const struct sk_buff *skb__nullable,
  68. const enum sk_rst_reason reason),
  69. TP_ARGS(sk, skb__nullable, reason),
  70. TP_STRUCT__entry(
  71. __field(const void *, skbaddr)
  72. __field(const void *, skaddr)
  73. __field(int, state)
  74. __field(enum sk_rst_reason, reason)
  75. __array(__u8, saddr, sizeof(struct sockaddr_in6))
  76. __array(__u8, daddr, sizeof(struct sockaddr_in6))
  77. ),
  78. TP_fast_assign(
  79. __entry->skbaddr = skb__nullable;
  80. __entry->skaddr = sk;
  81. /* Zero means unknown state. */
  82. __entry->state = sk ? sk->sk_state : 0;
  83. memset(__entry->saddr, 0, sizeof(struct sockaddr_in6));
  84. memset(__entry->daddr, 0, sizeof(struct sockaddr_in6));
  85. if (sk && sk_fullsock(sk)) {
  86. const struct inet_sock *inet = inet_sk(sk);
  87. TP_STORE_ADDR_PORTS(__entry, inet, sk);
  88. } else if (skb__nullable) {
  89. const struct tcphdr *th = (const struct tcphdr *)skb__nullable->data;
  90. /*
  91. * We should reverse the 4-tuple of skb, so later
  92. * it can print the right flow direction of rst.
  93. */
  94. TP_STORE_ADDR_PORTS_SKB(skb__nullable, th, entry->daddr, entry->saddr);
  95. }
  96. __entry->reason = reason;
  97. ),
  98. TP_printk("skbaddr=%p skaddr=%p src=%pISpc dest=%pISpc state=%s reason=%s",
  99. __entry->skbaddr, __entry->skaddr,
  100. __entry->saddr, __entry->daddr,
  101. __entry->state ? show_tcp_state_name(__entry->state) : "UNKNOWN",
  102. __print_symbolic(__entry->reason, DEFINE_RST_REASON(FN, FNe)))
  103. );
  104. #undef FN
  105. #undef FNe
  106. /*
  107. * tcp event with arguments sk
  108. *
  109. * Note: this class requires a valid sk pointer.
  110. */
  111. DECLARE_EVENT_CLASS(tcp_event_sk,
  112. TP_PROTO(struct sock *sk),
  113. TP_ARGS(sk),
  114. TP_STRUCT__entry(
  115. __field(const void *, skaddr)
  116. __field(__u16, sport)
  117. __field(__u16, dport)
  118. __field(__u16, family)
  119. __array(__u8, saddr, 4)
  120. __array(__u8, daddr, 4)
  121. __array(__u8, saddr_v6, 16)
  122. __array(__u8, daddr_v6, 16)
  123. __field(__u64, sock_cookie)
  124. ),
  125. TP_fast_assign(
  126. struct inet_sock *inet = inet_sk(sk);
  127. __be32 *p32;
  128. __entry->skaddr = sk;
  129. __entry->sport = ntohs(inet->inet_sport);
  130. __entry->dport = ntohs(inet->inet_dport);
  131. __entry->family = sk->sk_family;
  132. p32 = (__be32 *) __entry->saddr;
  133. *p32 = inet->inet_saddr;
  134. p32 = (__be32 *) __entry->daddr;
  135. *p32 = inet->inet_daddr;
  136. TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr,
  137. sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
  138. __entry->sock_cookie = sock_gen_cookie(sk);
  139. ),
  140. TP_printk("family=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c sock_cookie=%llx",
  141. show_family_name(__entry->family),
  142. __entry->sport, __entry->dport,
  143. __entry->saddr, __entry->daddr,
  144. __entry->saddr_v6, __entry->daddr_v6,
  145. __entry->sock_cookie)
  146. );
  147. DEFINE_EVENT(tcp_event_sk, tcp_receive_reset,
  148. TP_PROTO(struct sock *sk),
  149. TP_ARGS(sk)
  150. );
  151. DEFINE_EVENT(tcp_event_sk, tcp_destroy_sock,
  152. TP_PROTO(struct sock *sk),
  153. TP_ARGS(sk)
  154. );
  155. DEFINE_EVENT(tcp_event_sk, tcp_rcv_space_adjust,
  156. TP_PROTO(struct sock *sk),
  157. TP_ARGS(sk)
  158. );
  159. TRACE_EVENT(tcp_rcvbuf_grow,
  160. TP_PROTO(struct sock *sk, int time),
  161. TP_ARGS(sk, time),
  162. TP_STRUCT__entry(
  163. __field(int, time)
  164. __field(__u32, rtt_us)
  165. __field(__u32, copied)
  166. __field(__u32, inq)
  167. __field(__u32, space)
  168. __field(__u32, ooo_space)
  169. __field(__u32, rcvbuf)
  170. __field(__u32, rcv_ssthresh)
  171. __field(__u32, window_clamp)
  172. __field(__u32, rcv_wnd)
  173. __field(__u8, scaling_ratio)
  174. __field(__u16, sport)
  175. __field(__u16, dport)
  176. __field(__u16, family)
  177. __array(__u8, saddr, 4)
  178. __array(__u8, daddr, 4)
  179. __array(__u8, saddr_v6, 16)
  180. __array(__u8, daddr_v6, 16)
  181. __field(const void *, skaddr)
  182. __field(__u64, sock_cookie)
  183. ),
  184. TP_fast_assign(
  185. struct inet_sock *inet = inet_sk(sk);
  186. struct tcp_sock *tp = tcp_sk(sk);
  187. __be32 *p32;
  188. __entry->time = time;
  189. __entry->rtt_us = tp->rcv_rtt_est.rtt_us >> 3;
  190. __entry->copied = tp->copied_seq - tp->rcvq_space.seq;
  191. __entry->inq = tp->rcv_nxt - tp->copied_seq;
  192. __entry->space = tp->rcvq_space.space;
  193. __entry->ooo_space = RB_EMPTY_ROOT(&tp->out_of_order_queue) ? 0 :
  194. TCP_SKB_CB(tp->ooo_last_skb)->end_seq -
  195. tp->rcv_nxt;
  196. __entry->rcvbuf = sk->sk_rcvbuf;
  197. __entry->rcv_ssthresh = tp->rcv_ssthresh;
  198. __entry->window_clamp = tp->window_clamp;
  199. __entry->rcv_wnd = tp->rcv_wnd;
  200. __entry->scaling_ratio = tp->scaling_ratio;
  201. __entry->sport = ntohs(inet->inet_sport);
  202. __entry->dport = ntohs(inet->inet_dport);
  203. __entry->family = sk->sk_family;
  204. p32 = (__be32 *) __entry->saddr;
  205. *p32 = inet->inet_saddr;
  206. p32 = (__be32 *) __entry->daddr;
  207. *p32 = inet->inet_daddr;
  208. TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr,
  209. sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
  210. __entry->skaddr = sk;
  211. __entry->sock_cookie = sock_gen_cookie(sk);
  212. ),
  213. TP_printk("time=%u rtt_us=%u copied=%u inq=%u space=%u ooo=%u scaling_ratio=%u rcvbuf=%u "
  214. "rcv_ssthresh=%u window_clamp=%u rcv_wnd=%u "
  215. "family=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 "
  216. "saddrv6=%pI6c daddrv6=%pI6c skaddr=%p sock_cookie=%llx",
  217. __entry->time, __entry->rtt_us, __entry->copied,
  218. __entry->inq, __entry->space, __entry->ooo_space,
  219. __entry->scaling_ratio, __entry->rcvbuf,
  220. __entry->rcv_ssthresh, __entry->window_clamp,
  221. __entry->rcv_wnd,
  222. show_family_name(__entry->family),
  223. __entry->sport, __entry->dport,
  224. __entry->saddr, __entry->daddr,
  225. __entry->saddr_v6, __entry->daddr_v6,
  226. __entry->skaddr,
  227. __entry->sock_cookie)
  228. );
  229. TRACE_EVENT(tcp_retransmit_synack,
  230. TP_PROTO(const struct sock *sk, const struct request_sock *req),
  231. TP_ARGS(sk, req),
  232. TP_STRUCT__entry(
  233. __field(const void *, skaddr)
  234. __field(const void *, req)
  235. __field(__u16, sport)
  236. __field(__u16, dport)
  237. __field(__u16, family)
  238. __array(__u8, saddr, 4)
  239. __array(__u8, daddr, 4)
  240. __array(__u8, saddr_v6, 16)
  241. __array(__u8, daddr_v6, 16)
  242. ),
  243. TP_fast_assign(
  244. const struct inet_request_sock *ireq = inet_rsk(req);
  245. __be32 *p32;
  246. __entry->skaddr = sk;
  247. __entry->req = req;
  248. __entry->sport = ireq->ir_num;
  249. __entry->dport = ntohs(ireq->ir_rmt_port);
  250. __entry->family = sk->sk_family;
  251. p32 = (__be32 *) __entry->saddr;
  252. *p32 = ireq->ir_loc_addr;
  253. p32 = (__be32 *) __entry->daddr;
  254. *p32 = ireq->ir_rmt_addr;
  255. TP_STORE_ADDRS(__entry, ireq->ir_loc_addr, ireq->ir_rmt_addr,
  256. ireq->ir_v6_loc_addr, ireq->ir_v6_rmt_addr);
  257. ),
  258. TP_printk("family=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c",
  259. show_family_name(__entry->family),
  260. __entry->sport, __entry->dport,
  261. __entry->saddr, __entry->daddr,
  262. __entry->saddr_v6, __entry->daddr_v6)
  263. );
  264. TRACE_EVENT(tcp_sendmsg_locked,
  265. TP_PROTO(const struct sock *sk, const struct msghdr *msg,
  266. const struct sk_buff *skb, int size_goal),
  267. TP_ARGS(sk, msg, skb, size_goal),
  268. TP_STRUCT__entry(
  269. __field(const void *, skb_addr)
  270. __field(int, skb_len)
  271. __field(int, msg_left)
  272. __field(int, size_goal)
  273. ),
  274. TP_fast_assign(
  275. __entry->skb_addr = skb;
  276. __entry->skb_len = skb ? skb->len : 0;
  277. __entry->msg_left = msg_data_left(msg);
  278. __entry->size_goal = size_goal;
  279. ),
  280. TP_printk("skb_addr %p skb_len %d msg_left %d size_goal %d",
  281. __entry->skb_addr, __entry->skb_len, __entry->msg_left,
  282. __entry->size_goal));
  283. DECLARE_TRACE(tcp_cwnd_reduction,
  284. TP_PROTO(const struct sock *sk, int newly_acked_sacked,
  285. int newly_lost, int flag),
  286. TP_ARGS(sk, newly_acked_sacked, newly_lost, flag)
  287. );
  288. #include <trace/events/net_probe_common.h>
  289. TRACE_EVENT(tcp_probe,
  290. TP_PROTO(struct sock *sk, const struct sk_buff *skb),
  291. TP_ARGS(sk, skb),
  292. TP_STRUCT__entry(
  293. /* sockaddr_in6 is always bigger than sockaddr_in */
  294. __array(__u8, saddr, sizeof(struct sockaddr_in6))
  295. __array(__u8, daddr, sizeof(struct sockaddr_in6))
  296. __field(__u16, sport)
  297. __field(__u16, dport)
  298. __field(__u16, family)
  299. __field(__u32, mark)
  300. __field(__u16, data_len)
  301. __field(__u32, snd_nxt)
  302. __field(__u32, snd_una)
  303. __field(__u32, snd_cwnd)
  304. __field(__u32, ssthresh)
  305. __field(__u32, snd_wnd)
  306. __field(__u32, srtt)
  307. __field(__u32, rcv_wnd)
  308. __field(__u64, sock_cookie)
  309. __field(const void *, skbaddr)
  310. __field(const void *, skaddr)
  311. ),
  312. TP_fast_assign(
  313. const struct tcphdr *th = (const struct tcphdr *)skb->data;
  314. const struct inet_sock *inet = inet_sk(sk);
  315. const struct tcp_sock *tp = tcp_sk(sk);
  316. memset(__entry->saddr, 0, sizeof(struct sockaddr_in6));
  317. memset(__entry->daddr, 0, sizeof(struct sockaddr_in6));
  318. TP_STORE_ADDR_PORTS(__entry, inet, sk);
  319. /* For filtering use */
  320. __entry->sport = ntohs(inet->inet_sport);
  321. __entry->dport = ntohs(inet->inet_dport);
  322. __entry->mark = skb->mark;
  323. __entry->family = sk->sk_family;
  324. __entry->data_len = skb->len - __tcp_hdrlen(th);
  325. __entry->snd_nxt = tp->snd_nxt;
  326. __entry->snd_una = tp->snd_una;
  327. __entry->snd_cwnd = tcp_snd_cwnd(tp);
  328. __entry->snd_wnd = tp->snd_wnd;
  329. __entry->rcv_wnd = tp->rcv_wnd;
  330. __entry->ssthresh = tcp_current_ssthresh(sk);
  331. __entry->srtt = tp->srtt_us >> 3;
  332. __entry->sock_cookie = sock_gen_cookie(sk);
  333. __entry->skbaddr = skb;
  334. __entry->skaddr = sk;
  335. ),
  336. 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 skbaddr=%p skaddr=%p",
  337. show_family_name(__entry->family),
  338. __entry->saddr, __entry->daddr, __entry->mark,
  339. __entry->data_len, __entry->snd_nxt, __entry->snd_una,
  340. __entry->snd_cwnd, __entry->ssthresh, __entry->snd_wnd,
  341. __entry->srtt, __entry->rcv_wnd, __entry->sock_cookie,
  342. __entry->skbaddr, __entry->skaddr)
  343. );
  344. /*
  345. * tcp event with only skb
  346. */
  347. DECLARE_EVENT_CLASS(tcp_event_skb,
  348. TP_PROTO(const struct sk_buff *skb),
  349. TP_ARGS(skb),
  350. TP_STRUCT__entry(
  351. __field(const void *, skbaddr)
  352. __array(__u8, saddr, sizeof(struct sockaddr_in6))
  353. __array(__u8, daddr, sizeof(struct sockaddr_in6))
  354. ),
  355. TP_fast_assign(
  356. const struct tcphdr *th = (const struct tcphdr *)skb->data;
  357. __entry->skbaddr = skb;
  358. memset(__entry->saddr, 0, sizeof(struct sockaddr_in6));
  359. memset(__entry->daddr, 0, sizeof(struct sockaddr_in6));
  360. TP_STORE_ADDR_PORTS_SKB(skb, th, __entry->saddr, __entry->daddr);
  361. ),
  362. TP_printk("skbaddr=%p src=%pISpc dest=%pISpc",
  363. __entry->skbaddr, __entry->saddr, __entry->daddr)
  364. );
  365. DEFINE_EVENT(tcp_event_skb, tcp_bad_csum,
  366. TP_PROTO(const struct sk_buff *skb),
  367. TP_ARGS(skb)
  368. );
  369. TRACE_EVENT(tcp_cong_state_set,
  370. TP_PROTO(struct sock *sk, const u8 ca_state),
  371. TP_ARGS(sk, ca_state),
  372. TP_STRUCT__entry(
  373. __field(const void *, skaddr)
  374. __field(__u16, sport)
  375. __field(__u16, dport)
  376. __field(__u16, family)
  377. __array(__u8, saddr, 4)
  378. __array(__u8, daddr, 4)
  379. __array(__u8, saddr_v6, 16)
  380. __array(__u8, daddr_v6, 16)
  381. __field(__u8, cong_state)
  382. ),
  383. TP_fast_assign(
  384. struct inet_sock *inet = inet_sk(sk);
  385. __be32 *p32;
  386. __entry->skaddr = sk;
  387. __entry->sport = ntohs(inet->inet_sport);
  388. __entry->dport = ntohs(inet->inet_dport);
  389. __entry->family = sk->sk_family;
  390. p32 = (__be32 *) __entry->saddr;
  391. *p32 = inet->inet_saddr;
  392. p32 = (__be32 *) __entry->daddr;
  393. *p32 = inet->inet_daddr;
  394. TP_STORE_ADDRS(__entry, inet->inet_saddr, inet->inet_daddr,
  395. sk->sk_v6_rcv_saddr, sk->sk_v6_daddr);
  396. __entry->cong_state = ca_state;
  397. ),
  398. TP_printk("family=%s sport=%hu dport=%hu saddr=%pI4 daddr=%pI4 saddrv6=%pI6c daddrv6=%pI6c cong_state=%u",
  399. show_family_name(__entry->family),
  400. __entry->sport, __entry->dport,
  401. __entry->saddr, __entry->daddr,
  402. __entry->saddr_v6, __entry->daddr_v6,
  403. __entry->cong_state)
  404. );
  405. DECLARE_EVENT_CLASS(tcp_hash_event,
  406. TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
  407. TP_ARGS(sk, skb),
  408. TP_STRUCT__entry(
  409. __field(__u64, net_cookie)
  410. __field(const void *, skbaddr)
  411. __field(const void *, skaddr)
  412. __field(int, state)
  413. /* sockaddr_in6 is always bigger than sockaddr_in */
  414. __array(__u8, saddr, sizeof(struct sockaddr_in6))
  415. __array(__u8, daddr, sizeof(struct sockaddr_in6))
  416. __field(int, l3index)
  417. __field(__u16, sport)
  418. __field(__u16, dport)
  419. __field(__u16, family)
  420. __field(bool, fin)
  421. __field(bool, syn)
  422. __field(bool, rst)
  423. __field(bool, psh)
  424. __field(bool, ack)
  425. ),
  426. TP_fast_assign(
  427. const struct tcphdr *th = (const struct tcphdr *)skb->data;
  428. __entry->net_cookie = sock_net(sk)->net_cookie;
  429. __entry->skbaddr = skb;
  430. __entry->skaddr = sk;
  431. __entry->state = sk->sk_state;
  432. memset(__entry->saddr, 0, sizeof(struct sockaddr_in6));
  433. memset(__entry->daddr, 0, sizeof(struct sockaddr_in6));
  434. TP_STORE_ADDR_PORTS_SKB(skb, th, __entry->saddr, __entry->daddr);
  435. __entry->l3index = inet_sdif(skb) ? inet_iif(skb) : 0;
  436. /* For filtering use */
  437. __entry->sport = ntohs(th->source);
  438. __entry->dport = ntohs(th->dest);
  439. __entry->family = sk->sk_family;
  440. __entry->fin = th->fin;
  441. __entry->syn = th->syn;
  442. __entry->rst = th->rst;
  443. __entry->psh = th->psh;
  444. __entry->ack = th->ack;
  445. ),
  446. TP_printk("net=%llu state=%s family=%s src=%pISpc dest=%pISpc L3index=%d [%c%c%c%c%c]",
  447. __entry->net_cookie,
  448. show_tcp_state_name(__entry->state),
  449. show_family_name(__entry->family),
  450. __entry->saddr, __entry->daddr,
  451. __entry->l3index,
  452. __entry->fin ? 'F' : ' ',
  453. __entry->syn ? 'S' : ' ',
  454. __entry->rst ? 'R' : ' ',
  455. __entry->psh ? 'P' : ' ',
  456. __entry->ack ? '.' : ' ')
  457. );
  458. DEFINE_EVENT(tcp_hash_event, tcp_hash_bad_header,
  459. TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
  460. TP_ARGS(sk, skb)
  461. );
  462. DEFINE_EVENT(tcp_hash_event, tcp_hash_md5_required,
  463. TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
  464. TP_ARGS(sk, skb)
  465. );
  466. DEFINE_EVENT(tcp_hash_event, tcp_hash_md5_unexpected,
  467. TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
  468. TP_ARGS(sk, skb)
  469. );
  470. DEFINE_EVENT(tcp_hash_event, tcp_hash_md5_mismatch,
  471. TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
  472. TP_ARGS(sk, skb)
  473. );
  474. DEFINE_EVENT(tcp_hash_event, tcp_hash_ao_required,
  475. TP_PROTO(const struct sock *sk, const struct sk_buff *skb),
  476. TP_ARGS(sk, skb)
  477. );
  478. DECLARE_EVENT_CLASS(tcp_ao_event,
  479. TP_PROTO(const struct sock *sk, const struct sk_buff *skb,
  480. const __u8 keyid, const __u8 rnext, const __u8 maclen),
  481. TP_ARGS(sk, skb, keyid, rnext, maclen),
  482. TP_STRUCT__entry(
  483. __field(__u64, net_cookie)
  484. __field(const void *, skbaddr)
  485. __field(const void *, skaddr)
  486. __field(int, state)
  487. /* sockaddr_in6 is always bigger than sockaddr_in */
  488. __array(__u8, saddr, sizeof(struct sockaddr_in6))
  489. __array(__u8, daddr, sizeof(struct sockaddr_in6))
  490. __field(int, l3index)
  491. __field(__u16, sport)
  492. __field(__u16, dport)
  493. __field(__u16, family)
  494. __field(bool, fin)
  495. __field(bool, syn)
  496. __field(bool, rst)
  497. __field(bool, psh)
  498. __field(bool, ack)
  499. __field(__u8, keyid)
  500. __field(__u8, rnext)
  501. __field(__u8, maclen)
  502. ),
  503. TP_fast_assign(
  504. const struct tcphdr *th = (const struct tcphdr *)skb->data;
  505. __entry->net_cookie = sock_net(sk)->net_cookie;
  506. __entry->skbaddr = skb;
  507. __entry->skaddr = sk;
  508. __entry->state = sk->sk_state;
  509. memset(__entry->saddr, 0, sizeof(struct sockaddr_in6));
  510. memset(__entry->daddr, 0, sizeof(struct sockaddr_in6));
  511. TP_STORE_ADDR_PORTS_SKB(skb, th, __entry->saddr, __entry->daddr);
  512. __entry->l3index = inet_sdif(skb) ? inet_iif(skb) : 0;
  513. /* For filtering use */
  514. __entry->sport = ntohs(th->source);
  515. __entry->dport = ntohs(th->dest);
  516. __entry->family = sk->sk_family;
  517. __entry->fin = th->fin;
  518. __entry->syn = th->syn;
  519. __entry->rst = th->rst;
  520. __entry->psh = th->psh;
  521. __entry->ack = th->ack;
  522. __entry->keyid = keyid;
  523. __entry->rnext = rnext;
  524. __entry->maclen = maclen;
  525. ),
  526. TP_printk("net=%llu state=%s family=%s src=%pISpc dest=%pISpc L3index=%d [%c%c%c%c%c] keyid=%u rnext=%u maclen=%u",
  527. __entry->net_cookie,
  528. show_tcp_state_name(__entry->state),
  529. show_family_name(__entry->family),
  530. __entry->saddr, __entry->daddr,
  531. __entry->l3index,
  532. __entry->fin ? 'F' : ' ',
  533. __entry->syn ? 'S' : ' ',
  534. __entry->rst ? 'R' : ' ',
  535. __entry->psh ? 'P' : ' ',
  536. __entry->ack ? '.' : ' ',
  537. __entry->keyid, __entry->rnext, __entry->maclen)
  538. );
  539. DEFINE_EVENT(tcp_ao_event, tcp_ao_handshake_failure,
  540. TP_PROTO(const struct sock *sk, const struct sk_buff *skb,
  541. const __u8 keyid, const __u8 rnext, const __u8 maclen),
  542. TP_ARGS(sk, skb, keyid, rnext, maclen)
  543. );
  544. #ifdef CONFIG_TCP_AO
  545. DEFINE_EVENT(tcp_ao_event, tcp_ao_wrong_maclen,
  546. TP_PROTO(const struct sock *sk, const struct sk_buff *skb,
  547. const __u8 keyid, const __u8 rnext, const __u8 maclen),
  548. TP_ARGS(sk, skb, keyid, rnext, maclen)
  549. );
  550. DEFINE_EVENT(tcp_ao_event, tcp_ao_mismatch,
  551. TP_PROTO(const struct sock *sk, const struct sk_buff *skb,
  552. const __u8 keyid, const __u8 rnext, const __u8 maclen),
  553. TP_ARGS(sk, skb, keyid, rnext, maclen)
  554. );
  555. DEFINE_EVENT(tcp_ao_event, tcp_ao_key_not_found,
  556. TP_PROTO(const struct sock *sk, const struct sk_buff *skb,
  557. const __u8 keyid, const __u8 rnext, const __u8 maclen),
  558. TP_ARGS(sk, skb, keyid, rnext, maclen)
  559. );
  560. DEFINE_EVENT(tcp_ao_event, tcp_ao_rnext_request,
  561. TP_PROTO(const struct sock *sk, const struct sk_buff *skb,
  562. const __u8 keyid, const __u8 rnext, const __u8 maclen),
  563. TP_ARGS(sk, skb, keyid, rnext, maclen)
  564. );
  565. DECLARE_EVENT_CLASS(tcp_ao_event_sk,
  566. TP_PROTO(const struct sock *sk, const __u8 keyid, const __u8 rnext),
  567. TP_ARGS(sk, keyid, rnext),
  568. TP_STRUCT__entry(
  569. __field(__u64, net_cookie)
  570. __field(const void *, skaddr)
  571. __field(int, state)
  572. /* sockaddr_in6 is always bigger than sockaddr_in */
  573. __array(__u8, saddr, sizeof(struct sockaddr_in6))
  574. __array(__u8, daddr, sizeof(struct sockaddr_in6))
  575. __field(__u16, sport)
  576. __field(__u16, dport)
  577. __field(__u16, family)
  578. __field(__u8, keyid)
  579. __field(__u8, rnext)
  580. ),
  581. TP_fast_assign(
  582. const struct inet_sock *inet = inet_sk(sk);
  583. __entry->net_cookie = sock_net(sk)->net_cookie;
  584. __entry->skaddr = sk;
  585. __entry->state = sk->sk_state;
  586. memset(__entry->saddr, 0, sizeof(struct sockaddr_in6));
  587. memset(__entry->daddr, 0, sizeof(struct sockaddr_in6));
  588. TP_STORE_ADDR_PORTS(__entry, inet, sk);
  589. /* For filtering use */
  590. __entry->sport = ntohs(inet->inet_sport);
  591. __entry->dport = ntohs(inet->inet_dport);
  592. __entry->family = sk->sk_family;
  593. __entry->keyid = keyid;
  594. __entry->rnext = rnext;
  595. ),
  596. TP_printk("net=%llu state=%s family=%s src=%pISpc dest=%pISpc keyid=%u rnext=%u",
  597. __entry->net_cookie,
  598. show_tcp_state_name(__entry->state),
  599. show_family_name(__entry->family),
  600. __entry->saddr, __entry->daddr,
  601. __entry->keyid, __entry->rnext)
  602. );
  603. DEFINE_EVENT(tcp_ao_event_sk, tcp_ao_synack_no_key,
  604. TP_PROTO(const struct sock *sk, const __u8 keyid, const __u8 rnext),
  605. TP_ARGS(sk, keyid, rnext)
  606. );
  607. DECLARE_EVENT_CLASS(tcp_ao_event_sne,
  608. TP_PROTO(const struct sock *sk, __u32 new_sne),
  609. TP_ARGS(sk, new_sne),
  610. TP_STRUCT__entry(
  611. __field(__u64, net_cookie)
  612. __field(const void *, skaddr)
  613. __field(int, state)
  614. /* sockaddr_in6 is always bigger than sockaddr_in */
  615. __array(__u8, saddr, sizeof(struct sockaddr_in6))
  616. __array(__u8, daddr, sizeof(struct sockaddr_in6))
  617. __field(__u16, sport)
  618. __field(__u16, dport)
  619. __field(__u16, family)
  620. __field(__u32, new_sne)
  621. ),
  622. TP_fast_assign(
  623. const struct inet_sock *inet = inet_sk(sk);
  624. __entry->net_cookie = sock_net(sk)->net_cookie;
  625. __entry->skaddr = sk;
  626. __entry->state = sk->sk_state;
  627. memset(__entry->saddr, 0, sizeof(struct sockaddr_in6));
  628. memset(__entry->daddr, 0, sizeof(struct sockaddr_in6));
  629. TP_STORE_ADDR_PORTS(__entry, inet, sk);
  630. /* For filtering use */
  631. __entry->sport = ntohs(inet->inet_sport);
  632. __entry->dport = ntohs(inet->inet_dport);
  633. __entry->family = sk->sk_family;
  634. __entry->new_sne = new_sne;
  635. ),
  636. TP_printk("net=%llu state=%s family=%s src=%pISpc dest=%pISpc sne=%u",
  637. __entry->net_cookie,
  638. show_tcp_state_name(__entry->state),
  639. show_family_name(__entry->family),
  640. __entry->saddr, __entry->daddr,
  641. __entry->new_sne)
  642. );
  643. DEFINE_EVENT(tcp_ao_event_sne, tcp_ao_snd_sne_update,
  644. TP_PROTO(const struct sock *sk, __u32 new_sne),
  645. TP_ARGS(sk, new_sne)
  646. );
  647. DEFINE_EVENT(tcp_ao_event_sne, tcp_ao_rcv_sne_update,
  648. TP_PROTO(const struct sock *sk, __u32 new_sne),
  649. TP_ARGS(sk, new_sne)
  650. );
  651. #endif /* CONFIG_TCP_AO */
  652. #endif /* _TRACE_TCP_H */
  653. /* This part must be outside protection */
  654. #include <trace/define_trace.h>