hc
2024-05-10 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb
kernel/samples/bpf/sockex3_user.c
....@@ -1,17 +1,12 @@
11 // SPDX-License-Identifier: GPL-2.0
22 #include <stdio.h>
33 #include <assert.h>
4
-#include <linux/bpf.h>
54 #include <bpf/bpf.h>
6
-#include "bpf_load.h"
5
+#include <bpf/libbpf.h>
76 #include "sock_example.h"
87 #include <unistd.h>
98 #include <arpa/inet.h>
109 #include <sys/resource.h>
11
-
12
-#define PARSE_IP 3
13
-#define PARSE_IP_PROG_FD (prog_fd[0])
14
-#define PROG_ARRAY_FD (map_fd[0])
1510
1611 struct flow_key_record {
1712 __be32 src;
....@@ -30,35 +25,59 @@
3025
3126 int main(int argc, char **argv)
3227 {
28
+ int i, sock, key, fd, main_prog_fd, jmp_table_fd, hash_map_fd;
3329 struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY};
30
+ struct bpf_program *prog;
31
+ struct bpf_object *obj;
32
+ const char *section;
3433 char filename[256];
3534 FILE *f;
36
- int i, sock, err, id, key = PARSE_IP;
37
- struct bpf_prog_info info = {};
38
- uint32_t info_len = sizeof(info);
3935
4036 snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
4137 setrlimit(RLIMIT_MEMLOCK, &r);
4238
43
- if (load_bpf_file(filename)) {
44
- printf("%s", bpf_log_buf);
45
- return 1;
39
+ obj = bpf_object__open_file(filename, NULL);
40
+ if (libbpf_get_error(obj)) {
41
+ fprintf(stderr, "ERROR: opening BPF object file failed\n");
42
+ return 0;
4643 }
4744
48
- /* Test fd array lookup which returns the id of the bpf_prog */
49
- err = bpf_obj_get_info_by_fd(PARSE_IP_PROG_FD, &info, &info_len);
50
- assert(!err);
51
- err = bpf_map_lookup_elem(PROG_ARRAY_FD, &key, &id);
52
- assert(!err);
53
- assert(id == info.id);
45
+ /* load BPF program */
46
+ if (bpf_object__load(obj)) {
47
+ fprintf(stderr, "ERROR: loading BPF object file failed\n");
48
+ goto cleanup;
49
+ }
50
+
51
+ jmp_table_fd = bpf_object__find_map_fd_by_name(obj, "jmp_table");
52
+ hash_map_fd = bpf_object__find_map_fd_by_name(obj, "hash_map");
53
+ if (jmp_table_fd < 0 || hash_map_fd < 0) {
54
+ fprintf(stderr, "ERROR: finding a map in obj file failed\n");
55
+ goto cleanup;
56
+ }
57
+
58
+ bpf_object__for_each_program(prog, obj) {
59
+ fd = bpf_program__fd(prog);
60
+
61
+ section = bpf_program__section_name(prog);
62
+ if (sscanf(section, "socket/%d", &key) != 1) {
63
+ fprintf(stderr, "ERROR: finding prog failed\n");
64
+ goto cleanup;
65
+ }
66
+
67
+ if (key == 0)
68
+ main_prog_fd = fd;
69
+ else
70
+ bpf_map_update_elem(jmp_table_fd, &key, &fd, BPF_ANY);
71
+ }
5472
5573 sock = open_raw_sock("lo");
5674
57
- assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &prog_fd[4],
75
+ /* attach BPF program to socket */
76
+ assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &main_prog_fd,
5877 sizeof(__u32)) == 0);
5978
6079 if (argc > 1)
61
- f = popen("ping -c5 localhost", "r");
80
+ f = popen("ping -4 -c5 localhost", "r");
6281 else
6382 f = popen("netperf -l 4 localhost", "r");
6483 (void) f;
....@@ -69,8 +88,8 @@
6988
7089 sleep(1);
7190 printf("IP src.port -> dst.port bytes packets\n");
72
- while (bpf_map_get_next_key(map_fd[2], &key, &next_key) == 0) {
73
- bpf_map_lookup_elem(map_fd[2], &next_key, &value);
91
+ while (bpf_map_get_next_key(hash_map_fd, &key, &next_key) == 0) {
92
+ bpf_map_lookup_elem(hash_map_fd, &next_key, &value);
7493 printf("%s.%05d -> %s.%05d %12lld %12lld\n",
7594 inet_ntoa((struct in_addr){htonl(next_key.src)}),
7695 next_key.port16[0],
....@@ -80,5 +99,8 @@
8099 key = next_key;
81100 }
82101 }
102
+
103
+cleanup:
104
+ bpf_object__close(obj);
83105 return 0;
84106 }