in pkg/progs/loader.go [196:253]
func (m *BpfProgram) LoadProg(progMetaData CreateEBPFProgInput) (int, error) {
var prog_type uint32
switch progMetaData.ProgType {
case "xdp":
prog_type = uint32(netlink.BPF_PROG_TYPE_XDP)
case "tc_cls":
prog_type = uint32(netlink.BPF_PROG_TYPE_SCHED_CLS)
case "tc_act":
prog_type = uint32(netlink.BPF_PROG_TYPE_SCHED_ACT)
case "kprobe":
prog_type = uint32(netlink.BPF_PROG_TYPE_KPROBE)
case "kretprobe":
prog_type = uint32(netlink.BPF_PROG_TYPE_KPROBE)
case "tracepoint":
prog_type = uint32(netlink.BPF_PROG_TYPE_TRACEPOINT)
default:
prog_type = uint32(netlink.BPF_PROG_TYPE_UNSPEC)
}
logBuf := make([]byte, utils.GetLogBufferSize())
program := netlink.BPFAttr{
ProgType: prog_type,
LogBuf: uintptr(unsafe.Pointer(&logBuf[0])),
LogSize: uint32(cap(logBuf) - 1),
LogLevel: 1,
}
program.Insns = uintptr(unsafe.Pointer(&progMetaData.ProgData[0]))
program.InsnCnt = uint32(len(progMetaData.ProgData) / progMetaData.InsDefSize)
license := []byte(progMetaData.LicenseStr)
program.License = uintptr(unsafe.Pointer(&license[0]))
fd, _, errno := unix.Syscall(unix.SYS_BPF,
uintptr(constdef.BPF_PROG_LOAD),
uintptr(unsafe.Pointer(&program)),
unsafe.Sizeof(program))
runtime.KeepAlive(progMetaData.ProgData)
runtime.KeepAlive(license)
log.Infof("Load prog done with fd : %d", int(fd))
if errno != 0 {
logArray := parseLogs(logBuf)
for _, str := range logArray {
fmt.Println(str)
}
return -1, errno
}
//Pin the prog
err := m.PinProg(uint32(fd), progMetaData.PinPath)
if err != nil {
log.Errorf("pin prog failed %v", err)
return -1, err
}
return int(fd), nil
}