func()

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
}