net/ipv4: Udate fib_table_lookup tracepoint
authorDavid Ahern <dsahern@gmail.com>
Thu, 24 May 2018 00:08:47 +0000 (17:08 -0700)
committerDavid S. Miller <davem@davemloft.net>
Fri, 25 May 2018 03:00:31 +0000 (23:00 -0400)
Commit 4a2d73a4fb36 ("ipv4: fib_rules: support match on sport, dport
and ip proto") added support for protocol and ports to FIB rules.
Update the FIB lookup tracepoint to dump the parameters.

In addition, make the IPv4 tracepoint similar to the IPv6 one where
the lookup parameters and result are dumped in 1 event. It is much
easier to use and understand the outcome of the lookup.

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 81b7e985bb45a2fc26996a4a024cf002eca5bc23..f5a1d4c518d817017d64960f9c6dc9d39b1ce1dd 100644 (file)
 
 TRACE_EVENT(fib_table_lookup,
 
-       TP_PROTO(u32 tb_id, const struct flowi4 *flp),
+       TP_PROTO(u32 tb_id, const struct flowi4 *flp,
+                const struct fib_nh *nh, int err),
 
-       TP_ARGS(tb_id, flp),
+       TP_ARGS(tb_id, flp, nh, err),
 
        TP_STRUCT__entry(
                __field(        u32,    tb_id           )
+               __field(        int,    err             )
                __field(        int,    oif             )
                __field(        int,    iif             )
                __field(        __u8,   tos             )
@@ -25,12 +27,19 @@ TRACE_EVENT(fib_table_lookup,
                __field(        __u8,   flags           )
                __array(        __u8,   src,    4       )
                __array(        __u8,   dst,    4       )
+               __array(        __u8,   gw,     4       )
+               __array(        __u8,   saddr,  4       )
+               __field(        u16,    sport           )
+               __field(        u16,    dport           )
+               __field(        u8,     proto           )
+               __dynamic_array(char,  name,   IFNAMSIZ )
        ),
 
        TP_fast_assign(
                __be32 *p32;
 
                __entry->tb_id = tb_id;
+               __entry->err = err;
                __entry->oif = flp->flowi4_oif;
                __entry->iif = flp->flowi4_iif;
                __entry->tos = flp->flowi4_tos;
@@ -42,36 +51,41 @@ TRACE_EVENT(fib_table_lookup,
 
                p32 = (__be32 *) __entry->dst;
                *p32 = flp->daddr;
-       ),
-
-       TP_printk("table %u oif %d iif %d src %pI4 dst %pI4 tos %d scope %d flags %x",
-                 __entry->tb_id, __entry->oif, __entry->iif,
-                 __entry->src, __entry->dst, __entry->tos, __entry->scope,
-                 __entry->flags)
-);
-
-TRACE_EVENT(fib_table_lookup_nh,
-
-       TP_PROTO(const struct fib_nh *nh),
-
-       TP_ARGS(nh),
-
-       TP_STRUCT__entry(
-               __string(       name,   nh->nh_dev->name)
-               __field(        int,    oif             )
-               __array(        __u8,   src,    4       )
-       ),
-
-       TP_fast_assign(
-               __be32 *p32 = (__be32 *) __entry->src;
 
-               __assign_str(name, nh->nh_dev ? nh->nh_dev->name : "not set");
-               __entry->oif = nh->nh_oif;
-               *p32 = nh->nh_saddr;
+               __entry->proto = flp->flowi4_proto;
+               if (__entry->proto == IPPROTO_TCP ||
+                   __entry->proto == IPPROTO_UDP) {
+                       __entry->sport = ntohs(flp->fl4_sport);
+                       __entry->dport = ntohs(flp->fl4_dport);
+               } else {
+                       __entry->sport = 0;
+                       __entry->dport = 0;
+               }
+
+               if (nh) {
+                       p32 = (__be32 *) __entry->saddr;
+                       *p32 = nh->nh_saddr;
+
+                       p32 = (__be32 *) __entry->gw;
+                       *p32 = nh->nh_gw;
+
+                       __assign_str(name, nh->nh_dev ? nh->nh_dev->name : "-");
+               } else {
+                       p32 = (__be32 *) __entry->saddr;
+                       *p32 = 0;
+
+                       p32 = (__be32 *) __entry->gw;
+                       *p32 = 0;
+
+                       __assign_str(name, "-");
+               }
        ),
 
-       TP_printk("nexthop dev %s oif %d src %pI4",
-                 __get_str(name), __entry->oif, __entry->src)
+       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",
+                 __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)
 );
 
 TRACE_EVENT(fib_validate_source,
index 3dcffd3ce98c4b6fbbe50fab120bb4fe56f5bc0a..65c340f230aea53b445bd617e03305eb19fda25f 100644 (file)
@@ -1326,14 +1326,14 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
        unsigned long index;
        t_key cindex;
 
-       trace_fib_table_lookup(tb->tb_id, flp);
-
        pn = t->kv;
        cindex = 0;
 
        n = get_child_rcu(pn, cindex);
-       if (!n)
+       if (!n) {
+               trace_fib_table_lookup(tb->tb_id, flp, NULL, -EAGAIN);
                return -EAGAIN;
+       }
 
 #ifdef CONFIG_IP_FIB_TRIE_STATS
        this_cpu_inc(stats->gets);
@@ -1416,8 +1416,11 @@ backtrace:
                                 * nothing for us to do as we do not have any
                                 * further nodes to parse.
                                 */
-                               if (IS_TRIE(pn))
+                               if (IS_TRIE(pn)) {
+                                       trace_fib_table_lookup(tb->tb_id, flp,
+                                                              NULL, -EAGAIN);
                                        return -EAGAIN;
+                               }
 #ifdef CONFIG_IP_FIB_TRIE_STATS
                                this_cpu_inc(stats->backtrack);
 #endif
@@ -1459,6 +1462,7 @@ found:
 #ifdef CONFIG_IP_FIB_TRIE_STATS
                        this_cpu_inc(stats->semantic_match_passed);
 #endif
+                       trace_fib_table_lookup(tb->tb_id, flp, NULL, err);
                        return err;
                }
                if (fi->fib_flags & RTNH_F_DEAD)
@@ -1494,7 +1498,7 @@ found:
 #ifdef CONFIG_IP_FIB_TRIE_STATS
                        this_cpu_inc(stats->semantic_match_passed);
 #endif
-                       trace_fib_table_lookup_nh(nh);
+                       trace_fib_table_lookup(tb->tb_id, flp, nh, err);
 
                        return err;
                }