Blame view
samples/bpf/xdp1_user.c
3.41 KB
25763b3c8 treewide: Replace... |
1 |
// SPDX-License-Identifier: GPL-2.0-only |
86af8b419 Add sample for ad... |
2 |
/* Copyright (c) 2016 PLUMgrid |
86af8b419 Add sample for ad... |
3 4 |
*/ #include <linux/bpf.h> |
3993f2cb9 samples/bpf: Add ... |
5 |
#include <linux/if_link.h> |
86af8b419 Add sample for ad... |
6 7 8 9 10 11 |
#include <assert.h> #include <errno.h> #include <signal.h> #include <stdio.h> #include <stdlib.h> #include <string.h> |
86af8b419 Add sample for ad... |
12 |
#include <unistd.h> |
3993f2cb9 samples/bpf: Add ... |
13 |
#include <libgen.h> |
6dfca831c samples/bpf: adju... |
14 |
#include <sys/resource.h> |
dc378a1ab samples: bpf: get... |
15 |
#include <net/if.h> |
e00c7b216 bpf: fix multiple... |
16 |
|
e00c7b216 bpf: fix multiple... |
17 |
#include "bpf_util.h" |
7cf245a37 samples/bpf: Use ... |
18 19 |
#include <bpf/bpf.h> #include <bpf/libbpf.h> |
86af8b419 Add sample for ad... |
20 |
|
86af8b419 Add sample for ad... |
21 |
static int ifindex; |
743e568c1 samples/bpf: Add ... |
22 |
static __u32 xdp_flags = XDP_FLAGS_UPDATE_IF_NOEXIST; |
3b7a8ec2d samples/bpf: Chec... |
23 |
static __u32 prog_id; |
86af8b419 Add sample for ad... |
24 25 26 |
static void int_exit(int sig) { |
3b7a8ec2d samples/bpf: Chec... |
27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
__u32 curr_prog_id = 0; if (bpf_get_link_xdp_id(ifindex, &curr_prog_id, xdp_flags)) { printf("bpf_get_link_xdp_id failed "); exit(1); } if (prog_id == curr_prog_id) bpf_set_link_xdp_fd(ifindex, -1, xdp_flags); else if (!curr_prog_id) printf("couldn't find a prog id on a given interface "); else printf("program on interface changed, not removing "); |
86af8b419 Add sample for ad... |
42 43 44 45 46 |
exit(0); } /* simple per-protocol drop counter */ |
be5bca44a samples: bpf: con... |
47 |
static void poll_stats(int map_fd, int interval) |
86af8b419 Add sample for ad... |
48 |
{ |
e00c7b216 bpf: fix multiple... |
49 |
unsigned int nr_cpus = bpf_num_possible_cpus(); |
d606ee5c1 samples: bpf: imp... |
50 |
__u64 values[nr_cpus], prev[UINT8_MAX] = { 0 }; |
86af8b419 Add sample for ad... |
51 |
int i; |
86af8b419 Add sample for ad... |
52 |
while (1) { |
d606ee5c1 samples: bpf: imp... |
53 |
__u32 key = UINT32_MAX; |
86af8b419 Add sample for ad... |
54 |
sleep(interval); |
d606ee5c1 samples: bpf: imp... |
55 |
while (bpf_map_get_next_key(map_fd, &key, &key) != -1) { |
86af8b419 Add sample for ad... |
56 |
__u64 sum = 0; |
be5bca44a samples: bpf: con... |
57 |
assert(bpf_map_lookup_elem(map_fd, &key, values) == 0); |
86af8b419 Add sample for ad... |
58 |
for (i = 0; i < nr_cpus; i++) |
d606ee5c1 samples: bpf: imp... |
59 60 |
sum += values[i]; if (sum > prev[key]) |
86af8b419 Add sample for ad... |
61 62 |
printf("proto %u: %10llu pkt/s ", |
d606ee5c1 samples: bpf: imp... |
63 64 |
key, (sum - prev[key]) / interval); prev[key] = sum; |
86af8b419 Add sample for ad... |
65 66 67 |
} } } |
3993f2cb9 samples/bpf: Add ... |
68 |
static void usage(const char *prog) |
86af8b419 Add sample for ad... |
69 |
{ |
3993f2cb9 samples/bpf: Add ... |
70 |
fprintf(stderr, |
dc378a1ab samples: bpf: get... |
71 72 73 |
"usage: %s [OPTS] IFACE " |
3993f2cb9 samples/bpf: Add ... |
74 75 |
"OPTS: " |
0489df9a4 xdp: add flag to ... |
76 77 |
" -S use skb-mode " |
743e568c1 samples/bpf: Add ... |
78 79 80 81 |
" -N enforce native mode " " -F force loading prog ", |
3993f2cb9 samples/bpf: Add ... |
82 83 |
prog); } |
86af8b419 Add sample for ad... |
84 |
|
3993f2cb9 samples/bpf: Add ... |
85 86 |
int main(int argc, char **argv) { |
6dfca831c samples/bpf: adju... |
87 |
struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; |
be5bca44a samples: bpf: con... |
88 89 90 |
struct bpf_prog_load_attr prog_load_attr = { .prog_type = BPF_PROG_TYPE_XDP, }; |
3b7a8ec2d samples/bpf: Chec... |
91 92 |
struct bpf_prog_info info = {}; __u32 info_len = sizeof(info); |
743e568c1 samples/bpf: Add ... |
93 |
const char *optstr = "FSN"; |
be5bca44a samples: bpf: con... |
94 95 96 |
int prog_fd, map_fd, opt; struct bpf_object *obj; struct bpf_map *map; |
3993f2cb9 samples/bpf: Add ... |
97 |
char filename[256]; |
3b7a8ec2d samples/bpf: Chec... |
98 |
int err; |
3993f2cb9 samples/bpf: Add ... |
99 100 101 102 |
while ((opt = getopt(argc, argv, optstr)) != -1) { switch (opt) { case 'S': |
6387d0111 samples/bpf: fix ... |
103 |
xdp_flags |= XDP_FLAGS_SKB_MODE; |
3993f2cb9 samples/bpf: Add ... |
104 |
break; |
0489df9a4 xdp: add flag to ... |
105 |
case 'N': |
d50ecc46d samples/bpf: Atta... |
106 |
/* default, set below */ |
0489df9a4 xdp: add flag to ... |
107 |
break; |
743e568c1 samples/bpf: Add ... |
108 109 110 |
case 'F': xdp_flags &= ~XDP_FLAGS_UPDATE_IF_NOEXIST; break; |
3993f2cb9 samples/bpf: Add ... |
111 112 113 114 115 |
default: usage(basename(argv[0])); return 1; } } |
86af8b419 Add sample for ad... |
116 |
|
d50ecc46d samples/bpf: Atta... |
117 118 |
if (!(xdp_flags & XDP_FLAGS_SKB_MODE)) xdp_flags |= XDP_FLAGS_DRV_MODE; |
3993f2cb9 samples/bpf: Add ... |
119 120 |
if (optind == argc) { usage(basename(argv[0])); |
86af8b419 Add sample for ad... |
121 122 |
return 1; } |
6dfca831c samples/bpf: adju... |
123 124 125 126 127 |
if (setrlimit(RLIMIT_MEMLOCK, &r)) { perror("setrlimit(RLIMIT_MEMLOCK)"); return 1; } |
11b36abc2 samples: bpf: use... |
128 |
ifindex = if_nametoindex(argv[optind]); |
dc378a1ab samples: bpf: get... |
129 130 131 132 |
if (!ifindex) { perror("if_nametoindex"); return 1; } |
86af8b419 Add sample for ad... |
133 |
|
3993f2cb9 samples/bpf: Add ... |
134 |
snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); |
be5bca44a samples: bpf: con... |
135 |
prog_load_attr.file = filename; |
86af8b419 Add sample for ad... |
136 |
|
be5bca44a samples: bpf: con... |
137 138 139 140 141 142 143 |
if (bpf_prog_load_xattr(&prog_load_attr, &obj, &prog_fd)) return 1; map = bpf_map__next(NULL, obj); if (!map) { printf("finding a map in obj file failed "); |
86af8b419 Add sample for ad... |
144 145 |
return 1; } |
be5bca44a samples: bpf: con... |
146 |
map_fd = bpf_map__fd(map); |
86af8b419 Add sample for ad... |
147 |
|
be5bca44a samples: bpf: con... |
148 |
if (!prog_fd) { |
afbe3c27d samples: bpf: Upd... |
149 150 |
printf("bpf_prog_load_xattr: %s ", strerror(errno)); |
86af8b419 Add sample for ad... |
151 152 153 154 |
return 1; } signal(SIGINT, int_exit); |
ad990dbe6 samples/bpf: run ... |
155 |
signal(SIGTERM, int_exit); |
86af8b419 Add sample for ad... |
156 |
|
be5bca44a samples: bpf: con... |
157 |
if (bpf_set_link_xdp_fd(ifindex, prog_fd, xdp_flags) < 0) { |
86af8b419 Add sample for ad... |
158 159 160 161 |
printf("link set xdp fd failed "); return 1; } |
3b7a8ec2d samples/bpf: Chec... |
162 163 164 165 166 167 168 |
err = bpf_obj_get_info_by_fd(prog_fd, &info, &info_len); if (err) { printf("can't get prog info - %s ", strerror(errno)); return err; } prog_id = info.id; |
be5bca44a samples: bpf: con... |
169 |
poll_stats(map_fd, 2); |
86af8b419 Add sample for ad... |
170 171 172 |
return 0; } |