xref: /OK3568_Linux_fs/kernel/include/trace/events/neigh.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun #undef TRACE_SYSTEM
2*4882a593Smuzhiyun #define TRACE_SYSTEM neigh
3*4882a593Smuzhiyun 
4*4882a593Smuzhiyun #if !defined(_TRACE_NEIGH_H) || defined(TRACE_HEADER_MULTI_READ)
5*4882a593Smuzhiyun #define _TRACE_NEIGH_H
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/skbuff.h>
8*4882a593Smuzhiyun #include <linux/netdevice.h>
9*4882a593Smuzhiyun #include <linux/tracepoint.h>
10*4882a593Smuzhiyun #include <net/neighbour.h>
11*4882a593Smuzhiyun 
12*4882a593Smuzhiyun #define neigh_state_str(state)				\
13*4882a593Smuzhiyun 	__print_symbolic(state,				\
14*4882a593Smuzhiyun 		{ NUD_INCOMPLETE, "incomplete" },	\
15*4882a593Smuzhiyun 		{ NUD_REACHABLE, "reachable" },		\
16*4882a593Smuzhiyun 		{ NUD_STALE, "stale" },			\
17*4882a593Smuzhiyun 		{ NUD_DELAY, "delay" },			\
18*4882a593Smuzhiyun 		{ NUD_PROBE, "probe" },			\
19*4882a593Smuzhiyun 		{ NUD_FAILED, "failed" },		\
20*4882a593Smuzhiyun 		{ NUD_NOARP, "noarp" },			\
21*4882a593Smuzhiyun 		{ NUD_PERMANENT, "permanent"})
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun TRACE_EVENT(neigh_create,
24*4882a593Smuzhiyun 
25*4882a593Smuzhiyun 	TP_PROTO(struct neigh_table *tbl, struct net_device *dev,
26*4882a593Smuzhiyun 		 const void *pkey, const struct neighbour *n,
27*4882a593Smuzhiyun 		 bool exempt_from_gc),
28*4882a593Smuzhiyun 
29*4882a593Smuzhiyun 	TP_ARGS(tbl, dev, pkey, n, exempt_from_gc),
30*4882a593Smuzhiyun 
31*4882a593Smuzhiyun 	TP_STRUCT__entry(
32*4882a593Smuzhiyun 		__field(u32, family)
33*4882a593Smuzhiyun 		__dynamic_array(char,  dev,   IFNAMSIZ )
34*4882a593Smuzhiyun 		__field(int, entries)
35*4882a593Smuzhiyun 		__field(u8, created)
36*4882a593Smuzhiyun 		__field(u8, gc_exempt)
37*4882a593Smuzhiyun 		__array(u8, primary_key4, 4)
38*4882a593Smuzhiyun 		__array(u8, primary_key6, 16)
39*4882a593Smuzhiyun 	),
40*4882a593Smuzhiyun 
41*4882a593Smuzhiyun 	TP_fast_assign(
42*4882a593Smuzhiyun 		struct in6_addr *pin6;
43*4882a593Smuzhiyun 		__be32 *p32;
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun 		__entry->family = tbl->family;
46*4882a593Smuzhiyun 		__assign_str(dev, (dev ? dev->name : "NULL"));
47*4882a593Smuzhiyun 		__entry->entries = atomic_read(&tbl->gc_entries);
48*4882a593Smuzhiyun 		__entry->created = n != NULL;
49*4882a593Smuzhiyun 		__entry->gc_exempt = exempt_from_gc;
50*4882a593Smuzhiyun 		pin6 = (struct in6_addr *)__entry->primary_key6;
51*4882a593Smuzhiyun 		p32 = (__be32 *)__entry->primary_key4;
52*4882a593Smuzhiyun 
53*4882a593Smuzhiyun 		if (tbl->family == AF_INET)
54*4882a593Smuzhiyun 			*p32 = *(__be32 *)pkey;
55*4882a593Smuzhiyun 		else
56*4882a593Smuzhiyun 			*p32 = 0;
57*4882a593Smuzhiyun 
58*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_IPV6)
59*4882a593Smuzhiyun 		if (tbl->family == AF_INET6) {
60*4882a593Smuzhiyun 			pin6 = (struct in6_addr *)__entry->primary_key6;
61*4882a593Smuzhiyun 			*pin6 = *(struct in6_addr *)pkey;
62*4882a593Smuzhiyun 		}
63*4882a593Smuzhiyun #endif
64*4882a593Smuzhiyun 	),
65*4882a593Smuzhiyun 
66*4882a593Smuzhiyun 	TP_printk("family %d dev %s entries %d primary_key4 %pI4 primary_key6 %pI6c created %d gc_exempt %d",
67*4882a593Smuzhiyun 		  __entry->family, __get_str(dev), __entry->entries,
68*4882a593Smuzhiyun 		  __entry->primary_key4, __entry->primary_key6,
69*4882a593Smuzhiyun 		  __entry->created, __entry->gc_exempt)
70*4882a593Smuzhiyun );
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun TRACE_EVENT(neigh_update,
73*4882a593Smuzhiyun 
74*4882a593Smuzhiyun 	TP_PROTO(struct neighbour *n, const u8 *lladdr, u8 new,
75*4882a593Smuzhiyun 		 u32 flags, u32 nlmsg_pid),
76*4882a593Smuzhiyun 
77*4882a593Smuzhiyun 	TP_ARGS(n, lladdr, new, flags, nlmsg_pid),
78*4882a593Smuzhiyun 
79*4882a593Smuzhiyun 	TP_STRUCT__entry(
80*4882a593Smuzhiyun 		__field(u32, family)
81*4882a593Smuzhiyun 		__string(dev, (n->dev ? n->dev->name : "NULL"))
82*4882a593Smuzhiyun 		__array(u8, lladdr, MAX_ADDR_LEN)
83*4882a593Smuzhiyun 		__field(u8, lladdr_len)
84*4882a593Smuzhiyun 		__field(u8, flags)
85*4882a593Smuzhiyun 		__field(u8, nud_state)
86*4882a593Smuzhiyun 		__field(u8, type)
87*4882a593Smuzhiyun 		__field(u8, dead)
88*4882a593Smuzhiyun 		__field(int, refcnt)
89*4882a593Smuzhiyun 		__array(__u8, primary_key4, 4)
90*4882a593Smuzhiyun 		__array(__u8, primary_key6, 16)
91*4882a593Smuzhiyun 		__field(unsigned long, confirmed)
92*4882a593Smuzhiyun 		__field(unsigned long, updated)
93*4882a593Smuzhiyun 		__field(unsigned long, used)
94*4882a593Smuzhiyun 		__array(u8, new_lladdr, MAX_ADDR_LEN)
95*4882a593Smuzhiyun 		__field(u8, new_state)
96*4882a593Smuzhiyun 		__field(u32, update_flags)
97*4882a593Smuzhiyun 		__field(u32, pid)
98*4882a593Smuzhiyun 	),
99*4882a593Smuzhiyun 
100*4882a593Smuzhiyun 	TP_fast_assign(
101*4882a593Smuzhiyun 		int lladdr_len = (n->dev ? n->dev->addr_len : MAX_ADDR_LEN);
102*4882a593Smuzhiyun 		struct in6_addr *pin6;
103*4882a593Smuzhiyun 		__be32 *p32;
104*4882a593Smuzhiyun 
105*4882a593Smuzhiyun 		__entry->family = n->tbl->family;
106*4882a593Smuzhiyun 		__assign_str(dev, (n->dev ? n->dev->name : "NULL"));
107*4882a593Smuzhiyun 		__entry->lladdr_len = lladdr_len;
108*4882a593Smuzhiyun 		memcpy(__entry->lladdr, n->ha, lladdr_len);
109*4882a593Smuzhiyun 		__entry->flags = n->flags;
110*4882a593Smuzhiyun 		__entry->nud_state = n->nud_state;
111*4882a593Smuzhiyun 		__entry->type = n->type;
112*4882a593Smuzhiyun 		__entry->dead = n->dead;
113*4882a593Smuzhiyun 		__entry->refcnt = refcount_read(&n->refcnt);
114*4882a593Smuzhiyun 		pin6 = (struct in6_addr *)__entry->primary_key6;
115*4882a593Smuzhiyun 		p32 = (__be32 *)__entry->primary_key4;
116*4882a593Smuzhiyun 
117*4882a593Smuzhiyun 		if (n->tbl->family == AF_INET)
118*4882a593Smuzhiyun 			*p32 = *(__be32 *)n->primary_key;
119*4882a593Smuzhiyun 		else
120*4882a593Smuzhiyun 			*p32 = 0;
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_IPV6)
123*4882a593Smuzhiyun 		if (n->tbl->family == AF_INET6) {
124*4882a593Smuzhiyun 			pin6 = (struct in6_addr *)__entry->primary_key6;
125*4882a593Smuzhiyun 			*pin6 = *(struct in6_addr *)n->primary_key;
126*4882a593Smuzhiyun 		} else
127*4882a593Smuzhiyun #endif
128*4882a593Smuzhiyun 		{
129*4882a593Smuzhiyun 			ipv6_addr_set_v4mapped(*p32, pin6);
130*4882a593Smuzhiyun 		}
131*4882a593Smuzhiyun 		__entry->confirmed = n->confirmed;
132*4882a593Smuzhiyun 		__entry->updated = n->updated;
133*4882a593Smuzhiyun 		__entry->used = n->used;
134*4882a593Smuzhiyun 		if (lladdr)
135*4882a593Smuzhiyun 			memcpy(__entry->new_lladdr, lladdr, lladdr_len);
136*4882a593Smuzhiyun 		__entry->new_state = new;
137*4882a593Smuzhiyun 		__entry->update_flags = flags;
138*4882a593Smuzhiyun 		__entry->pid = nlmsg_pid;
139*4882a593Smuzhiyun 	),
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun 	TP_printk("family %d dev %s lladdr %s flags %02x nud_state %s type %02x "
142*4882a593Smuzhiyun 		  "dead %d refcnt %d primary_key4 %pI4 primary_key6 %pI6c "
143*4882a593Smuzhiyun 		  "confirmed %lu updated %lu used %lu new_lladdr %s "
144*4882a593Smuzhiyun 		  "new_state %s update_flags %02x pid %d",
145*4882a593Smuzhiyun 		  __entry->family, __get_str(dev),
146*4882a593Smuzhiyun 		  __print_hex_str(__entry->lladdr, __entry->lladdr_len),
147*4882a593Smuzhiyun 		  __entry->flags, neigh_state_str(__entry->nud_state),
148*4882a593Smuzhiyun 		  __entry->type, __entry->dead, __entry->refcnt,
149*4882a593Smuzhiyun 		  __entry->primary_key4, __entry->primary_key6,
150*4882a593Smuzhiyun 		  __entry->confirmed, __entry->updated, __entry->used,
151*4882a593Smuzhiyun 		  __print_hex_str(__entry->new_lladdr, __entry->lladdr_len),
152*4882a593Smuzhiyun 		  neigh_state_str(__entry->new_state),
153*4882a593Smuzhiyun 		  __entry->update_flags, __entry->pid)
154*4882a593Smuzhiyun );
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun DECLARE_EVENT_CLASS(neigh__update,
157*4882a593Smuzhiyun 	TP_PROTO(struct neighbour *n, int err),
158*4882a593Smuzhiyun 	TP_ARGS(n, err),
159*4882a593Smuzhiyun 	TP_STRUCT__entry(
160*4882a593Smuzhiyun 		__field(u32, family)
161*4882a593Smuzhiyun 		__string(dev, (n->dev ? n->dev->name : "NULL"))
162*4882a593Smuzhiyun 		__array(u8, lladdr, MAX_ADDR_LEN)
163*4882a593Smuzhiyun 		__field(u8, lladdr_len)
164*4882a593Smuzhiyun 		__field(u8, flags)
165*4882a593Smuzhiyun 		__field(u8, nud_state)
166*4882a593Smuzhiyun 		__field(u8, type)
167*4882a593Smuzhiyun 		__field(u8, dead)
168*4882a593Smuzhiyun 		__field(int, refcnt)
169*4882a593Smuzhiyun 		__array(__u8, primary_key4, 4)
170*4882a593Smuzhiyun 		__array(__u8, primary_key6, 16)
171*4882a593Smuzhiyun 		__field(unsigned long, confirmed)
172*4882a593Smuzhiyun 		__field(unsigned long, updated)
173*4882a593Smuzhiyun 		__field(unsigned long, used)
174*4882a593Smuzhiyun 		__field(u32, err)
175*4882a593Smuzhiyun 	),
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun 	TP_fast_assign(
178*4882a593Smuzhiyun 		int lladdr_len = (n->dev ? n->dev->addr_len : MAX_ADDR_LEN);
179*4882a593Smuzhiyun 		struct in6_addr *pin6;
180*4882a593Smuzhiyun 		__be32 *p32;
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun 		__entry->family = n->tbl->family;
183*4882a593Smuzhiyun 		__assign_str(dev, (n->dev ? n->dev->name : "NULL"));
184*4882a593Smuzhiyun 		__entry->lladdr_len = lladdr_len;
185*4882a593Smuzhiyun 		memcpy(__entry->lladdr, n->ha, lladdr_len);
186*4882a593Smuzhiyun 		__entry->flags = n->flags;
187*4882a593Smuzhiyun 		__entry->nud_state = n->nud_state;
188*4882a593Smuzhiyun 		__entry->type = n->type;
189*4882a593Smuzhiyun 		__entry->dead = n->dead;
190*4882a593Smuzhiyun 		__entry->refcnt = refcount_read(&n->refcnt);
191*4882a593Smuzhiyun 		pin6 = (struct in6_addr *)__entry->primary_key6;
192*4882a593Smuzhiyun 		p32 = (__be32 *)__entry->primary_key4;
193*4882a593Smuzhiyun 
194*4882a593Smuzhiyun 		if (n->tbl->family == AF_INET)
195*4882a593Smuzhiyun 			*p32 = *(__be32 *)n->primary_key;
196*4882a593Smuzhiyun 		else
197*4882a593Smuzhiyun 			*p32 = 0;
198*4882a593Smuzhiyun 
199*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_IPV6)
200*4882a593Smuzhiyun 		if (n->tbl->family == AF_INET6) {
201*4882a593Smuzhiyun 			pin6 = (struct in6_addr *)__entry->primary_key6;
202*4882a593Smuzhiyun 			*pin6 = *(struct in6_addr *)n->primary_key;
203*4882a593Smuzhiyun 		} else
204*4882a593Smuzhiyun #endif
205*4882a593Smuzhiyun 		{
206*4882a593Smuzhiyun 			ipv6_addr_set_v4mapped(*p32, pin6);
207*4882a593Smuzhiyun 		}
208*4882a593Smuzhiyun 
209*4882a593Smuzhiyun 		__entry->confirmed = n->confirmed;
210*4882a593Smuzhiyun 		__entry->updated = n->updated;
211*4882a593Smuzhiyun 		__entry->used = n->used;
212*4882a593Smuzhiyun 		__entry->err = err;
213*4882a593Smuzhiyun 	),
214*4882a593Smuzhiyun 
215*4882a593Smuzhiyun 	TP_printk("family %d dev %s lladdr %s flags %02x nud_state %s type %02x "
216*4882a593Smuzhiyun 		  "dead %d refcnt %d primary_key4 %pI4 primary_key6 %pI6c "
217*4882a593Smuzhiyun 		  "confirmed %lu updated %lu used %lu err %d",
218*4882a593Smuzhiyun 		  __entry->family, __get_str(dev),
219*4882a593Smuzhiyun 		  __print_hex_str(__entry->lladdr, __entry->lladdr_len),
220*4882a593Smuzhiyun 		  __entry->flags, neigh_state_str(__entry->nud_state),
221*4882a593Smuzhiyun 		  __entry->type, __entry->dead, __entry->refcnt,
222*4882a593Smuzhiyun 		  __entry->primary_key4, __entry->primary_key6,
223*4882a593Smuzhiyun 		  __entry->confirmed, __entry->updated, __entry->used,
224*4882a593Smuzhiyun 		  __entry->err)
225*4882a593Smuzhiyun );
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun DEFINE_EVENT(neigh__update, neigh_update_done,
228*4882a593Smuzhiyun 	TP_PROTO(struct neighbour *neigh, int err),
229*4882a593Smuzhiyun 	TP_ARGS(neigh, err)
230*4882a593Smuzhiyun );
231*4882a593Smuzhiyun 
232*4882a593Smuzhiyun DEFINE_EVENT(neigh__update, neigh_timer_handler,
233*4882a593Smuzhiyun 	TP_PROTO(struct neighbour *neigh, int err),
234*4882a593Smuzhiyun 	TP_ARGS(neigh, err)
235*4882a593Smuzhiyun );
236*4882a593Smuzhiyun 
237*4882a593Smuzhiyun DEFINE_EVENT(neigh__update, neigh_event_send_done,
238*4882a593Smuzhiyun 	TP_PROTO(struct neighbour *neigh, int err),
239*4882a593Smuzhiyun 	TP_ARGS(neigh, err)
240*4882a593Smuzhiyun );
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun DEFINE_EVENT(neigh__update, neigh_event_send_dead,
243*4882a593Smuzhiyun 	TP_PROTO(struct neighbour *neigh, int err),
244*4882a593Smuzhiyun 	TP_ARGS(neigh, err)
245*4882a593Smuzhiyun );
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun DEFINE_EVENT(neigh__update, neigh_cleanup_and_release,
248*4882a593Smuzhiyun 	TP_PROTO(struct neighbour *neigh, int rc),
249*4882a593Smuzhiyun 	TP_ARGS(neigh, rc)
250*4882a593Smuzhiyun );
251*4882a593Smuzhiyun 
252*4882a593Smuzhiyun #endif /* _TRACE_NEIGH_H */
253*4882a593Smuzhiyun 
254*4882a593Smuzhiyun /* This part must be outside protection */
255*4882a593Smuzhiyun #include <trace/define_trace.h>
256