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> 6*7cf245a3SToke 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 { 19eb88d585SWilliam Tu struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; 201a9b268cSJakub Kicinski struct bpf_object *obj; 211a9b268cSJakub Kicinski int map_fd, prog_fd; 22fbe33108SAlexei Starovoitov char filename[256]; 23fbe33108SAlexei Starovoitov int i, sock; 241a9b268cSJakub Kicinski FILE *f; 25fbe33108SAlexei Starovoitov 26fbe33108SAlexei Starovoitov snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); 27eb88d585SWilliam Tu setrlimit(RLIMIT_MEMLOCK, &r); 28fbe33108SAlexei Starovoitov 291a9b268cSJakub Kicinski if (bpf_prog_load(filename, BPF_PROG_TYPE_SOCKET_FILTER, 301a9b268cSJakub Kicinski &obj, &prog_fd)) 31fbe33108SAlexei Starovoitov return 1; 321a9b268cSJakub Kicinski 331a9b268cSJakub Kicinski map_fd = bpf_object__find_map_fd_by_name(obj, "hash_map"); 34fbe33108SAlexei Starovoitov 35fbe33108SAlexei Starovoitov sock = open_raw_sock("lo"); 36fbe33108SAlexei Starovoitov 371a9b268cSJakub Kicinski assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &prog_fd, 381a9b268cSJakub Kicinski sizeof(prog_fd)) == 0); 39fbe33108SAlexei Starovoitov 405c3cf87dSJakub Kicinski f = popen("ping -4 -c5 localhost", "r"); 41fbe33108SAlexei Starovoitov (void) f; 42fbe33108SAlexei Starovoitov 43fbe33108SAlexei Starovoitov for (i = 0; i < 5; i++) { 44fbe33108SAlexei Starovoitov int key = 0, next_key; 45614cd3bdSAlexei Starovoitov struct pair value; 46fbe33108SAlexei Starovoitov 471a9b268cSJakub Kicinski while (bpf_map_get_next_key(map_fd, &key, &next_key) == 0) { 481a9b268cSJakub Kicinski bpf_map_lookup_elem(map_fd, &next_key, &value); 49614cd3bdSAlexei Starovoitov printf("ip %s bytes %lld packets %lld\n", 50fbe33108SAlexei Starovoitov inet_ntoa((struct in_addr){htonl(next_key)}), 51614cd3bdSAlexei Starovoitov value.bytes, value.packets); 52fbe33108SAlexei Starovoitov key = next_key; 53fbe33108SAlexei Starovoitov } 54fbe33108SAlexei Starovoitov sleep(1); 55fbe33108SAlexei Starovoitov } 56fbe33108SAlexei Starovoitov return 0; 57fbe33108SAlexei Starovoitov } 58