xref: /linux/net/dsa/trace.h (revision 36ec807b627b4c0a0a382f0ae48eac7187d14b2b)
1 /* SPDX-License-Identifier: GPL-2.0
2  * Copyright 2022-2023 NXP
3  */
4 
5 #undef TRACE_SYSTEM
6 #define TRACE_SYSTEM	dsa
7 
8 #if !defined(_NET_DSA_TRACE_H) || defined(TRACE_HEADER_MULTI_READ)
9 #define _NET_DSA_TRACE_H
10 
11 #include <net/dsa.h>
12 #include <net/switchdev.h>
13 #include <linux/etherdevice.h>
14 #include <linux/if_bridge.h>
15 #include <linux/refcount.h>
16 #include <linux/tracepoint.h>
17 
18 /* Enough to fit "bridge %s num %d" where num has 3 digits */
19 #define DSA_DB_BUFSIZ	(IFNAMSIZ + 16)
20 
21 void dsa_db_print(const struct dsa_db *db, char buf[DSA_DB_BUFSIZ]);
22 const char *dsa_port_kind(const struct dsa_port *dp);
23 
24 DECLARE_EVENT_CLASS(dsa_port_addr_op_hw,
25 
26 	TP_PROTO(const struct dsa_port *dp, const unsigned char *addr, u16 vid,
27 		 const struct dsa_db *db, int err),
28 
29 	TP_ARGS(dp, addr, vid, db, err),
30 
31 	TP_STRUCT__entry(
32 		__string(dev, dev_name(dp->ds->dev))
33 		__string(kind, dsa_port_kind(dp))
34 		__field(int, port)
35 		__array(unsigned char, addr, ETH_ALEN)
36 		__field(u16, vid)
37 		__array(char, db_buf, DSA_DB_BUFSIZ)
38 		__field(int, err)
39 	),
40 
41 	TP_fast_assign(
42 		__assign_str(dev);
43 		__assign_str(kind);
44 		__entry->port = dp->index;
45 		ether_addr_copy(__entry->addr, addr);
46 		__entry->vid = vid;
47 		dsa_db_print(db, __entry->db_buf);
48 		__entry->err = err;
49 	),
50 
51 	TP_printk("%s %s port %d addr %pM vid %u db \"%s\" err %d",
52 		  __get_str(dev), __get_str(kind), __entry->port, __entry->addr,
53 		  __entry->vid, __entry->db_buf, __entry->err)
54 );
55 
56 /* Add unicast/multicast address to hardware, either on user ports
57  * (where no refcounting is kept), or on shared ports when the entry
58  * is first seen and its refcount is 1.
59  */
60 DEFINE_EVENT(dsa_port_addr_op_hw, dsa_fdb_add_hw,
61 	     TP_PROTO(const struct dsa_port *dp, const unsigned char *addr,
62 		      u16 vid, const struct dsa_db *db, int err),
63 	     TP_ARGS(dp, addr, vid, db, err));
64 
65 DEFINE_EVENT(dsa_port_addr_op_hw, dsa_mdb_add_hw,
66 	     TP_PROTO(const struct dsa_port *dp, const unsigned char *addr,
67 		      u16 vid, const struct dsa_db *db, int err),
68 	     TP_ARGS(dp, addr, vid, db, err));
69 
70 /* Delete unicast/multicast address from hardware, either on user ports or
71  * when the refcount on shared ports reaches 0
72  */
73 DEFINE_EVENT(dsa_port_addr_op_hw, dsa_fdb_del_hw,
74 	     TP_PROTO(const struct dsa_port *dp, const unsigned char *addr,
75 		      u16 vid, const struct dsa_db *db, int err),
76 	     TP_ARGS(dp, addr, vid, db, err));
77 
78 DEFINE_EVENT(dsa_port_addr_op_hw, dsa_mdb_del_hw,
79 	     TP_PROTO(const struct dsa_port *dp, const unsigned char *addr,
80 		      u16 vid, const struct dsa_db *db, int err),
81 	     TP_ARGS(dp, addr, vid, db, err));
82 
83 DECLARE_EVENT_CLASS(dsa_port_addr_op_refcount,
84 
85 	TP_PROTO(const struct dsa_port *dp, const unsigned char *addr, u16 vid,
86 		 const struct dsa_db *db, const refcount_t *refcount),
87 
88 	TP_ARGS(dp, addr, vid, db, refcount),
89 
90 	TP_STRUCT__entry(
91 		__string(dev, dev_name(dp->ds->dev))
92 		__string(kind, dsa_port_kind(dp))
93 		__field(int, port)
94 		__array(unsigned char, addr, ETH_ALEN)
95 		__field(u16, vid)
96 		__array(char, db_buf, DSA_DB_BUFSIZ)
97 		__field(unsigned int, refcount)
98 	),
99 
100 	TP_fast_assign(
101 		__assign_str(dev);
102 		__assign_str(kind);
103 		__entry->port = dp->index;
104 		ether_addr_copy(__entry->addr, addr);
105 		__entry->vid = vid;
106 		dsa_db_print(db, __entry->db_buf);
107 		__entry->refcount = refcount_read(refcount);
108 	),
109 
110 	TP_printk("%s %s port %d addr %pM vid %u db \"%s\" refcount %u",
111 		  __get_str(dev), __get_str(kind), __entry->port, __entry->addr,
112 		  __entry->vid, __entry->db_buf, __entry->refcount)
113 );
114 
115 /* Bump the refcount of an existing unicast/multicast address on shared ports */
116 DEFINE_EVENT(dsa_port_addr_op_refcount, dsa_fdb_add_bump,
117 	     TP_PROTO(const struct dsa_port *dp, const unsigned char *addr,
118 		      u16 vid, const struct dsa_db *db,
119 		      const refcount_t *refcount),
120 	     TP_ARGS(dp, addr, vid, db, refcount));
121 
122 DEFINE_EVENT(dsa_port_addr_op_refcount, dsa_mdb_add_bump,
123 	     TP_PROTO(const struct dsa_port *dp, const unsigned char *addr,
124 		      u16 vid, const struct dsa_db *db,
125 		      const refcount_t *refcount),
126 	     TP_ARGS(dp, addr, vid, db, refcount));
127 
128 /* Drop the refcount of a multicast address that we still keep on
129  * shared ports
130  */
131 DEFINE_EVENT(dsa_port_addr_op_refcount, dsa_fdb_del_drop,
132 	     TP_PROTO(const struct dsa_port *dp, const unsigned char *addr,
133 		      u16 vid, const struct dsa_db *db,
134 		      const refcount_t *refcount),
135 	     TP_ARGS(dp, addr, vid, db, refcount));
136 
137 DEFINE_EVENT(dsa_port_addr_op_refcount, dsa_mdb_del_drop,
138 	     TP_PROTO(const struct dsa_port *dp, const unsigned char *addr,
139 		      u16 vid, const struct dsa_db *db,
140 		      const refcount_t *refcount),
141 	     TP_ARGS(dp, addr, vid, db, refcount));
142 
143 DECLARE_EVENT_CLASS(dsa_port_addr_del_not_found,
144 
145 	TP_PROTO(const struct dsa_port *dp, const unsigned char *addr, u16 vid,
146 		 const struct dsa_db *db),
147 
148 	TP_ARGS(dp, addr, vid, db),
149 
150 	TP_STRUCT__entry(
151 		__string(dev, dev_name(dp->ds->dev))
152 		__string(kind, dsa_port_kind(dp))
153 		__field(int, port)
154 		__array(unsigned char, addr, ETH_ALEN)
155 		__field(u16, vid)
156 		__array(char, db_buf, DSA_DB_BUFSIZ)
157 	),
158 
159 	TP_fast_assign(
160 		__assign_str(dev);
161 		__assign_str(kind);
162 		__entry->port = dp->index;
163 		ether_addr_copy(__entry->addr, addr);
164 		__entry->vid = vid;
165 		dsa_db_print(db, __entry->db_buf);
166 	),
167 
168 	TP_printk("%s %s port %d addr %pM vid %u db \"%s\"",
169 		  __get_str(dev), __get_str(kind), __entry->port,
170 		  __entry->addr, __entry->vid, __entry->db_buf)
171 );
172 
173 /* Attempt to delete a unicast/multicast address on shared ports for which
174  * the delete operation was called more times than the addition
175  */
176 DEFINE_EVENT(dsa_port_addr_del_not_found, dsa_fdb_del_not_found,
177 	     TP_PROTO(const struct dsa_port *dp, const unsigned char *addr,
178 		      u16 vid, const struct dsa_db *db),
179 	     TP_ARGS(dp, addr, vid, db));
180 
181 DEFINE_EVENT(dsa_port_addr_del_not_found, dsa_mdb_del_not_found,
182 	     TP_PROTO(const struct dsa_port *dp, const unsigned char *addr,
183 		      u16 vid, const struct dsa_db *db),
184 	     TP_ARGS(dp, addr, vid, db));
185 
186 TRACE_EVENT(dsa_lag_fdb_add_hw,
187 
188 	TP_PROTO(const struct net_device *lag_dev, const unsigned char *addr,
189 		 u16 vid, const struct dsa_db *db, int err),
190 
191 	TP_ARGS(lag_dev, addr, vid, db, err),
192 
193 	TP_STRUCT__entry(
194 		__string(dev, lag_dev->name)
195 		__array(unsigned char, addr, ETH_ALEN)
196 		__field(u16, vid)
197 		__array(char, db_buf, DSA_DB_BUFSIZ)
198 		__field(int, err)
199 	),
200 
201 	TP_fast_assign(
202 		__assign_str(dev);
203 		ether_addr_copy(__entry->addr, addr);
204 		__entry->vid = vid;
205 		dsa_db_print(db, __entry->db_buf);
206 		__entry->err = err;
207 	),
208 
209 	TP_printk("%s addr %pM vid %u db \"%s\" err %d",
210 		  __get_str(dev), __entry->addr, __entry->vid,
211 		  __entry->db_buf, __entry->err)
212 );
213 
214 TRACE_EVENT(dsa_lag_fdb_add_bump,
215 
216 	TP_PROTO(const struct net_device *lag_dev, const unsigned char *addr,
217 		 u16 vid, const struct dsa_db *db, const refcount_t *refcount),
218 
219 	TP_ARGS(lag_dev, addr, vid, db, refcount),
220 
221 	TP_STRUCT__entry(
222 		__string(dev, lag_dev->name)
223 		__array(unsigned char, addr, ETH_ALEN)
224 		__field(u16, vid)
225 		__array(char, db_buf, DSA_DB_BUFSIZ)
226 		__field(unsigned int, refcount)
227 	),
228 
229 	TP_fast_assign(
230 		__assign_str(dev);
231 		ether_addr_copy(__entry->addr, addr);
232 		__entry->vid = vid;
233 		dsa_db_print(db, __entry->db_buf);
234 		__entry->refcount = refcount_read(refcount);
235 	),
236 
237 	TP_printk("%s addr %pM vid %u db \"%s\" refcount %u",
238 		  __get_str(dev), __entry->addr, __entry->vid,
239 		  __entry->db_buf, __entry->refcount)
240 );
241 
242 TRACE_EVENT(dsa_lag_fdb_del_hw,
243 
244 	TP_PROTO(const struct net_device *lag_dev, const unsigned char *addr,
245 		 u16 vid, const struct dsa_db *db, int err),
246 
247 	TP_ARGS(lag_dev, addr, vid, db, err),
248 
249 	TP_STRUCT__entry(
250 		__string(dev, lag_dev->name)
251 		__array(unsigned char, addr, ETH_ALEN)
252 		__field(u16, vid)
253 		__array(char, db_buf, DSA_DB_BUFSIZ)
254 		__field(int, err)
255 	),
256 
257 	TP_fast_assign(
258 		__assign_str(dev);
259 		ether_addr_copy(__entry->addr, addr);
260 		__entry->vid = vid;
261 		dsa_db_print(db, __entry->db_buf);
262 		__entry->err = err;
263 	),
264 
265 	TP_printk("%s addr %pM vid %u db \"%s\" err %d",
266 		  __get_str(dev), __entry->addr, __entry->vid,
267 		  __entry->db_buf, __entry->err)
268 );
269 
270 TRACE_EVENT(dsa_lag_fdb_del_drop,
271 
272 	TP_PROTO(const struct net_device *lag_dev, const unsigned char *addr,
273 		 u16 vid, const struct dsa_db *db, const refcount_t *refcount),
274 
275 	TP_ARGS(lag_dev, addr, vid, db, refcount),
276 
277 	TP_STRUCT__entry(
278 		__string(dev, lag_dev->name)
279 		__array(unsigned char, addr, ETH_ALEN)
280 		__field(u16, vid)
281 		__array(char, db_buf, DSA_DB_BUFSIZ)
282 		__field(unsigned int, refcount)
283 	),
284 
285 	TP_fast_assign(
286 		__assign_str(dev);
287 		ether_addr_copy(__entry->addr, addr);
288 		__entry->vid = vid;
289 		dsa_db_print(db, __entry->db_buf);
290 		__entry->refcount = refcount_read(refcount);
291 	),
292 
293 	TP_printk("%s addr %pM vid %u db \"%s\" refcount %u",
294 		  __get_str(dev), __entry->addr, __entry->vid,
295 		  __entry->db_buf, __entry->refcount)
296 );
297 
298 TRACE_EVENT(dsa_lag_fdb_del_not_found,
299 
300 	TP_PROTO(const struct net_device *lag_dev, const unsigned char *addr,
301 		 u16 vid, const struct dsa_db *db),
302 
303 	TP_ARGS(lag_dev, addr, vid, db),
304 
305 	TP_STRUCT__entry(
306 		__string(dev, lag_dev->name)
307 		__array(unsigned char, addr, ETH_ALEN)
308 		__field(u16, vid)
309 		__array(char, db_buf, DSA_DB_BUFSIZ)
310 	),
311 
312 	TP_fast_assign(
313 		__assign_str(dev);
314 		ether_addr_copy(__entry->addr, addr);
315 		__entry->vid = vid;
316 		dsa_db_print(db, __entry->db_buf);
317 	),
318 
319 	TP_printk("%s addr %pM vid %u db \"%s\"",
320 		  __get_str(dev), __entry->addr, __entry->vid, __entry->db_buf)
321 );
322 
323 DECLARE_EVENT_CLASS(dsa_vlan_op_hw,
324 
325 	TP_PROTO(const struct dsa_port *dp,
326 		 const struct switchdev_obj_port_vlan *vlan, int err),
327 
328 	TP_ARGS(dp, vlan, err),
329 
330 	TP_STRUCT__entry(
331 		__string(dev, dev_name(dp->ds->dev))
332 		__string(kind, dsa_port_kind(dp))
333 		__field(int, port)
334 		__field(u16, vid)
335 		__field(u16, flags)
336 		__field(bool, changed)
337 		__field(int, err)
338 	),
339 
340 	TP_fast_assign(
341 		__assign_str(dev);
342 		__assign_str(kind);
343 		__entry->port = dp->index;
344 		__entry->vid = vlan->vid;
345 		__entry->flags = vlan->flags;
346 		__entry->changed = vlan->changed;
347 		__entry->err = err;
348 	),
349 
350 	TP_printk("%s %s port %d vid %u%s%s%s",
351 		  __get_str(dev), __get_str(kind), __entry->port, __entry->vid,
352 		  __entry->flags & BRIDGE_VLAN_INFO_PVID ? " pvid" : "",
353 		  __entry->flags & BRIDGE_VLAN_INFO_UNTAGGED ? " untagged" : "",
354 		  __entry->changed ? " (changed)" : "")
355 );
356 
357 DEFINE_EVENT(dsa_vlan_op_hw, dsa_vlan_add_hw,
358 	     TP_PROTO(const struct dsa_port *dp,
359 		      const struct switchdev_obj_port_vlan *vlan, int err),
360 	     TP_ARGS(dp, vlan, err));
361 
362 DEFINE_EVENT(dsa_vlan_op_hw, dsa_vlan_del_hw,
363 	     TP_PROTO(const struct dsa_port *dp,
364 		      const struct switchdev_obj_port_vlan *vlan, int err),
365 	     TP_ARGS(dp, vlan, err));
366 
367 DECLARE_EVENT_CLASS(dsa_vlan_op_refcount,
368 
369 	TP_PROTO(const struct dsa_port *dp,
370 		 const struct switchdev_obj_port_vlan *vlan,
371 		 const refcount_t *refcount),
372 
373 	TP_ARGS(dp, vlan, refcount),
374 
375 	TP_STRUCT__entry(
376 		__string(dev, dev_name(dp->ds->dev))
377 		__string(kind, dsa_port_kind(dp))
378 		__field(int, port)
379 		__field(u16, vid)
380 		__field(u16, flags)
381 		__field(bool, changed)
382 		__field(unsigned int, refcount)
383 	),
384 
385 	TP_fast_assign(
386 		__assign_str(dev);
387 		__assign_str(kind);
388 		__entry->port = dp->index;
389 		__entry->vid = vlan->vid;
390 		__entry->flags = vlan->flags;
391 		__entry->changed = vlan->changed;
392 		__entry->refcount = refcount_read(refcount);
393 	),
394 
395 	TP_printk("%s %s port %d vid %u%s%s%s refcount %u",
396 		  __get_str(dev), __get_str(kind), __entry->port, __entry->vid,
397 		  __entry->flags & BRIDGE_VLAN_INFO_PVID ? " pvid" : "",
398 		  __entry->flags & BRIDGE_VLAN_INFO_UNTAGGED ? " untagged" : "",
399 		  __entry->changed ? " (changed)" : "", __entry->refcount)
400 );
401 
402 DEFINE_EVENT(dsa_vlan_op_refcount, dsa_vlan_add_bump,
403 	     TP_PROTO(const struct dsa_port *dp,
404 		      const struct switchdev_obj_port_vlan *vlan,
405 		      const refcount_t *refcount),
406 	     TP_ARGS(dp, vlan, refcount));
407 
408 DEFINE_EVENT(dsa_vlan_op_refcount, dsa_vlan_del_drop,
409 	     TP_PROTO(const struct dsa_port *dp,
410 		      const struct switchdev_obj_port_vlan *vlan,
411 		      const refcount_t *refcount),
412 	     TP_ARGS(dp, vlan, refcount));
413 
414 TRACE_EVENT(dsa_vlan_del_not_found,
415 
416 	TP_PROTO(const struct dsa_port *dp,
417 		 const struct switchdev_obj_port_vlan *vlan),
418 
419 	TP_ARGS(dp, vlan),
420 
421 	TP_STRUCT__entry(
422 		__string(dev, dev_name(dp->ds->dev))
423 		__string(kind, dsa_port_kind(dp))
424 		__field(int, port)
425 		__field(u16, vid)
426 	),
427 
428 	TP_fast_assign(
429 		__assign_str(dev);
430 		__assign_str(kind);
431 		__entry->port = dp->index;
432 		__entry->vid = vlan->vid;
433 	),
434 
435 	TP_printk("%s %s port %d vid %u",
436 		  __get_str(dev), __get_str(kind), __entry->port, __entry->vid)
437 );
438 
439 #endif /* _NET_DSA_TRACE_H */
440 
441 /* We don't want to use include/trace/events */
442 #undef TRACE_INCLUDE_PATH
443 #define TRACE_INCLUDE_PATH .
444 #undef TRACE_INCLUDE_FILE
445 #define TRACE_INCLUDE_FILE	trace
446 /* This part must be outside protection */
447 #include <trace/define_trace.h>
448