int main(int argc, char **argv) { struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; char filename[256]; int delay = 1; snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); setrlimit(RLIMIT_MEMLOCK, &r); signal(SIGINT, int_exit); if (load_kallsyms()) { printf("failed to process /proc/kallsyms\n"); return 2; } if (load_bpf_file(filename)) { printf("%s", bpf_log_buf); return 1; } if (argc > 1) delay = atoi(argv[1]); sleep(delay); print_stacks(map_fd[0]); return 0; }
int main(int argc, char **argv) { int longindex = 0, opt; int ret = EXIT_SUCCESS; char bpf_obj_file[256]; /* Default settings: */ bool errors_only = true; int interval = 2; snprintf(bpf_obj_file, sizeof(bpf_obj_file), "%s_kern.o", argv[0]); /* Parse commands line args */ while ((opt = getopt_long(argc, argv, "h", long_options, &longindex)) != -1) { switch (opt) { case 'D': debug = true; break; case 'S': errors_only = false; break; case 's': interval = atoi(optarg); break; case 'h': default: usage(argv); return EXIT_FAILURE; } } if (load_bpf_file(bpf_obj_file)) { printf("ERROR - bpf_log_buf: %s", bpf_log_buf); return 1; } if (!prog_fd[0]) { printf("ERROR - load_bpf_file: %s\n", strerror(errno)); return 1; } if (debug) { print_bpf_prog_info(); } /* Unload/stop tracepoint event by closing fd's */ if (errors_only) { /* The prog_fd[i] and event_fd[i] depend on the * order the functions was defined in _kern.c */ close(event_fd[2]); /* tracepoint/xdp/xdp_redirect */ close(prog_fd[2]); /* func: trace_xdp_redirect */ close(event_fd[3]); /* tracepoint/xdp/xdp_redirect_map */ close(prog_fd[3]); /* func: trace_xdp_redirect_map */ } stats_poll(interval, errors_only); return ret; }
int main(int ac, char **argv) { char filename[256]; snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); if (ac != 2) { printf("usage: %s IFINDEX\n", argv[0]); return 1; } ifindex = strtoul(argv[1], NULL, 0); if (load_bpf_file(filename)) { printf("%s", bpf_log_buf); return 1; } if (!prog_fd[0]) { printf("load_bpf_file: %s\n", strerror(errno)); return 1; } signal(SIGINT, int_exit); if (set_link_xdp_fd(ifindex, prog_fd[0]) < 0) { printf("link set xdp fd failed\n"); return 1; } poll_stats(2); return 0; }
static int test(char *filename, int num_progs) { int i, fd, map0_fds[num_progs], map1_fds[num_progs]; for (i = 0; i < num_progs; i++) { if (load_bpf_file(filename)) { fprintf(stderr, "%s", bpf_log_buf); return 1; } printf("prog #%d: map ids %d %d\n", i, map_fd[0], map_fd[1]); map0_fds[i] = map_fd[0]; map1_fds[i] = map_fd[1]; } /* current load_bpf_file has perf_event_open default pid = -1 * and cpu = 0, which permits attached bpf execution on * all cpus for all pid's. bpf program execution ignores * cpu affinity. */ /* trigger some "open" operations */ fd = open(filename, O_RDONLY); if (fd < 0) { fprintf(stderr, "open failed: %s\n", strerror(errno)); return 1; } close(fd); /* verify the map */ for (i = 0; i < num_progs; i++) { verify_map(map0_fds[i]); verify_map(map1_fds[i]); } return 0; }
int main(int ac, char **argv) { struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; char filename[256]; int i; snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); if (setrlimit(RLIMIT_MEMLOCK, &r)) { perror("setrlimit(RLIMIT_MEMLOCK, RLIM_INFINITY)"); return 1; } if (load_bpf_file(filename)) { printf("%s", bpf_log_buf); return 1; } for (i = 0; ; i++) { print_old_objects(map_fd[1]); sleep(1); } return 0; }
int main(int ac, char **argv) { struct rlimit r = {1024*1024, RLIM_INFINITY}; char filename[256]; int i; snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); if (setrlimit(RLIMIT_MEMLOCK, &r)) { perror("setrlimit(RLIMIT_MEMLOCK)"); return 1; } if (load_bpf_file(filename)) { printf("%s", bpf_log_buf); return 1; } for (i = 1; i < ac; i++) { if (strcmp(argv[i], "-a") == 0) { full_range = true; } else if (strcmp(argv[i], "-t") == 0) { text_only = true; } else if (strcmp(argv[i], "-h") == 0) { printf("Usage:\n" " -a display wider latency range\n" " -t text only\n"); return 1; } } printf(" heatmap of IO latency\n"); if (text_only) printf(" %s", sym[num_colors - 1]); else printf(" %s %s", color[num_colors - 1], nocolor); printf(" - many events with this latency\n"); if (text_only) printf(" %s", sym[0]); else printf(" %s %s", color[0], nocolor); printf(" - few events\n"); for (i = 0; ; i++) { if (i % 20 == 0) print_banner(); print_hist(map_fd[1]); sleep(2); } return 0; }
static void test_bpf_perf_event(void) { struct perf_event_attr attr_type_hw = { .sample_freq = SAMPLE_FREQ, .freq = 1, .type = PERF_TYPE_HARDWARE, .config = PERF_COUNT_HW_CPU_CYCLES, .inherit = 1, }; struct perf_event_attr attr_type_sw = { .sample_freq = SAMPLE_FREQ, .freq = 1, .type = PERF_TYPE_SOFTWARE, .config = PERF_COUNT_SW_CPU_CLOCK, .inherit = 1, }; test_perf_event_all_cpu(&attr_type_hw); test_perf_event_task(&attr_type_hw); test_perf_event_all_cpu(&attr_type_sw); test_perf_event_task(&attr_type_sw); } int main(int argc, char **argv) { struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; char filename[256]; snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); setrlimit(RLIMIT_MEMLOCK, &r); signal(SIGINT, int_exit); if (load_kallsyms()) { printf("failed to process /proc/kallsyms\n"); return 1; } if (load_bpf_file(filename)) { printf("%s", bpf_log_buf); return 2; } if (fork() == 0) { read_trace_pipe(); return 0; } test_bpf_perf_event(); int_exit(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; }
static int bpf_prog_create(const char *object) { static struct bpf_insn insns[] = { BPF_MOV64_IMM(BPF_REG_0, 1), BPF_EXIT_INSN(), }; size_t insns_cnt = sizeof(insns) / sizeof(struct bpf_insn); if (object) { assert(!load_bpf_file((char *)object)); return prog_fd[0]; } else { return bpf_load_program(BPF_PROG_TYPE_SOCKET_FILTER, insns, insns_cnt, "GPL", 0, bpf_log_buf, BPF_LOG_BUF_SIZE); } }
/* Inititlize and prepare the eBPF prog */ unsigned int init_ebpf_prog(void) { int ret = 0; if (load_bpf_file("./filter.bpf") != 0){ printf("BPF load error"); return 1; } char bpf_log_buf[1024]; unsigned int insn_count = prog_size / sizeof(struct bpf_insn); union bpf_attr attr = { .prog_type = BPF_PROG_TYPE_UNSPEC, .insns = ptr_to_u64((void*) insn_prog), .insn_cnt = insn_count, .license = ptr_to_u64((void *) "GPL"), .log_buf = ptr_to_u64(bpf_log_buf), .log_size = 1024, .log_level = 1, }; prog = bpf_prog_alloc(bpf_prog_size(attr.insn_cnt)); if (!prog) return -ENOMEM; prog->jited = 0; prog->orig_prog = NULL; prog->len = attr.insn_cnt; if (memcpy(prog->insnsi, u64_to_ptr(attr.insns), prog->len * sizeof(struct bpf_insn)) != 0) atomic_set(&prog->aux->refcnt, 1); prog->aux->is_gpl_compatible = 1; fixup_bpf_calls(prog); // ready for JIT bpf_prog_select_runtime(prog); return ret; } unsigned int run_bpf_filt(struct filt_args *fargs) { unsigned int ret = 0; struct bpf_context bctx = {}; bctx.arg1 = (__u64) fargs; ret = filter(prog, &bctx); return ret; }
int main(int argc, char **argv) { struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; char filename[256]; assert(!setrlimit(RLIMIT_MEMLOCK, &r)); snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); if (load_bpf_file(filename)) { printf("%s", bpf_log_buf); return 1; } test_map_in_map(); return 0; }
int main (int ac, char **argv) { if (ac != 3) { printf("Usage: master_host <module.bpf> <prog_path>\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; } int key = 0; int fd = bpf_obj_get(argv[2]); if (fd < 0) { printf("Failed to load container module %s\n", argv[2]); return -1; } int ret = bpf_update_elem(map_fd[0], &key, &fd, BPF_ANY); if (ret != 0) { printf("Failed to add key-value pair %s\n", strerror(errno)); return -1; } int sock = open_raw_sock("lo"); assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, prog_fd, sizeof(prog_fd[0])) == 0); FILE *f = popen("ping -c5 localhost", "r"); (void) f; char q; while (q != 'q') { printf("Enter 'q' to exit\n"); q = getchar(); } return 0; }
int main(int argc, char **argv) { FILE *f; char filename[256]; char command[256]; int ret; snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); if (load_bpf_file(filename)) { printf("%s", bpf_log_buf); return 1; } snprintf(command, 256, "mount %s tmpmnt/", argv[1]); f = popen(command, "r"); ret = pclose(f); return ret ? 0 : 1; }
int main(int ac, char **argv) { char filename[256]; FILE *f; int i, sock; snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); if (load_bpf_file(filename)) { printf("%s", bpf_log_buf); return 1; } sock = open_raw_sock("lo"); assert(setsockopt(sock, SOL_SOCKET, SO_ATTACH_BPF, prog_fd, sizeof(prog_fd[0])) == 0); f = popen("ping -c5 localhost", "r"); (void) f; for (i = 0; i < 5; i++) { long long tcp_cnt, udp_cnt, icmp_cnt; int key; key = IPPROTO_TCP; assert(bpf_map_lookup_elem(map_fd[0], &key, &tcp_cnt) == 0); key = IPPROTO_UDP; assert(bpf_map_lookup_elem(map_fd[0], &key, &udp_cnt) == 0); key = IPPROTO_ICMP; assert(bpf_map_lookup_elem(map_fd[0], &key, &icmp_cnt) == 0); printf("TCP %lld UDP %lld ICMP %lld bytes\n", tcp_cnt, udp_cnt, icmp_cnt); sleep(1); } return 0; }
int main(int ac, char **argv) { char filename[256]; long key, next_key, value; FILE *f; int i; snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); signal(SIGINT, int_exit); /* start 'ping' in the background to have some kfree_skb events */ f = popen("ping -c5 localhost", "r"); (void) f; /* start 'dd' in the background to have plenty of 'write' syscalls */ f = popen("dd if=/dev/zero of=/dev/null count=5000000", "r"); (void) f; if (load_bpf_file(filename)) { printf("%s", bpf_log_buf); return 1; } for (i = 0; i < 5; i++) { key = 0; while (bpf_get_next_key(map_fd[0], &key, &next_key) == 0) { bpf_lookup_elem(map_fd[0], &next_key, &value); printf("location 0x%lx count %ld\n", next_key, value); key = next_key; } if (key) printf("\n"); sleep(1); } print_hist(map_fd[1]); 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; }
/* install fake seccomp program to enable seccomp code path inside the kernel, * so that our kprobe attached to seccomp_phase1() can be triggered */ static void install_accept_all_seccomp(void) { struct sock_filter filter[] = { BPF_STMT(BPF_RET+BPF_K, SECCOMP_RET_ALLOW), }; struct sock_fprog prog = { .len = (unsigned short)(sizeof(filter)/sizeof(filter[0])), .filter = filter, }; if (prctl(PR_SET_SECCOMP, 2, &prog)) perror("prctl"); } int main(int ac, char **argv) { FILE *f; char filename[256]; struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); setrlimit(RLIMIT_MEMLOCK, &r); if (load_bpf_file(filename)) { printf("%s", bpf_log_buf); return 1; } install_accept_all_seccomp(); f = popen("dd if=/dev/zero of=/dev/null count=5", "r"); (void) f; read_trace_pipe(); return 0; }
int main(int argc, char **argv) { int logFlag = 0; int error = 0; char *cg_path; char fn[500]; char *prog; int cg_fd; if (argc < 3) usage(argv[0]); if (!strcmp(argv[1], "-r")) { cg_path = argv[2]; cg_fd = open(cg_path, O_DIRECTORY, O_RDONLY); error = bpf_prog_detach(cg_fd, BPF_CGROUP_SOCK_OPS); if (error) { printf("ERROR: bpf_prog_detach: %d (%s)\n", error, strerror(errno)); return 2; } return 0; } else if (!strcmp(argv[1], "-h")) { usage(argv[0]); } else if (!strcmp(argv[1], "-l")) { logFlag = 1; if (argc < 4) usage(argv[0]); } prog = argv[argc - 1]; cg_path = argv[argc - 2]; if (strlen(prog) > 480) { fprintf(stderr, "ERROR: program name too long (> 480 chars)\n"); return 3; } cg_fd = open(cg_path, O_DIRECTORY, O_RDONLY); if (!strcmp(prog + strlen(prog)-2, ".o")) strcpy(fn, prog); else sprintf(fn, "%s_kern.o", prog); if (logFlag) printf("loading bpf file:%s\n", fn); if (load_bpf_file(fn)) { printf("ERROR: load_bpf_file failed for: %s\n", fn); printf("%s", bpf_log_buf); return 4; } if (logFlag) printf("TCP BPF Loaded %s\n", fn); error = bpf_prog_attach(prog_fd[0], cg_fd, BPF_CGROUP_SOCK_OPS, 0); if (error) { printf("ERROR: bpf_prog_attach: %d (%s)\n", error, strerror(errno)); return 5; } else if (logFlag) { read_trace_pipe(); } return error; }
int main(int argc, char **argv) { char filename[256]; int *pmu_fd, opt, freq = DEFAULT_FREQ, secs = DEFAULT_SECS; /* process arguments */ while ((opt = getopt(argc, argv, "F:h")) != -1) { switch (opt) { case 'F': freq = atoi(optarg); break; case 'h': default: usage(); return 0; } } if (argc - optind == 1) secs = atoi(argv[optind]); if (freq == 0 || secs == 0) { usage(); return 1; } /* initialize kernel symbol translation */ if (load_kallsyms()) { fprintf(stderr, "ERROR: loading /proc/kallsyms\n"); return 2; } /* create perf FDs for each CPU */ nr_cpus = sysconf(_SC_NPROCESSORS_CONF); pmu_fd = malloc(nr_cpus * sizeof(int)); if (pmu_fd == NULL) { fprintf(stderr, "ERROR: malloc of pmu_fd\n"); return 1; } /* load BPF program */ snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); if (load_bpf_file(filename)) { fprintf(stderr, "ERROR: loading BPF program (errno %d):\n", errno); if (strcmp(bpf_log_buf, "") == 0) fprintf(stderr, "Try: ulimit -l unlimited\n"); else fprintf(stderr, "%s", bpf_log_buf); return 1; } signal(SIGINT, int_exit); signal(SIGTERM, int_exit); /* do sampling */ printf("Sampling at %d Hertz for %d seconds. Ctrl-C also ends.\n", freq, secs); if (sampling_start(pmu_fd, freq) != 0) return 1; sleep(secs); sampling_end(pmu_fd); free(pmu_fd); /* output sample counts */ print_ip_map(map_fd[0]); return 0; }
int main(int argc, char **argv) { unsigned char opt_flags[256] = {}; unsigned int kill_after_s = 0; const char *optstr = "i:a:p:s:d:m:T:P:SNh"; int min_port = 0, max_port = 0; struct iptnl_info tnl = {}; struct rlimit r = {RLIM_INFINITY, RLIM_INFINITY}; struct vip vip = {}; char filename[256]; int opt; int i; tnl.family = AF_UNSPEC; vip.protocol = IPPROTO_TCP; for (i = 0; i < strlen(optstr); i++) if (optstr[i] != 'h' && 'a' <= optstr[i] && optstr[i] <= 'z') opt_flags[(unsigned char)optstr[i]] = 1; while ((opt = getopt(argc, argv, optstr)) != -1) { unsigned short family; unsigned int *v6; switch (opt) { case 'i': ifindex = atoi(optarg); break; case 'a': vip.family = parse_ipstr(optarg, vip.daddr.v6); if (vip.family == AF_UNSPEC) return 1; break; case 'p': if (parse_ports(optarg, &min_port, &max_port)) return 1; break; case 'P': vip.protocol = atoi(optarg); break; case 's': case 'd': if (opt == 's') v6 = tnl.saddr.v6; else v6 = tnl.daddr.v6; family = parse_ipstr(optarg, v6); if (family == AF_UNSPEC) return 1; if (tnl.family == AF_UNSPEC) { tnl.family = family; } else if (tnl.family != family) { fprintf(stderr, "The IP version of the src and dst addresses used in the IP encapsulation does not match\n"); return 1; } break; case 'm': if (!ether_aton_r(optarg, (struct ether_addr *)tnl.dmac)) { fprintf(stderr, "Invalid mac address:%s\n", optarg); return 1; } break; case 'T': kill_after_s = atoi(optarg); break; case 'S': xdp_flags |= XDP_FLAGS_SKB_MODE; break; case 'N': xdp_flags |= XDP_FLAGS_DRV_MODE; break; default: usage(argv[0]); return 1; } opt_flags[opt] = 0; } for (i = 0; i < strlen(optstr); i++) { if (opt_flags[(unsigned int)optstr[i]]) { fprintf(stderr, "Missing argument -%c\n", optstr[i]); usage(argv[0]); return 1; } } if (setrlimit(RLIMIT_MEMLOCK, &r)) { perror("setrlimit(RLIMIT_MEMLOCK, RLIM_INFINITY)"); return 1; } snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); if (load_bpf_file(filename)) { printf("%s", bpf_log_buf); return 1; } if (!prog_fd[0]) { printf("load_bpf_file: %s\n", strerror(errno)); return 1; } signal(SIGINT, int_exit); signal(SIGTERM, int_exit); while (min_port <= max_port) { vip.dport = htons(min_port++); if (bpf_map_update_elem(map_fd[1], &vip, &tnl, BPF_NOEXIST)) { perror("bpf_map_update_elem(&vip2tnl)"); return 1; } } if (bpf_set_link_xdp_fd(ifindex, prog_fd[0], xdp_flags) < 0) { printf("link set xdp fd failed\n"); return 1; } poll_stats(kill_after_s); bpf_set_link_xdp_fd(ifindex, -1, xdp_flags); return 0; }
int main(int argc, char **argv) { pid_t remote_pid, local_pid = getpid(); int cg2, idx = 0, rc = 0; char filename[256]; snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); if (load_bpf_file(filename)) { printf("%s", bpf_log_buf); return 1; } if (setup_cgroup_environment()) goto err; cg2 = create_and_get_cgroup(CGROUP_PATH); if (!cg2) goto err; if (bpf_map_update_elem(map_fd[0], &idx, &cg2, BPF_ANY)) { log_err("Adding target cgroup to map"); goto err; } if (join_cgroup(CGROUP_PATH)) goto err; /* * The installed helper program catched the sync call, and should * write it to the map. */ sync(); bpf_map_lookup_elem(map_fd[1], &idx, &remote_pid); if (local_pid != remote_pid) { fprintf(stderr, "BPF Helper didn't write correct PID to map, but: %d\n", remote_pid); goto err; } /* Verify the negative scenario; leave the cgroup */ if (join_cgroup("/")) goto err; remote_pid = 0; bpf_map_update_elem(map_fd[1], &idx, &remote_pid, BPF_ANY); sync(); bpf_map_lookup_elem(map_fd[1], &idx, &remote_pid); if (local_pid == remote_pid) { fprintf(stderr, "BPF cgroup negative test did not work\n"); goto err; } goto out; err: rc = 1; out: close(cg2); cleanup_cgroup_environment(); return rc; }
int main(int argc, char **argv) { const char *optstr = "SN"; char filename[256]; int ret, opt, key = 0; while ((opt = getopt(argc, argv, optstr)) != -1) { switch (opt) { case 'S': xdp_flags |= XDP_FLAGS_SKB_MODE; break; case 'N': xdp_flags |= XDP_FLAGS_DRV_MODE; break; default: usage(basename(argv[0])); return 1; } } if (optind == argc) { printf("usage: %s IFINDEX_IN IFINDEX_OUT\n", argv[0]); return 1; } ifindex_in = strtoul(argv[optind], NULL, 0); ifindex_out = strtoul(argv[optind + 1], NULL, 0); printf("input: %d output: %d\n", ifindex_in, ifindex_out); snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); if (load_bpf_file(filename)) { printf("%s", bpf_log_buf); return 1; } if (!prog_fd[0]) { printf("load_bpf_file: %s\n", strerror(errno)); return 1; } if (set_link_xdp_fd(ifindex_in, prog_fd[0], xdp_flags) < 0) { printf("ERROR: link set xdp fd failed on %d\n", ifindex_in); return 1; } /* Loading dummy XDP prog on out-device */ if (set_link_xdp_fd(ifindex_out, prog_fd[1], (xdp_flags | XDP_FLAGS_UPDATE_IF_NOEXIST)) < 0) { printf("WARN: link set xdp fd failed on %d\n", ifindex_out); ifindex_out_xdp_dummy_attached = false; } signal(SIGINT, int_exit); signal(SIGTERM, int_exit); printf("map[0] (vports) = %i, map[1] (map) = %i, map[2] (count) = %i\n", map_fd[0], map_fd[1], map_fd[2]); /* populate virtual to physical port map */ ret = bpf_map_update_elem(map_fd[0], &key, &ifindex_out, 0); if (ret) { perror("bpf_update_elem"); goto out; } poll_stats(2, ifindex_out); out: return 0; }
int main(int ac, char **argv) { int serverfd, serverconnfd, clientfd; socklen_t sockaddr_len; struct sockaddr serv_addr, mapped_addr, tmp_addr; struct sockaddr_in *serv_addr_in, *mapped_addr_in, *tmp_addr_in; char filename[256]; char *ip; serv_addr_in = (struct sockaddr_in *)&serv_addr; mapped_addr_in = (struct sockaddr_in *)&mapped_addr; tmp_addr_in = (struct sockaddr_in *)&tmp_addr; snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); if (load_bpf_file(filename)) { printf("%s", bpf_log_buf); return 1; } assert((serverfd = socket(AF_INET, SOCK_STREAM, 0)) > 0); assert((clientfd = socket(AF_INET, SOCK_STREAM, 0)) > 0); /* Bind server to ephemeral port on lo */ memset(&serv_addr, 0, sizeof(serv_addr)); serv_addr_in->sin_family = AF_INET; serv_addr_in->sin_port = 0; serv_addr_in->sin_addr.s_addr = htonl(INADDR_LOOPBACK); assert(bind(serverfd, &serv_addr, sizeof(serv_addr)) == 0); sockaddr_len = sizeof(serv_addr); assert(getsockname(serverfd, &serv_addr, &sockaddr_len) == 0); ip = inet_ntoa(serv_addr_in->sin_addr); printf("Server bound to: %s:%d\n", ip, ntohs(serv_addr_in->sin_port)); memset(&mapped_addr, 0, sizeof(mapped_addr)); mapped_addr_in->sin_family = AF_INET; mapped_addr_in->sin_port = htons(5555); mapped_addr_in->sin_addr.s_addr = inet_addr("255.255.255.255"); assert(!bpf_update_elem(map_fd[0], &mapped_addr, &serv_addr, BPF_ANY)); assert(listen(serverfd, 5) == 0); ip = inet_ntoa(mapped_addr_in->sin_addr); printf("Client connecting to: %s:%d\n", ip, ntohs(mapped_addr_in->sin_port)); assert(connect(clientfd, &mapped_addr, sizeof(mapped_addr)) == 0); sockaddr_len = sizeof(tmp_addr); ip = inet_ntoa(tmp_addr_in->sin_addr); assert((serverconnfd = accept(serverfd, &tmp_addr, &sockaddr_len)) > 0); printf("Server received connection from: %s:%d\n", ip, ntohs(tmp_addr_in->sin_port)); sockaddr_len = sizeof(tmp_addr); assert(getpeername(clientfd, &tmp_addr, &sockaddr_len) == 0); ip = inet_ntoa(tmp_addr_in->sin_addr); printf("Client's peer address: %s:%d\n", ip, ntohs(tmp_addr_in->sin_port)); /* Is the server's getsockname = the socket getpeername */ assert(memcmp(&serv_addr, &tmp_addr, sizeof(struct sockaddr_in)) == 0); return 0; }