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 <kerneljasonx...@gmail.com>
Signed-off-by: Balazs Scheidler <balazs.scheid...@axoflow.com>
---
 include/trace/events/net_probe_common.h | 40 ++++++++++++++++++++++
 include/trace/events/tcp.h              | 45 ++-----------------------
 2 files changed, 42 insertions(+), 43 deletions(-)

diff --git a/include/trace/events/net_probe_common.h 
b/include/trace/events/net_probe_common.h
index b1f9a4d3ee13..5e33f91bdea3 100644
--- a/include/trace/events/net_probe_common.h
+++ b/include/trace/events/net_probe_common.h
@@ -70,4 +70,44 @@
        TP_STORE_V4MAPPED(__entry, saddr, daddr)
 #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
diff --git a/include/trace/events/tcp.h b/include/trace/events/tcp.h
index 3c08a0846c47..1db95175c1e5 100644
--- a/include/trace/events/tcp.h
+++ b/include/trace/events/tcp.h
@@ -273,48 +273,6 @@ TRACE_EVENT(tcp_probe,
                  __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
  */
@@ -331,12 +289,13 @@ DECLARE_EVENT_CLASS(tcp_event_skb,
        ),
 
        TP_fast_assign(
+               const struct tcphdr *th = (const struct tcphdr *)skb->data;
                __entry->skbaddr = skb;
 
                memset(__entry->saddr, 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",
-- 
2.40.1


Reply via email to