trace.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. /*
  2. * net/tipc/trace.h: TIPC tracepoints
  3. *
  4. * Copyright (c) 2018, Ericsson AB
  5. * All rights reserved.
  6. *
  7. * Redistribution and use in source and binary forms, with or without
  8. * modification, are permitted provided that the following conditions are met:
  9. *
  10. * 1. Redistributions of source code must retain the above copyright
  11. * notice, this list of conditions and the following disclaimer.
  12. * 2. Redistributions in binary form must reproduce the above copyright
  13. * notice, this list of conditions and the following disclaimer in the
  14. * documentation and/or other materials provided with the distribution.
  15. * 3. Neither the names of the copyright holders nor the names of its
  16. * contributors may be used to endorse or promote products derived from
  17. * this software without specific prior written permission.
  18. *
  19. * Alternatively, this software may be distributed under the terms of the
  20. * GNU General Public License ("GPL") version 2 as published by the Free
  21. * Software Foundation.
  22. *
  23. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "ASIS"
  24. * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,THE
  25. * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  26. * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
  27. * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  28. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  29. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
  30. * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
  31. * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  32. * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
  33. * POSSIBILITY OF SUCH DAMAGE.
  34. */
  35. #undef TRACE_SYSTEM
  36. #define TRACE_SYSTEM tipc
  37. #if !defined(_TIPC_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
  38. #define _TIPC_TRACE_H
  39. #include <linux/tracepoint.h>
  40. #include "core.h"
  41. #include "link.h"
  42. #include "socket.h"
  43. #include "node.h"
  44. #define SKB_LMIN (100)
  45. #define SKB_LMAX (SKB_LMIN * 2)
  46. #define LIST_LMIN (SKB_LMIN * 3)
  47. #define LIST_LMAX (SKB_LMIN * 11)
  48. #define SK_LMIN (SKB_LMIN * 2)
  49. #define SK_LMAX (SKB_LMIN * 11)
  50. #define LINK_LMIN (SKB_LMIN)
  51. #define LINK_LMAX (SKB_LMIN * 16)
  52. #define NODE_LMIN (SKB_LMIN)
  53. #define NODE_LMAX (SKB_LMIN * 11)
  54. #ifndef __TIPC_TRACE_ENUM
  55. #define __TIPC_TRACE_ENUM
  56. enum {
  57. TIPC_DUMP_NONE = 0,
  58. TIPC_DUMP_TRANSMQ = 1,
  59. TIPC_DUMP_BACKLOGQ = (1 << 1),
  60. TIPC_DUMP_DEFERDQ = (1 << 2),
  61. TIPC_DUMP_INPUTQ = (1 << 3),
  62. TIPC_DUMP_WAKEUP = (1 << 4),
  63. TIPC_DUMP_SK_SNDQ = (1 << 8),
  64. TIPC_DUMP_SK_RCVQ = (1 << 9),
  65. TIPC_DUMP_SK_BKLGQ = (1 << 10),
  66. TIPC_DUMP_ALL = 0xffffu
  67. };
  68. #endif
  69. /* Link & Node FSM states: */
  70. #define state_sym(val) \
  71. __print_symbolic(val, \
  72. {(0xe), "ESTABLISHED" },\
  73. {(0xe << 4), "ESTABLISHING" },\
  74. {(0x1 << 8), "RESET" },\
  75. {(0x2 << 12), "RESETTING" },\
  76. {(0xd << 16), "PEER_RESET" },\
  77. {(0xf << 20), "FAILINGOVER" },\
  78. {(0xc << 24), "SYNCHING" },\
  79. {(0xdd), "SELF_DOWN_PEER_DOWN" },\
  80. {(0xaa), "SELF_UP_PEER_UP" },\
  81. {(0xd1), "SELF_DOWN_PEER_LEAVING" },\
  82. {(0xac), "SELF_UP_PEER_COMING" },\
  83. {(0xca), "SELF_COMING_PEER_UP" },\
  84. {(0x1d), "SELF_LEAVING_PEER_DOWN" },\
  85. {(0xf0), "FAILINGOVER" },\
  86. {(0xcc), "SYNCHING" })
  87. /* Link & Node FSM events: */
  88. #define evt_sym(val) \
  89. __print_symbolic(val, \
  90. {(0xec1ab1e), "ESTABLISH_EVT" },\
  91. {(0x9eed0e), "PEER_RESET_EVT" },\
  92. {(0xfa110e), "FAILURE_EVT" },\
  93. {(0x10ca1d0e), "RESET_EVT" },\
  94. {(0xfa110bee), "FAILOVER_BEGIN_EVT" },\
  95. {(0xfa110ede), "FAILOVER_END_EVT" },\
  96. {(0xc1ccbee), "SYNCH_BEGIN_EVT" },\
  97. {(0xc1ccede), "SYNCH_END_EVT" },\
  98. {(0xece), "SELF_ESTABL_CONTACT_EVT" },\
  99. {(0x1ce), "SELF_LOST_CONTACT_EVT" },\
  100. {(0x9ece), "PEER_ESTABL_CONTACT_EVT" },\
  101. {(0x91ce), "PEER_LOST_CONTACT_EVT" },\
  102. {(0xfbe), "FAILOVER_BEGIN_EVT" },\
  103. {(0xfee), "FAILOVER_END_EVT" },\
  104. {(0xcbe), "SYNCH_BEGIN_EVT" },\
  105. {(0xcee), "SYNCH_END_EVT" })
  106. /* Bearer, net device events: */
  107. #define dev_evt_sym(val) \
  108. __print_symbolic(val, \
  109. {(NETDEV_CHANGE), "NETDEV_CHANGE" },\
  110. {(NETDEV_GOING_DOWN), "NETDEV_GOING_DOWN" },\
  111. {(NETDEV_UP), "NETDEV_UP" },\
  112. {(NETDEV_CHANGEMTU), "NETDEV_CHANGEMTU" },\
  113. {(NETDEV_CHANGEADDR), "NETDEV_CHANGEADDR" },\
  114. {(NETDEV_UNREGISTER), "NETDEV_UNREGISTER" },\
  115. {(NETDEV_CHANGENAME), "NETDEV_CHANGENAME" })
  116. extern unsigned long sysctl_tipc_sk_filter[5] __read_mostly;
  117. int tipc_skb_dump(struct sk_buff *skb, bool more, char *buf);
  118. int tipc_list_dump(struct sk_buff_head *list, bool more, char *buf);
  119. int tipc_sk_dump(struct sock *sk, u16 dqueues, char *buf);
  120. int tipc_link_dump(struct tipc_link *l, u16 dqueues, char *buf);
  121. int tipc_node_dump(struct tipc_node *n, bool more, char *buf);
  122. bool tipc_sk_filtering(struct sock *sk);
  123. DECLARE_EVENT_CLASS(tipc_skb_class,
  124. TP_PROTO(struct sk_buff *skb, bool more, const char *header),
  125. TP_ARGS(skb, more, header),
  126. TP_STRUCT__entry(
  127. __string(header, header)
  128. __dynamic_array(char, buf, (more) ? SKB_LMAX : SKB_LMIN)
  129. ),
  130. TP_fast_assign(
  131. __assign_str(header, header);
  132. tipc_skb_dump(skb, more, __get_str(buf));
  133. ),
  134. TP_printk("%s\n%s", __get_str(header), __get_str(buf))
  135. )
  136. #define DEFINE_SKB_EVENT(name) \
  137. DEFINE_EVENT(tipc_skb_class, name, \
  138. TP_PROTO(struct sk_buff *skb, bool more, const char *header), \
  139. TP_ARGS(skb, more, header))
  140. DEFINE_SKB_EVENT(tipc_skb_dump);
  141. DEFINE_SKB_EVENT(tipc_proto_build);
  142. DEFINE_SKB_EVENT(tipc_proto_rcv);
  143. DECLARE_EVENT_CLASS(tipc_list_class,
  144. TP_PROTO(struct sk_buff_head *list, bool more, const char *header),
  145. TP_ARGS(list, more, header),
  146. TP_STRUCT__entry(
  147. __string(header, header)
  148. __dynamic_array(char, buf, (more) ? LIST_LMAX : LIST_LMIN)
  149. ),
  150. TP_fast_assign(
  151. __assign_str(header, header);
  152. tipc_list_dump(list, more, __get_str(buf));
  153. ),
  154. TP_printk("%s\n%s", __get_str(header), __get_str(buf))
  155. );
  156. #define DEFINE_LIST_EVENT(name) \
  157. DEFINE_EVENT(tipc_list_class, name, \
  158. TP_PROTO(struct sk_buff_head *list, bool more, const char *header), \
  159. TP_ARGS(list, more, header))
  160. DEFINE_LIST_EVENT(tipc_list_dump);
  161. DECLARE_EVENT_CLASS(tipc_sk_class,
  162. TP_PROTO(struct sock *sk, struct sk_buff *skb, u16 dqueues,
  163. const char *header),
  164. TP_ARGS(sk, skb, dqueues, header),
  165. TP_STRUCT__entry(
  166. __string(header, header)
  167. __field(u32, portid)
  168. __dynamic_array(char, buf, (dqueues) ? SK_LMAX : SK_LMIN)
  169. __dynamic_array(char, skb_buf, (skb) ? SKB_LMIN : 1)
  170. ),
  171. TP_fast_assign(
  172. __assign_str(header, header);
  173. __entry->portid = tipc_sock_get_portid(sk);
  174. tipc_sk_dump(sk, dqueues, __get_str(buf));
  175. if (skb)
  176. tipc_skb_dump(skb, false, __get_str(skb_buf));
  177. else
  178. *(__get_str(skb_buf)) = '\0';
  179. ),
  180. TP_printk("<%u> %s\n%s%s", __entry->portid, __get_str(header),
  181. __get_str(skb_buf), __get_str(buf))
  182. );
  183. #define DEFINE_SK_EVENT_FILTER(name) \
  184. DEFINE_EVENT_CONDITION(tipc_sk_class, name, \
  185. TP_PROTO(struct sock *sk, struct sk_buff *skb, u16 dqueues, \
  186. const char *header), \
  187. TP_ARGS(sk, skb, dqueues, header), \
  188. TP_CONDITION(tipc_sk_filtering(sk)))
  189. DEFINE_SK_EVENT_FILTER(tipc_sk_dump);
  190. DEFINE_SK_EVENT_FILTER(tipc_sk_create);
  191. DEFINE_SK_EVENT_FILTER(tipc_sk_sendmcast);
  192. DEFINE_SK_EVENT_FILTER(tipc_sk_sendmsg);
  193. DEFINE_SK_EVENT_FILTER(tipc_sk_sendstream);
  194. DEFINE_SK_EVENT_FILTER(tipc_sk_poll);
  195. DEFINE_SK_EVENT_FILTER(tipc_sk_filter_rcv);
  196. DEFINE_SK_EVENT_FILTER(tipc_sk_advance_rx);
  197. DEFINE_SK_EVENT_FILTER(tipc_sk_rej_msg);
  198. DEFINE_SK_EVENT_FILTER(tipc_sk_drop_msg);
  199. DEFINE_SK_EVENT_FILTER(tipc_sk_release);
  200. DEFINE_SK_EVENT_FILTER(tipc_sk_shutdown);
  201. #define DEFINE_SK_EVENT_FILTER_COND(name, cond) \
  202. DEFINE_EVENT_CONDITION(tipc_sk_class, name, \
  203. TP_PROTO(struct sock *sk, struct sk_buff *skb, u16 dqueues, \
  204. const char *header), \
  205. TP_ARGS(sk, skb, dqueues, header), \
  206. TP_CONDITION(tipc_sk_filtering(sk) && (cond)))
  207. DEFINE_SK_EVENT_FILTER_COND(tipc_sk_overlimit1, tipc_sk_overlimit1(sk, skb));
  208. DEFINE_SK_EVENT_FILTER_COND(tipc_sk_overlimit2, tipc_sk_overlimit2(sk, skb));
  209. DECLARE_EVENT_CLASS(tipc_link_class,
  210. TP_PROTO(struct tipc_link *l, u16 dqueues, const char *header),
  211. TP_ARGS(l, dqueues, header),
  212. TP_STRUCT__entry(
  213. __string(header, header)
  214. __array(char, name, TIPC_MAX_LINK_NAME)
  215. __dynamic_array(char, buf, (dqueues) ? LINK_LMAX : LINK_LMIN)
  216. ),
  217. TP_fast_assign(
  218. __assign_str(header, header);
  219. memcpy(__entry->name, tipc_link_name(l), TIPC_MAX_LINK_NAME);
  220. tipc_link_dump(l, dqueues, __get_str(buf));
  221. ),
  222. TP_printk("<%s> %s\n%s", __entry->name, __get_str(header),
  223. __get_str(buf))
  224. );
  225. #define DEFINE_LINK_EVENT(name) \
  226. DEFINE_EVENT(tipc_link_class, name, \
  227. TP_PROTO(struct tipc_link *l, u16 dqueues, const char *header), \
  228. TP_ARGS(l, dqueues, header))
  229. DEFINE_LINK_EVENT(tipc_link_dump);
  230. DEFINE_LINK_EVENT(tipc_link_conges);
  231. DEFINE_LINK_EVENT(tipc_link_timeout);
  232. DEFINE_LINK_EVENT(tipc_link_reset);
  233. #define DEFINE_LINK_EVENT_COND(name, cond) \
  234. DEFINE_EVENT_CONDITION(tipc_link_class, name, \
  235. TP_PROTO(struct tipc_link *l, u16 dqueues, const char *header), \
  236. TP_ARGS(l, dqueues, header), \
  237. TP_CONDITION(cond))
  238. DEFINE_LINK_EVENT_COND(tipc_link_too_silent, tipc_link_too_silent(l));
  239. DECLARE_EVENT_CLASS(tipc_link_transmq_class,
  240. TP_PROTO(struct tipc_link *r, u16 f, u16 t, struct sk_buff_head *tq),
  241. TP_ARGS(r, f, t, tq),
  242. TP_STRUCT__entry(
  243. __array(char, name, TIPC_MAX_LINK_NAME)
  244. __field(u16, from)
  245. __field(u16, to)
  246. __field(u32, len)
  247. __field(u16, fseqno)
  248. __field(u16, lseqno)
  249. ),
  250. TP_fast_assign(
  251. memcpy(__entry->name, tipc_link_name(r), TIPC_MAX_LINK_NAME);
  252. __entry->from = f;
  253. __entry->to = t;
  254. __entry->len = skb_queue_len(tq);
  255. __entry->fseqno = __entry->len ?
  256. msg_seqno(buf_msg(skb_peek(tq))) : 0;
  257. __entry->lseqno = __entry->len ?
  258. msg_seqno(buf_msg(skb_peek_tail(tq))) : 0;
  259. ),
  260. TP_printk("<%s> retrans req: [%u-%u] transmq: %u [%u-%u]\n",
  261. __entry->name, __entry->from, __entry->to,
  262. __entry->len, __entry->fseqno, __entry->lseqno)
  263. );
  264. DEFINE_EVENT_CONDITION(tipc_link_transmq_class, tipc_link_retrans,
  265. TP_PROTO(struct tipc_link *r, u16 f, u16 t, struct sk_buff_head *tq),
  266. TP_ARGS(r, f, t, tq),
  267. TP_CONDITION(less_eq(f, t))
  268. );
  269. DEFINE_EVENT_PRINT(tipc_link_transmq_class, tipc_link_bc_ack,
  270. TP_PROTO(struct tipc_link *r, u16 f, u16 t, struct sk_buff_head *tq),
  271. TP_ARGS(r, f, t, tq),
  272. TP_printk("<%s> acked: %u gap: %u transmq: %u [%u-%u]\n",
  273. __entry->name, __entry->from, __entry->to,
  274. __entry->len, __entry->fseqno, __entry->lseqno)
  275. );
  276. DECLARE_EVENT_CLASS(tipc_node_class,
  277. TP_PROTO(struct tipc_node *n, bool more, const char *header),
  278. TP_ARGS(n, more, header),
  279. TP_STRUCT__entry(
  280. __string(header, header)
  281. __field(u32, addr)
  282. __dynamic_array(char, buf, (more) ? NODE_LMAX : NODE_LMIN)
  283. ),
  284. TP_fast_assign(
  285. __assign_str(header, header);
  286. __entry->addr = tipc_node_get_addr(n);
  287. tipc_node_dump(n, more, __get_str(buf));
  288. ),
  289. TP_printk("<%x> %s\n%s", __entry->addr, __get_str(header),
  290. __get_str(buf))
  291. );
  292. #define DEFINE_NODE_EVENT(name) \
  293. DEFINE_EVENT(tipc_node_class, name, \
  294. TP_PROTO(struct tipc_node *n, bool more, const char *header), \
  295. TP_ARGS(n, more, header))
  296. DEFINE_NODE_EVENT(tipc_node_dump);
  297. DEFINE_NODE_EVENT(tipc_node_create);
  298. DEFINE_NODE_EVENT(tipc_node_delete);
  299. DEFINE_NODE_EVENT(tipc_node_lost_contact);
  300. DEFINE_NODE_EVENT(tipc_node_timeout);
  301. DEFINE_NODE_EVENT(tipc_node_link_up);
  302. DEFINE_NODE_EVENT(tipc_node_link_down);
  303. DEFINE_NODE_EVENT(tipc_node_reset_links);
  304. DEFINE_NODE_EVENT(tipc_node_check_state);
  305. DECLARE_EVENT_CLASS(tipc_fsm_class,
  306. TP_PROTO(const char *name, u32 os, u32 ns, int evt),
  307. TP_ARGS(name, os, ns, evt),
  308. TP_STRUCT__entry(
  309. __string(name, name)
  310. __field(u32, os)
  311. __field(u32, ns)
  312. __field(u32, evt)
  313. ),
  314. TP_fast_assign(
  315. __assign_str(name, name);
  316. __entry->os = os;
  317. __entry->ns = ns;
  318. __entry->evt = evt;
  319. ),
  320. TP_printk("<%s> %s--(%s)->%s\n", __get_str(name),
  321. state_sym(__entry->os), evt_sym(__entry->evt),
  322. state_sym(__entry->ns))
  323. );
  324. #define DEFINE_FSM_EVENT(fsm_name) \
  325. DEFINE_EVENT(tipc_fsm_class, fsm_name, \
  326. TP_PROTO(const char *name, u32 os, u32 ns, int evt), \
  327. TP_ARGS(name, os, ns, evt))
  328. DEFINE_FSM_EVENT(tipc_link_fsm);
  329. DEFINE_FSM_EVENT(tipc_node_fsm);
  330. TRACE_EVENT(tipc_l2_device_event,
  331. TP_PROTO(struct net_device *dev, struct tipc_bearer *b,
  332. unsigned long evt),
  333. TP_ARGS(dev, b, evt),
  334. TP_STRUCT__entry(
  335. __string(dev_name, dev->name)
  336. __string(b_name, b->name)
  337. __field(unsigned long, evt)
  338. __field(u8, b_up)
  339. __field(u8, carrier)
  340. __field(u8, oper)
  341. ),
  342. TP_fast_assign(
  343. __assign_str(dev_name, dev->name);
  344. __assign_str(b_name, b->name);
  345. __entry->evt = evt;
  346. __entry->b_up = test_bit(0, &b->up);
  347. __entry->carrier = netif_carrier_ok(dev);
  348. __entry->oper = netif_oper_up(dev);
  349. ),
  350. TP_printk("%s on: <%s>/<%s> oper: %s carrier: %s bearer: %s\n",
  351. dev_evt_sym(__entry->evt), __get_str(dev_name),
  352. __get_str(b_name), (__entry->oper) ? "up" : "down",
  353. (__entry->carrier) ? "ok" : "notok",
  354. (__entry->b_up) ? "up" : "down")
  355. );
  356. #endif /* _TIPC_TRACE_H */
  357. /* This part must be outside protection */
  358. #undef TRACE_INCLUDE_PATH
  359. #define TRACE_INCLUDE_PATH .
  360. #undef TRACE_INCLUDE_FILE
  361. #define TRACE_INCLUDE_FILE trace
  362. #include <trace/define_trace.h>