net: port TP_STORE_ADDR_PORTS_SKB macro to be tcp/udp independent

This patch moves TP_STORE_ADDR_PORTS_SKB() to a common header and removes
the TCP specific implementation details.

Previously the macro assumed the skb passed as an argument is a
TCP packet, the implementation now uses an argument to the L4 header and
uses that to extract the source/destination ports, which happen
to be named the same in "struct tcphdr" and "struct udphdr"

Reviewed-by: Jason Xing <kerneljasonxing@gmail.com>
Signed-off-by: Balazs Scheidler <balazs.scheidler@axoflow.com>
Link: https://lore.kernel.org/r/9e306f78260dfbbdc7353ba5f864cc027a409540.1711475011.git.balazs.scheidler@axoflow.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
Balazs Scheidler 2024-03-26 19:05:46 +01:00 committed by Jakub Kicinski
parent b7b1c59069
commit a0ad11fc26
2 changed files with 42 additions and 43 deletions

View File

@ -70,4 +70,44 @@
TP_STORE_V4MAPPED(__entry, saddr, daddr) TP_STORE_V4MAPPED(__entry, saddr, daddr)
#endif #endif
#define TP_STORE_ADDR_PORTS_SKB_V4(__entry, skb, protoh) \
do { \
struct sockaddr_in *v4 = (void *)__entry->saddr; \
\
v4->sin_family = AF_INET; \
v4->sin_port = protoh->source; \
v4->sin_addr.s_addr = ip_hdr(skb)->saddr; \
v4 = (void *)__entry->daddr; \
v4->sin_family = AF_INET; \
v4->sin_port = protoh->dest; \
v4->sin_addr.s_addr = ip_hdr(skb)->daddr; \
} while (0)
#if IS_ENABLED(CONFIG_IPV6)
#define TP_STORE_ADDR_PORTS_SKB(__entry, skb, protoh) \
do { \
const struct iphdr *iph = ip_hdr(skb); \
\
if (iph->version == 6) { \
struct sockaddr_in6 *v6 = (void *)__entry->saddr; \
\
v6->sin6_family = AF_INET6; \
v6->sin6_port = protoh->source; \
v6->sin6_addr = ipv6_hdr(skb)->saddr; \
v6 = (void *)__entry->daddr; \
v6->sin6_family = AF_INET6; \
v6->sin6_port = protoh->dest; \
v6->sin6_addr = ipv6_hdr(skb)->daddr; \
} else \
TP_STORE_ADDR_PORTS_SKB_V4(__entry, skb, protoh); \
} while (0)
#else
#define TP_STORE_ADDR_PORTS_SKB(__entry, skb, protoh) \
TP_STORE_ADDR_PORTS_SKB_V4(__entry, skb, protoh)
#endif
#endif #endif

View File

@ -273,48 +273,6 @@ TRACE_EVENT(tcp_probe,
__entry->skbaddr, __entry->skaddr) __entry->skbaddr, __entry->skaddr)
); );
#define TP_STORE_ADDR_PORTS_SKB_V4(__entry, skb) \
do { \
const struct tcphdr *th = (const struct tcphdr *)skb->data; \
struct sockaddr_in *v4 = (void *)__entry->saddr; \
\
v4->sin_family = AF_INET; \
v4->sin_port = th->source; \
v4->sin_addr.s_addr = ip_hdr(skb)->saddr; \
v4 = (void *)__entry->daddr; \
v4->sin_family = AF_INET; \
v4->sin_port = th->dest; \
v4->sin_addr.s_addr = ip_hdr(skb)->daddr; \
} while (0)
#if IS_ENABLED(CONFIG_IPV6)
#define TP_STORE_ADDR_PORTS_SKB(__entry, skb) \
do { \
const struct iphdr *iph = ip_hdr(skb); \
\
if (iph->version == 6) { \
const struct tcphdr *th = (const struct tcphdr *)skb->data; \
struct sockaddr_in6 *v6 = (void *)__entry->saddr; \
\
v6->sin6_family = AF_INET6; \
v6->sin6_port = th->source; \
v6->sin6_addr = ipv6_hdr(skb)->saddr; \
v6 = (void *)__entry->daddr; \
v6->sin6_family = AF_INET6; \
v6->sin6_port = th->dest; \
v6->sin6_addr = ipv6_hdr(skb)->daddr; \
} else \
TP_STORE_ADDR_PORTS_SKB_V4(__entry, skb); \
} while (0)
#else
#define TP_STORE_ADDR_PORTS_SKB(__entry, skb) \
TP_STORE_ADDR_PORTS_SKB_V4(__entry, skb)
#endif
/* /*
* tcp event with only skb * tcp event with only skb
*/ */
@ -331,12 +289,13 @@ DECLARE_EVENT_CLASS(tcp_event_skb,
), ),
TP_fast_assign( TP_fast_assign(
const struct tcphdr *th = (const struct tcphdr *)skb->data;
__entry->skbaddr = skb; __entry->skbaddr = skb;
memset(__entry->saddr, 0, sizeof(struct sockaddr_in6)); memset(__entry->saddr, 0, sizeof(struct sockaddr_in6));
memset(__entry->daddr, 0, sizeof(struct sockaddr_in6)); memset(__entry->daddr, 0, sizeof(struct sockaddr_in6));
TP_STORE_ADDR_PORTS_SKB(__entry, skb); TP_STORE_ADDR_PORTS_SKB(__entry, skb, th);
), ),
TP_printk("skbaddr=%p src=%pISpc dest=%pISpc", TP_printk("skbaddr=%p src=%pISpc dest=%pISpc",