mirror of
https://github.com/Fishwaldo/Star64_linux.git
synced 2025-06-22 06:32:08 +00:00
perf trace augmented_syscalls: Augment connect's 'sockaddr' arg
As the first example of augmenting something other than a 'filename', augment the 'struct sockaddr' argument for the 'connect' syscall: # perf trace -e tools/perf/examples/bpf/augmented_syscalls.c ssh -6 fedorapeople.org 0.000 ssh/29669 connect(fd: 3, uservaddr: { .family: LOCAL, path: /var/run/nscd/socket }, addrlen: 110) 0.042 ssh/29669 connect(fd: 3, uservaddr: { .family: LOCAL, path: /var/run/nscd/socket }, addrlen: 110) 1.329 ssh/29669 connect(fd: 3, uservaddr: { .family: LOCAL, path: /var/run/nscd/socket }, addrlen: 110) 1.362 ssh/29669 connect(fd: 3, uservaddr: { .family: LOCAL, path: /var/run/nscd/socket }, addrlen: 110) 1.458 ssh/29669 connect(fd: 3, uservaddr: { .family: LOCAL, path: /var/run/nscd/socket }, addrlen: 110) 1.478 ssh/29669 connect(fd: 3, uservaddr: { .family: LOCAL, path: /var/run/nscd/socket }, addrlen: 110) 1.683 ssh/29669 connect(fd: 3<socket:[125942]>, uservaddr: { .family: INET, port: 53, addr: 192.168.43.1 }, addrlen: 16) 4.710 ssh/29669 connect(fd: 3<socket:[125942]>, uservaddr: { .family: INET6, port: 22, addr: 2610:28:3090:3001:5054:ff:fea7:9474 }, addrlen: 28) root@fedorapeople.org: Permission denied (publickey). # This is still just augmenting the syscalls:sys_enter_connect part, later we'll wire this up to augment the enter+exit combo, like in the tradicional 'perf trace' and 'strace' outputs. Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Wang Nan <wangnan0@huawei.com> Link: https://lkml.kernel.org/n/tip-s7l541cbiqb22ifio6z7dpf6@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
403f833d15
commit
d5a7e6613b
5 changed files with 99 additions and 11 deletions
|
@ -19,6 +19,7 @@
|
|||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <linux/socket.h>
|
||||
|
||||
struct bpf_map SEC("maps") __augmented_syscalls__ = {
|
||||
.type = BPF_MAP_TYPE_PERF_EVENT_ARRAY,
|
||||
|
@ -33,7 +34,7 @@ struct augmented_filename {
|
|||
char value[256];
|
||||
};
|
||||
|
||||
#define augmented_filename_syscall_enter(syscall) \
|
||||
#define augmented_filename_syscall_enter(syscall) \
|
||||
struct augmented_enter_##syscall##_args { \
|
||||
struct syscall_enter_##syscall##_args args; \
|
||||
struct augmented_filename filename; \
|
||||
|
@ -94,4 +95,35 @@ struct syscall_enter_newstat_args {
|
|||
|
||||
augmented_filename_syscall_enter(newstat);
|
||||
|
||||
struct sockaddr;
|
||||
|
||||
struct syscall_enter_connect_args {
|
||||
unsigned long long common_tp_fields;
|
||||
long syscall_nr;
|
||||
long fd;
|
||||
struct sockaddr *addr_ptr;
|
||||
unsigned long addrlen;
|
||||
};
|
||||
|
||||
struct augmented_enter_connect_args {
|
||||
struct syscall_enter_connect_args args;
|
||||
struct sockaddr_storage addr;
|
||||
};
|
||||
|
||||
int syscall_enter(connect)(struct syscall_enter_connect_args *args)
|
||||
{
|
||||
struct augmented_enter_connect_args augmented_args;
|
||||
unsigned long addrlen = sizeof(augmented_args.addr);
|
||||
|
||||
probe_read(&augmented_args.args, sizeof(augmented_args.args), args);
|
||||
#ifdef FIXME_CLANG_OPTIMIZATION_THAT_ACCESSES_USER_CONTROLLED_ADDRLEN_DESPITE_THIS_CHECK
|
||||
if (addrlen > augmented_args.args.addrlen)
|
||||
addrlen = augmented_args.args.addrlen;
|
||||
#endif
|
||||
probe_read(&augmented_args.addr, addrlen, args->addr_ptr);
|
||||
perf_event_output(args, &__augmented_syscalls__, BPF_F_CURRENT_CPU, &augmented_args,
|
||||
sizeof(augmented_args) - sizeof(augmented_args.addr) + addrlen);
|
||||
return 0;
|
||||
}
|
||||
|
||||
license(GPL);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue