123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263 |
- package netlink
- /*
- #include <asm/types.h>
- #include <asm/unistd.h>
- #include <errno.h>
- #include <stdio.h>
- #include <stdint.h>
- #include <unistd.h>
- 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
- }
|