Browse Source

core: Update trace_print_skb_gso

Add support for UDP_GSO and also print the address, port, ip family
and transport protocol in each trace.

CRs-Fixed: 2983027
Change-Id: If98c9423f77c0f566b004b167c2b45eca560b0d7
Signed-off-by: Subash Abhinov Kasiviswanathan <[email protected]>
Subash Abhinov Kasiviswanathan 4 years ago
parent
commit
daf959626b
2 changed files with 47 additions and 8 deletions
  1. 16 4
      core/rmnet_trace.h
  2. 31 4
      core/rmnet_vnd.c

+ 16 - 4
core/rmnet_trace.h

@@ -111,9 +111,10 @@ DEFINE_EVENT
 
 TRACE_EVENT(print_skb_gso,
 
-	TP_PROTO(struct sk_buff *skb, __be16 src, __be16 dest),
+	TP_PROTO(struct sk_buff *skb, __be16 src, __be16 dest,
+		 u16 ip_proto, u16 xport_proto, const char *saddr, const char *daddr),
 
-	TP_ARGS(skb, src, dest),
+	TP_ARGS(skb, src, dest, ip_proto, xport_proto, saddr, daddr),
 
 	TP_STRUCT__entry(
 		__field(void *,	skbaddr)
@@ -121,6 +122,10 @@ TRACE_EVENT(print_skb_gso,
 		__field(int, data_len)
 		__field(__be16, src)
 		__field(__be16, dest)
+		__field(u16, ip_proto)
+		__field(u16, xport_proto)
+		__string(saddr, saddr)
+		__string(daddr, daddr)
 	),
 
 	TP_fast_assign(
@@ -129,11 +134,18 @@ TRACE_EVENT(print_skb_gso,
 		__entry->data_len = skb->data_len;
 		__entry->src = src;
 		__entry->dest = dest;
+		__entry->ip_proto = ip_proto;
+		__entry->xport_proto = xport_proto;
+		__assign_str(saddr, saddr);
+		__assign_str(daddr, daddr);
 	),
 
-	TP_printk("GSO: skbaddr=%pK, len=%d, data_len=%d, src=%u, dest=%u",
+	TP_printk("GSO: skbaddr=%pK, len=%d, data_len=%d, [%s][%s] src=%s %u dest=%s %u",
 		__entry->skbaddr, __entry->len, __entry->data_len,
-		be16_to_cpu(__entry->src), be16_to_cpu(__entry->dest))
+		__entry->ip_proto == htons(ETH_P_IP) ? "IPv4" : "IPv6",
+		__entry->xport_proto == IPPROTO_TCP ? "TCP" : "UDP",
+		__get_str(saddr), be16_to_cpu(__entry->src),
+		__get_str(daddr), be16_to_cpu(__entry->dest))
 );
 
 /*****************************************************************************/

+ 31 - 4
core/rmnet_vnd.c

@@ -19,6 +19,7 @@
 #include <linux/ip.h>
 #include <linux/ipv6.h>
 #include <linux/tcp.h>
+#include <linux/inet.h>
 #include <net/pkt_sched.h>
 #include "rmnet_config.h"
 #include "rmnet_handlers.h"
@@ -250,21 +251,47 @@ static u16 rmnet_vnd_select_queue(struct net_device *dev,
 	int txq = 0;
 
 	if (trace_print_skb_gso_enabled()) {
+		char saddr[INET6_ADDRSTRLEN], daddr[INET6_ADDRSTRLEN];
+		u16 ip_proto = 0, xport_proto = 0;
+
 		if (!skb_shinfo(skb)->gso_size)
 			goto skip_trace;
 
+		memset(saddr, 0, INET6_ADDRSTRLEN);
+		memset(daddr, 0, INET6_ADDRSTRLEN);
+
 		if (skb->protocol == htons(ETH_P_IP)) {
-			if (ip_hdr(skb)->protocol != IPPROTO_TCP)
+			if (ip_hdr(skb)->protocol == IPPROTO_TCP)
+				xport_proto = IPPROTO_TCP;
+			else if (ip_hdr(skb)->protocol == IPPROTO_UDP)
+				xport_proto = IPPROTO_UDP;
+			else
 				goto skip_trace;
+
+			ip_proto = htons(ETH_P_IP);
+			snprintf(saddr, INET6_ADDRSTRLEN, "%pI4", &ip_hdr(skb)->saddr);
+			snprintf(daddr, INET6_ADDRSTRLEN, "%pI4", &ip_hdr(skb)->daddr);
 		}
 
 		if (skb->protocol == htons(ETH_P_IPV6)) {
-			if (ipv6_hdr(skb)->nexthdr != IPPROTO_TCP)
+			if (ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)
+				xport_proto = IPPROTO_TCP;
+			else if (ipv6_hdr(skb)->nexthdr == IPPROTO_UDP)
+				xport_proto = IPPROTO_UDP;
+			else
 				goto skip_trace;
+
+			ip_proto = htons(ETH_P_IPV6);
+			snprintf(saddr, INET6_ADDRSTRLEN, "%pI6", &ipv6_hdr(skb)->saddr);
+			snprintf(daddr, INET6_ADDRSTRLEN, "%pI6", &ipv6_hdr(skb)->daddr);
 		}
 
-		trace_print_skb_gso(skb, tcp_hdr(skb)->source,
-				    tcp_hdr(skb)->dest);
+		trace_print_skb_gso(skb,
+				    xport_proto == IPPROTO_TCP ? tcp_hdr(skb)->source :
+								 udp_hdr(skb)->source,
+				    xport_proto == IPPROTO_TCP ? tcp_hdr(skb)->dest :
+								 udp_hdr(skb)->dest,
+				    ip_proto, xport_proto, saddr, daddr);
 	}
 
 skip_trace: