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