in pkg/elfparser/elf.go [784:954]
func (b *bpfSDKClient) RecoverAllBpfProgramsAndMaps() (map[string]BpfData, error) {
_, err := os.Stat(constdef.BPF_DIR_MNT)
if err != nil {
log.Infof("BPF FS directory is not present")
return nil, fmt.Errorf("eBPF FS directory is not present %v", err)
}
var statfs syscall.Statfs_t
//Pass DS here
loadedPrograms := make(map[string]BpfData)
mapIDsToNames := make(map[int]string)
mapPodSelector := make(map[string]map[int]string)
mapIDsToFDs := make(map[int]int)
mapsDirExists := true
progsDirExists := true
_, err = os.Stat(constdef.MAP_BPF_FS)
if err != nil {
mapsDirExists = false
}
_, err = os.Stat(constdef.PROG_BPF_FS)
if err != nil {
progsDirExists = false
}
if err := syscall.Statfs(constdef.BPF_DIR_MNT, &statfs); err == nil && statfs.Type == unix.BPF_FS_MAGIC {
if mapsDirExists {
if err := filepath.Walk(constdef.MAP_BPF_FS, func(pinPath string, fsinfo os.FileInfo, err error) error {
if err != nil {
return err
}
if !fsinfo.IsDir() {
log.Infof("Dumping pinpaths - ", pinPath)
bpfMapInfo, err := b.mapApi.GetMapFromPinPath(pinPath)
if err != nil {
log.Infof("error getting mapInfo for pin path, this shouldn't happen")
return err
}
mapID := bpfMapInfo.Id
log.Infof("Got ID %d", mapID)
//Get map name
mapName, mapNamespace := GetMapNameFromBPFPinPath(pinPath)
mapIDsToNames[int(mapID)] = mapName
if IsMapGlobal(pinPath) {
return nil
}
//Fill New FD since old FDs will be deleted on recovery
mapFD, err := utils.GetMapFDFromID(int(mapID))
if err != nil {
log.Infof("Unable to GetFDfromID and ret %d and err %s", int(mapFD), err)
return fmt.Errorf("unable to get FD: %s", err)
}
log.Infof("Got FD %d", mapFD)
mapIDsToFDs[int(mapID)] = mapFD
log.Infof("Adding ID %d to name %s and NS %s", mapID, mapName, mapNamespace)
mapPodSelector[mapNamespace] = mapIDsToNames
}
return nil
}); err != nil {
log.Infof("Error walking bpf map directory:", err)
return nil, fmt.Errorf("failed walking the bpfdirectory %v", err)
}
}
if progsDirExists {
if err := filepath.Walk(constdef.PROG_BPF_FS, func(pinPath string, fsinfo os.FileInfo, err error) error {
if err != nil {
return err
}
if !fsinfo.IsDir() {
log.Infof("Dumping pinpaths - ", pinPath)
pgmData := ebpf_progs.BpfProgram{
PinPath: pinPath,
}
splittedPinPath := strings.Split(pinPath, "/")
podIdentifier := strings.SplitN(splittedPinPath[len(splittedPinPath)-1], "_", 2)
log.Infof("Found Identified - %s : %s", podIdentifier[0], podIdentifier[1])
progNamespace := podIdentifier[0]
if progNamespace == "global" {
log.Infof("Skipping global progs")
return nil
}
bpfProgInfo, progFD, err := (b.progApi).GetProgFromPinPath(pinPath)
if err != nil {
log.Infof("Failed to progInfo for pinPath %s", pinPath)
return err
}
pgmData.ProgFD = progFD
recoveredMapData := make(map[string]ebpf_maps.BpfMap)
if bpfProgInfo.NrMapIDs > 0 {
log.Infof("Have associated maps to link")
associatedBpfMapList, associatedBPFMapIDs, err := ebpf_progs.BpfGetMapInfoFromProgInfo(progFD, bpfProgInfo.NrMapIDs)
if err != nil {
log.Infof("Failed to get associated maps")
return err
}
for mapInfoIdx := 0; mapInfoIdx < len(associatedBpfMapList); mapInfoIdx++ {
bpfMapInfo := associatedBpfMapList[mapInfoIdx]
newMapID := associatedBPFMapIDs[mapInfoIdx]
recoveredBpfMap := ebpf_maps.BpfMap{}
//Fill BPF map
recoveredBpfMap.MapID = uint32(newMapID)
mapIds, ok := mapPodSelector[progNamespace]
if !ok {
log.Infof("Failed to get ID for %s", progNamespace)
return fmt.Errorf("failed to get err")
}
mapName := mapIds[int(recoveredBpfMap.MapID)]
var mapFD int
//Check in global cache for global maps
globalMapFd, ok := sdkCache.Get(mapName)
if ok {
log.Infof("Found FD %d in SDK cache", globalMapFd)
mapFD = globalMapFd
} else {
//Fill New FD since old FDs will be deleted on recovery
localMapFD, ok := mapIDsToFDs[int(newMapID)]
if !ok {
log.Infof("Unable to get FD from ID %d", int(newMapID))
return fmt.Errorf("unable to get FD")
}
mapFD = localMapFD
}
recoveredBpfMap.MapFD = uint32(mapFD)
log.Infof("Mapinfo MapName - %v", bpfMapInfo.Name)
//Fill BPF map metadata
recoveredBpfMapMetaData := ebpf_maps.CreateEBPFMapInput{
Type: bpfMapInfo.Type,
KeySize: bpfMapInfo.KeySize,
ValueSize: bpfMapInfo.ValueSize,
MaxEntries: bpfMapInfo.MaxEntries,
Flags: bpfMapInfo.MapFlags,
Name: mapName,
}
recoveredBpfMap.MapMetaData = recoveredBpfMapMetaData
recoveredMapData[mapName] = recoveredBpfMap
}
}
recoveredBPFdata := BpfData{
Program: pgmData,
Maps: recoveredMapData,
}
loadedPrograms[pinPath] = recoveredBPFdata
}
return nil
}); err != nil {
log.Infof("Error walking bpf prog directory:", err)
return nil, fmt.Errorf("failed walking the bpfdirectory %v", err)
}
}
} else {
log.Infof("error checking BPF FS, please make sure it is mounted %v", err)
return nil, fmt.Errorf("error checking BPF FS, please make sure it is mounted")
}
//Return DS here
return loadedPrograms, nil
}