static int bpf_do_map(const char *file, uint32_t flags, uint32_t key, uint32_t value) { int fd, ret; if (flags & BPF_F_PIN) { fd = bpf_map_create(); printf("bpf: map fd:%d (%s)\n", fd, strerror(errno)); assert(fd > 0); ret = bpf_obj_pin(fd, file); printf("bpf: pin ret:(%d,%s)\n", ret, strerror(errno)); assert(ret == 0); } else { fd = bpf_obj_get(file); printf("bpf: get fd:%d (%s)\n", fd, strerror(errno)); assert(fd > 0); } if ((flags & BPF_F_KEY_VAL) == BPF_F_KEY_VAL) { ret = bpf_map_update_elem(fd, &key, &value, 0); printf("bpf: fd:%d u->(%u:%u) ret:(%d,%s)\n", fd, key, value, ret, strerror(errno)); assert(ret == 0); } else if (flags & BPF_F_KEY) { ret = bpf_map_lookup_elem(fd, &key, &value); printf("bpf: fd:%d l->(%u):%u ret:(%d,%s)\n", fd, key, value, ret, strerror(errno)); assert(ret == 0); } return 0; }
static int bpf_do_prog(const char *file, uint32_t flags, const char *object) { int fd, sock, ret; if (flags & BPF_F_PIN) { fd = bpf_prog_create(object); printf("bpf: prog fd:%d (%s)\n", fd, strerror(errno)); assert(fd > 0); ret = bpf_obj_pin(fd, file); printf("bpf: pin ret:(%d,%s)\n", ret, strerror(errno)); assert(ret == 0); } else { fd = bpf_obj_get(file); printf("bpf: get fd:%d (%s)\n", fd, strerror(errno)); assert(fd > 0); } sock = open_raw_sock("lo"); assert(sock > 0); ret = setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, &fd, sizeof(fd)); printf("bpf: sock:%d <- fd:%d attached ret:(%d,%s)\n", sock, fd, ret, strerror(errno)); assert(ret == 0); return 0; }
int main (int ac, char **argv) { if (ac != 3) { printf("Usage: master <module.bpf> <map_path>\n"); return -1; } char filename[256]; int sock; snprintf(filename, sizeof(filename), "%s", argv[1]); if (load_bpf_file(filename)){ printf("%s", bpf_log_buf); return 1; } /* Initializing our map with key val pair ( IPPROTO_ICMP,0) */ int key = IPPROTO_ICMP; long value = 0; int ret = bpf_update_elem(map_fd[0], &key, &value, BPF_ANY); if (ret != 0) { printf("Failed to add key-value pair: %s\n",strerror(errno)); return -1; } sock = open_raw_sock("lo"); assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, prog_fd, sizeof(prog_fd[0])) == 0); /* Persisting map */ assert(bpf_obj_pin(map_fd[0],argv[2]) == 0); printf("MAP persisted to %s\n", argv[2]); // Pinging to localhost FILE * f = popen("ping -c5 localhost", "r"); (void) f; //Suppress unused variable warning from compiler long icmp_cnt = 0; char q; while (q != 'q') { assert(bpf_lookup_elem(map_fd[0], &key, &icmp_cnt) == 0); printf("ICMP Count %ld | Enter 'q' to quit: ", icmp_cnt); q = getchar(); } return 0; }
int main (int ac, char **argv) { if (ac != 6) { printf( "Usage: persist_module <module.bpf> <prog_path> <m1> <latency> <counter>\n" ); return -1; } char filename[256]; snprintf(filename, sizeof(filename), "%s", argv[1]); if (load_bpf_file(filename)){ printf("%s", bpf_log_buf); return -1; } assert(bpf_obj_pin(prog_fd[0], argv[2]) == 0); assert(bpf_obj_pin(map_fd[0], argv[3]) == 0); assert(bpf_obj_pin(map_fd[1], argv[4]) == 0); assert(bpf_obj_pin(map_fd[2], argv[5]) == 0); printf("module persisted\n"); return 0; }
int export_map_idx(int map_idx) { const char *file; file = map_idx_to_export_filename(map_idx); /* Export map as a file */ if (bpf_obj_pin(map_fd[map_idx], file) != 0) { fprintf(stderr, "ERR: Cannot pin map(%s) file:%s err(%d):%s\n", map_data[map_idx].name, file, errno, strerror(errno)); return EXIT_FAIL_MAP; } if (verbose) printf(" - Export bpf-map:%-30s to file:%s\n", map_data[map_idx].name, file); return 0; }
int main(int argc, char **argv) { const char *pinned_file = NULL, *cg2 = NULL; int create_array = 1; int array_key = 0; int array_fd = -1; int cg2_fd = -1; int ret = -1; int opt; while ((opt = getopt(argc, argv, "F:U:v:")) != -1) { switch (opt) { /* General args */ case 'F': pinned_file = optarg; break; case 'U': pinned_file = optarg; create_array = 0; break; case 'v': cg2 = optarg; break; default: usage(); goto out; } } if (!cg2 || !pinned_file) { usage(); goto out; } cg2_fd = open(cg2, O_RDONLY); if (cg2_fd < 0) { fprintf(stderr, "open(%s,...): %s(%d)\n", cg2, strerror(errno), errno); goto out; } if (create_array) { array_fd = bpf_create_map(BPF_MAP_TYPE_CGROUP_ARRAY, sizeof(uint32_t), sizeof(uint32_t), 1, 0); if (array_fd < 0) { fprintf(stderr, "bpf_create_map(BPF_MAP_TYPE_CGROUP_ARRAY,...): %s(%d)\n", strerror(errno), errno); goto out; } } else { array_fd = bpf_obj_get(pinned_file); if (array_fd < 0) { fprintf(stderr, "bpf_obj_get(%s): %s(%d)\n", pinned_file, strerror(errno), errno); goto out; } } ret = bpf_map_update_elem(array_fd, &array_key, &cg2_fd, 0); if (ret) { perror("bpf_map_update_elem"); goto out; } if (create_array) { ret = bpf_obj_pin(array_fd, pinned_file); if (ret) { fprintf(stderr, "bpf_obj_pin(..., %s): %s(%d)\n", pinned_file, strerror(errno), errno); goto out; } } out: if (array_fd != -1) close(array_fd); if (cg2_fd != -1) close(cg2_fd); return ret; }