Forráskód Böngészése

core: Add more data path tracing

Add traces to track TCP and UDP non fragmented packets in uplink and downlink.

CRs-Fixed: 3002908
Change-Id: I35643c38dff564964dcd9e04518cbe4655dd050b
Signed-off-by: Subash Abhinov Kasiviswanathan <[email protected]>
Subash Abhinov Kasiviswanathan 3 éve
szülő
commit
dd380cbece
4 módosított fájl, 224 hozzáadás és 0 törlés
  1. 61 0
      core/rmnet_descriptor.c
  2. 1 0
      core/rmnet_handlers.c
  3. 110 0
      core/rmnet_trace.h
  4. 52 0
      core/rmnet_vnd.c

+ 61 - 0
core/rmnet_descriptor.c

@@ -15,6 +15,7 @@
 
 #include <linux/ip.h>
 #include <linux/ipv6.h>
+#include <linux/inet.h>
 #include <net/ipv6.h>
 #include <net/ip6_checksum.h>
 #include "rmnet_config.h"
@@ -23,6 +24,7 @@
 #include "rmnet_private.h"
 #include "rmnet_vnd.h"
 #include "rmnet_qmi.h"
+#include "rmnet_trace.h"
 #include "qmi_rmnet.h"
 
 #define RMNET_FRAG_DESCRIPTOR_POOL_SIZE 64
@@ -977,6 +979,65 @@ skip_frags:
 
 	/* Propagate original priority value */
 	head_skb->priority = frag_desc->priority;
+
+	if (trace_print_tcp_rx_enabled()) {
+		char saddr[INET6_ADDRSTRLEN], daddr[INET6_ADDRSTRLEN];
+
+		if (!frag_desc->hdrs_valid && !frag_desc->trans_len)
+			goto skip_trace_print_tcp_rx;
+
+		memset(saddr, 0, INET6_ADDRSTRLEN);
+		memset(daddr, 0, INET6_ADDRSTRLEN);
+
+		if (head_skb->protocol == htons(ETH_P_IP)) {
+			if (ip_hdr(head_skb)->protocol != IPPROTO_TCP)
+				goto skip_trace_print_tcp_rx;
+
+			snprintf(saddr, INET6_ADDRSTRLEN, "%pI4", &ip_hdr(head_skb)->saddr);
+			snprintf(daddr, INET6_ADDRSTRLEN, "%pI4", &ip_hdr(head_skb)->daddr);
+		}
+
+		if (head_skb->protocol == htons(ETH_P_IPV6)) {
+			if (ipv6_hdr(head_skb)->nexthdr != IPPROTO_TCP)
+				goto skip_trace_print_tcp_rx;
+
+			snprintf(saddr, INET6_ADDRSTRLEN, "%pI6", &ipv6_hdr(head_skb)->saddr);
+			snprintf(daddr, INET6_ADDRSTRLEN, "%pI6", &ipv6_hdr(head_skb)->daddr);
+		}
+
+		trace_print_tcp_rx(head_skb, saddr, daddr, tcp_hdr(head_skb));
+	}
+skip_trace_print_tcp_rx:
+
+	if (trace_print_udp_rx_enabled()) {
+		char saddr[INET6_ADDRSTRLEN], daddr[INET6_ADDRSTRLEN];
+
+		if (!frag_desc->hdrs_valid && !frag_desc->trans_len)
+			goto skip_trace_print_udp_rx;
+
+		memset(saddr, 0, INET6_ADDRSTRLEN);
+		memset(daddr, 0, INET6_ADDRSTRLEN);
+
+		if (head_skb->protocol == htons(ETH_P_IP)) {
+			if (ip_hdr(head_skb)->protocol != IPPROTO_UDP)
+				goto skip_trace_print_udp_rx;
+
+			snprintf(saddr, INET6_ADDRSTRLEN, "%pI4", &ip_hdr(head_skb)->saddr);
+			snprintf(daddr, INET6_ADDRSTRLEN, "%pI4", &ip_hdr(head_skb)->daddr);
+		}
+
+		if (head_skb->protocol == htons(ETH_P_IPV6)) {
+			if (ipv6_hdr(head_skb)->nexthdr != IPPROTO_UDP)
+				goto skip_trace_print_udp_rx;
+
+			snprintf(saddr, INET6_ADDRSTRLEN, "%pI6", &ipv6_hdr(head_skb)->saddr);
+			snprintf(daddr, INET6_ADDRSTRLEN, "%pI6", &ipv6_hdr(head_skb)->daddr);
+		}
+
+		trace_print_udp_rx(head_skb, saddr, daddr, udp_hdr(head_skb));
+	}
+skip_trace_print_udp_rx:
+
 	return head_skb;
 }
 

