Commit 9f323973 authored by David Ahern's avatar David Ahern Committed by David S. Miller

net/ipv4: Udate fib_table_lookup tracepoint

Commit 4a2d73a4 ("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: default avatarDavid Ahern <dsahern@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent aaa908ff
...@@ -12,12 +12,14 @@ ...@@ -12,12 +12,14 @@
TRACE_EVENT(fib_table_lookup, 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( TP_STRUCT__entry(
__field( u32, tb_id ) __field( u32, tb_id )
__field( int, err )
__field( int, oif ) __field( int, oif )
__field( int, iif ) __field( int, iif )
__field( __u8, tos ) __field( __u8, tos )
...@@ -25,12 +27,19 @@ TRACE_EVENT(fib_table_lookup, ...@@ -25,12 +27,19 @@ TRACE_EVENT(fib_table_lookup,
__field( __u8, flags ) __field( __u8, flags )
__array( __u8, src, 4 ) __array( __u8, src, 4 )
__array( __u8, dst, 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( TP_fast_assign(
__be32 *p32; __be32 *p32;
__entry->tb_id = tb_id; __entry->tb_id = tb_id;
__entry->err = err;
__entry->oif = flp->flowi4_oif; __entry->oif = flp->flowi4_oif;
__entry->iif = flp->flowi4_iif; __entry->iif = flp->flowi4_iif;
__entry->tos = flp->flowi4_tos; __entry->tos = flp->flowi4_tos;
...@@ -42,36 +51,41 @@ TRACE_EVENT(fib_table_lookup, ...@@ -42,36 +51,41 @@ TRACE_EVENT(fib_table_lookup,
p32 = (__be32 *) __entry->dst; p32 = (__be32 *) __entry->dst;
*p32 = flp->daddr; *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->proto = flp->flowi4_proto;
__entry->oif = nh->nh_oif; if (__entry->proto == IPPROTO_TCP ||
*p32 = nh->nh_saddr; __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", 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",
__get_str(name), __entry->oif, __entry->src) __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, TRACE_EVENT(fib_validate_source,
......
...@@ -1326,14 +1326,14 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp, ...@@ -1326,14 +1326,14 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
unsigned long index; unsigned long index;
t_key cindex; t_key cindex;
trace_fib_table_lookup(tb->tb_id, flp);
pn = t->kv; pn = t->kv;
cindex = 0; cindex = 0;
n = get_child_rcu(pn, cindex); n = get_child_rcu(pn, cindex);
if (!n) if (!n) {
trace_fib_table_lookup(tb->tb_id, flp, NULL, -EAGAIN);
return -EAGAIN; return -EAGAIN;
}
#ifdef CONFIG_IP_FIB_TRIE_STATS #ifdef CONFIG_IP_FIB_TRIE_STATS
this_cpu_inc(stats->gets); this_cpu_inc(stats->gets);
...@@ -1416,8 +1416,11 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp, ...@@ -1416,8 +1416,11 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
* nothing for us to do as we do not have any * nothing for us to do as we do not have any
* further nodes to parse. * further nodes to parse.
*/ */
if (IS_TRIE(pn)) if (IS_TRIE(pn)) {
trace_fib_table_lookup(tb->tb_id, flp,
NULL, -EAGAIN);
return -EAGAIN; return -EAGAIN;
}
#ifdef CONFIG_IP_FIB_TRIE_STATS #ifdef CONFIG_IP_FIB_TRIE_STATS
this_cpu_inc(stats->backtrack); this_cpu_inc(stats->backtrack);
#endif #endif
...@@ -1459,6 +1462,7 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp, ...@@ -1459,6 +1462,7 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
#ifdef CONFIG_IP_FIB_TRIE_STATS #ifdef CONFIG_IP_FIB_TRIE_STATS
this_cpu_inc(stats->semantic_match_passed); this_cpu_inc(stats->semantic_match_passed);
#endif #endif
trace_fib_table_lookup(tb->tb_id, flp, NULL, err);
return err; return err;
} }
if (fi->fib_flags & RTNH_F_DEAD) if (fi->fib_flags & RTNH_F_DEAD)
...@@ -1494,7 +1498,7 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp, ...@@ -1494,7 +1498,7 @@ int fib_table_lookup(struct fib_table *tb, const struct flowi4 *flp,
#ifdef CONFIG_IP_FIB_TRIE_STATS #ifdef CONFIG_IP_FIB_TRIE_STATS
this_cpu_inc(stats->semantic_match_passed); this_cpu_inc(stats->semantic_match_passed);
#endif #endif
trace_fib_table_lookup_nh(nh); trace_fib_table_lookup(tb->tb_id, flp, nh, err);
return err; return err;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment