1fbe33108SAlexei Starovoitov #include <stdio.h> 2fbe33108SAlexei Starovoitov #include <assert.h> 3fbe33108SAlexei Starovoitov #include <linux/bpf.h> 4fbe33108SAlexei Starovoitov #include "libbpf.h" 5fbe33108SAlexei Starovoitov #include "bpf_load.h" 6*9899694aSJoe Stringer #include "sock_example.h" 7fbe33108SAlexei Starovoitov #include <unistd.h> 8fbe33108SAlexei Starovoitov #include <arpa/inet.h> 9eb88d585SWilliam Tu #include <sys/resource.h> 10fbe33108SAlexei Starovoitov 11614cd3bdSAlexei Starovoitov struct pair { 12614cd3bdSAlexei Starovoitov __u64 packets; 13614cd3bdSAlexei Starovoitov __u64 bytes; 14614cd3bdSAlexei Starovoitov }; 15614cd3bdSAlexei Starovoitov 16fbe33108SAlexei Starovoitov int main(int ac, char **argv) 17fbe33108SAlexei Starovoitov { 18eb88d585SWilliam Tu struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; 19fbe33108SAlexei Starovoitov char filename[256]; 20fbe33108SAlexei Starovoitov FILE *f; 21fbe33108SAlexei Starovoitov int i, sock; 22fbe33108SAlexei Starovoitov 23fbe33108SAlexei Starovoitov snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); 24eb88d585SWilliam Tu setrlimit(RLIMIT_MEMLOCK, &r); 25fbe33108SAlexei Starovoitov 26fbe33108SAlexei Starovoitov if (load_bpf_file(filename)) { 27fbe33108SAlexei Starovoitov printf("%s", bpf_log_buf); 28fbe33108SAlexei Starovoitov return 1; 29fbe33108SAlexei Starovoitov } 30fbe33108SAlexei Starovoitov 31fbe33108SAlexei Starovoitov sock = open_raw_sock("lo"); 32fbe33108SAlexei Starovoitov 33fbe33108SAlexei Starovoitov assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, prog_fd, 34fbe33108SAlexei Starovoitov sizeof(prog_fd[0])) == 0); 35fbe33108SAlexei Starovoitov 36fbe33108SAlexei Starovoitov f = popen("ping -c5 localhost", "r"); 37fbe33108SAlexei Starovoitov (void) f; 38fbe33108SAlexei Starovoitov 39fbe33108SAlexei Starovoitov for (i = 0; i < 5; i++) { 40fbe33108SAlexei Starovoitov int key = 0, next_key; 41614cd3bdSAlexei Starovoitov struct pair value; 42fbe33108SAlexei Starovoitov 43d40fc181SJoe Stringer while (bpf_map_get_next_key(map_fd[0], &key, &next_key) == 0) { 44d40fc181SJoe Stringer bpf_map_lookup_elem(map_fd[0], &next_key, &value); 45614cd3bdSAlexei Starovoitov printf("ip %s bytes %lld packets %lld\n", 46fbe33108SAlexei Starovoitov inet_ntoa((struct in_addr){htonl(next_key)}), 47614cd3bdSAlexei Starovoitov value.bytes, value.packets); 48fbe33108SAlexei Starovoitov key = next_key; 49fbe33108SAlexei Starovoitov } 50fbe33108SAlexei Starovoitov sleep(1); 51fbe33108SAlexei Starovoitov } 52fbe33108SAlexei Starovoitov return 0; 53fbe33108SAlexei Starovoitov } 54