Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 #undef TRACE_SYSTEM
0003 #define TRACE_SYSTEM fib
0004 
0005 #if !defined(_TRACE_FIB_H) || defined(TRACE_HEADER_MULTI_READ)
0006 #define _TRACE_FIB_H
0007 
0008 #include <linux/skbuff.h>
0009 #include <linux/netdevice.h>
0010 #include <net/ip_fib.h>
0011 #include <linux/tracepoint.h>
0012 
0013 TRACE_EVENT(fib_table_lookup,
0014 
0015     TP_PROTO(u32 tb_id, const struct flowi4 *flp,
0016          const struct fib_nh_common *nhc, int err),
0017 
0018     TP_ARGS(tb_id, flp, nhc, err),
0019 
0020     TP_STRUCT__entry(
0021         __field(    u32,    tb_id       )
0022         __field(    int,    err     )
0023         __field(    int,    oif     )
0024         __field(    int,    iif     )
0025         __field(    u8, proto       )
0026         __field(    __u8,   tos     )
0027         __field(    __u8,   scope       )
0028         __field(    __u8,   flags       )
0029         __array(    __u8,   src,    4   )
0030         __array(    __u8,   dst,    4   )
0031         __array(    __u8,   gw4,    4   )
0032         __array(    __u8,   gw6,    16  )
0033         __field(    u16,    sport       )
0034         __field(    u16,    dport       )
0035         __array(char,  name,   IFNAMSIZ )
0036     ),
0037 
0038     TP_fast_assign(
0039         struct in6_addr in6_zero = {};
0040         struct net_device *dev;
0041         struct in6_addr *in6;
0042         __be32 *p32;
0043 
0044         __entry->tb_id = tb_id;
0045         __entry->err = err;
0046         __entry->oif = flp->flowi4_oif;
0047         __entry->iif = flp->flowi4_iif;
0048         __entry->tos = flp->flowi4_tos;
0049         __entry->scope = flp->flowi4_scope;
0050         __entry->flags = flp->flowi4_flags;
0051 
0052         p32 = (__be32 *) __entry->src;
0053         *p32 = flp->saddr;
0054 
0055         p32 = (__be32 *) __entry->dst;
0056         *p32 = flp->daddr;
0057 
0058         __entry->proto = flp->flowi4_proto;
0059         if (__entry->proto == IPPROTO_TCP ||
0060             __entry->proto == IPPROTO_UDP) {
0061             __entry->sport = ntohs(flp->fl4_sport);
0062             __entry->dport = ntohs(flp->fl4_dport);
0063         } else {
0064             __entry->sport = 0;
0065             __entry->dport = 0;
0066         }
0067 
0068         dev = nhc ? nhc->nhc_dev : NULL;
0069         strlcpy(__entry->name, dev ? dev->name : "-", IFNAMSIZ);
0070 
0071         if (nhc) {
0072             if (nhc->nhc_gw_family == AF_INET) {
0073                 p32 = (__be32 *) __entry->gw4;
0074                 *p32 = nhc->nhc_gw.ipv4;
0075 
0076                 in6 = (struct in6_addr *)__entry->gw6;
0077                 *in6 = in6_zero;
0078             } else if (nhc->nhc_gw_family == AF_INET6) {
0079                 p32 = (__be32 *) __entry->gw4;
0080                 *p32 = 0;
0081 
0082                 in6 = (struct in6_addr *)__entry->gw6;
0083                 *in6 = nhc->nhc_gw.ipv6;
0084             }
0085         } else {
0086             p32 = (__be32 *) __entry->gw4;
0087             *p32 = 0;
0088 
0089             in6 = (struct in6_addr *)__entry->gw6;
0090             *in6 = in6_zero;
0091         }
0092     ),
0093 
0094     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",
0095           __entry->tb_id, __entry->oif, __entry->iif, __entry->proto,
0096           __entry->src, __entry->sport, __entry->dst, __entry->dport,
0097           __entry->tos, __entry->scope, __entry->flags,
0098           __entry->name, __entry->gw4, __entry->gw6, __entry->err)
0099 );
0100 #endif /* _TRACE_FIB_H */
0101 
0102 /* This part must be outside protection */
0103 #include <trace/define_trace.h>