ipv4: Update fib_table_lookup tracepoint to take common nexthop
authorDavid Ahern <dsahern@gmail.com>
Tue, 2 Apr 2019 21:11:54 +0000 (14:11 -0700)
committerDavid S. Miller <davem@davemloft.net>
Thu, 4 Apr 2019 04:50:20 +0000 (21:50 -0700)
Update fib_table_lookup tracepoint to take a fib_nh_common struct and
dump the v6 gateway address if the nexthop uses it.

Over the years saddr has not proven useful and the output of the
tracepoint produces very long lines. Since saddr is not part of
fib_nh_common, drop it. If it needs to be added later, fib_nh which
contains saddr can be obtained from a fib_nh_common via container_of.

Signed-off-by: David Ahern <dsahern@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/trace/events/fib.h
net/ipv4/fib_trie.c

index 61ea7a24c8e5479215811b41e462701a89ce58e7..7f83b6eafc5c4d5df91085656c35f2d99d986bc1 100644 (file)
@@ -13,9 +13,9 @@
 TRACE_EVENT(fib_table_lookup,
 
        TP_PROTO(u32 tb_id, const struct flowi4 *flp,
-                const struct fib_nh *nh, int err),
+                const struct fib_nh_common *nhc, int err),
 
-       TP_ARGS(tb_id, flp, nh, err),
+       TP_ARGS(tb_id, flp, nhc, err),
 
        TP_STRUCT__entry(
                __field(        u32,    tb_id           )
@@ -28,14 +28,17 @@ TRACE_EVENT(fib_table_lookup,
                __field(        __u8,   flags           )
                __array(        __u8,   src,    4       )
                __array(        __u8,   dst,    4       )
-               __array(        __u8,   gw    4       )
-               __array(        __u8,   saddr,  4       )
+               __array(        __u8,   gw4,    4       )
+               __array(        __u8,   gw6,    16      )
                __field(        u16,    sport           )
                __field(        u16,    dport           )
                __dynamic_array(char,  name,   IFNAMSIZ )
        ),
 
        TP_fast_assign(
+               struct in6_addr in6_zero = {};
+               struct net_device *dev;
+               struct in6_addr *in6;
                __be32 *p32;
 
                __entry->tb_id = tb_id;
@@ -62,33 +65,37 @@ TRACE_EVENT(fib_table_lookup,
                        __entry->dport = 0;
                }
 
-               if (nh) {
-                       struct net_device *dev;
+               dev = nhc ? nhc->nhc_dev : NULL;
+               __assign_str(name, dev ? dev->name : "-");
 
-                       p32 = (__be32 *) __entry->saddr;
-                       *p32 = nh->nh_saddr;
+               if (nhc) {
+                       if (nhc->nhc_family == AF_INET) {
+                               p32 = (__be32 *) __entry->gw4;
+                               *p32 = nhc->nhc_gw.ipv4;
 
-                       p32 = (__be32 *) __entry->gw;
-                       *p32 = nh->fib_nh_gw4;
+                               in6 = (struct in6_addr *)__entry->gw6;
+                               *in6 = in6_zero;
+                       } else if (nhc->nhc_family == AF_INET6) {
+                               p32 = (__be32 *) __entry->gw4;
+                               *p32 = 0;
 
-                       dev = nh->fib_nh_dev;
-                       __assign_str(name, dev ? dev->name : "-");
+                               in6 = (struct in6_addr *)__entry->gw6;
+                               *in6 = nhc->nhc_gw.ipv6;
+                       }
                } else {
-                       p32 = (__be32 *) __entry->saddr;
+                       p32 = (__be32 *) __entry->gw4;
                        *p32 = 0;
 
-                       p32 = (__be32 *) __entry->gw;
-                       *p32 = 0;
-
-                       __assign_str(name, "-");
+                       in6 = (struct in6_addr *)__entry->gw6;
+                       *in6 = in6_zero;
                }
        ),
 
-       TP_printk("table %u oif %d iif %d proto %u %pI4/%u -> %pI4/%u tos %d scope %d flags %x ==> dev %s gw %pI4 src %pI4 err %d",
+       TP_printk("table %u oif %d iif %d proto %u %pI4/%u -> %pI4/%u tos %d scope %d flags %x ==> dev %s gw %pI4/%pI6c err %d",
                  __entry->tb_id, __entry->oif, __entry->iif, __entry->proto,
                  __entry->src, __entry->sport, __entry->dst, __entry->dport,
                  __entry->tos, __entry->scope, __entry->flags,
-                 __get_str(name), __entry->gw, __entry->saddr, __entry->err)
+                 __get_str(name), __entry->gw4, __entry->gw6, __entry->err)
 );
 #endif /* _TRACE_FIB_H */
 
index 1e3b492690f9996d4811f040bae2cd31e92354c5..13b3327206f9acac3c9d82f8676eba65e9b126cb 100644 (file)
@@ -1498,7 +1498,7 @@ found:
 #ifdef CONFIG_IP_FIB_TRIE_STATS
                        this_cpu_inc(stats->semantic_match_passed);
 #endif
-                       trace_fib_table_lookup(tb->tb_id, flp, nh, err);
+                       trace_fib_table_lookup(tb->tb_id, flp, &nh->nh_common, err);
 
                        return err;
                }