1 /* Copyright (c) 2016 Sargun Dhillon <sargun@sargun.me> 2 * 3 * This program is free software; you can redistribute it and/or 4 * modify it under the terms of version 2 of the GNU General Public 5 * License as published by the Free Software Foundation. 6 */ 7 8 #define _GNU_SOURCE 9 #include <stdio.h> 10 #include <linux/bpf.h> 11 #include <unistd.h> 12 #include <bpf/bpf.h> 13 #include "bpf_load.h" 14 #include <linux/bpf.h> 15 #include "cgroup_helpers.h" 16 17 #define CGROUP_PATH "/my-cgroup" 18 19 int main(int argc, char **argv) 20 { 21 pid_t remote_pid, local_pid = getpid(); 22 int cg2, idx = 0, rc = 0; 23 char filename[256]; 24 25 snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); 26 if (load_bpf_file(filename)) { 27 printf("%s", bpf_log_buf); 28 return 1; 29 } 30 31 if (setup_cgroup_environment()) 32 goto err; 33 34 cg2 = create_and_get_cgroup(CGROUP_PATH); 35 36 if (!cg2) 37 goto err; 38 39 if (bpf_map_update_elem(map_fd[0], &idx, &cg2, BPF_ANY)) { 40 log_err("Adding target cgroup to map"); 41 goto err; 42 } 43 44 if (join_cgroup(CGROUP_PATH)) 45 goto err; 46 47 /* 48 * The installed helper program catched the sync call, and should 49 * write it to the map. 50 */ 51 52 sync(); 53 bpf_map_lookup_elem(map_fd[1], &idx, &remote_pid); 54 55 if (local_pid != remote_pid) { 56 fprintf(stderr, 57 "BPF Helper didn't write correct PID to map, but: %d\n", 58 remote_pid); 59 goto err; 60 } 61 62 /* Verify the negative scenario; leave the cgroup */ 63 if (join_cgroup("/")) 64 goto err; 65 66 remote_pid = 0; 67 bpf_map_update_elem(map_fd[1], &idx, &remote_pid, BPF_ANY); 68 69 sync(); 70 bpf_map_lookup_elem(map_fd[1], &idx, &remote_pid); 71 72 if (local_pid == remote_pid) { 73 fprintf(stderr, "BPF cgroup negative test did not work\n"); 74 goto err; 75 } 76 77 goto out; 78 err: 79 rc = 1; 80 81 out: 82 close(cg2); 83 cleanup_cgroup_environment(); 84 return rc; 85 } 86