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