0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 #undef TRACE_SYSTEM
0037 #define TRACE_SYSTEM tipc
0038
0039 #if !defined(_TIPC_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
0040 #define _TIPC_TRACE_H
0041
0042 #include <linux/tracepoint.h>
0043 #include "core.h"
0044 #include "link.h"
0045 #include "socket.h"
0046 #include "node.h"
0047
0048 #define SKB_LMIN (100)
0049 #define SKB_LMAX (SKB_LMIN * 2)
0050 #define LIST_LMIN (SKB_LMIN * 3)
0051 #define LIST_LMAX (SKB_LMIN * 11)
0052 #define SK_LMIN (SKB_LMIN * 2)
0053 #define SK_LMAX (SKB_LMIN * 11)
0054 #define LINK_LMIN (SKB_LMIN)
0055 #define LINK_LMAX (SKB_LMIN * 16)
0056 #define NODE_LMIN (SKB_LMIN)
0057 #define NODE_LMAX (SKB_LMIN * 11)
0058
0059 #ifndef __TIPC_TRACE_ENUM
0060 #define __TIPC_TRACE_ENUM
0061 enum {
0062 TIPC_DUMP_NONE = 0,
0063
0064 TIPC_DUMP_TRANSMQ = 1,
0065 TIPC_DUMP_BACKLOGQ = (1 << 1),
0066 TIPC_DUMP_DEFERDQ = (1 << 2),
0067 TIPC_DUMP_INPUTQ = (1 << 3),
0068 TIPC_DUMP_WAKEUP = (1 << 4),
0069
0070 TIPC_DUMP_SK_SNDQ = (1 << 8),
0071 TIPC_DUMP_SK_RCVQ = (1 << 9),
0072 TIPC_DUMP_SK_BKLGQ = (1 << 10),
0073 TIPC_DUMP_ALL = 0xffffu
0074 };
0075 #endif
0076
0077
0078 #define state_sym(val) \
0079 __print_symbolic(val, \
0080 {(0xe), "ESTABLISHED" },\
0081 {(0xe << 4), "ESTABLISHING" },\
0082 {(0x1 << 8), "RESET" },\
0083 {(0x2 << 12), "RESETTING" },\
0084 {(0xd << 16), "PEER_RESET" },\
0085 {(0xf << 20), "FAILINGOVER" },\
0086 {(0xc << 24), "SYNCHING" },\
0087 {(0xdd), "SELF_DOWN_PEER_DOWN" },\
0088 {(0xaa), "SELF_UP_PEER_UP" },\
0089 {(0xd1), "SELF_DOWN_PEER_LEAVING" },\
0090 {(0xac), "SELF_UP_PEER_COMING" },\
0091 {(0xca), "SELF_COMING_PEER_UP" },\
0092 {(0x1d), "SELF_LEAVING_PEER_DOWN" },\
0093 {(0xf0), "FAILINGOVER" },\
0094 {(0xcc), "SYNCHING" })
0095
0096
0097 #define evt_sym(val) \
0098 __print_symbolic(val, \
0099 {(0xec1ab1e), "ESTABLISH_EVT" },\
0100 {(0x9eed0e), "PEER_RESET_EVT" },\
0101 {(0xfa110e), "FAILURE_EVT" },\
0102 {(0x10ca1d0e), "RESET_EVT" },\
0103 {(0xfa110bee), "FAILOVER_BEGIN_EVT" },\
0104 {(0xfa110ede), "FAILOVER_END_EVT" },\
0105 {(0xc1ccbee), "SYNCH_BEGIN_EVT" },\
0106 {(0xc1ccede), "SYNCH_END_EVT" },\
0107 {(0xece), "SELF_ESTABL_CONTACT_EVT" },\
0108 {(0x1ce), "SELF_LOST_CONTACT_EVT" },\
0109 {(0x9ece), "PEER_ESTABL_CONTACT_EVT" },\
0110 {(0x91ce), "PEER_LOST_CONTACT_EVT" },\
0111 {(0xfbe), "FAILOVER_BEGIN_EVT" },\
0112 {(0xfee), "FAILOVER_END_EVT" },\
0113 {(0xcbe), "SYNCH_BEGIN_EVT" },\
0114 {(0xcee), "SYNCH_END_EVT" })
0115
0116
0117 #define dev_evt_sym(val) \
0118 __print_symbolic(val, \
0119 {(NETDEV_CHANGE), "NETDEV_CHANGE" },\
0120 {(NETDEV_GOING_DOWN), "NETDEV_GOING_DOWN" },\
0121 {(NETDEV_UP), "NETDEV_UP" },\
0122 {(NETDEV_CHANGEMTU), "NETDEV_CHANGEMTU" },\
0123 {(NETDEV_CHANGEADDR), "NETDEV_CHANGEADDR" },\
0124 {(NETDEV_UNREGISTER), "NETDEV_UNREGISTER" },\
0125 {(NETDEV_CHANGENAME), "NETDEV_CHANGENAME" })
0126
0127 extern unsigned long sysctl_tipc_sk_filter[5] __read_mostly;
0128
0129 int tipc_skb_dump(struct sk_buff *skb, bool more, char *buf);
0130 int tipc_list_dump(struct sk_buff_head *list, bool more, char *buf);
0131 int tipc_sk_dump(struct sock *sk, u16 dqueues, char *buf);
0132 int tipc_link_dump(struct tipc_link *l, u16 dqueues, char *buf);
0133 int tipc_node_dump(struct tipc_node *n, bool more, char *buf);
0134 bool tipc_sk_filtering(struct sock *sk);
0135
0136 DECLARE_EVENT_CLASS(tipc_skb_class,
0137
0138 TP_PROTO(struct sk_buff *skb, bool more, const char *header),
0139
0140 TP_ARGS(skb, more, header),
0141
0142 TP_STRUCT__entry(
0143 __string(header, header)
0144 __dynamic_array(char, buf, (more) ? SKB_LMAX : SKB_LMIN)
0145 ),
0146
0147 TP_fast_assign(
0148 __assign_str(header, header);
0149 tipc_skb_dump(skb, more, __get_str(buf));
0150 ),
0151
0152 TP_printk("%s\n%s", __get_str(header), __get_str(buf))
0153 )
0154
0155 #define DEFINE_SKB_EVENT(name) \
0156 DEFINE_EVENT(tipc_skb_class, name, \
0157 TP_PROTO(struct sk_buff *skb, bool more, const char *header), \
0158 TP_ARGS(skb, more, header))
0159 DEFINE_SKB_EVENT(tipc_skb_dump);
0160 DEFINE_SKB_EVENT(tipc_proto_build);
0161 DEFINE_SKB_EVENT(tipc_proto_rcv);
0162
0163 DECLARE_EVENT_CLASS(tipc_list_class,
0164
0165 TP_PROTO(struct sk_buff_head *list, bool more, const char *header),
0166
0167 TP_ARGS(list, more, header),
0168
0169 TP_STRUCT__entry(
0170 __string(header, header)
0171 __dynamic_array(char, buf, (more) ? LIST_LMAX : LIST_LMIN)
0172 ),
0173
0174 TP_fast_assign(
0175 __assign_str(header, header);
0176 tipc_list_dump(list, more, __get_str(buf));
0177 ),
0178
0179 TP_printk("%s\n%s", __get_str(header), __get_str(buf))
0180 );
0181
0182 #define DEFINE_LIST_EVENT(name) \
0183 DEFINE_EVENT(tipc_list_class, name, \
0184 TP_PROTO(struct sk_buff_head *list, bool more, const char *header), \
0185 TP_ARGS(list, more, header))
0186 DEFINE_LIST_EVENT(tipc_list_dump);
0187
0188 DECLARE_EVENT_CLASS(tipc_sk_class,
0189
0190 TP_PROTO(struct sock *sk, struct sk_buff *skb, u16 dqueues,
0191 const char *header),
0192
0193 TP_ARGS(sk, skb, dqueues, header),
0194
0195 TP_STRUCT__entry(
0196 __string(header, header)
0197 __field(u32, portid)
0198 __dynamic_array(char, buf, (dqueues) ? SK_LMAX : SK_LMIN)
0199 __dynamic_array(char, skb_buf, (skb) ? SKB_LMIN : 1)
0200 ),
0201
0202 TP_fast_assign(
0203 __assign_str(header, header);
0204 __entry->portid = tipc_sock_get_portid(sk);
0205 tipc_sk_dump(sk, dqueues, __get_str(buf));
0206 if (skb)
0207 tipc_skb_dump(skb, false, __get_str(skb_buf));
0208 else
0209 *(__get_str(skb_buf)) = '\0';
0210 ),
0211
0212 TP_printk("<%u> %s\n%s%s", __entry->portid, __get_str(header),
0213 __get_str(skb_buf), __get_str(buf))
0214 );
0215
0216 #define DEFINE_SK_EVENT_FILTER(name) \
0217 DEFINE_EVENT_CONDITION(tipc_sk_class, name, \
0218 TP_PROTO(struct sock *sk, struct sk_buff *skb, u16 dqueues, \
0219 const char *header), \
0220 TP_ARGS(sk, skb, dqueues, header), \
0221 TP_CONDITION(tipc_sk_filtering(sk)))
0222 DEFINE_SK_EVENT_FILTER(tipc_sk_dump);
0223 DEFINE_SK_EVENT_FILTER(tipc_sk_create);
0224 DEFINE_SK_EVENT_FILTER(tipc_sk_sendmcast);
0225 DEFINE_SK_EVENT_FILTER(tipc_sk_sendmsg);
0226 DEFINE_SK_EVENT_FILTER(tipc_sk_sendstream);
0227 DEFINE_SK_EVENT_FILTER(tipc_sk_poll);
0228 DEFINE_SK_EVENT_FILTER(tipc_sk_filter_rcv);
0229 DEFINE_SK_EVENT_FILTER(tipc_sk_advance_rx);
0230 DEFINE_SK_EVENT_FILTER(tipc_sk_rej_msg);
0231 DEFINE_SK_EVENT_FILTER(tipc_sk_drop_msg);
0232 DEFINE_SK_EVENT_FILTER(tipc_sk_release);
0233 DEFINE_SK_EVENT_FILTER(tipc_sk_shutdown);
0234
0235 #define DEFINE_SK_EVENT_FILTER_COND(name, cond) \
0236 DEFINE_EVENT_CONDITION(tipc_sk_class, name, \
0237 TP_PROTO(struct sock *sk, struct sk_buff *skb, u16 dqueues, \
0238 const char *header), \
0239 TP_ARGS(sk, skb, dqueues, header), \
0240 TP_CONDITION(tipc_sk_filtering(sk) && (cond)))
0241 DEFINE_SK_EVENT_FILTER_COND(tipc_sk_overlimit1, tipc_sk_overlimit1(sk, skb));
0242 DEFINE_SK_EVENT_FILTER_COND(tipc_sk_overlimit2, tipc_sk_overlimit2(sk, skb));
0243
0244 DECLARE_EVENT_CLASS(tipc_link_class,
0245
0246 TP_PROTO(struct tipc_link *l, u16 dqueues, const char *header),
0247
0248 TP_ARGS(l, dqueues, header),
0249
0250 TP_STRUCT__entry(
0251 __string(header, header)
0252 __array(char, name, TIPC_MAX_LINK_NAME)
0253 __dynamic_array(char, buf, (dqueues) ? LINK_LMAX : LINK_LMIN)
0254 ),
0255
0256 TP_fast_assign(
0257 __assign_str(header, header);
0258 memcpy(__entry->name, tipc_link_name(l), TIPC_MAX_LINK_NAME);
0259 tipc_link_dump(l, dqueues, __get_str(buf));
0260 ),
0261
0262 TP_printk("<%s> %s\n%s", __entry->name, __get_str(header),
0263 __get_str(buf))
0264 );
0265
0266 #define DEFINE_LINK_EVENT(name) \
0267 DEFINE_EVENT(tipc_link_class, name, \
0268 TP_PROTO(struct tipc_link *l, u16 dqueues, const char *header), \
0269 TP_ARGS(l, dqueues, header))
0270 DEFINE_LINK_EVENT(tipc_link_dump);
0271 DEFINE_LINK_EVENT(tipc_link_conges);
0272 DEFINE_LINK_EVENT(tipc_link_timeout);
0273 DEFINE_LINK_EVENT(tipc_link_reset);
0274
0275 #define DEFINE_LINK_EVENT_COND(name, cond) \
0276 DEFINE_EVENT_CONDITION(tipc_link_class, name, \
0277 TP_PROTO(struct tipc_link *l, u16 dqueues, const char *header), \
0278 TP_ARGS(l, dqueues, header), \
0279 TP_CONDITION(cond))
0280 DEFINE_LINK_EVENT_COND(tipc_link_too_silent, tipc_link_too_silent(l));
0281
0282 DECLARE_EVENT_CLASS(tipc_link_transmq_class,
0283
0284 TP_PROTO(struct tipc_link *r, u16 f, u16 t, struct sk_buff_head *tq),
0285
0286 TP_ARGS(r, f, t, tq),
0287
0288 TP_STRUCT__entry(
0289 __array(char, name, TIPC_MAX_LINK_NAME)
0290 __field(u16, from)
0291 __field(u16, to)
0292 __field(u32, len)
0293 __field(u16, fseqno)
0294 __field(u16, lseqno)
0295 ),
0296
0297 TP_fast_assign(
0298 memcpy(__entry->name, tipc_link_name(r), TIPC_MAX_LINK_NAME);
0299 __entry->from = f;
0300 __entry->to = t;
0301 __entry->len = skb_queue_len(tq);
0302 __entry->fseqno = __entry->len ?
0303 msg_seqno(buf_msg(skb_peek(tq))) : 0;
0304 __entry->lseqno = __entry->len ?
0305 msg_seqno(buf_msg(skb_peek_tail(tq))) : 0;
0306 ),
0307
0308 TP_printk("<%s> retrans req: [%u-%u] transmq: %u [%u-%u]\n",
0309 __entry->name, __entry->from, __entry->to,
0310 __entry->len, __entry->fseqno, __entry->lseqno)
0311 );
0312
0313 DEFINE_EVENT_CONDITION(tipc_link_transmq_class, tipc_link_retrans,
0314 TP_PROTO(struct tipc_link *r, u16 f, u16 t, struct sk_buff_head *tq),
0315 TP_ARGS(r, f, t, tq),
0316 TP_CONDITION(less_eq(f, t))
0317 );
0318
0319 DEFINE_EVENT_PRINT(tipc_link_transmq_class, tipc_link_bc_ack,
0320 TP_PROTO(struct tipc_link *r, u16 f, u16 t, struct sk_buff_head *tq),
0321 TP_ARGS(r, f, t, tq),
0322 TP_printk("<%s> acked: %u gap: %u transmq: %u [%u-%u]\n",
0323 __entry->name, __entry->from, __entry->to,
0324 __entry->len, __entry->fseqno, __entry->lseqno)
0325 );
0326
0327 DECLARE_EVENT_CLASS(tipc_node_class,
0328
0329 TP_PROTO(struct tipc_node *n, bool more, const char *header),
0330
0331 TP_ARGS(n, more, header),
0332
0333 TP_STRUCT__entry(
0334 __string(header, header)
0335 __field(u32, addr)
0336 __dynamic_array(char, buf, (more) ? NODE_LMAX : NODE_LMIN)
0337 ),
0338
0339 TP_fast_assign(
0340 __assign_str(header, header);
0341 __entry->addr = tipc_node_get_addr(n);
0342 tipc_node_dump(n, more, __get_str(buf));
0343 ),
0344
0345 TP_printk("<%x> %s\n%s", __entry->addr, __get_str(header),
0346 __get_str(buf))
0347 );
0348
0349 #define DEFINE_NODE_EVENT(name) \
0350 DEFINE_EVENT(tipc_node_class, name, \
0351 TP_PROTO(struct tipc_node *n, bool more, const char *header), \
0352 TP_ARGS(n, more, header))
0353 DEFINE_NODE_EVENT(tipc_node_dump);
0354 DEFINE_NODE_EVENT(tipc_node_create);
0355 DEFINE_NODE_EVENT(tipc_node_delete);
0356 DEFINE_NODE_EVENT(tipc_node_lost_contact);
0357 DEFINE_NODE_EVENT(tipc_node_timeout);
0358 DEFINE_NODE_EVENT(tipc_node_link_up);
0359 DEFINE_NODE_EVENT(tipc_node_link_down);
0360 DEFINE_NODE_EVENT(tipc_node_reset_links);
0361 DEFINE_NODE_EVENT(tipc_node_check_state);
0362
0363 DECLARE_EVENT_CLASS(tipc_fsm_class,
0364
0365 TP_PROTO(const char *name, u32 os, u32 ns, int evt),
0366
0367 TP_ARGS(name, os, ns, evt),
0368
0369 TP_STRUCT__entry(
0370 __string(name, name)
0371 __field(u32, os)
0372 __field(u32, ns)
0373 __field(u32, evt)
0374 ),
0375
0376 TP_fast_assign(
0377 __assign_str(name, name);
0378 __entry->os = os;
0379 __entry->ns = ns;
0380 __entry->evt = evt;
0381 ),
0382
0383 TP_printk("<%s> %s--(%s)->%s\n", __get_str(name),
0384 state_sym(__entry->os), evt_sym(__entry->evt),
0385 state_sym(__entry->ns))
0386 );
0387
0388 #define DEFINE_FSM_EVENT(fsm_name) \
0389 DEFINE_EVENT(tipc_fsm_class, fsm_name, \
0390 TP_PROTO(const char *name, u32 os, u32 ns, int evt), \
0391 TP_ARGS(name, os, ns, evt))
0392 DEFINE_FSM_EVENT(tipc_link_fsm);
0393 DEFINE_FSM_EVENT(tipc_node_fsm);
0394
0395 TRACE_EVENT(tipc_l2_device_event,
0396
0397 TP_PROTO(struct net_device *dev, struct tipc_bearer *b,
0398 unsigned long evt),
0399
0400 TP_ARGS(dev, b, evt),
0401
0402 TP_STRUCT__entry(
0403 __string(dev_name, dev->name)
0404 __string(b_name, b->name)
0405 __field(unsigned long, evt)
0406 __field(u8, b_up)
0407 __field(u8, carrier)
0408 __field(u8, oper)
0409 ),
0410
0411 TP_fast_assign(
0412 __assign_str(dev_name, dev->name);
0413 __assign_str(b_name, b->name);
0414 __entry->evt = evt;
0415 __entry->b_up = test_bit(0, &b->up);
0416 __entry->carrier = netif_carrier_ok(dev);
0417 __entry->oper = netif_oper_up(dev);
0418 ),
0419
0420 TP_printk("%s on: <%s>/<%s> oper: %s carrier: %s bearer: %s\n",
0421 dev_evt_sym(__entry->evt), __get_str(dev_name),
0422 __get_str(b_name), (__entry->oper) ? "up" : "down",
0423 (__entry->carrier) ? "ok" : "notok",
0424 (__entry->b_up) ? "up" : "down")
0425 );
0426
0427 #endif
0428
0429
0430 #undef TRACE_INCLUDE_PATH
0431 #define TRACE_INCLUDE_PATH .
0432 #undef TRACE_INCLUDE_FILE
0433 #define TRACE_INCLUDE_FILE trace
0434 #include <trace/define_trace.h>