1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 2fbe33108SAlexei Starovoitov #include <stdio.h> 3fbe33108SAlexei Starovoitov #include <assert.h> 4fbe33108SAlexei Starovoitov #include <linux/bpf.h> 52bf3e2efSJakub Kicinski #include <bpf/bpf.h> 67cf245a3SToke Høiland-Jørgensen #include <bpf/libbpf.h> 79899694aSJoe Stringer #include "sock_example.h" 8fbe33108SAlexei Starovoitov #include <unistd.h> 9fbe33108SAlexei Starovoitov #include <arpa/inet.h> 10eb88d585SWilliam Tu #include <sys/resource.h> 11fbe33108SAlexei Starovoitov 12614cd3bdSAlexei Starovoitov struct pair { 13614cd3bdSAlexei Starovoitov __u64 packets; 14614cd3bdSAlexei Starovoitov __u64 bytes; 15614cd3bdSAlexei Starovoitov }; 16614cd3bdSAlexei Starovoitov 17fbe33108SAlexei Starovoitov int main(int ac, char **argv) 18fbe33108SAlexei Starovoitov { 19*c58f9815SAndrii Nakryiko struct bpf_program *prog; 201a9b268cSJakub Kicinski struct bpf_object *obj; 211a9b268cSJakub Kicinski int map_fd, prog_fd; 22fbe33108SAlexei Starovoitov char filename[256]; 23*c58f9815SAndrii Nakryiko int i, sock, err; 241a9b268cSJakub Kicinski FILE *f; 25fbe33108SAlexei Starovoitov 26fbe33108SAlexei Starovoitov snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); 27*c58f9815SAndrii Nakryiko obj = bpf_object__open_file(filename, NULL); 28*c58f9815SAndrii Nakryiko if (libbpf_get_error(obj)) 29fbe33108SAlexei Starovoitov return 1; 301a9b268cSJakub Kicinski 31*c58f9815SAndrii Nakryiko prog = bpf_object__next_program(obj, NULL); 32*c58f9815SAndrii Nakryiko bpf_program__set_type(prog, BPF_PROG_TYPE_SOCKET_FILTER); 33*c58f9815SAndrii Nakryiko 34*c58f9815SAndrii Nakryiko err = bpf_object__load(obj); 35*c58f9815SAndrii Nakryiko if (err) 36*c58f9815SAndrii Nakryiko return 1; 37*c58f9815SAndrii Nakryiko 38*c58f9815SAndrii Nakryiko prog_fd = bpf_program__fd(prog); 391a9b268cSJakub Kicinski map_fd = bpf_object__find_map_fd_by_name(obj, "hash_map"); 40fbe33108SAlexei Starovoitov 41fbe33108SAlexei Starovoitov sock = open_raw_sock("lo"); 42fbe33108SAlexei Starovoitov 431a9b268cSJakub Kicinski assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &prog_fd, 441a9b268cSJakub Kicinski sizeof(prog_fd)) == 0); 45fbe33108SAlexei Starovoitov 465c3cf87dSJakub Kicinski f = popen("ping -4 -c5 localhost", "r"); 47fbe33108SAlexei Starovoitov (void) f; 48fbe33108SAlexei Starovoitov 49fbe33108SAlexei Starovoitov for (i = 0; i < 5; i++) { 50fbe33108SAlexei Starovoitov int key = 0, next_key; 51614cd3bdSAlexei Starovoitov struct pair value; 52fbe33108SAlexei Starovoitov 531a9b268cSJakub Kicinski while (bpf_map_get_next_key(map_fd, &key, &next_key) == 0) { 541a9b268cSJakub Kicinski bpf_map_lookup_elem(map_fd, &next_key, &value); 55614cd3bdSAlexei Starovoitov printf("ip %s bytes %lld packets %lld\n", 56fbe33108SAlexei Starovoitov inet_ntoa((struct in_addr){htonl(next_key)}), 57614cd3bdSAlexei Starovoitov value.bytes, value.packets); 58fbe33108SAlexei Starovoitov key = next_key; 59fbe33108SAlexei Starovoitov } 60fbe33108SAlexei Starovoitov sleep(1); 61fbe33108SAlexei Starovoitov } 62fbe33108SAlexei Starovoitov return 0; 63fbe33108SAlexei Starovoitov } 64