From af4d81ef0c2fb4657a4fbf8d01ee351a00e99f33 Mon Sep 17 00:00:00 2001 From: wenzhiwei11 Date: Sun, 25 Jun 2023 14:22:01 +0800 Subject: [PATCH] Add output format for tcplife.c --- observation/src/tcplife/tcplife.c | 87 +++++++++++++++++++++++++++++++ 1 file changed, 87 insertions(+) diff --git a/observation/src/tcplife/tcplife.c b/observation/src/tcplife/tcplife.c index 25b364c8..a3ea9936 100644 --- a/observation/src/tcplife/tcplife.c +++ b/observation/src/tcplife/tcplife.c @@ -48,3 +48,90 @@ static const struct argp_option opts[] = { {} }; +static error_t parse_arg(int key, char *arg, struct argp_state *state) +{ + switch (key) { + case 'p': + env.target_pid = argp_parse_pid(key, arg, state); + break; + case '4': + env.target_family = AF_INET; + break; + case '6': + env.target_family = AF_INET6; + break; + case 'w': + env.column_width = 26; + break; + case 'L': + case 'R': + { + char *port = strtok(arg, ","); + + for (int i = 0; i < MAX_PORTS && port; i++) { + if (key == 'L') + env.target_sports[i] = safe_strtol(port, 1, 65535, state); + else + env.target_dports[i] = safe_strtol(port, 1, 63355, state); + port = strtok(NULL, ","); + } + break; + } + case 'T': + env.emit_timestamp = true; + break; + case 'v': + env.verbose = true; + break; + case 'h': + argp_state_help(state, stderr, ARGP_HELP_STD_HELP); + break; + case ARGP_KEY_END: + if (env.target_sports[0] != 0) + env.filter_sport = true; + if (env.target_dports[0] != 0) + env.filter_dport = true; + default: + return ARGP_ERR_UNKNOWN; + } + + return 0; +} + +static int libbpf_print_fn(enum libbpf_print_level level, const char *format, + va_list args) +{ + if (level == LIBBPF_DEBUG && !env.verbose) + return 0; + return vfprintf(stderr, format, args); +} + +static int print_events(struct bpf_buffer *buf) +{ + int err; + + err = bpf_buffer__open(buf, handle_event, handle_lost_events, NULL); + if (err) { + warning("Failed to open ring/perf buffer\n"); + return err; + } + + if (env.emit_timestamp) + printf("%-8s ", "TIME(s)"); + printf("%-7s %-16s %-*s %-5s %-*s %-5s %-6s %-6s %-s\n", + "PID", "COMM", env.column_width, "LADDR", "LPORT", + env.column_width, "RADDR", "RPORT", "TX_KB", "RX_KB", "MS"); + + while (!exiting) { + err = bpf_buffer__poll(buf, POLL_TIMEOUT_MS); + if (err < 0 && err != -EINTR) { + warning("Error polling ring/perf buffer: %s\n", strerror(-err)); + break; + } + /* reset err to return 0 if exiting */ + err = 0; + } + + return err; +} + -- Gitee