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