+ 1 - 0
core/rmnet_handlers.c

@@ -18,6 +18,7 @@
 #include <linux/if_arp.h>
 #include <linux/ip.h>
 #include <linux/ipv6.h>
+#include <linux/inet.h>
 #include <net/sock.h>
 #include <linux/tracepoint.h>
 #include "rmnet_private.h"

+ 110 - 0
core/rmnet_trace.h

@@ -200,6 +200,116 @@ DEFINE_EVENT
 	TP_ARGS(skb, ip_proto, type, sequence, saddr, daddr)
 );
 
+DECLARE_EVENT_CLASS(print_tcp,
+
+	TP_PROTO(struct sk_buff *skb, const char *saddr, const char *daddr,
+		 struct tcphdr *tp),
+
+	TP_ARGS(skb, saddr, daddr, tp),
+
+	TP_STRUCT__entry(
+		__field(void *, skbaddr)
+		__field(int, len)
+		__string(saddr, saddr)
+		__string(daddr, daddr)
+		__field(__be16, source)
+		__field(__be16, dest)
+		__field(__be32, seq)
+		__field(__be32, ack_seq)
+		__field(u8, syn)
+		__field(u8, ack)
+		__field(u8, fin)
+	),
+
+	TP_fast_assign(
+		__entry->skbaddr = skb;
+		__entry->len = skb->len;
+		__assign_str(saddr, saddr);
+		__assign_str(daddr, daddr);
+		__entry->source = tp->source;
+		__entry->dest = tp->dest;
+		__entry->seq = tp->seq;
+		__entry->ack_seq = tp->ack_seq;
+		__entry->syn = tp->syn;
+		__entry->ack = tp->ack;
+		__entry->fin = tp->fin;
+	),
+
+	TP_printk("TCP: skbaddr=%pK, len=%d source=%s %u dest=%s %u seq=%u ack_seq=%u syn=%u ack=%u fin=%u",
+		__entry->skbaddr, __entry->len,
+		__get_str(saddr), be16_to_cpu(__entry->source),
+		__get_str(daddr), be16_to_cpu(__entry->dest),
+		be32_to_cpu(__entry->seq), be32_to_cpu(__entry->ack_seq),
+		!!__entry->syn, !!__entry->ack, !!__entry->fin)
+);
+
+DEFINE_EVENT
+	(print_tcp, print_tcp_tx,
+
+	TP_PROTO(struct sk_buff *skb, const char *saddr, const char *daddr,
+		 struct tcphdr *tp),
+
+	TP_ARGS(skb, saddr, daddr, tp)
+);
+
+DEFINE_EVENT
+	(print_tcp, print_tcp_rx,
+
+	TP_PROTO(struct sk_buff *skb, const char *saddr, const char *daddr,
+		 struct tcphdr *tp),
+
+	TP_ARGS(skb, saddr, daddr, tp)
+);
+
+DECLARE_EVENT_CLASS(print_udp,
+
+	TP_PROTO(struct sk_buff *skb, const char *saddr, const char *daddr,
+		 struct udphdr *uh),
+
+	TP_ARGS(skb, saddr, daddr, uh),
+
+	TP_STRUCT__entry(
+		__field(void *, skbaddr)
+		__field(int, len)
+		__string(saddr, saddr)
+		__string(daddr, daddr)
+		__field(__be16, source)
+		__field(__be16, dest)
+	),
+
+	TP_fast_assign(
+		__entry->skbaddr = skb;
+		__entry->len = skb->len;
+		__assign_str(saddr, saddr);
+		__assign_str(daddr, daddr);
+		__entry->source = uh->source;
+		__entry->dest = uh->dest;
+	),
+
+	TP_printk("UDP: skbaddr=%pK, len=%d source=%s %u dest=%s %u",
+		__entry->skbaddr, __entry->len,
+		__get_str(saddr), be16_to_cpu(__entry->source),
+		__get_str(daddr), be16_to_cpu(__entry->dest))
+);
+
+DEFINE_EVENT
+	(print_udp, print_udp_tx,
+
+	TP_PROTO(struct sk_buff *skb, const char *saddr, const char *daddr,
+		 struct udphdr *uh),
+
+	TP_ARGS(skb, saddr, daddr, uh)
+);
+
+DEFINE_EVENT
+	(print_udp, print_udp_rx,
+
+	TP_PROTO(struct sk_buff *skb, const char *saddr, const char *daddr,
+		 struct udphdr *uh),
+
+	TP_ARGS(skb, saddr, daddr, uh)
+);
+
 /*****************************************************************************/
 /* Trace events for rmnet_perf module */
 /*****************************************************************************/

