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