forked from mirrors/linux
		
	net: IPv6 fib lookup tracepoint
Add tracepoint to show fib6 table lookups and result. Signed-off-by: David Ahern <dsa@cumulusnetworks.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									e2f9dc3bd2
								
							
						
					
					
						commit
						b811580d91
					
				
					 3 changed files with 90 additions and 0 deletions
				
			
		
							
								
								
									
										76
									
								
								include/trace/events/fib6.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										76
									
								
								include/trace/events/fib6.h
									
									
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,76 @@ | ||||||
|  | #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 = flp->flowi6_tos; | ||||||
|  | 		__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> | ||||||
|  | @ -32,6 +32,10 @@ | ||||||
| #include <trace/events/sock.h> | #include <trace/events/sock.h> | ||||||
| #include <trace/events/udp.h> | #include <trace/events/udp.h> | ||||||
| #include <trace/events/fib.h> | #include <trace/events/fib.h> | ||||||
|  | #if IS_ENABLED(CONFIG_IPV6) | ||||||
|  | #include <trace/events/fib6.h> | ||||||
|  | EXPORT_TRACEPOINT_SYMBOL_GPL(fib6_table_lookup); | ||||||
|  | #endif | ||||||
| 
 | 
 | ||||||
| EXPORT_TRACEPOINT_SYMBOL_GPL(kfree_skb); | EXPORT_TRACEPOINT_SYMBOL_GPL(kfree_skb); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -62,6 +62,7 @@ | ||||||
| #include <net/lwtunnel.h> | #include <net/lwtunnel.h> | ||||||
| #include <net/ip_tunnels.h> | #include <net/ip_tunnels.h> | ||||||
| #include <net/l3mdev.h> | #include <net/l3mdev.h> | ||||||
|  | #include <trace/events/fib6.h> | ||||||
| 
 | 
 | ||||||
| #include <asm/uaccess.h> | #include <asm/uaccess.h> | ||||||
| 
 | 
 | ||||||
|  | @ -865,6 +866,9 @@ static struct rt6_info *ip6_pol_route_lookup(struct net *net, | ||||||
| 	} | 	} | ||||||
| 	dst_use(&rt->dst, jiffies); | 	dst_use(&rt->dst, jiffies); | ||||||
| 	read_unlock_bh(&table->tb6_lock); | 	read_unlock_bh(&table->tb6_lock); | ||||||
|  | 
 | ||||||
|  | 	trace_fib6_table_lookup(net, rt, table->tb6_id, fl6); | ||||||
|  | 
 | ||||||
| 	return rt; | 	return rt; | ||||||
| 
 | 
 | ||||||
| } | } | ||||||
|  | @ -1078,6 +1082,8 @@ static struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table, | ||||||
| 		read_unlock_bh(&table->tb6_lock); | 		read_unlock_bh(&table->tb6_lock); | ||||||
| 
 | 
 | ||||||
| 		rt6_dst_from_metrics_check(rt); | 		rt6_dst_from_metrics_check(rt); | ||||||
|  | 
 | ||||||
|  | 		trace_fib6_table_lookup(net, rt, table->tb6_id, fl6); | ||||||
| 		return rt; | 		return rt; | ||||||
| 	} else if (unlikely((fl6->flowi6_flags & FLOWI_FLAG_KNOWN_NH) && | 	} else if (unlikely((fl6->flowi6_flags & FLOWI_FLAG_KNOWN_NH) && | ||||||
| 			    !(rt->rt6i_flags & RTF_GATEWAY))) { | 			    !(rt->rt6i_flags & RTF_GATEWAY))) { | ||||||
|  | @ -1101,6 +1107,8 @@ static struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table, | ||||||
| 			uncached_rt = net->ipv6.ip6_null_entry; | 			uncached_rt = net->ipv6.ip6_null_entry; | ||||||
| 
 | 
 | ||||||
| 		dst_hold(&uncached_rt->dst); | 		dst_hold(&uncached_rt->dst); | ||||||
|  | 
 | ||||||
|  | 		trace_fib6_table_lookup(net, uncached_rt, table->tb6_id, fl6); | ||||||
| 		return uncached_rt; | 		return uncached_rt; | ||||||
| 
 | 
 | ||||||
| 	} else { | 	} else { | ||||||
|  | @ -1125,6 +1133,7 @@ static struct rt6_info *ip6_pol_route(struct net *net, struct fib6_table *table, | ||||||
| 			dst_release(&rt->dst); | 			dst_release(&rt->dst); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
|  | 		trace_fib6_table_lookup(net, pcpu_rt, table->tb6_id, fl6); | ||||||
| 		return pcpu_rt; | 		return pcpu_rt; | ||||||
| 
 | 
 | ||||||
| 	} | 	} | ||||||
|  | @ -1474,6 +1483,7 @@ static struct rt6_info *__ip6_route_redirect(struct net *net, | ||||||
| 
 | 
 | ||||||
| 	read_unlock_bh(&table->tb6_lock); | 	read_unlock_bh(&table->tb6_lock); | ||||||
| 
 | 
 | ||||||
|  | 	trace_fib6_table_lookup(net, rt, table->tb6_id, fl6); | ||||||
| 	return rt; | 	return rt; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
		Reference in a new issue
	
	 David Ahern
						David Ahern