forked from luck/tmp_suning_uos_patched
perf augmented_raw_syscalls: Augment sockaddr arg in 'connect'
We already had a beautifier for an augmented sockaddr payload, but that was when we were hooking on each syscalls:sys_enter_foo tracepoints, since now we're almost doing that by doing a tail call from raw_syscalls:sys_enter, its almost the same, we can reuse it straight away. # perf trace -e connec* ssh www.bla.com connect(3</var/lib/sss/mc/passwd>, { .family: PF_LOCAL, path: /var/run/nscd/socket }, 0x6e) = -1 ENOENT (No such file or directory) connect(3</var/lib/sss/mc/passwd>, { .family: PF_LOCAL, path: /var/run/nscd/socket }, 0x6e) = -1 ENOENT (No such file or directory) connect(4<socket:[16604782]>, { .family: PF_LOCAL, path: /var/lib/sss/pipes/nss }, 0x6e) = 0 connect(7, { .family: PF_LOCAL, path: /var/run/nscd/socket }, 0x6e) = -1 ENOENT (No such file or directory) connect(7, { .family: PF_LOCAL, path: /var/run/nscd/socket }, 0x6e) = -1 ENOENT (No such file or directory) connect(5</etc/hosts>, { .family: PF_LOCAL, path: /var/run/nscd/socket }, 0x6e) = -1 ENOENT (No such file or directory) connect(5</etc/hosts>, { .family: PF_LOCAL, path: /var/run/nscd/socket }, 0x6e) = -1 ENOENT (No such file or directory) connect(5</etc/hosts>, { .family: PF_INET, port: 53, addr: 192.168.44.1 }, 0x10) = 0 connect(5</etc/hosts>, { .family: PF_INET, port: 22, addr: 146.112.61.108 }, 0x10) = 0 connect(5</etc/hosts>, { .family: PF_INET6, port: 22, addr: ::ffff:146.112.61.108 }, 0x1c) = 0 ^C# Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: Jiri Olsa <jolsa@kernel.org> Cc: Luis Cláudio Gonçalves <lclaudio@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Link: https://lkml.kernel.org/n/tip-5xkrbcpjsgnr3zt1aqdd7nvc@git.kernel.org Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
6f56367493
commit
212b9ab677
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <linux/limits.h>
|
#include <linux/limits.h>
|
||||||
|
#include <linux/socket.h>
|
||||||
#include <pid_filter.h>
|
#include <pid_filter.h>
|
||||||
|
|
||||||
/* bpf-output associated map */
|
/* bpf-output associated map */
|
||||||
|
@ -69,9 +70,12 @@ pid_filter(pids_filtered);
|
||||||
|
|
||||||
struct augmented_args_payload {
|
struct augmented_args_payload {
|
||||||
struct syscall_enter_args args;
|
struct syscall_enter_args args;
|
||||||
|
union {
|
||||||
struct {
|
struct {
|
||||||
struct augmented_filename filename;
|
struct augmented_filename filename,
|
||||||
struct augmented_filename filename2;
|
filename2;
|
||||||
|
};
|
||||||
|
struct sockaddr_storage saddr;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -112,11 +116,32 @@ int syscall_unaugmented(struct syscall_enter_args *args)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This will be tail_called from SEC("raw_syscalls:sys_enter"), so will find in
|
* These will be tail_called from SEC("raw_syscalls:sys_enter"), so will find in
|
||||||
* augmented_args_tmp what was read by that raw_syscalls:sys_enter and go
|
* augmented_args_tmp what was read by that raw_syscalls:sys_enter and go
|
||||||
* on from there, reading the first syscall arg as a string, i.e. open's
|
* on from there, reading the first syscall arg as a string, i.e. open's
|
||||||
* filename.
|
* filename.
|
||||||
*/
|
*/
|
||||||
|
SEC("!syscalls:sys_enter_connect")
|
||||||
|
int sys_enter_connect(struct syscall_enter_args *args)
|
||||||
|
{
|
||||||
|
int key = 0;
|
||||||
|
struct augmented_args_payload *augmented_args = bpf_map_lookup_elem(&augmented_args_tmp, &key);
|
||||||
|
const void *sockaddr_arg = (const void *)args->args[1];
|
||||||
|
unsigned int socklen = args->args[2];
|
||||||
|
unsigned int len = sizeof(augmented_args->args);
|
||||||
|
|
||||||
|
if (augmented_args == NULL)
|
||||||
|
return 1; /* Failure: don't filter */
|
||||||
|
|
||||||
|
if (socklen > sizeof(augmented_args->saddr))
|
||||||
|
socklen = sizeof(augmented_args->saddr);
|
||||||
|
|
||||||
|
probe_read(&augmented_args->saddr, socklen, sockaddr_arg);
|
||||||
|
|
||||||
|
/* If perf_event_output fails, return non-zero so that it gets recorded unaugmented */
|
||||||
|
return perf_event_output(args, &__augmented_syscalls__, BPF_F_CURRENT_CPU, augmented_args, len + socklen);
|
||||||
|
}
|
||||||
|
|
||||||
SEC("!syscalls:sys_enter_open")
|
SEC("!syscalls:sys_enter_open")
|
||||||
int sys_enter_open(struct syscall_enter_args *args)
|
int sys_enter_open(struct syscall_enter_args *args)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue
Block a user