xref: /openbmc/linux/include/trace/events/bridge.h (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
1b74fd306SRoopa Prabhu #undef TRACE_SYSTEM
2b74fd306SRoopa Prabhu #define TRACE_SYSTEM bridge
3b74fd306SRoopa Prabhu 
4b74fd306SRoopa Prabhu #if !defined(_TRACE_BRIDGE_H) || defined(TRACE_HEADER_MULTI_READ)
5b74fd306SRoopa Prabhu #define _TRACE_BRIDGE_H
6b74fd306SRoopa Prabhu 
7b74fd306SRoopa Prabhu #include <linux/netdevice.h>
8b74fd306SRoopa Prabhu #include <linux/tracepoint.h>
9b74fd306SRoopa Prabhu 
10b74fd306SRoopa Prabhu #include "../../../net/bridge/br_private.h"
11b74fd306SRoopa Prabhu 
12b74fd306SRoopa Prabhu TRACE_EVENT(br_fdb_add,
13b74fd306SRoopa Prabhu 
14b74fd306SRoopa Prabhu 	TP_PROTO(struct ndmsg *ndm, struct net_device *dev,
15b74fd306SRoopa Prabhu 		 const unsigned char *addr, u16 vid, u16 nlh_flags),
16b74fd306SRoopa Prabhu 
17b74fd306SRoopa Prabhu 	TP_ARGS(ndm, dev, addr, vid, nlh_flags),
18b74fd306SRoopa Prabhu 
19b74fd306SRoopa Prabhu 	TP_STRUCT__entry(
20b74fd306SRoopa Prabhu 		__field(u8, ndm_flags)
21b74fd306SRoopa Prabhu 		__string(dev, dev->name)
22b74fd306SRoopa Prabhu 		__array(unsigned char, addr, ETH_ALEN)
23b74fd306SRoopa Prabhu 		__field(u16, vid)
24b74fd306SRoopa Prabhu 		__field(u16, nlh_flags)
25b74fd306SRoopa Prabhu 	),
26b74fd306SRoopa Prabhu 
27b74fd306SRoopa Prabhu 	TP_fast_assign(
28b74fd306SRoopa Prabhu 		__assign_str(dev, dev->name);
29b74fd306SRoopa Prabhu 		memcpy(__entry->addr, addr, ETH_ALEN);
30b74fd306SRoopa Prabhu 		__entry->vid = vid;
31b74fd306SRoopa Prabhu 		__entry->nlh_flags = nlh_flags;
32b74fd306SRoopa Prabhu 		__entry->ndm_flags = ndm->ndm_flags;
33b74fd306SRoopa Prabhu 	),
34b74fd306SRoopa Prabhu 
35b74fd306SRoopa Prabhu 	TP_printk("dev %s addr %02x:%02x:%02x:%02x:%02x:%02x vid %u nlh_flags %04x ndm_flags %02x",
36b74fd306SRoopa Prabhu 		  __get_str(dev), __entry->addr[0], __entry->addr[1],
37b74fd306SRoopa Prabhu 		  __entry->addr[2], __entry->addr[3], __entry->addr[4],
38b74fd306SRoopa Prabhu 		  __entry->addr[5], __entry->vid,
39b74fd306SRoopa Prabhu 		  __entry->nlh_flags, __entry->ndm_flags)
40b74fd306SRoopa Prabhu );
41b74fd306SRoopa Prabhu 
42b74fd306SRoopa Prabhu TRACE_EVENT(br_fdb_external_learn_add,
43b74fd306SRoopa Prabhu 
44b74fd306SRoopa Prabhu 	TP_PROTO(struct net_bridge *br, struct net_bridge_port *p,
45b74fd306SRoopa Prabhu 		 const unsigned char *addr, u16 vid),
46b74fd306SRoopa Prabhu 
47b74fd306SRoopa Prabhu 	TP_ARGS(br, p, addr, vid),
48b74fd306SRoopa Prabhu 
49b74fd306SRoopa Prabhu 	TP_STRUCT__entry(
50b74fd306SRoopa Prabhu 		__string(br_dev, br->dev->name)
51b74fd306SRoopa Prabhu 		__string(dev, p ? p->dev->name : "null")
52b74fd306SRoopa Prabhu 		__array(unsigned char, addr, ETH_ALEN)
53b74fd306SRoopa Prabhu 		__field(u16, vid)
54b74fd306SRoopa Prabhu 	),
55b74fd306SRoopa Prabhu 
56b74fd306SRoopa Prabhu 	TP_fast_assign(
57b74fd306SRoopa Prabhu 		__assign_str(br_dev, br->dev->name);
58b74fd306SRoopa Prabhu 		__assign_str(dev, p ? p->dev->name : "null");
59b74fd306SRoopa Prabhu 		memcpy(__entry->addr, addr, ETH_ALEN);
60b74fd306SRoopa Prabhu 		__entry->vid = vid;
61b74fd306SRoopa Prabhu 	),
62b74fd306SRoopa Prabhu 
63b74fd306SRoopa Prabhu 	TP_printk("br_dev %s port %s addr %02x:%02x:%02x:%02x:%02x:%02x vid %u",
64b74fd306SRoopa Prabhu 		  __get_str(br_dev), __get_str(dev), __entry->addr[0],
65b74fd306SRoopa Prabhu 		  __entry->addr[1], __entry->addr[2], __entry->addr[3],
66b74fd306SRoopa Prabhu 		  __entry->addr[4], __entry->addr[5], __entry->vid)
67b74fd306SRoopa Prabhu );
68b74fd306SRoopa Prabhu 
69b74fd306SRoopa Prabhu TRACE_EVENT(fdb_delete,
70b74fd306SRoopa Prabhu 
71b74fd306SRoopa Prabhu 	TP_PROTO(struct net_bridge *br, struct net_bridge_fdb_entry *f),
72b74fd306SRoopa Prabhu 
73b74fd306SRoopa Prabhu 	TP_ARGS(br, f),
74b74fd306SRoopa Prabhu 
75b74fd306SRoopa Prabhu 	TP_STRUCT__entry(
76b74fd306SRoopa Prabhu 		__string(br_dev, br->dev->name)
77b74fd306SRoopa Prabhu 		__string(dev, f->dst ? f->dst->dev->name : "null")
78b74fd306SRoopa Prabhu 		__array(unsigned char, addr, ETH_ALEN)
79b74fd306SRoopa Prabhu 		__field(u16, vid)
80b74fd306SRoopa Prabhu 	),
81b74fd306SRoopa Prabhu 
82b74fd306SRoopa Prabhu 	TP_fast_assign(
83b74fd306SRoopa Prabhu 		__assign_str(br_dev, br->dev->name);
84b74fd306SRoopa Prabhu 		__assign_str(dev, f->dst ? f->dst->dev->name : "null");
85eb793583SNikolay Aleksandrov 		memcpy(__entry->addr, f->key.addr.addr, ETH_ALEN);
86eb793583SNikolay Aleksandrov 		__entry->vid = f->key.vlan_id;
87b74fd306SRoopa Prabhu 	),
88b74fd306SRoopa Prabhu 
89b74fd306SRoopa Prabhu 	TP_printk("br_dev %s dev %s addr %02x:%02x:%02x:%02x:%02x:%02x vid %u",
90b74fd306SRoopa Prabhu 		  __get_str(br_dev), __get_str(dev), __entry->addr[0],
91b74fd306SRoopa Prabhu 		  __entry->addr[1], __entry->addr[2], __entry->addr[3],
92b74fd306SRoopa Prabhu 		  __entry->addr[4], __entry->addr[5], __entry->vid)
93b74fd306SRoopa Prabhu );
94b74fd306SRoopa Prabhu 
95e3cfddd5SRoopa Prabhu TRACE_EVENT(br_fdb_update,
96e3cfddd5SRoopa Prabhu 
97e3cfddd5SRoopa Prabhu 	TP_PROTO(struct net_bridge *br, struct net_bridge_port *source,
98be0c5677SNikolay Aleksandrov 		 const unsigned char *addr, u16 vid, unsigned long flags),
99e3cfddd5SRoopa Prabhu 
100be0c5677SNikolay Aleksandrov 	TP_ARGS(br, source, addr, vid, flags),
101e3cfddd5SRoopa Prabhu 
102e3cfddd5SRoopa Prabhu 	TP_STRUCT__entry(
103e3cfddd5SRoopa Prabhu 		__string(br_dev, br->dev->name)
104e3cfddd5SRoopa Prabhu 		__string(dev, source->dev->name)
105e3cfddd5SRoopa Prabhu 		__array(unsigned char, addr, ETH_ALEN)
106e3cfddd5SRoopa Prabhu 		__field(u16, vid)
107be0c5677SNikolay Aleksandrov 		__field(unsigned long, flags)
108e3cfddd5SRoopa Prabhu 	),
109e3cfddd5SRoopa Prabhu 
110e3cfddd5SRoopa Prabhu 	TP_fast_assign(
111e3cfddd5SRoopa Prabhu 		__assign_str(br_dev, br->dev->name);
112e3cfddd5SRoopa Prabhu 		__assign_str(dev, source->dev->name);
113e3cfddd5SRoopa Prabhu 		memcpy(__entry->addr, addr, ETH_ALEN);
114e3cfddd5SRoopa Prabhu 		__entry->vid = vid;
115be0c5677SNikolay Aleksandrov 		__entry->flags = flags;
116e3cfddd5SRoopa Prabhu 	),
117e3cfddd5SRoopa Prabhu 
118be0c5677SNikolay Aleksandrov 	TP_printk("br_dev %s source %s addr %02x:%02x:%02x:%02x:%02x:%02x vid %u flags 0x%lx",
119e3cfddd5SRoopa Prabhu 		  __get_str(br_dev), __get_str(dev), __entry->addr[0],
120e3cfddd5SRoopa Prabhu 		  __entry->addr[1], __entry->addr[2], __entry->addr[3],
121e3cfddd5SRoopa Prabhu 		  __entry->addr[4], __entry->addr[5], __entry->vid,
122be0c5677SNikolay Aleksandrov 		  __entry->flags)
123e3cfddd5SRoopa Prabhu );
124e3cfddd5SRoopa Prabhu 
125*d47230a3SPetr Machata TRACE_EVENT(br_mdb_full,
126*d47230a3SPetr Machata 
127*d47230a3SPetr Machata 	TP_PROTO(const struct net_device *dev,
128*d47230a3SPetr Machata 		 const struct br_ip *group),
129*d47230a3SPetr Machata 
130*d47230a3SPetr Machata 	TP_ARGS(dev, group),
131*d47230a3SPetr Machata 
132*d47230a3SPetr Machata 	TP_STRUCT__entry(
133*d47230a3SPetr Machata 		__string(dev, dev->name)
134*d47230a3SPetr Machata 		__field(int, af)
135*d47230a3SPetr Machata 		__field(u16, vid)
136*d47230a3SPetr Machata 		__array(__u8, src, 16)
137*d47230a3SPetr Machata 		__array(__u8, grp, 16)
138*d47230a3SPetr Machata 		__array(__u8, grpmac, ETH_ALEN) /* For af == 0. */
139*d47230a3SPetr Machata 	),
140*d47230a3SPetr Machata 
141*d47230a3SPetr Machata 	TP_fast_assign(
142*d47230a3SPetr Machata 		struct in6_addr *in6;
143*d47230a3SPetr Machata 
144*d47230a3SPetr Machata 		__assign_str(dev, dev->name);
145*d47230a3SPetr Machata 		__entry->vid = group->vid;
146*d47230a3SPetr Machata 
147*d47230a3SPetr Machata 		if (!group->proto) {
148*d47230a3SPetr Machata 			__entry->af = 0;
149*d47230a3SPetr Machata 
150*d47230a3SPetr Machata 			memset(__entry->src, 0, sizeof(__entry->src));
151*d47230a3SPetr Machata 			memset(__entry->grp, 0, sizeof(__entry->grp));
152*d47230a3SPetr Machata 			memcpy(__entry->grpmac, group->dst.mac_addr, ETH_ALEN);
153*d47230a3SPetr Machata 		} else if (group->proto == htons(ETH_P_IP)) {
154*d47230a3SPetr Machata 			__entry->af = AF_INET;
155*d47230a3SPetr Machata 
156*d47230a3SPetr Machata 			in6 = (struct in6_addr *)__entry->src;
157*d47230a3SPetr Machata 			ipv6_addr_set_v4mapped(group->src.ip4, in6);
158*d47230a3SPetr Machata 
159*d47230a3SPetr Machata 			in6 = (struct in6_addr *)__entry->grp;
160*d47230a3SPetr Machata 			ipv6_addr_set_v4mapped(group->dst.ip4, in6);
161*d47230a3SPetr Machata 
162*d47230a3SPetr Machata 			memset(__entry->grpmac, 0, ETH_ALEN);
163*d47230a3SPetr Machata 
164*d47230a3SPetr Machata #if IS_ENABLED(CONFIG_IPV6)
165*d47230a3SPetr Machata 		} else {
166*d47230a3SPetr Machata 			__entry->af = AF_INET6;
167*d47230a3SPetr Machata 
168*d47230a3SPetr Machata 			in6 = (struct in6_addr *)__entry->src;
169*d47230a3SPetr Machata 			*in6 = group->src.ip6;
170*d47230a3SPetr Machata 
171*d47230a3SPetr Machata 			in6 = (struct in6_addr *)__entry->grp;
172*d47230a3SPetr Machata 			*in6 = group->dst.ip6;
173*d47230a3SPetr Machata 
174*d47230a3SPetr Machata 			memset(__entry->grpmac, 0, ETH_ALEN);
175*d47230a3SPetr Machata #endif
176*d47230a3SPetr Machata 		}
177*d47230a3SPetr Machata 	),
178*d47230a3SPetr Machata 
179*d47230a3SPetr Machata 	TP_printk("dev %s af %u src %pI6c grp %pI6c/%pM vid %u",
180*d47230a3SPetr Machata 		  __get_str(dev), __entry->af, __entry->src, __entry->grp,
181*d47230a3SPetr Machata 		  __entry->grpmac, __entry->vid)
182*d47230a3SPetr Machata );
183e3cfddd5SRoopa Prabhu 
184b74fd306SRoopa Prabhu #endif /* _TRACE_BRIDGE_H */
185b74fd306SRoopa Prabhu 
186b74fd306SRoopa Prabhu /* This part must be outside protection */
187b74fd306SRoopa Prabhu #include <trace/define_trace.h>
188