1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun #undef TRACE_SYSTEM 3*4882a593Smuzhiyun #define TRACE_SYSTEM fib 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun #if !defined(_TRACE_FIB_H) || defined(TRACE_HEADER_MULTI_READ) 6*4882a593Smuzhiyun #define _TRACE_FIB_H 7*4882a593Smuzhiyun 8*4882a593Smuzhiyun #include <linux/skbuff.h> 9*4882a593Smuzhiyun #include <linux/netdevice.h> 10*4882a593Smuzhiyun #include <net/ip_fib.h> 11*4882a593Smuzhiyun #include <linux/tracepoint.h> 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun TRACE_EVENT(fib_table_lookup, 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun TP_PROTO(u32 tb_id, const struct flowi4 *flp, 16*4882a593Smuzhiyun const struct fib_nh_common *nhc, int err), 17*4882a593Smuzhiyun 18*4882a593Smuzhiyun TP_ARGS(tb_id, flp, nhc, err), 19*4882a593Smuzhiyun 20*4882a593Smuzhiyun TP_STRUCT__entry( 21*4882a593Smuzhiyun __field( u32, tb_id ) 22*4882a593Smuzhiyun __field( int, err ) 23*4882a593Smuzhiyun __field( int, oif ) 24*4882a593Smuzhiyun __field( int, iif ) 25*4882a593Smuzhiyun __field( u8, proto ) 26*4882a593Smuzhiyun __field( __u8, tos ) 27*4882a593Smuzhiyun __field( __u8, scope ) 28*4882a593Smuzhiyun __field( __u8, flags ) 29*4882a593Smuzhiyun __array( __u8, src, 4 ) 30*4882a593Smuzhiyun __array( __u8, dst, 4 ) 31*4882a593Smuzhiyun __array( __u8, gw4, 4 ) 32*4882a593Smuzhiyun __array( __u8, gw6, 16 ) 33*4882a593Smuzhiyun __field( u16, sport ) 34*4882a593Smuzhiyun __field( u16, dport ) 35*4882a593Smuzhiyun __dynamic_array(char, name, IFNAMSIZ ) 36*4882a593Smuzhiyun ), 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun TP_fast_assign( 39*4882a593Smuzhiyun struct in6_addr in6_zero = {}; 40*4882a593Smuzhiyun struct net_device *dev; 41*4882a593Smuzhiyun struct in6_addr *in6; 42*4882a593Smuzhiyun __be32 *p32; 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun __entry->tb_id = tb_id; 45*4882a593Smuzhiyun __entry->err = err; 46*4882a593Smuzhiyun __entry->oif = flp->flowi4_oif; 47*4882a593Smuzhiyun __entry->iif = flp->flowi4_iif; 48*4882a593Smuzhiyun __entry->tos = flp->flowi4_tos; 49*4882a593Smuzhiyun __entry->scope = flp->flowi4_scope; 50*4882a593Smuzhiyun __entry->flags = flp->flowi4_flags; 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun p32 = (__be32 *) __entry->src; 53*4882a593Smuzhiyun *p32 = flp->saddr; 54*4882a593Smuzhiyun 55*4882a593Smuzhiyun p32 = (__be32 *) __entry->dst; 56*4882a593Smuzhiyun *p32 = flp->daddr; 57*4882a593Smuzhiyun 58*4882a593Smuzhiyun __entry->proto = flp->flowi4_proto; 59*4882a593Smuzhiyun if (__entry->proto == IPPROTO_TCP || 60*4882a593Smuzhiyun __entry->proto == IPPROTO_UDP) { 61*4882a593Smuzhiyun __entry->sport = ntohs(flp->fl4_sport); 62*4882a593Smuzhiyun __entry->dport = ntohs(flp->fl4_dport); 63*4882a593Smuzhiyun } else { 64*4882a593Smuzhiyun __entry->sport = 0; 65*4882a593Smuzhiyun __entry->dport = 0; 66*4882a593Smuzhiyun } 67*4882a593Smuzhiyun 68*4882a593Smuzhiyun dev = nhc ? nhc->nhc_dev : NULL; 69*4882a593Smuzhiyun __assign_str(name, dev ? dev->name : "-"); 70*4882a593Smuzhiyun 71*4882a593Smuzhiyun if (nhc) { 72*4882a593Smuzhiyun if (nhc->nhc_gw_family == AF_INET) { 73*4882a593Smuzhiyun p32 = (__be32 *) __entry->gw4; 74*4882a593Smuzhiyun *p32 = nhc->nhc_gw.ipv4; 75*4882a593Smuzhiyun 76*4882a593Smuzhiyun in6 = (struct in6_addr *)__entry->gw6; 77*4882a593Smuzhiyun *in6 = in6_zero; 78*4882a593Smuzhiyun } else if (nhc->nhc_gw_family == AF_INET6) { 79*4882a593Smuzhiyun p32 = (__be32 *) __entry->gw4; 80*4882a593Smuzhiyun *p32 = 0; 81*4882a593Smuzhiyun 82*4882a593Smuzhiyun in6 = (struct in6_addr *)__entry->gw6; 83*4882a593Smuzhiyun *in6 = nhc->nhc_gw.ipv6; 84*4882a593Smuzhiyun } 85*4882a593Smuzhiyun } else { 86*4882a593Smuzhiyun p32 = (__be32 *) __entry->gw4; 87*4882a593Smuzhiyun *p32 = 0; 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun in6 = (struct in6_addr *)__entry->gw6; 90*4882a593Smuzhiyun *in6 = in6_zero; 91*4882a593Smuzhiyun } 92*4882a593Smuzhiyun ), 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun 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", 95*4882a593Smuzhiyun __entry->tb_id, __entry->oif, __entry->iif, __entry->proto, 96*4882a593Smuzhiyun __entry->src, __entry->sport, __entry->dst, __entry->dport, 97*4882a593Smuzhiyun __entry->tos, __entry->scope, __entry->flags, 98*4882a593Smuzhiyun __get_str(name), __entry->gw4, __entry->gw6, __entry->err) 99*4882a593Smuzhiyun ); 100*4882a593Smuzhiyun #endif /* _TRACE_FIB_H */ 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun /* This part must be outside protection */ 103*4882a593Smuzhiyun #include <trace/define_trace.h> 104