forked from Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
103 lines
2.5 KiB
103 lines
2.5 KiB
/* SPDX-License-Identifier: GPL-2.0 */ |
|
#undef TRACE_SYSTEM |
|
#define TRACE_SYSTEM fib |
|
|
|
#if !defined(_TRACE_FIB_H) || defined(TRACE_HEADER_MULTI_READ) |
|
#define _TRACE_FIB_H |
|
|
|
#include <linux/skbuff.h> |
|
#include <linux/netdevice.h> |
|
#include <net/ip_fib.h> |
|
#include <linux/tracepoint.h> |
|
|
|
TRACE_EVENT(fib_table_lookup, |
|
|
|
TP_PROTO(u32 tb_id, const struct flowi4 *flp, |
|
const struct fib_nh_common *nhc, int err), |
|
|
|
TP_ARGS(tb_id, flp, nhc, err), |
|
|
|
TP_STRUCT__entry( |
|
__field( u32, tb_id ) |
|
__field( int, err ) |
|
__field( int, oif ) |
|
__field( int, iif ) |
|
__field( u8, proto ) |
|
__field( __u8, tos ) |
|
__field( __u8, scope ) |
|
__field( __u8, flags ) |
|
__array( __u8, src, 4 ) |
|
__array( __u8, dst, 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; |
|
__entry->err = err; |
|
__entry->oif = flp->flowi4_oif; |
|
__entry->iif = flp->flowi4_iif; |
|
__entry->tos = flp->flowi4_tos; |
|
__entry->scope = flp->flowi4_scope; |
|
__entry->flags = flp->flowi4_flags; |
|
|
|
p32 = (__be32 *) __entry->src; |
|
*p32 = flp->saddr; |
|
|
|
p32 = (__be32 *) __entry->dst; |
|
*p32 = flp->daddr; |
|
|
|
__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; |
|
} |
|
|
|
dev = nhc ? nhc->nhc_dev : NULL; |
|
__assign_str(name, dev ? dev->name : "-"); |
|
|
|
if (nhc) { |
|
if (nhc->nhc_gw_family == AF_INET) { |
|
p32 = (__be32 *) __entry->gw4; |
|
*p32 = nhc->nhc_gw.ipv4; |
|
|
|
in6 = (struct in6_addr *)__entry->gw6; |
|
*in6 = in6_zero; |
|
} else if (nhc->nhc_gw_family == AF_INET6) { |
|
p32 = (__be32 *) __entry->gw4; |
|
*p32 = 0; |
|
|
|
in6 = (struct in6_addr *)__entry->gw6; |
|
*in6 = nhc->nhc_gw.ipv6; |
|
} |
|
} else { |
|
p32 = (__be32 *) __entry->gw4; |
|
*p32 = 0; |
|
|
|
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/%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->gw4, __entry->gw6, __entry->err) |
|
); |
|
#endif /* _TRACE_FIB_H */ |
|
|
|
/* This part must be outside protection */ |
|
#include <trace/define_trace.h>
|
|
|