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

     1  #ifndef __COMMON_PID_TRANSLATION_H__
     2  #define __COMMON_PID_TRANSLATION_H__
     3  
     4  #define PID_NESTED_NAMESPACES_MAX 10
     5  
     6  #include <vmlinux.h>
     7  #include <common/common.h>
     8  
     9  static __always_inline void get_pid_in_ns(uint64_t ns_pid_ino, uint32_t *pid) {
    10      unsigned int inum;
    11  
    12      // fallback to host pid, if no inode provided
    13      if (ns_pid_ino == 0) {
    14          uint64_t pid_tgid = bpf_get_current_pid_tgid();
    15          *pid = (u32)(pid_tgid >> 32);
    16          return;
    17      }
    18  
    19      struct task_struct *task = (struct task_struct *)bpf_get_current_task();
    20  
    21      // retrieve level nested namespaces
    22      unsigned int level = BPF_CORE_READ(task, group_leader, nsproxy, pid_ns_for_children, level);
    23  
    24      // match the level with pid ns inode
    25  #pragma unroll
    26      for (int i = 0; i < PID_NESTED_NAMESPACES_MAX; i++) {
    27          if ((level - i) < 0) {
    28              break;
    29          }
    30          inum = BPF_CORE_READ(task, group_leader, thread_pid, numbers[level - i].ns, ns.inum);
    31          if (inum == ns_pid_ino) {
    32              *pid = BPF_CORE_READ(task, group_leader, thread_pid, numbers[level - i].nr);
    33              break;
    34          }
    35      }
    36  }
    37  #endif