linux-stable/include/trace/events/fib6.h
Daniel Borkmann 69716a2b51 ipv6, trace: fix tos reporting on fib6_table_lookup
flowi6_tos of struct flowi6 is unused in IPv6, therefore dumping tos on
that tracepoint will also give incorrect information wrt traffic class.

If we want to fix it, we need to extract it via ip6_tclass(flp->flowlabel).
While for the same test case I get a count of 0 non-zero tos values before
the change, they now start to show up after the change:

  # ./perf record -e fib6:fib6_table_lookup -a sleep 10
  # ./perf script | grep -v "tos 0" | wc -l
  60

Since there's no user in the kernel tree anymore of flowi6_tos, remove the
define to avoid any future confusion on this.

Fixes: b811580d91 ("net: IPv6 fib lookup tracepoint")
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
2016-03-20 13:44:34 -04:00

76 lines
1.8 KiB
C

#undef TRACE_SYSTEM
#define TRACE_SYSTEM fib6
#if !defined(_TRACE_FIB6_H) || defined(TRACE_HEADER_MULTI_READ)
#define _TRACE_FIB6_H
#include <linux/in6.h>
#include <net/flow.h>
#include <net/ip6_fib.h>
#include <linux/tracepoint.h>
TRACE_EVENT(fib6_table_lookup,
TP_PROTO(const struct net *net, const struct rt6_info *rt,
u32 tb_id, const struct flowi6 *flp),
TP_ARGS(net, rt, tb_id, flp),
TP_STRUCT__entry(
__field( u32, tb_id )
__field( int, oif )
__field( int, iif )
__field( __u8, tos )
__field( __u8, scope )
__field( __u8, flags )
__array( __u8, src, 16 )
__array( __u8, dst, 16 )
__dynamic_array( char, name, IFNAMSIZ )
__array( __u8, gw, 16 )
),
TP_fast_assign(
struct in6_addr *in6;
__entry->tb_id = tb_id;
__entry->oif = flp->flowi6_oif;
__entry->iif = flp->flowi6_iif;
__entry->tos = ip6_tclass(flp->flowlabel);
__entry->scope = flp->flowi6_scope;
__entry->flags = flp->flowi6_flags;
in6 = (struct in6_addr *)__entry->src;
*in6 = flp->saddr;
in6 = (struct in6_addr *)__entry->dst;
*in6 = flp->daddr;
if (rt->rt6i_idev) {
__assign_str(name, rt->rt6i_idev->dev->name);
} else {
__assign_str(name, "");
}
if (rt == net->ipv6.ip6_null_entry) {
struct in6_addr in6_zero = {};
in6 = (struct in6_addr *)__entry->gw;
*in6 = in6_zero;
} else if (rt) {
in6 = (struct in6_addr *)__entry->gw;
*in6 = rt->rt6i_gateway;
}
),
TP_printk("table %3u oif %d iif %d src %pI6c dst %pI6c tos %d scope %d flags %x ==> dev %s gw %pI6c",
__entry->tb_id, __entry->oif, __entry->iif,
__entry->src, __entry->dst, __entry->tos, __entry->scope,
__entry->flags, __get_str(name), __entry->gw)
);
#endif /* _TRACE_FIB6_H */
/* This part must be outside protection */
#include <trace/define_trace.h>