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:
Subash Abhinov Kasiviswanathan
2021-07-29 00:37:11 -07:00
vanhempi bc43c8213e
commit dd380cbece
4 muutettua tiedostoa jossa 224 lisäystä ja 0 poistoa

Näytä tiedosto

@@ -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;
}

Näytä tiedosto

@@ -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"

Näytä tiedosto

@@ -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 */
/*****************************************************************************/

Näytä tiedosto

@@ -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;