]>
Commit | Line | Data |
---|---|---|
6e1051a5 KKD |
1 | // SPDX-License-Identifier: GPL-2.0 |
2 | /* Copyright(c) 2017 Jesper Dangaard Brouer, Red Hat, Inc. */ | |
3ffab546 | 3 | static const char *__doc__= |
6e1051a5 | 4 | "XDP monitor tool, based on tracepoints\n"; |
3ffab546 JDB |
5 | |
6 | static const char *__doc_err_only__= | |
6e1051a5 KKD |
7 | " NOTICE: Only tracking XDP redirect errors\n" |
8 | " Enable redirect success stats via '-s/--stats'\n" | |
9 | " (which comes with a per packet processing overhead)\n"; | |
3ffab546 JDB |
10 | |
11 | #include <errno.h> | |
12 | #include <stdio.h> | |
13 | #include <stdlib.h> | |
14 | #include <stdbool.h> | |
15 | #include <stdint.h> | |
16 | #include <string.h> | |
17 | #include <ctype.h> | |
18 | #include <unistd.h> | |
19 | #include <locale.h> | |
c4eb7f46 | 20 | #include <sys/resource.h> |
3ffab546 JDB |
21 | #include <getopt.h> |
22 | #include <net/if.h> | |
23 | #include <time.h> | |
8ac91df6 | 24 | #include <signal.h> |
2bf3e2ef | 25 | #include <bpf/bpf.h> |
8ac91df6 | 26 | #include <bpf/libbpf.h> |
3ffab546 | 27 | #include "bpf_util.h" |
6e1051a5 KKD |
28 | #include "xdp_sample_user.h" |
29 | #include "xdp_monitor.skel.h" | |
3ffab546 | 30 | |
6e1051a5 KKD |
31 | static int mask = SAMPLE_REDIRECT_ERR_CNT | SAMPLE_CPUMAP_ENQUEUE_CNT | |
32 | SAMPLE_CPUMAP_KTHREAD_CNT | SAMPLE_EXCEPTION_CNT | | |
33 | SAMPLE_DEVMAP_XMIT_CNT | SAMPLE_DEVMAP_XMIT_CNT_MULTI; | |
8ac91df6 | 34 | |
6e1051a5 | 35 | DEFINE_SAMPLE_INIT(xdp_monitor); |
3ffab546 JDB |
36 | |
37 | static const struct option long_options[] = { | |
6e1051a5 KKD |
38 | { "help", no_argument, NULL, 'h' }, |
39 | { "stats", no_argument, NULL, 's' }, | |
40 | { "interval", required_argument, NULL, 'i' }, | |
41 | { "verbose", no_argument, NULL, 'v' }, | |
42 | {} | |
417f1d9f | 43 | }; |
3ffab546 JDB |
44 | |
45 | int main(int argc, char **argv) | |
46 | { | |
6e1051a5 KKD |
47 | unsigned long interval = 2; |
48 | int ret = EXIT_FAIL_OPTION; | |
49 | struct xdp_monitor *skel; | |
3ffab546 | 50 | bool errors_only = true; |
6e1051a5 KKD |
51 | int longindex = 0, opt; |
52 | bool error = true; | |
3ffab546 | 53 | |
3ffab546 | 54 | /* Parse commands line args */ |
6e1051a5 | 55 | while ((opt = getopt_long(argc, argv, "si:vh", |
3ffab546 JDB |
56 | long_options, &longindex)) != -1) { |
57 | switch (opt) { | |
6e1051a5 | 58 | case 's': |
3ffab546 | 59 | errors_only = false; |
6e1051a5 | 60 | mask |= SAMPLE_REDIRECT_CNT; |
3ffab546 | 61 | break; |
6e1051a5 KKD |
62 | case 'i': |
63 | interval = strtoul(optarg, NULL, 0); | |
64 | break; | |
65 | case 'v': | |
66 | sample_switch_mode(); | |
3ffab546 JDB |
67 | break; |
68 | case 'h': | |
6e1051a5 | 69 | error = false; |
3ffab546 | 70 | default: |
6e1051a5 | 71 | sample_usage(argv, long_options, __doc__, mask, error); |
8ac91df6 | 72 | return ret; |
3ffab546 JDB |
73 | } |
74 | } | |
75 | ||
6e1051a5 KKD |
76 | skel = xdp_monitor__open(); |
77 | if (!skel) { | |
78 | fprintf(stderr, "Failed to xdp_monitor__open: %s\n", | |
79 | strerror(errno)); | |
80 | ret = EXIT_FAIL_BPF; | |
81 | goto end; | |
8ac91df6 DL |
82 | } |
83 | ||
6e1051a5 KKD |
84 | ret = sample_init_pre_load(skel); |
85 | if (ret < 0) { | |
86 | fprintf(stderr, "Failed to sample_init_pre_load: %s\n", strerror(-ret)); | |
87 | ret = EXIT_FAIL_BPF; | |
88 | goto end_destroy; | |
3ffab546 | 89 | } |
8ac91df6 | 90 | |
6e1051a5 KKD |
91 | ret = xdp_monitor__load(skel); |
92 | if (ret < 0) { | |
93 | fprintf(stderr, "Failed to xdp_monitor__load: %s\n", strerror(errno)); | |
94 | ret = EXIT_FAIL_BPF; | |
95 | goto end_destroy; | |
3ffab546 JDB |
96 | } |
97 | ||
6e1051a5 KKD |
98 | ret = sample_init(skel, mask); |
99 | if (ret < 0) { | |
100 | fprintf(stderr, "Failed to initialize sample: %s\n", strerror(-ret)); | |
101 | ret = EXIT_FAIL_BPF; | |
102 | goto end_destroy; | |
3ffab546 JDB |
103 | } |
104 | ||
6e1051a5 KKD |
105 | if (errors_only) |
106 | printf("%s", __doc_err_only__); | |
8ac91df6 | 107 | |
6e1051a5 KKD |
108 | ret = sample_run(interval, NULL, NULL); |
109 | if (ret < 0) { | |
110 | fprintf(stderr, "Failed during sample run: %s\n", strerror(-ret)); | |
111 | ret = EXIT_FAIL; | |
112 | goto end_destroy; | |
3ffab546 | 113 | } |
6e1051a5 KKD |
114 | ret = EXIT_OK; |
115 | end_destroy: | |
116 | xdp_monitor__destroy(skel); | |
117 | end: | |
118 | sample_exit(ret); | |
3ffab546 | 119 | } |