package netlink /* #include #include #include #include #include #include static int load_simple_bpf(int prog_type, int ret) { #ifdef __NR_bpf // { return ret; } __u64 __attribute__((aligned(8))) insns[] = { 0x00000000000000b7ull | ((__u64)ret<<32), 0x0000000000000095ull, }; __u8 __attribute__((aligned(8))) license[] = "ASL2"; // Copied from a header file since libc is notoriously slow to update. // The call will succeed or fail and that will be our indication on // whether or not it is supported. struct { __u32 prog_type; __u32 insn_cnt; __u64 insns; __u64 license; __u32 log_level; __u32 log_size; __u64 log_buf; __u32 kern_version; } __attribute__((aligned(8))) attr = { .prog_type = prog_type, .insn_cnt = 2, .insns = (uintptr_t)&insns, .license = (uintptr_t)&license, }; return syscall(__NR_bpf, 5, &attr, sizeof(attr)); #else errno = EINVAL; return -1; #endif } */ import "C" type BpfProgType C.int const ( BPF_PROG_TYPE_UNSPEC BpfProgType = iota BPF_PROG_TYPE_SOCKET_FILTER BPF_PROG_TYPE_KPROBE BPF_PROG_TYPE_SCHED_CLS BPF_PROG_TYPE_SCHED_ACT BPF_PROG_TYPE_TRACEPOINT BPF_PROG_TYPE_XDP ) // loadSimpleBpf loads a trivial bpf program for testing purposes func loadSimpleBpf(progType BpfProgType, ret int) (int, error) { fd, err := C.load_simple_bpf(C.int(progType), C.int(ret)) return int(fd), err }