int main(int argc, char **argv) { struct sockaddr_in addr4; struct sockaddr_in6 addr6; int server = -1; int server_v6 = -1; int results = -1; int err = 0; if (argc < 2) { fprintf(stderr, "Usage: %s prog_id\n", argv[0]); exit(1); } results = get_map_fd_by_prog_id(atoi(argv[1])); if (results < 0) { log_err("Can't get map"); goto err; } memset(&addr4, 0, sizeof(addr4)); addr4.sin_family = AF_INET; addr4.sin_addr.s_addr = htonl(INADDR_LOOPBACK); addr4.sin_port = 0; memset(&addr6, 0, sizeof(addr6)); addr6.sin6_family = AF_INET6; addr6.sin6_addr = in6addr_loopback; addr6.sin6_port = 0; server = start_server((const struct sockaddr *)&addr4, sizeof(addr4)); if (server == -1) goto err; server_v6 = start_server((const struct sockaddr *)&addr6, sizeof(addr6)); if (server_v6 == -1) goto err; if (run_test(server, results)) goto err; if (run_test(server_v6, results)) goto err; printf("ok\n"); goto out; err: err = 1; out: close(server); close(server_v6); close(results); return err; }
int check_ancestor_cgroup_ids(int prog_id) { __u64 actual_ids[NUM_CGROUP_LEVELS], expected_ids[NUM_CGROUP_LEVELS]; __u32 level; int err = 0; int map_fd; expected_ids[0] = 0x100000001; /* root cgroup */ expected_ids[1] = get_cgroup_id(""); expected_ids[2] = get_cgroup_id(CGROUP_PATH); expected_ids[3] = 0; /* non-existent cgroup */ map_fd = get_map_fd_by_prog_id(prog_id); if (map_fd < 0) goto err; for (level = 0; level < NUM_CGROUP_LEVELS; ++level) { if (bpf_map_lookup_elem(map_fd, &level, &actual_ids[level])) { log_err("Failed to lookup key %d", level); goto err; } if (actual_ids[level] != expected_ids[level]) { log_err("%llx (actual) != %llx (expected), level: %u\n", actual_ids[level], expected_ids[level], level); goto err; } } goto out; err: err = -1; out: if (map_fd >= 0) close(map_fd); return err; }