From ccb0be5362c8c8b5345e11c44cc4d19ce145a4d1 Mon Sep 17 00:00:00 2001 From: wenzhiwei11 Date: Sun, 25 Jun 2023 14:52:37 +0800 Subject: [PATCH] Organize user layer output data --- observation/src/tcplife/tcplife.c | 84 +++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) diff --git a/observation/src/tcplife/tcplife.c b/observation/src/tcplife/tcplife.c index 185866ee..9ece89d0 100644 --- a/observation/src/tcplife/tcplife.c +++ b/observation/src/tcplife/tcplife.c @@ -169,3 +169,87 @@ static int print_events(struct bpf_buffer *buf) return err; } +int main(int argc, char *argv[]) +{ + LIBBPF_OPTS(bpf_object_open_opts, open_opts); + static const struct argp argp = { + .options = opts, + .parser = parse_arg, + .doc = argp_program_doc, + }; + struct tcplife_bpf *obj; + struct bpf_buffer *buf = NULL; + int err; + + err = argp_parse(&argp, argc, argv, 0, NULL, NULL); + if (err) + return err; + + if (!bpf_is_root()) + return 1; + + libbpf_set_print(libbpf_print_fn); + + err = ensure_core_btf(&open_opts); + if (err) { + warning("Failed to fetch necessary BTF for CO-RE: %s\n", strerror(-err)); + return 1; + } + + obj = tcplife_bpf__open_opts(&open_opts); + if (!obj) { + warning("Failed to open BPF object\n"); + err = 1; + goto cleanup; + } + + obj->rodata->target_pid = env.target_pid; + obj->rodata->target_family = env.target_family; + obj->rodata->filter_sport = env.filter_sport; + obj->rodata->filter_dport = env.filter_dport; + + for (int i = 0; i < MAX_PORTS; i++) { + obj->rodata->target_dports[i] = env.target_dports[i]; + obj->rodata->target_sports[i] = env.target_sports[i]; + } + + buf = bpf_buffer__new(obj->maps.events, obj->maps.heap); + if (!buf) { + err = -errno; + warning("Failed to create ring/perf buffer: %d\n", err); + goto cleanup; + } + + if (probe_tp_btf("inet_sock_set_state")) + bpf_program__set_autoload(obj->progs.inet_sock_set_state_raw, false); + else + bpf_program__set_autoload(obj->progs.inet_sock_set_state, false); + + err = tcplife_bpf__load(obj); + if (err) { + warning("Failed to load BPF object: %d\n", err); + goto cleanup; + } + + err = tcplife_bpf__attach(obj); + if (err) { + warning("Failed to attach BPF programs: %d\n", err); + goto cleanup; + } + + if (signal(SIGINT, sig_handler) == SIG_ERR) { + warning("Can't set signal handler: %s\n", strerror(errno)); + err = 1; + goto cleanup; + } + + err = print_events(buf); + +cleanup: + bpf_buffer__free(buf); + tcplife_bpf__destroy(obj); + cleanup_core_btf(&open_opts); + + return err != 0; +} + -- Gitee