2019-01-12 04:58:27 +00:00
|
|
|
package netlink
|
|
|
|
|
2019-09-27 21:51:53 +00:00
|
|
|
import (
|
|
|
|
"unsafe"
|
2019-01-12 04:58:27 +00:00
|
|
|
|
2019-09-27 21:51:53 +00:00
|
|
|
"golang.org/x/sys/unix"
|
|
|
|
)
|
2019-01-12 04:58:27 +00:00
|
|
|
|
2019-09-27 21:51:53 +00:00
|
|
|
type BpfProgType uint32
|
2019-01-12 04:58:27 +00:00
|
|
|
|
|
|
|
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
|
|
|
|
)
|
|
|
|
|
2019-09-27 21:51:53 +00:00
|
|
|
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
|
2019-01-12 04:58:27 +00:00
|
|
|
}
|