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 long long tcp_cnt, udp_cnt, icmp_cnt; 32 int key; 33 34 key = IPPROTO_TCP; 35 assert(bpf_lookup_elem(map_fd[0], &key, &tcp_cnt) == 0); 36 37 key = IPPROTO_UDP; 38 assert(bpf_lookup_elem(map_fd[0], &key, &udp_cnt) == 0); 39 40 key = IPPROTO_ICMP; 41 assert(bpf_lookup_elem(map_fd[0], &key, &icmp_cnt) == 0); 42 43 printf("TCP %lld UDP %lld ICMP %lld packets\n", 44 tcp_cnt, udp_cnt, icmp_cnt); 45 sleep(1); 46 } 47 48 return 0; 49 } 50