| package netlink |
| |
| import ( |
| "unsafe" |
| |
| "golang.org/x/sys/unix" |
| ) |
| |
| type BpfProgType uint32 |
| |
| 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 |
| ) |
| |
| type BPFAttr struct { |
| ProgType uint32 |
| InsnCnt uint32 |
| Insns uintptr |
| License uintptr |
| LogLevel uint32 |
| LogSize uint32 |
| LogBuf uintptr |
| KernVersion uint32 |
| } |
| |
| // loadSimpleBpf loads a trivial bpf program for testing purposes. |
| func loadSimpleBpf(progType BpfProgType, ret uint32) (int, error) { |
| insns := []uint64{ |
| 0x00000000000000b7 | (uint64(ret) << 32), |
| 0x0000000000000095, |
| } |
| license := []byte{'A', 'S', 'L', '2', '\x00'} |
| attr := BPFAttr{ |
| ProgType: uint32(progType), |
| InsnCnt: uint32(len(insns)), |
| Insns: uintptr(unsafe.Pointer(&insns[0])), |
| License: uintptr(unsafe.Pointer(&license[0])), |
| } |
| fd, _, errno := unix.Syscall(unix.SYS_BPF, |
| 5, /* bpf cmd */ |
| uintptr(unsafe.Pointer(&attr)), |
| unsafe.Sizeof(attr)) |
| if errno != 0 { |
| return 0, errno |
| } |
| return int(fd), nil |
| } |