diff --git a/pythonbpf/helper/__init__.py b/pythonbpf/helper/__init__.py index 1730635..dcbfe24 100644 --- a/pythonbpf/helper/__init__.py +++ b/pythonbpf/helper/__init__.py @@ -16,6 +16,7 @@ from .helpers import ( smp_processor_id, uid, skb_store_bytes, + get_current_cgroup_id, get_stack, XDP_DROP, XDP_PASS, @@ -79,6 +80,7 @@ __all__ = [ "handle_helper_call", "emit_probe_read_kernel_str_call", "emit_probe_read_kernel_call", + "get_current_cgroup_id", "ktime", "pid", "deref", diff --git a/pythonbpf/helper/bpf_helper_handler.py b/pythonbpf/helper/bpf_helper_handler.py index f52e87a..d90efc0 100644 --- a/pythonbpf/helper/bpf_helper_handler.py +++ b/pythonbpf/helper/bpf_helper_handler.py @@ -30,6 +30,7 @@ class BPFHelperID(Enum): BPF_SKB_STORE_BYTES = 9 BPF_GET_CURRENT_PID_TGID = 14 BPF_GET_CURRENT_UID_GID = 15 + BPF_GET_CURRENT_CGROUP_ID = 80 BPF_GET_CURRENT_COMM = 16 BPF_PERF_EVENT_OUTPUT = 25 BPF_GET_STACK = 67 @@ -67,6 +68,32 @@ def bpf_ktime_get_ns_emitter( result = builder.call(fn_ptr, [], tail=False) return result, ir.IntType(64) +@HelperHandlerRegistry.register( + "get_current_cgroup_id", + param_types=[], + return_type=ir.IntType(64), +) +def bpf_get_current_cgroup_id( + call, + map_ptr, + module, + builder, + func, + local_sym_tab=None, + struct_sym_tab=None, + map_sym_tab=None, +): + """ + Emit LLVM IR for bpf_get_current_cgroup_id helper function call. + """ + # func is an arg to just have a uniform signature with other emitters + helper_id = ir.Constant(ir.IntType(64), BPFHelperID.BPF_GET_CURRENT_CGROUP_ID.value) + fn_type = ir.FunctionType(ir.IntType(64), [], var_arg=False) + fn_ptr_type = ir.PointerType(fn_type) + fn_ptr = builder.inttoptr(helper_id, fn_ptr_type) + result = builder.call(fn_ptr, [], tail=False) + return result, ir.IntType(64) + @HelperHandlerRegistry.register( "lookup", diff --git a/pythonbpf/helper/helpers.py b/pythonbpf/helper/helpers.py index c80d57d..253c4b0 100644 --- a/pythonbpf/helper/helpers.py +++ b/pythonbpf/helper/helpers.py @@ -57,6 +57,11 @@ def get_stack(buf, flags=0): return ctypes.c_int64(0) +def get_current_cgroup_id(): + """Get the current cgroup ID""" + return ctypes.c_int64(0) + + XDP_ABORTED = ctypes.c_int64(0) XDP_DROP = ctypes.c_int64(1) XDP_PASS = ctypes.c_int64(2)