0001 #undef TRACE_SYSTEM
0002 #define TRACE_SYSTEM neigh
0003
0004 #if !defined(_TRACE_NEIGH_H) || defined(TRACE_HEADER_MULTI_READ)
0005 #define _TRACE_NEIGH_H
0006
0007 #include <linux/skbuff.h>
0008 #include <linux/netdevice.h>
0009 #include <linux/tracepoint.h>
0010 #include <net/neighbour.h>
0011
0012 #define neigh_state_str(state) \
0013 __print_symbolic(state, \
0014 { NUD_INCOMPLETE, "incomplete" }, \
0015 { NUD_REACHABLE, "reachable" }, \
0016 { NUD_STALE, "stale" }, \
0017 { NUD_DELAY, "delay" }, \
0018 { NUD_PROBE, "probe" }, \
0019 { NUD_FAILED, "failed" }, \
0020 { NUD_NOARP, "noarp" }, \
0021 { NUD_PERMANENT, "permanent"})
0022
0023 TRACE_EVENT(neigh_create,
0024
0025 TP_PROTO(struct neigh_table *tbl, struct net_device *dev,
0026 const void *pkey, const struct neighbour *n,
0027 bool exempt_from_gc),
0028
0029 TP_ARGS(tbl, dev, pkey, n, exempt_from_gc),
0030
0031 TP_STRUCT__entry(
0032 __field(u32, family)
0033 __string(dev, dev ? dev->name : "NULL")
0034 __field(int, entries)
0035 __field(u8, created)
0036 __field(u8, gc_exempt)
0037 __array(u8, primary_key4, 4)
0038 __array(u8, primary_key6, 16)
0039 ),
0040
0041 TP_fast_assign(
0042 struct in6_addr *pin6;
0043 __be32 *p32;
0044
0045 __entry->family = tbl->family;
0046 __assign_str(dev, (dev ? dev->name : "NULL"));
0047 __entry->entries = atomic_read(&tbl->gc_entries);
0048 __entry->created = n != NULL;
0049 __entry->gc_exempt = exempt_from_gc;
0050 pin6 = (struct in6_addr *)__entry->primary_key6;
0051 p32 = (__be32 *)__entry->primary_key4;
0052
0053 if (tbl->family == AF_INET)
0054 *p32 = *(__be32 *)pkey;
0055 else
0056 *p32 = 0;
0057
0058 #if IS_ENABLED(CONFIG_IPV6)
0059 if (tbl->family == AF_INET6) {
0060 pin6 = (struct in6_addr *)__entry->primary_key6;
0061 *pin6 = *(struct in6_addr *)pkey;
0062 }
0063 #endif
0064 ),
0065
0066 TP_printk("family %d dev %s entries %d primary_key4 %pI4 primary_key6 %pI6c created %d gc_exempt %d",
0067 __entry->family, __get_str(dev), __entry->entries,
0068 __entry->primary_key4, __entry->primary_key6,
0069 __entry->created, __entry->gc_exempt)
0070 );
0071
0072 TRACE_EVENT(neigh_update,
0073
0074 TP_PROTO(struct neighbour *n, const u8 *lladdr, u8 new,
0075 u32 flags, u32 nlmsg_pid),
0076
0077 TP_ARGS(n, lladdr, new, flags, nlmsg_pid),
0078
0079 TP_STRUCT__entry(
0080 __field(u32, family)
0081 __string(dev, (n->dev ? n->dev->name : "NULL"))
0082 __array(u8, lladdr, MAX_ADDR_LEN)
0083 __field(u8, lladdr_len)
0084 __field(u8, flags)
0085 __field(u8, nud_state)
0086 __field(u8, type)
0087 __field(u8, dead)
0088 __field(int, refcnt)
0089 __array(__u8, primary_key4, 4)
0090 __array(__u8, primary_key6, 16)
0091 __field(unsigned long, confirmed)
0092 __field(unsigned long, updated)
0093 __field(unsigned long, used)
0094 __array(u8, new_lladdr, MAX_ADDR_LEN)
0095 __field(u8, new_state)
0096 __field(u32, update_flags)
0097 __field(u32, pid)
0098 ),
0099
0100 TP_fast_assign(
0101 int lladdr_len = (n->dev ? n->dev->addr_len : MAX_ADDR_LEN);
0102 struct in6_addr *pin6;
0103 __be32 *p32;
0104
0105 __entry->family = n->tbl->family;
0106 __assign_str(dev, (n->dev ? n->dev->name : "NULL"));
0107 __entry->lladdr_len = lladdr_len;
0108 memcpy(__entry->lladdr, n->ha, lladdr_len);
0109 __entry->flags = n->flags;
0110 __entry->nud_state = n->nud_state;
0111 __entry->type = n->type;
0112 __entry->dead = n->dead;
0113 __entry->refcnt = refcount_read(&n->refcnt);
0114 pin6 = (struct in6_addr *)__entry->primary_key6;
0115 p32 = (__be32 *)__entry->primary_key4;
0116
0117 if (n->tbl->family == AF_INET)
0118 *p32 = *(__be32 *)n->primary_key;
0119 else
0120 *p32 = 0;
0121
0122 #if IS_ENABLED(CONFIG_IPV6)
0123 if (n->tbl->family == AF_INET6) {
0124 pin6 = (struct in6_addr *)__entry->primary_key6;
0125 *pin6 = *(struct in6_addr *)n->primary_key;
0126 } else
0127 #endif
0128 {
0129 ipv6_addr_set_v4mapped(*p32, pin6);
0130 }
0131 __entry->confirmed = n->confirmed;
0132 __entry->updated = n->updated;
0133 __entry->used = n->used;
0134 if (lladdr)
0135 memcpy(__entry->new_lladdr, lladdr, lladdr_len);
0136 __entry->new_state = new;
0137 __entry->update_flags = flags;
0138 __entry->pid = nlmsg_pid;
0139 ),
0140
0141 TP_printk("family %d dev %s lladdr %s flags %02x nud_state %s type %02x "
0142 "dead %d refcnt %d primary_key4 %pI4 primary_key6 %pI6c "
0143 "confirmed %lu updated %lu used %lu new_lladdr %s "
0144 "new_state %s update_flags %02x pid %d",
0145 __entry->family, __get_str(dev),
0146 __print_hex_str(__entry->lladdr, __entry->lladdr_len),
0147 __entry->flags, neigh_state_str(__entry->nud_state),
0148 __entry->type, __entry->dead, __entry->refcnt,
0149 __entry->primary_key4, __entry->primary_key6,
0150 __entry->confirmed, __entry->updated, __entry->used,
0151 __print_hex_str(__entry->new_lladdr, __entry->lladdr_len),
0152 neigh_state_str(__entry->new_state),
0153 __entry->update_flags, __entry->pid)
0154 );
0155
0156 DECLARE_EVENT_CLASS(neigh__update,
0157 TP_PROTO(struct neighbour *n, int err),
0158 TP_ARGS(n, err),
0159 TP_STRUCT__entry(
0160 __field(u32, family)
0161 __string(dev, (n->dev ? n->dev->name : "NULL"))
0162 __array(u8, lladdr, MAX_ADDR_LEN)
0163 __field(u8, lladdr_len)
0164 __field(u8, flags)
0165 __field(u8, nud_state)
0166 __field(u8, type)
0167 __field(u8, dead)
0168 __field(int, refcnt)
0169 __array(__u8, primary_key4, 4)
0170 __array(__u8, primary_key6, 16)
0171 __field(unsigned long, confirmed)
0172 __field(unsigned long, updated)
0173 __field(unsigned long, used)
0174 __field(u32, err)
0175 ),
0176
0177 TP_fast_assign(
0178 int lladdr_len = (n->dev ? n->dev->addr_len : MAX_ADDR_LEN);
0179 struct in6_addr *pin6;
0180 __be32 *p32;
0181
0182 __entry->family = n->tbl->family;
0183 __assign_str(dev, (n->dev ? n->dev->name : "NULL"));
0184 __entry->lladdr_len = lladdr_len;
0185 memcpy(__entry->lladdr, n->ha, lladdr_len);
0186 __entry->flags = n->flags;
0187 __entry->nud_state = n->nud_state;
0188 __entry->type = n->type;
0189 __entry->dead = n->dead;
0190 __entry->refcnt = refcount_read(&n->refcnt);
0191 pin6 = (struct in6_addr *)__entry->primary_key6;
0192 p32 = (__be32 *)__entry->primary_key4;
0193
0194 if (n->tbl->family == AF_INET)
0195 *p32 = *(__be32 *)n->primary_key;
0196 else
0197 *p32 = 0;
0198
0199 #if IS_ENABLED(CONFIG_IPV6)
0200 if (n->tbl->family == AF_INET6) {
0201 pin6 = (struct in6_addr *)__entry->primary_key6;
0202 *pin6 = *(struct in6_addr *)n->primary_key;
0203 } else
0204 #endif
0205 {
0206 ipv6_addr_set_v4mapped(*p32, pin6);
0207 }
0208
0209 __entry->confirmed = n->confirmed;
0210 __entry->updated = n->updated;
0211 __entry->used = n->used;
0212 __entry->err = err;
0213 ),
0214
0215 TP_printk("family %d dev %s lladdr %s flags %02x nud_state %s type %02x "
0216 "dead %d refcnt %d primary_key4 %pI4 primary_key6 %pI6c "
0217 "confirmed %lu updated %lu used %lu err %d",
0218 __entry->family, __get_str(dev),
0219 __print_hex_str(__entry->lladdr, __entry->lladdr_len),
0220 __entry->flags, neigh_state_str(__entry->nud_state),
0221 __entry->type, __entry->dead, __entry->refcnt,
0222 __entry->primary_key4, __entry->primary_key6,
0223 __entry->confirmed, __entry->updated, __entry->used,
0224 __entry->err)
0225 );
0226
0227 DEFINE_EVENT(neigh__update, neigh_update_done,
0228 TP_PROTO(struct neighbour *neigh, int err),
0229 TP_ARGS(neigh, err)
0230 );
0231
0232 DEFINE_EVENT(neigh__update, neigh_timer_handler,
0233 TP_PROTO(struct neighbour *neigh, int err),
0234 TP_ARGS(neigh, err)
0235 );
0236
0237 DEFINE_EVENT(neigh__update, neigh_event_send_done,
0238 TP_PROTO(struct neighbour *neigh, int err),
0239 TP_ARGS(neigh, err)
0240 );
0241
0242 DEFINE_EVENT(neigh__update, neigh_event_send_dead,
0243 TP_PROTO(struct neighbour *neigh, int err),
0244 TP_ARGS(neigh, err)
0245 );
0246
0247 DEFINE_EVENT(neigh__update, neigh_cleanup_and_release,
0248 TP_PROTO(struct neighbour *neigh, int rc),
0249 TP_ARGS(neigh, rc)
0250 );
0251
0252 #endif
0253
0254
0255 #include <trace/define_trace.h>