18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci#include <stdio.h> 38c2ecf20Sopenharmony_ci#include <assert.h> 48c2ecf20Sopenharmony_ci#include <linux/bpf.h> 58c2ecf20Sopenharmony_ci#include <bpf/bpf.h> 68c2ecf20Sopenharmony_ci#include <bpf/libbpf.h> 78c2ecf20Sopenharmony_ci#include "sock_example.h" 88c2ecf20Sopenharmony_ci#include <unistd.h> 98c2ecf20Sopenharmony_ci#include <arpa/inet.h> 108c2ecf20Sopenharmony_ci#include <sys/resource.h> 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_cistruct pair { 138c2ecf20Sopenharmony_ci __u64 packets; 148c2ecf20Sopenharmony_ci __u64 bytes; 158c2ecf20Sopenharmony_ci}; 168c2ecf20Sopenharmony_ci 178c2ecf20Sopenharmony_ciint main(int ac, char **argv) 188c2ecf20Sopenharmony_ci{ 198c2ecf20Sopenharmony_ci struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; 208c2ecf20Sopenharmony_ci struct bpf_object *obj; 218c2ecf20Sopenharmony_ci int map_fd, prog_fd; 228c2ecf20Sopenharmony_ci char filename[256]; 238c2ecf20Sopenharmony_ci int i, sock; 248c2ecf20Sopenharmony_ci FILE *f; 258c2ecf20Sopenharmony_ci 268c2ecf20Sopenharmony_ci snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); 278c2ecf20Sopenharmony_ci setrlimit(RLIMIT_MEMLOCK, &r); 288c2ecf20Sopenharmony_ci 298c2ecf20Sopenharmony_ci if (bpf_prog_load(filename, BPF_PROG_TYPE_SOCKET_FILTER, 308c2ecf20Sopenharmony_ci &obj, &prog_fd)) 318c2ecf20Sopenharmony_ci return 1; 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci map_fd = bpf_object__find_map_fd_by_name(obj, "hash_map"); 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci sock = open_raw_sock("lo"); 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &prog_fd, 388c2ecf20Sopenharmony_ci sizeof(prog_fd)) == 0); 398c2ecf20Sopenharmony_ci 408c2ecf20Sopenharmony_ci f = popen("ping -4 -c5 localhost", "r"); 418c2ecf20Sopenharmony_ci (void) f; 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_ci for (i = 0; i < 5; i++) { 448c2ecf20Sopenharmony_ci int key = 0, next_key; 458c2ecf20Sopenharmony_ci struct pair value; 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ci while (bpf_map_get_next_key(map_fd, &key, &next_key) == 0) { 488c2ecf20Sopenharmony_ci bpf_map_lookup_elem(map_fd, &next_key, &value); 498c2ecf20Sopenharmony_ci printf("ip %s bytes %lld packets %lld\n", 508c2ecf20Sopenharmony_ci inet_ntoa((struct in_addr){htonl(next_key)}), 518c2ecf20Sopenharmony_ci value.bytes, value.packets); 528c2ecf20Sopenharmony_ci key = next_key; 538c2ecf20Sopenharmony_ci } 548c2ecf20Sopenharmony_ci sleep(1); 558c2ecf20Sopenharmony_ci } 568c2ecf20Sopenharmony_ci return 0; 578c2ecf20Sopenharmony_ci} 58