Patch "net/ipv4: add tracepoint for icmp_send" has been added to the 6.1-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    net/ipv4: add tracepoint for icmp_send

to the 6.1-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-ipv4-add-tracepoint-for-icmp_send.patch
and it can be found in the queue-6.1 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit d4efcf4743e3568a179f36d9fc4c98b970b38ef3
Author: Peilin He <he.peilin@xxxxxxxxxx>
Date:   Tue May 7 15:41:03 2024 +0800

    net/ipv4: add tracepoint for icmp_send
    
    [ Upstream commit db3efdcf70c752e8a8deb16071d8e693c3ef8746 ]
    
    Introduce a tracepoint for icmp_send, which can help users to get more
    detail information conveniently when icmp abnormal events happen.
    
    1. Giving an usecase example:
    =============================
    When an application experiences packet loss due to an unreachable UDP
    destination port, the kernel will send an exception message through the
    icmp_send function. By adding a trace point for icmp_send, developers or
    system administrators can obtain detailed information about the UDP
    packet loss, including the type, code, source address, destination address,
    source port, and destination port. This facilitates the trouble-shooting
    of UDP packet loss issues especially for those network-service
    applications.
    
    2. Operation Instructions:
    ==========================
    Switch to the tracing directory.
            cd /sys/kernel/tracing
    Filter for destination port unreachable.
            echo "type==3 && code==3" > events/icmp/icmp_send/filter
    Enable trace event.
            echo 1 > events/icmp/icmp_send/enable
    
    3. Result View:
    ================
     udp_client_erro-11370   [002] ...s.12   124.728002:
     icmp_send: icmp_send: type=3, code=3.
     From 127.0.0.1:41895 to 127.0.0.1:6666 ulen=23
     skbaddr=00000000589b167a
    
    Signed-off-by: Peilin He <he.peilin@xxxxxxxxxx>
    Signed-off-by: xu xin <xu.xin16@xxxxxxxxxx>
    Reviewed-by: Yunkai Zhang <zhang.yunkai@xxxxxxxxxx>
    Cc: Yang Yang <yang.yang29@xxxxxxxxxx>
    Cc: Liu Chun <liu.chun2@xxxxxxxxxx>
    Cc: Xuexin Jiang <jiang.xuexin@xxxxxxxxxx>
    Reviewed-by: Steven Rostedt (Google) <rostedt@xxxxxxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Stable-dep-of: 27843ce6ba3d ("ipvlan: ensure network headers are in skb linear part")
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/include/trace/events/icmp.h b/include/trace/events/icmp.h
new file mode 100644
index 0000000000000..31559796949a7
--- /dev/null
+++ b/include/trace/events/icmp.h
@@ -0,0 +1,67 @@
+/* SPDX-License-Identifier: GPL-2.0 */
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM icmp
+
+#if !defined(_TRACE_ICMP_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_ICMP_H
+
+#include <linux/icmp.h>
+#include <linux/tracepoint.h>
+
+TRACE_EVENT(icmp_send,
+
+		TP_PROTO(const struct sk_buff *skb, int type, int code),
+
+		TP_ARGS(skb, type, code),
+
+		TP_STRUCT__entry(
+			__field(const void *, skbaddr)
+			__field(int, type)
+			__field(int, code)
+			__array(__u8, saddr, 4)
+			__array(__u8, daddr, 4)
+			__field(__u16, sport)
+			__field(__u16, dport)
+			__field(unsigned short, ulen)
+		),
+
+		TP_fast_assign(
+			struct iphdr *iph = ip_hdr(skb);
+			struct udphdr *uh = udp_hdr(skb);
+			int proto_4 = iph->protocol;
+			__be32 *p32;
+
+			__entry->skbaddr = skb;
+			__entry->type = type;
+			__entry->code = code;
+
+			if (proto_4 != IPPROTO_UDP || (u8 *)uh < skb->head ||
+				(u8 *)uh + sizeof(struct udphdr)
+				> skb_tail_pointer(skb)) {
+				__entry->sport = 0;
+				__entry->dport = 0;
+				__entry->ulen = 0;
+			} else {
+				__entry->sport = ntohs(uh->source);
+				__entry->dport = ntohs(uh->dest);
+				__entry->ulen = ntohs(uh->len);
+			}
+
+			p32 = (__be32 *) __entry->saddr;
+			*p32 = iph->saddr;
+
+			p32 = (__be32 *) __entry->daddr;
+			*p32 = iph->daddr;
+		),
+
+		TP_printk("icmp_send: type=%d, code=%d. From %pI4:%u to %pI4:%u ulen=%d skbaddr=%p",
+			__entry->type, __entry->code,
+			__entry->saddr, __entry->sport, __entry->daddr,
+			__entry->dport, __entry->ulen, __entry->skbaddr)
+);
+
+#endif /* _TRACE_ICMP_H */
+
+/* This part must be outside protection */
+#include <trace/define_trace.h>
+
diff --git a/net/ipv4/icmp.c b/net/ipv4/icmp.c
index a21d32b3ae6c3..b05fa424ad5ce 100644
--- a/net/ipv4/icmp.c
+++ b/net/ipv4/icmp.c
@@ -93,6 +93,8 @@
 #include <net/ip_fib.h>
 #include <net/l3mdev.h>
 #include <net/addrconf.h>
+#define CREATE_TRACE_POINTS
+#include <trace/events/icmp.h>
 
 /*
  *	Build xmit assembly blocks
@@ -778,6 +780,8 @@ void __icmp_send(struct sk_buff *skb_in, int type, int code, __be32 info,
 	if (!fl4.saddr)
 		fl4.saddr = htonl(INADDR_DUMMY);
 
+	trace_icmp_send(skb_in, type, code);
+
 	icmp_push_reply(sk, &icmp_param, &fl4, &ipc, &rt);
 ende:
 	ip_rt_put(rt);




[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux