| From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 |
| From: Bae Soukjin <soukjin.bae@samsung.com> |
| Date: Wed, 19 Aug 2020 08:30:51 +0900 |
| Subject: NOUPSTREAM: 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 |
| |
| [CPNOTE: 04/08/21] Lee: Vendor hooks |
| |
| Bug: 163716381 |
| |
| Signed-off-by: Bae Soukjin <soukjin.bae@samsung.com> |
| 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 |
| --- a/drivers/android/vendor_hooks.c |
| +++ b/drivers/android/vendor_hooks.c |
| @@ -31,6 +31,7 @@ |
| #include <trace/hooks/cgroup.h> |
| #include <trace/hooks/sys.h> |
| #include <trace/hooks/iommu.h> |
| +#include <trace/hooks/net.h> |
| |
| /* |
| * Export tracepoints that act as a bare tracehook (ie: have no trace event |
| @@ -133,6 +134,8 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_cgroup_set_task); |
| EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_syscall_prctl_finished); |
| 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); |
| EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_check_preempt_tick); |
| EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_check_preempt_wakeup_ignore); |
| EXPORT_TRACEPOINT_SYMBOL_GPL(android_rvh_replace_next_task_fair); |
| diff --git a/include/trace/hooks/net.h b/include/trace/hooks/net.h |
| new file mode 100644 |
| --- /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 <linux/tracepoint.h> |
| +#include <trace/hooks/vendor_hooks.h> |
| + |
| +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 <trace/define_trace.h> |
| diff --git a/net/core/dev.c b/net/core/dev.c |
| --- a/net/core/dev.c |
| +++ b/net/core/dev.c |
| @@ -150,6 +150,7 @@ |
| #include <linux/pm_runtime.h> |
| #include <linux/prandom.h> |
| #include <linux/once_lite.h> |
| +#include <trace/hooks/net.h> |
| |
| #include "net-sysfs.h" |
| |
| @@ -514,6 +515,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 |
| --- a/net/core/skbuff.c |
| +++ b/net/core/skbuff.c |
| @@ -78,6 +78,7 @@ |
| #include <linux/capability.h> |
| #include <linux/user_namespace.h> |
| #include <linux/indirect_call_wrapper.h> |
| +#include <trace/hooks/net.h> |
| |
| #include "datagram.h" |
| |
| @@ -769,6 +770,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 |
| --- a/net/ipv4/tcp_input.c |
| +++ b/net/ipv4/tcp_input.c |
| @@ -80,6 +80,7 @@ |
| #include <linux/jump_label_ratelimit.h> |
| #include <net/busy_poll.h> |
| #include <net/mptcp.h> |
| +#include <trace/hooks/net.h> |
| |
| int sysctl_tcp_max_orphans __read_mostly = NR_FILE; |
| |
| @@ -4677,6 +4678,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); |
| } |