def BpfProgLoad(prog_type, insn_ptr, prog_len, insn_len): gpl_license = ctypes.create_string_buffer(b"GPL") log_buf = ctypes.create_string_buffer(b"", LOG_SIZE) attr = BpfAttrProgLoad((prog_type, prog_len / insn_len, insn_ptr, ctypes.addressof(gpl_license), LOG_LEVEL, LOG_SIZE, ctypes.addressof(log_buf), 0)) ret = libc.syscall(__NR_bpf, BPF_PROG_LOAD, attr.CPointer(), len(attr)) csocket.MaybeRaiseSocketError(ret) return ret
def GetNextKey(map_fd, key): c_key = ctypes.c_uint32(key) c_next_key = ctypes.c_uint32(0) attr = BpfAttrOps( (map_fd, ctypes.addressof(c_key), ctypes.addressof(c_next_key), 0)) ret = libc.syscall(__NR_bpf, BPF_MAP_GET_NEXT_KEY, attr.CPointer(), len(attr)) csocket.MaybeRaiseSocketError(ret) return c_next_key
def LookupMap(map_fd, key): c_value = ctypes.c_uint32(0) c_key = ctypes.c_uint32(key) attr = BpfAttrOps( (map_fd, ctypes.addressof(c_key), ctypes.addressof(c_value), 0)) ret = libc.syscall(__NR_bpf, BPF_MAP_LOOKUP_ELEM, attr.CPointer(), len(attr)) csocket.MaybeRaiseSocketError(ret) return c_value
def UpdateMap(map_fd, key, value, flags=0): c_value = ctypes.c_uint32(value) c_key = ctypes.c_uint32(key) value_ptr = ctypes.addressof(c_value) key_ptr = ctypes.addressof(c_key) attr = BpfAttrOps((map_fd, key_ptr, value_ptr, flags)) ret = libc.syscall(__NR_bpf, BPF_MAP_UPDATE_ELEM, attr.CPointer(), len(attr)) csocket.MaybeRaiseSocketError(ret)
def BpfProgAttachSocket(sock_fd, prog_fd): prog_ptr = ctypes.c_uint32(prog_fd) ret = libc.setsockopt(sock_fd, socket.SOL_SOCKET, SO_ATTACH_BPF, ctypes.addressof(prog_ptr), ctypes.sizeof(prog_ptr)) csocket.MaybeRaiseSocketError(ret)
def DeleteMap(map_fd, key): c_key = ctypes.c_uint32(key) attr = BpfAttrOps((map_fd, ctypes.addressof(c_key), 0, 0)) ret = libc.syscall(__NR_bpf, BPF_MAP_DELETE_ELEM, attr.CPointer(), len(attr)) csocket.MaybeRaiseSocketError(ret)
def CreateMap(map_type, key_size, value_size, max_entries): attr = BpfAttrCreate((map_type, key_size, value_size, max_entries)) ret = libc.syscall(__NR_bpf, BPF_MAP_CREATE, attr.CPointer(), len(attr)) csocket.MaybeRaiseSocketError(ret) return ret
def BpfSyscall(op, attr): ret = libc.syscall(__NR_bpf, op, attr.CPointer(), len(attr)) csocket.MaybeRaiseSocketError(ret) return ret
def BpfProgAttachSocket(sock_fd, prog_fd): uint_fd = ctypes.c_uint32(prog_fd) ret = libc.setsockopt(sock_fd, socket.SOL_SOCKET, SO_ATTACH_BPF, ctypes.pointer(uint_fd), ctypes.sizeof(uint_fd)) csocket.MaybeRaiseSocketError(ret)