func()

in pkg/maps/loader.go [182:224]


func (m *BpfMap) CreateBPFMap(MapMetaData CreateEBPFMapInput) (BpfMap, error) {

	// Copying all contents, innerMapFD is 0 since we don't support map-in-map
	mapContents := bpfAttrBPFMapCreate{
		Def: BpfMapDef{
			Type:       uint32(MapMetaData.Type),
			KeySize:    MapMetaData.KeySize,
			ValueSize:  MapMetaData.ValueSize,
			MaxEntries: MapMetaData.MaxEntries,
			Flags:      MapMetaData.Flags,
			InnerMapFd: 0,
		},
		Name: MapMetaData.Name,
	}
	mapData := unsafe.Pointer(&mapContents)
	mapDataSize := unsafe.Sizeof(mapContents)

	log.Infof("Calling BPFsys for name %s mapType %d keysize %d valuesize %d max entries %d and flags %d", string(MapMetaData.Name[:]), MapMetaData.Type, MapMetaData.KeySize, MapMetaData.ValueSize, MapMetaData.MaxEntries, MapMetaData.Flags)

	ret, _, errno := unix.Syscall(
		unix.SYS_BPF,
		uintptr(constdef.BPF_MAP_CREATE),
		uintptr(mapData),
		mapDataSize,
	)

	if (errno < 0) || (int(ret) == -1) {
		log.Errorf("Unable to create map and ret %d and err %s", int(ret), errno)
		return BpfMap{}, fmt.Errorf("unable to create map: %s", errno)
	}

	log.Infof("Create map done with fd : %d", int(ret))

	bpfMap := BpfMap{
		MapFD:       uint32(ret),
		MapMetaData: MapMetaData,
	}

	if MapMetaData.PinOptions != nil {
		bpfMap.PinMap(MapMetaData.PinOptions.PinPath, MapMetaData.PinOptions.Type)
	}
	return bpfMap, nil
}