1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- 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
- BPF_PROG_TYPE_PERF_EVENT
- BPF_PROG_TYPE_CGROUP_SKB
- BPF_PROG_TYPE_CGROUP_SOCK
- BPF_PROG_TYPE_LWT_IN
- BPF_PROG_TYPE_LWT_OUT
- BPF_PROG_TYPE_LWT_XMIT
- BPF_PROG_TYPE_SOCK_OPS
- BPF_PROG_TYPE_SK_SKB
- BPF_PROG_TYPE_CGROUP_DEVICE
- BPF_PROG_TYPE_SK_MSG
- BPF_PROG_TYPE_RAW_TRACEPOINT
- BPF_PROG_TYPE_CGROUP_SOCK_ADDR
- BPF_PROG_TYPE_LWT_SEG6LOCAL
- BPF_PROG_TYPE_LIRC_MODE2
- BPF_PROG_TYPE_SK_REUSEPORT
- BPF_PROG_TYPE_FLOW_DISSECTOR
- BPF_PROG_TYPE_CGROUP_SYSCTL
- BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE
- BPF_PROG_TYPE_CGROUP_SOCKOPT
- BPF_PROG_TYPE_TRACING
- BPF_PROG_TYPE_STRUCT_OPS
- BPF_PROG_TYPE_EXT
- BPF_PROG_TYPE_LSM
- BPF_PROG_TYPE_SK_LOOKUP
- )
- 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
- }
|