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