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