From: David Ahern <dsah...@gmail.com>

Update fib_table_lookup tracepoint to take a fib_nh_common struct and
dump the v6 gateway address if the nexthop uses it.

Signed-off-by: David Ahern <dsah...@gmail.com>
---
 include/trace/events/fib.h | 45 ++++++++++++++++++++++++++-------------------
 net/ipv4/fib_trie.c        |  2 +-
 2 files changed, 27 insertions(+), 20 deletions(-)

diff --git a/include/trace/events/fib.h b/include/trace/events/fib.h
index 61ea7a24c8e5..7f83b6eafc5c 100644
--- a/include/trace/events/fib.h
+++ b/include/trace/events/fib.h
@@ -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 */
 
diff --git a/net/ipv4/fib_trie.c b/net/ipv4/fib_trie.c
index 1e3b492690f9..13b3327206f9 100644
--- a/net/ipv4/fib_trie.c
+++ b/net/ipv4/fib_trie.c
@@ -1498,7 +1498,7 @@ int fib_table_lookup(struct fib_table *tb, const struct 
flowi4 *flp,
 #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;
                }
-- 
2.11.0

Reply via email to