github.com/castai/kvisor@v1.7.1-0.20240516114728-b3572a2607b5/pkg/ebpftracer/c/headers/common/task.h (about)

     1  #ifndef __COMMON_TASK_H__
     2  #define __COMMON_TASK_H__
     3  
     4  #include <vmlinux.h>
     5  #include <vmlinux_flavors.h>
     6  
     7  #include <common/arch.h>
     8  #include <common/namespaces.h>
     9  
    10  // PROTOTYPES
    11  
    12  statfunc int get_task_flags(struct task_struct *task);
    13  statfunc int get_task_syscall_id(struct task_struct *task);
    14  statfunc u32 get_task_mnt_ns_id(struct task_struct *task);
    15  statfunc u32 get_task_pid_ns_for_children_id(struct task_struct *task);
    16  statfunc u32 get_task_pid_ns_id(struct task_struct *task);
    17  statfunc u32 get_task_uts_ns_id(struct task_struct *task);
    18  statfunc u32 get_task_ipc_ns_id(struct task_struct *task);
    19  statfunc u32 get_task_net_ns_id(struct task_struct *task);
    20  statfunc u32 get_task_cgroup_ns_id(struct task_struct *task);
    21  statfunc u32 get_task_pid_vnr(struct task_struct *task);
    22  statfunc u32 get_task_ns_pid(struct task_struct *task);
    23  statfunc u32 get_task_ns_tgid(struct task_struct *task);
    24  statfunc u32 get_task_ns_ppid(struct task_struct *task);
    25  statfunc char *get_task_uts_name(struct task_struct *task);
    26  statfunc u32 get_task_ppid(struct task_struct *task);
    27  statfunc u64 get_task_start_time(struct task_struct *task);
    28  statfunc u32 get_task_host_pid(struct task_struct *task);
    29  statfunc u32 get_task_host_tgid(struct task_struct *task);
    30  statfunc struct task_struct *get_parent_task(struct task_struct *task);
    31  statfunc u32 get_task_exit_code(struct task_struct *task);
    32  statfunc int get_task_parent_flags(struct task_struct *task);
    33  statfunc const struct cred *get_task_real_cred(struct task_struct *task);
    34  
    35  // FUNCTIONS
    36  
    37  statfunc int get_task_flags(struct task_struct *task)
    38  {
    39      return BPF_CORE_READ(task, flags);
    40  }
    41  
    42  statfunc int get_task_syscall_id(struct task_struct *task)
    43  {
    44      // There is no originated syscall in kernel thread context
    45      if (get_task_flags(task) & PF_KTHREAD) {
    46          return NO_SYSCALL;
    47      }
    48      struct pt_regs *regs = get_task_pt_regs(task);
    49      return get_syscall_id_from_regs(regs);
    50  }
    51  
    52  statfunc u32 get_task_mnt_ns_id(struct task_struct *task)
    53  {
    54      return get_mnt_ns_id(BPF_CORE_READ(task, nsproxy));
    55  }
    56  
    57  statfunc u32 get_task_pid_ns_for_children_id(struct task_struct *task)
    58  {
    59      return get_pid_ns_for_children_id(BPF_CORE_READ(task, nsproxy));
    60  }
    61  
    62  statfunc u32 get_task_pid_ns_id(struct task_struct *task)
    63  {
    64      unsigned int level = 0;
    65      struct pid *pid = NULL;
    66      struct pid_namespace *ns = NULL;
    67  
    68      if (bpf_core_type_exists(struct pid_link)) {
    69          struct task_struct___older_v50 *t = (void *) task;
    70          pid = BPF_CORE_READ(t, pids[PIDTYPE_PID].pid);
    71      } else {
    72          pid = BPF_CORE_READ(task, thread_pid);
    73      }
    74  
    75      level = BPF_CORE_READ(pid, level);
    76      ns = BPF_CORE_READ(pid, numbers[level].ns);
    77      return BPF_CORE_READ(ns, ns.inum);
    78  }
    79  
    80  statfunc u32 get_task_uts_ns_id(struct task_struct *task)
    81  {
    82      return get_uts_ns_id(BPF_CORE_READ(task, nsproxy));
    83  }
    84  
    85  statfunc u32 get_task_ipc_ns_id(struct task_struct *task)
    86  {
    87      return get_ipc_ns_id(BPF_CORE_READ(task, nsproxy));
    88  }
    89  
    90  statfunc u32 get_task_net_ns_id(struct task_struct *task)
    91  {
    92      return get_net_ns_id(BPF_CORE_READ(task, nsproxy));
    93  }
    94  
    95  statfunc u32 get_task_cgroup_ns_id(struct task_struct *task)
    96  {
    97      return get_cgroup_ns_id(BPF_CORE_READ(task, nsproxy));
    98  }
    99  
   100  statfunc u32 get_task_pid_vnr(struct task_struct *task)
   101  {
   102      unsigned int level = 0;
   103      struct pid *pid = NULL;
   104  
   105      if (bpf_core_type_exists(struct pid_link)) {
   106          struct task_struct___older_v50 *t = (void *) task;
   107          pid = BPF_CORE_READ(t, pids[PIDTYPE_PID].pid);
   108      } else {
   109          pid = BPF_CORE_READ(task, thread_pid);
   110      }
   111  
   112      level = BPF_CORE_READ(pid, level);
   113  
   114      return BPF_CORE_READ(pid, numbers[level].nr);
   115  }
   116  
   117  statfunc u32 get_task_ns_pid(struct task_struct *task)
   118  {
   119      return get_task_pid_vnr(task);
   120  }
   121  
   122  statfunc u32 get_task_ns_tgid(struct task_struct *task)
   123  {
   124      struct task_struct *group_leader = BPF_CORE_READ(task, group_leader);
   125      return get_task_pid_vnr(group_leader);
   126  }
   127  
   128  statfunc u32 get_task_ns_ppid(struct task_struct *task)
   129  {
   130      struct task_struct *real_parent = BPF_CORE_READ(task, real_parent);
   131      return get_task_pid_vnr(real_parent);
   132  }
   133  
   134  statfunc char *get_task_uts_name(struct task_struct *task)
   135  {
   136      struct nsproxy *np = BPF_CORE_READ(task, nsproxy);
   137      struct uts_namespace *uts_ns = BPF_CORE_READ(np, uts_ns);
   138      return BPF_CORE_READ(uts_ns, name.nodename);
   139  }
   140  
   141  statfunc u32 get_task_pid(struct task_struct *task)
   142  {
   143      return BPF_CORE_READ(task, pid);
   144  }
   145  
   146  statfunc u32 get_task_ppid(struct task_struct *task)
   147  {
   148      struct task_struct *parent = BPF_CORE_READ(task, real_parent);
   149      return BPF_CORE_READ(parent, tgid);
   150  }
   151  
   152  statfunc u64 get_task_start_time(struct task_struct *task)
   153  {
   154      return BPF_CORE_READ(task, start_time);
   155  }
   156  
   157  statfunc u32 get_task_host_pid(struct task_struct *task)
   158  {
   159      return BPF_CORE_READ(task, pid);
   160  }
   161  
   162  statfunc u32 get_task_host_tgid(struct task_struct *task)
   163  {
   164      return BPF_CORE_READ(task, tgid);
   165  }
   166  
   167  statfunc struct task_struct *get_parent_task(struct task_struct *task)
   168  {
   169      return BPF_CORE_READ(task, real_parent);
   170  }
   171  
   172  statfunc struct task_struct *get_leader_task(struct task_struct *task)
   173  {
   174      return BPF_CORE_READ(task, group_leader);
   175  }
   176  
   177  statfunc u32 get_task_exit_code(struct task_struct *task)
   178  {
   179      return BPF_CORE_READ(task, exit_code);
   180  }
   181  
   182  statfunc int get_task_parent_flags(struct task_struct *task)
   183  {
   184      struct task_struct *parent = BPF_CORE_READ(task, real_parent);
   185      return get_task_flags(parent);
   186  }
   187  
   188  statfunc const struct cred *get_task_real_cred(struct task_struct *task)
   189  {
   190      return BPF_CORE_READ(task, real_cred);
   191  }
   192  
   193  #endif