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