1*b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0 2fbe33108SAlexei Starovoitov #include <stdio.h> 3fbe33108SAlexei Starovoitov #include <assert.h> 4fbe33108SAlexei Starovoitov #include <linux/bpf.h> 5fbe33108SAlexei Starovoitov #include "libbpf.h" 6fbe33108SAlexei Starovoitov #include "bpf_load.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}; 20fbe33108SAlexei Starovoitov char filename[256]; 21fbe33108SAlexei Starovoitov FILE *f; 22fbe33108SAlexei Starovoitov int i, sock; 23fbe33108SAlexei Starovoitov 24fbe33108SAlexei Starovoitov snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); 25eb88d585SWilliam Tu setrlimit(RLIMIT_MEMLOCK, &r); 26fbe33108SAlexei Starovoitov 27fbe33108SAlexei Starovoitov if (load_bpf_file(filename)) { 28fbe33108SAlexei Starovoitov printf("%s", bpf_log_buf); 29fbe33108SAlexei Starovoitov return 1; 30fbe33108SAlexei Starovoitov } 31fbe33108SAlexei Starovoitov 32fbe33108SAlexei Starovoitov sock = open_raw_sock("lo"); 33fbe33108SAlexei Starovoitov 34fbe33108SAlexei Starovoitov assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, prog_fd, 35fbe33108SAlexei Starovoitov sizeof(prog_fd[0])) == 0); 36fbe33108SAlexei Starovoitov 37fbe33108SAlexei Starovoitov f = popen("ping -c5 localhost", "r"); 38fbe33108SAlexei Starovoitov (void) f; 39fbe33108SAlexei Starovoitov 40fbe33108SAlexei Starovoitov for (i = 0; i < 5; i++) { 41fbe33108SAlexei Starovoitov int key = 0, next_key; 42614cd3bdSAlexei Starovoitov struct pair value; 43fbe33108SAlexei Starovoitov 44d40fc181SJoe Stringer while (bpf_map_get_next_key(map_fd[0], &key, &next_key) == 0) { 45d40fc181SJoe Stringer bpf_map_lookup_elem(map_fd[0], &next_key, &value); 46614cd3bdSAlexei Starovoitov printf("ip %s bytes %lld packets %lld\n", 47fbe33108SAlexei Starovoitov inet_ntoa((struct in_addr){htonl(next_key)}), 48614cd3bdSAlexei Starovoitov value.bytes, value.packets); 49fbe33108SAlexei Starovoitov key = next_key; 50fbe33108SAlexei Starovoitov } 51fbe33108SAlexei Starovoitov sleep(1); 52fbe33108SAlexei Starovoitov } 53fbe33108SAlexei Starovoitov return 0; 54fbe33108SAlexei Starovoitov } 55