Messages in this thread Patch in this message | | | From | menglong8.dong@gmail ... | Subject | [PATCH net-next 2/2] net: snmp: add snmp tracepoint support for udp | Date | Thu, 11 Nov 2021 21:35:30 +0800 |
| |
From: Menglong Dong <imagedong@tencent.com>
Add snmp tracepoint support for udp. Here is the new tracepoint: /sys/kernel/debug/tracing/events/snmp/snmp_udp/
Signed-off-by: Menglong Dong <imagedong@tencent.com> --- include/net/udp.h | 25 +++++++++++++++++++------ include/trace/events/snmp.h | 5 +++++ net/core/net-traces.c | 2 ++ net/ipv4/udp.c | 28 +++++++++++++++++----------- 4 files changed, 43 insertions(+), 17 deletions(-)
diff --git a/include/net/udp.h b/include/net/udp.h index 909ecf447e0f..bf39793f2052 100644 --- a/include/net/udp.h +++ b/include/net/udp.h @@ -28,6 +28,7 @@ #include <linux/seq_file.h> #include <linux/poll.h> #include <linux/indirect_call_wrapper.h> +#include <trace/events/snmp.h> /** * struct udp_skb_cb - UDP(-Lite) private variables @@ -408,12 +409,24 @@ static inline int copy_linear_skb(struct sk_buff *skb, int len, int off, /* * SNMP statistics for UDP and UDP-Lite */ -#define UDP_INC_STATS(net, field, is_udplite) do { \ - if (is_udplite) SNMP_INC_STATS((net)->mib.udplite_statistics, field); \ - else SNMP_INC_STATS((net)->mib.udp_statistics, field); } while(0) -#define __UDP_INC_STATS(net, field, is_udplite) do { \ - if (is_udplite) __SNMP_INC_STATS((net)->mib.udplite_statistics, field); \ - else __SNMP_INC_STATS((net)->mib.udp_statistics, field); } while(0) +#define UDP_INC_STATS(net, field, is_udplite) do { \ + if (is_udplite) { \ + SNMP_INC_STATS((net)->mib.udplite_statistics, field); \ + TRACE_SNMP(skb, udp, field, 1); \ + } else { \ + SNMP_INC_STATS((net)->mib.udp_statistics, field); \ + TRACE_SNMP(skb, udplite, field, 1); \ + } \ +} while (0) +#define __UDP_INC_STATS(net, skb, field, is_udplite) do { \ + if (is_udplite) { \ + __SNMP_INC_STATS((net)->mib.udplite_statistics, field); \ + TRACE_SNMP(skb, udp, field, 1); \ + } else { \ + __SNMP_INC_STATS((net)->mib.udp_statistics, field); \ + TRACE_SNMP(skb, udplite, field, 1); \ + } \ +} while (0) #define __UDP6_INC_STATS(net, field, is_udplite) do { \ if (is_udplite) __SNMP_INC_STATS((net)->mib.udplite_stats_in6, field);\ diff --git a/include/trace/events/snmp.h b/include/trace/events/snmp.h index 9dbd630306dd..799a8b66b438 100644 --- a/include/trace/events/snmp.h +++ b/include/trace/events/snmp.h @@ -37,6 +37,11 @@ DEFINE_EVENT(snmp_template, snmp_##proto, \ TP_ARGS(skb, field, val) \ ) + + +DEFINE_SNMP_EVENT(udp); +DEFINE_SNMP_EVENT(udplite); + #define TRACE_SNMP(skb, proto, field, val) \ trace_snmp_##proto(skb, field, val) diff --git a/net/core/net-traces.c b/net/core/net-traces.c index 15ff40b83ca7..c33a86bb2db3 100644 --- a/net/core/net-traces.c +++ b/net/core/net-traces.c @@ -62,3 +62,5 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(napi_poll); EXPORT_TRACEPOINT_SYMBOL_GPL(tcp_send_reset); EXPORT_TRACEPOINT_SYMBOL_GPL(tcp_bad_csum); + +EXPORT_TRACEPOINT_SYMBOL_GPL(snmp_udp); diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c index 319dd7bbfe33..d5116971892f 100644 --- a/net/ipv4/udp.c +++ b/net/ipv4/udp.c @@ -1648,9 +1648,11 @@ static struct sk_buff *__first_packet_length(struct sock *sk, while ((skb = skb_peek(rcvq)) != NULL) { if (udp_lib_checksum_complete(skb)) { - __UDP_INC_STATS(sock_net(sk), UDP_MIB_CSUMERRORS, + __UDP_INC_STATS(sock_net(sk), skb, + UDP_MIB_CSUMERRORS, IS_UDPLITE(sk)); - __UDP_INC_STATS(sock_net(sk), UDP_MIB_INERRORS, + __UDP_INC_STATS(sock_net(sk), skb, + UDP_MIB_INERRORS, IS_UDPLITE(sk)); atomic_inc(&sk->sk_drops); __skb_unlink(skb, rcvq); @@ -2143,7 +2145,7 @@ static int udp_queue_rcv_one_skb(struct sock *sk, struct sk_buff *skb) ret = encap_rcv(sk, skb); if (ret <= 0) { - __UDP_INC_STATS(sock_net(sk), + __UDP_INC_STATS(sock_net(sk), skb, UDP_MIB_INDATAGRAMS, is_udplite); return -ret; @@ -2201,9 +2203,10 @@ static int udp_queue_rcv_one_skb(struct sock *sk, struct sk_buff *skb) return __udp_queue_rcv_skb(sk, skb); csum_error: - __UDP_INC_STATS(sock_net(sk), UDP_MIB_CSUMERRORS, is_udplite); + __UDP_INC_STATS(sock_net(sk), skb, UDP_MIB_CSUMERRORS, + is_udplite); drop: - __UDP_INC_STATS(sock_net(sk), UDP_MIB_INERRORS, is_udplite); + __UDP_INC_STATS(sock_net(sk), skb, UDP_MIB_INERRORS, is_udplite); atomic_inc(&sk->sk_drops); kfree_skb(skb); return -1; @@ -2290,9 +2293,9 @@ static int __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb, if (unlikely(!nskb)) { atomic_inc(&sk->sk_drops); - __UDP_INC_STATS(net, UDP_MIB_RCVBUFERRORS, + __UDP_INC_STATS(net, skb, UDP_MIB_RCVBUFERRORS, IS_UDPLITE(sk)); - __UDP_INC_STATS(net, UDP_MIB_INERRORS, + __UDP_INC_STATS(net, skb, UDP_MIB_INERRORS, IS_UDPLITE(sk)); continue; } @@ -2311,7 +2314,7 @@ static int __udp4_lib_mcast_deliver(struct net *net, struct sk_buff *skb, consume_skb(skb); } else { kfree_skb(skb); - __UDP_INC_STATS(net, UDP_MIB_IGNOREDMULTI, + __UDP_INC_STATS(net, skb, UDP_MIB_IGNOREDMULTI, proto == IPPROTO_UDPLITE); } return 0; @@ -2454,7 +2457,8 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, if (udp_lib_checksum_complete(skb)) goto csum_error; - __UDP_INC_STATS(net, UDP_MIB_NOPORTS, proto == IPPROTO_UDPLITE); + __UDP_INC_STATS(net, skb, UDP_MIB_NOPORTS, + proto == IPPROTO_UDPLITE); icmp_send(skb, ICMP_DEST_UNREACH, ICMP_PORT_UNREACH, 0); /* @@ -2481,9 +2485,11 @@ int __udp4_lib_rcv(struct sk_buff *skb, struct udp_table *udptable, proto == IPPROTO_UDPLITE ? "Lite" : "", &saddr, ntohs(uh->source), &daddr, ntohs(uh->dest), ulen); - __UDP_INC_STATS(net, UDP_MIB_CSUMERRORS, proto == IPPROTO_UDPLITE); + __UDP_INC_STATS(net, skb, UDP_MIB_CSUMERRORS, + proto == IPPROTO_UDPLITE); drop: - __UDP_INC_STATS(net, UDP_MIB_INERRORS, proto == IPPROTO_UDPLITE); + __UDP_INC_STATS(net, skb, UDP_MIB_INERRORS, + proto == IPPROTO_UDPLITE); kfree_skb(skb); return 0; } -- 2.27.0
| |