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
}