test_current_task_under_cgroup_user.c 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /* Copyright (c) 2016 Sargun Dhillon <sargun@sargun.me>
  3. */
  4. #define _GNU_SOURCE
  5. #include <stdio.h>
  6. #include <unistd.h>
  7. #include <bpf/bpf.h>
  8. #include <bpf/libbpf.h>
  9. #include "cgroup_helpers.h"
  10. #define CGROUP_PATH "/my-cgroup"
  11. int main(int argc, char **argv)
  12. {
  13. pid_t remote_pid, local_pid = getpid();
  14. struct bpf_link *link = NULL;
  15. struct bpf_program *prog;
  16. int cg2, idx = 0, rc = 1;
  17. struct bpf_object *obj;
  18. char filename[256];
  19. int map_fd[2];
  20. snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]);
  21. obj = bpf_object__open_file(filename, NULL);
  22. if (libbpf_get_error(obj)) {
  23. fprintf(stderr, "ERROR: opening BPF object file failed\n");
  24. return 0;
  25. }
  26. prog = bpf_object__find_program_by_name(obj, "bpf_prog1");
  27. if (!prog) {
  28. printf("finding a prog in obj file failed\n");
  29. goto cleanup;
  30. }
  31. /* load BPF program */
  32. if (bpf_object__load(obj)) {
  33. fprintf(stderr, "ERROR: loading BPF object file failed\n");
  34. goto cleanup;
  35. }
  36. map_fd[0] = bpf_object__find_map_fd_by_name(obj, "cgroup_map");
  37. map_fd[1] = bpf_object__find_map_fd_by_name(obj, "perf_map");
  38. if (map_fd[0] < 0 || map_fd[1] < 0) {
  39. fprintf(stderr, "ERROR: finding a map in obj file failed\n");
  40. goto cleanup;
  41. }
  42. link = bpf_program__attach(prog);
  43. if (libbpf_get_error(link)) {
  44. fprintf(stderr, "ERROR: bpf_program__attach failed\n");
  45. link = NULL;
  46. goto cleanup;
  47. }
  48. if (setup_cgroup_environment())
  49. goto err;
  50. cg2 = create_and_get_cgroup(CGROUP_PATH);
  51. if (cg2 < 0)
  52. goto err;
  53. if (bpf_map_update_elem(map_fd[0], &idx, &cg2, BPF_ANY)) {
  54. log_err("Adding target cgroup to map");
  55. goto err;
  56. }
  57. if (join_cgroup(CGROUP_PATH))
  58. goto err;
  59. /*
  60. * The installed helper program catched the sync call, and should
  61. * write it to the map.
  62. */
  63. sync();
  64. bpf_map_lookup_elem(map_fd[1], &idx, &remote_pid);
  65. if (local_pid != remote_pid) {
  66. fprintf(stderr,
  67. "BPF Helper didn't write correct PID to map, but: %d\n",
  68. remote_pid);
  69. goto err;
  70. }
  71. /* Verify the negative scenario; leave the cgroup */
  72. if (join_cgroup("/"))
  73. goto err;
  74. remote_pid = 0;
  75. bpf_map_update_elem(map_fd[1], &idx, &remote_pid, BPF_ANY);
  76. sync();
  77. bpf_map_lookup_elem(map_fd[1], &idx, &remote_pid);
  78. if (local_pid == remote_pid) {
  79. fprintf(stderr, "BPF cgroup negative test did not work\n");
  80. goto err;
  81. }
  82. rc = 0;
  83. err:
  84. close(cg2);
  85. cleanup_cgroup_environment();
  86. cleanup:
  87. bpf_link__destroy(link);
  88. bpf_object__close(obj);
  89. return rc;
  90. }