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 10 int main(int ac, char **argv) 11 { 12 char filename[256]; 13 FILE *f; 14 int i, sock; 15 16 snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); 17 18 if (load_bpf_file(filename)) { 19 printf("%s", bpf_log_buf); 20 return 1; 21 } 22 23 sock = open_raw_sock("lo"); 24 25 assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, prog_fd, 26 sizeof(prog_fd[0])) == 0); 27 28 f = popen("ping -c5 localhost", "r"); 29 (void) f; 30 31 for (i = 0; i < 5; i++) { 32 long long tcp_cnt, udp_cnt, icmp_cnt; 33 int key; 34 35 key = IPPROTO_TCP; 36 assert(bpf_map_lookup_elem(map_fd[0], &key, &tcp_cnt) == 0); 37 38 key = IPPROTO_UDP; 39 assert(bpf_map_lookup_elem(map_fd[0], &key, &udp_cnt) == 0); 40 41 key = IPPROTO_ICMP; 42 assert(bpf_map_lookup_elem(map_fd[0], &key, &icmp_cnt) == 0); 43 44 printf("TCP %lld UDP %lld ICMP %lld bytes\n", 45 tcp_cnt, udp_cnt, icmp_cnt); 46 sleep(1); 47 } 48 49 return 0; 50 } 51