78 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
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
 | 
						|
}
 |