From 1da7910c1d7d29b8bf38ba3870ceb05036e1706f Mon Sep 17 00:00:00 2001 From: Bae Soukjin Date: Wed, 19 Aug 2020 08:30:51 +0900 Subject: [PATCH] ANDROID: vendor_hooks: Add vendor hook to the net android_vh_ptype_head: To add a debugging chain to ptype list android_vh_kfree_skb To sniff the dropped packet at kernel network Bug: 163716381 Signed-off-by: Bae Soukjin Change-Id: Ide80bf0a129da31a1824d4a33026ac42be327361 (cherry picked from commit d88b2969cfa78608ad4563e5f4fa84497cc0ffa6) (cherry picked from commit a8021ba684c584b8a4361d1680f6e466748ab012) --- drivers/android/vendor_hooks.c | 3 +++ include/trace/hooks/net.h | 25 +++++++++++++++++++++++++ net/core/dev.c | 7 +++++++ net/core/skbuff.c | 2 ++ net/ipv4/tcp_input.c | 2 ++ 5 files changed, 39 insertions(+) create mode 100644 include/trace/hooks/net.h diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 2cf944fe6c97..05586e74bc43 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -32,6 +32,7 @@ #include #include #include +#include /* * Export tracepoints that act as a bare tracehook (ie: have no trace event @@ -126,3 +127,5 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_send_tm_command); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ufs_check_int_errors); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cgroup_attach); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_iommu_setup_dma_ops); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ptype_head); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_kfree_skb); diff --git a/include/trace/hooks/net.h b/include/trace/hooks/net.h new file mode 100644 index 000000000000..31e0f21373e8 --- /dev/null +++ b/include/trace/hooks/net.h @@ -0,0 +1,25 @@ +/* SPDX-License-Identifier: GPL-2.0 */ + +#undef TRACE_SYSTEM +#define TRACE_SYSTEM net +#define TRACE_INCLUDE_PATH trace/hooks + +#if !defined(_TRACE_HOOK_NET_VH_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HOOK_NET_VH_H +#include +#include + +struct packet_type; +struct list_head; +struct sk_buff; +DECLARE_HOOK(android_vh_ptype_head, + TP_PROTO(const struct packet_type *pt, struct list_head *vendor_pt), + TP_ARGS(pt, vendor_pt)); +DECLARE_HOOK(android_vh_kfree_skb, + TP_PROTO(struct sk_buff *skb), TP_ARGS(skb)); + +/* macro versions of hooks are no longer required */ + +#endif /* _TRACE_HOOK_NET_VH_H */ +/* This part must be outside protection */ +#include diff --git a/net/core/dev.c b/net/core/dev.c index ef8cf7619baf..db17bc32c674 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -148,6 +148,7 @@ #include #include #include +#include #include "net-sysfs.h" @@ -512,6 +513,12 @@ static inline void netdev_set_addr_lockdep_class(struct net_device *dev) static inline struct list_head *ptype_head(const struct packet_type *pt) { + struct list_head vendor_pt = { .next = NULL, }; + + trace_android_vh_ptype_head(pt, &vendor_pt); + if (vendor_pt.next) + return vendor_pt.next; + if (pt->type == htons(ETH_P_ALL)) return pt->dev ? &pt->dev->ptype_all : &ptype_all; else diff --git a/net/core/skbuff.c b/net/core/skbuff.c index bbc3b4b62032..06ced658959e 100644 --- a/net/core/skbuff.c +++ b/net/core/skbuff.c @@ -77,6 +77,7 @@ #include #include #include +#include #include "datagram.h" @@ -754,6 +755,7 @@ void kfree_skb(struct sk_buff *skb) if (!skb_unref(skb)) return; + trace_android_vh_kfree_skb(skb); trace_kfree_skb(skb, __builtin_return_address(0)); __kfree_skb(skb); } diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c index 4cf4dd532d1c..f3bbc2d37c8b 100644 --- a/net/ipv4/tcp_input.c +++ b/net/ipv4/tcp_input.c @@ -80,6 +80,7 @@ #include #include #include +#include int sysctl_tcp_max_orphans __read_mostly = NR_FILE; @@ -4635,6 +4636,7 @@ static bool tcp_ooo_try_coalesce(struct sock *sk, static void tcp_drop(struct sock *sk, struct sk_buff *skb) { + trace_android_vh_kfree_skb(skb); sk_drops_add(sk, skb); __kfree_skb(skb); }