+ 52 - 0
core/rmnet_vnd.c

@@ -299,6 +299,58 @@ static u16 rmnet_vnd_select_queue(struct net_device *dev,
 	}
 
 skip_trace_print_icmp_tx:
+	if (trace_print_tcp_tx_enabled()) {
+		char saddr[INET6_ADDRSTRLEN], daddr[INET6_ADDRSTRLEN];
+
+		memset(saddr, 0, INET6_ADDRSTRLEN);
+		memset(daddr, 0, INET6_ADDRSTRLEN);
+
+		if (skb->protocol == htons(ETH_P_IP)) {
+			if (ip_hdr(skb)->protocol != IPPROTO_TCP)
+				goto skip_trace_print_tcp_tx;
+
+			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)
+				goto skip_trace_print_tcp_tx;
+
+			snprintf(saddr, INET6_ADDRSTRLEN, "%pI6", &ipv6_hdr(skb)->saddr);
+			snprintf(daddr, INET6_ADDRSTRLEN, "%pI6", &ipv6_hdr(skb)->daddr);
+		}
+
+		trace_print_tcp_tx(skb, saddr, daddr, tcp_hdr(skb));
+	}
+
+skip_trace_print_tcp_tx:
+	if (trace_print_udp_tx_enabled()) {
+		char saddr[INET6_ADDRSTRLEN], daddr[INET6_ADDRSTRLEN];
+
+		memset(saddr, 0, INET6_ADDRSTRLEN);
+		memset(daddr, 0, INET6_ADDRSTRLEN);
+
+		if (skb->protocol == htons(ETH_P_IP)) {
+			if (ip_hdr(skb)->protocol != IPPROTO_UDP)
+				goto skip_trace_print_udp_tx;
+
+			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_UDP)
+				goto skip_trace_print_udp_tx;
+
+			snprintf(saddr, INET6_ADDRSTRLEN, "%pI6", &ipv6_hdr(skb)->saddr);
+			snprintf(daddr, INET6_ADDRSTRLEN, "%pI6", &ipv6_hdr(skb)->daddr);
+		}
+
+		trace_print_udp_tx(skb, saddr, daddr, udp_hdr(skb));
+	}
+
+skip_trace_print_udp_tx:
 	if (trace_print_skb_gso_enabled()) {
 		char saddr[INET6_ADDRSTRLEN], daddr[INET6_ADDRSTRLEN];
 		u16 ip_proto = 0, xport_proto = 0;