diff --git a/drivers/android/vendor_hooks.c b/drivers/android/vendor_hooks.c index 07eb8efd7c40..4bea5f851083 100644 --- a/drivers/android/vendor_hooks.c +++ b/drivers/android/vendor_hooks.c @@ -68,6 +68,7 @@ #include #include #include +#include /* * Export tracepoints that act as a bare tracehook (ie: have no trace event @@ -353,3 +354,4 @@ EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_check_file_open); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_check_bpf_syscall); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_usb_dev_suspend); EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_usb_dev_resume); +EXPORT_TRACEPOINT_SYMBOL_GPL(android_vh_ipv6_gen_linklocal_addr); diff --git a/include/trace/hooks/ipv6.h b/include/trace/hooks/ipv6.h new file mode 100644 index 000000000000..c1998af0c5a0 --- /dev/null +++ b/include/trace/hooks/ipv6.h @@ -0,0 +1,22 @@ +/* SPDX-License-Identifier: GPL-2.0 */ +#undef TRACE_SYSTEM +#define TRACE_SYSTEM ipv6 +#define TRACE_INCLUDE_PATH trace/hooks + +#if !defined(_TRACE_HOOK_IPV6_H) || defined(TRACE_HEADER_MULTI_READ) +#define _TRACE_HOOK_IPV6_H +#include +#include +/* + * Following tracepoints are not exported in tracefs and provide a + * mechanism for vendor modules to hook and extend functionality + */ +DECLARE_HOOK(android_vh_ipv6_gen_linklocal_addr, + TP_PROTO(struct net_device *dev, bool *ret), + TP_ARGS(dev, ret)); + +/* macro versions of hooks are no longer required */ + +#endif /* _TRACE_HOOK_IPV6_H */ +/* This part must be outside protection */ +#include diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index d6e7a77ca123..812b79192b7e 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -90,6 +90,8 @@ #include #include +#include + #define INFINITY_LIFE_TIME 0xFFFFFFFF #define IPV6_MAX_STRLEN \ @@ -3344,6 +3346,7 @@ static void addrconf_addr_gen(struct inet6_dev *idev, bool prefix_route) static void addrconf_dev_config(struct net_device *dev) { struct inet6_dev *idev; + bool ret = false; ASSERT_RTNL(); @@ -3371,6 +3374,10 @@ static void addrconf_dev_config(struct net_device *dev) if (IS_ERR(idev)) return; + trace_android_vh_ipv6_gen_linklocal_addr(dev, &ret); + if (ret) + return; + /* this device type has no EUI support */ if (dev->type == ARPHRD_NONE && idev->cnf.addr_gen_mode == IN6_ADDR_GEN_MODE_EUI64)