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" 6fbe33108SAlexei Starovoitov #include <unistd.h> 7fbe33108SAlexei Starovoitov #include <arpa/inet.h> 8fbe33108SAlexei Starovoitov 9*614cd3bdSAlexei Starovoitov struct pair { 10*614cd3bdSAlexei Starovoitov __u64 packets; 11*614cd3bdSAlexei Starovoitov __u64 bytes; 12*614cd3bdSAlexei Starovoitov }; 13*614cd3bdSAlexei Starovoitov 14fbe33108SAlexei Starovoitov int main(int ac, char **argv) 15fbe33108SAlexei Starovoitov { 16fbe33108SAlexei Starovoitov char filename[256]; 17fbe33108SAlexei Starovoitov FILE *f; 18fbe33108SAlexei Starovoitov int i, sock; 19fbe33108SAlexei Starovoitov 20fbe33108SAlexei Starovoitov snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); 21fbe33108SAlexei Starovoitov 22fbe33108SAlexei Starovoitov if (load_bpf_file(filename)) { 23fbe33108SAlexei Starovoitov printf("%s", bpf_log_buf); 24fbe33108SAlexei Starovoitov return 1; 25fbe33108SAlexei Starovoitov } 26fbe33108SAlexei Starovoitov 27fbe33108SAlexei Starovoitov sock = open_raw_sock("lo"); 28fbe33108SAlexei Starovoitov 29fbe33108SAlexei Starovoitov assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, prog_fd, 30fbe33108SAlexei Starovoitov sizeof(prog_fd[0])) == 0); 31fbe33108SAlexei Starovoitov 32fbe33108SAlexei Starovoitov f = popen("ping -c5 localhost", "r"); 33fbe33108SAlexei Starovoitov (void) f; 34fbe33108SAlexei Starovoitov 35fbe33108SAlexei Starovoitov for (i = 0; i < 5; i++) { 36fbe33108SAlexei Starovoitov int key = 0, next_key; 37*614cd3bdSAlexei Starovoitov struct pair value; 38fbe33108SAlexei Starovoitov 39fbe33108SAlexei Starovoitov while (bpf_get_next_key(map_fd[0], &key, &next_key) == 0) { 40fbe33108SAlexei Starovoitov bpf_lookup_elem(map_fd[0], &next_key, &value); 41*614cd3bdSAlexei Starovoitov printf("ip %s bytes %lld packets %lld\n", 42fbe33108SAlexei Starovoitov inet_ntoa((struct in_addr){htonl(next_key)}), 43*614cd3bdSAlexei Starovoitov value.bytes, value.packets); 44fbe33108SAlexei Starovoitov key = next_key; 45fbe33108SAlexei Starovoitov } 46fbe33108SAlexei Starovoitov sleep(1); 47fbe33108SAlexei Starovoitov } 48fbe33108SAlexei Starovoitov return 0; 49fbe33108SAlexei Starovoitov } 50