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