1 | // SPDX-License-Identifier: GPL-2.0 |
2 | #include <stdio.h> |
3 | #include <assert.h> |
4 | #include <linux/bpf.h> |
5 | #include <bpf/bpf.h> |
6 | #include <bpf/libbpf.h> |
7 | #include "sock_example.h" |
8 | #include <unistd.h> |
9 | #include <arpa/inet.h> |
10 | |
11 | int main(int ac, char **argv) |
12 | { |
13 | struct bpf_object *obj; |
14 | struct bpf_program *prog; |
15 | int map_fd, prog_fd; |
16 | char filename[256]; |
17 | int i, sock, err; |
18 | FILE *f; |
19 | |
20 | snprintf(s: filename, maxlen: sizeof(filename), format: "%s_kern.o" , argv[0]); |
21 | |
22 | obj = bpf_object__open_file(filename, NULL); |
23 | if (libbpf_get_error(obj)) |
24 | return 1; |
25 | |
26 | prog = bpf_object__next_program(obj, NULL); |
27 | bpf_program__set_type(prog, BPF_PROG_TYPE_SOCKET_FILTER); |
28 | |
29 | err = bpf_object__load(obj); |
30 | if (err) |
31 | return 1; |
32 | |
33 | prog_fd = bpf_program__fd(prog); |
34 | map_fd = bpf_object__find_map_fd_by_name(obj, "my_map" ); |
35 | |
36 | sock = open_raw_sock(name: "lo" ); |
37 | |
38 | assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &prog_fd, |
39 | sizeof(prog_fd)) == 0); |
40 | |
41 | f = popen(command: "ping -4 -c5 localhost" , modes: "r" ); |
42 | (void) f; |
43 | |
44 | for (i = 0; i < 5; i++) { |
45 | long long tcp_cnt, udp_cnt, icmp_cnt; |
46 | int key; |
47 | |
48 | key = IPPROTO_TCP; |
49 | assert(bpf_map_lookup_elem(map_fd, &key, &tcp_cnt) == 0); |
50 | |
51 | key = IPPROTO_UDP; |
52 | assert(bpf_map_lookup_elem(map_fd, &key, &udp_cnt) == 0); |
53 | |
54 | key = IPPROTO_ICMP; |
55 | assert(bpf_map_lookup_elem(map_fd, &key, &icmp_cnt) == 0); |
56 | |
57 | printf(format: "TCP %lld UDP %lld ICMP %lld bytes\n" , |
58 | tcp_cnt, udp_cnt, icmp_cnt); |
59 | sleep(seconds: 1); |
60 | } |
61 | |
62 | return 0; |
63 | } |
64 | |