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 <subashab@codeaurora.org>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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"
|
||||
|
@@ -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 */
|
||||
/*****************************************************************************/
|
||||
|
@@ -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;
|
||||
|
Viittaa uudesa ongelmassa
Block a user