in pkg/clihelper/show.go [84:237]
func MapWalk(mapID int) error {
if mapID <= 0 {
return fmt.Errorf("Invalid mapID")
}
mapFD, err := goebpfutils.GetMapFDFromID(mapID)
if err != nil {
return err
}
mapInfo, err := goebpfmaps.GetBPFmapInfo(mapFD)
if err != nil {
return err
}
unix.Close(mapFD)
if mapInfo.Type != constdef.BPF_MAP_TYPE_LPM_TRIE.Index() && mapInfo.Type != constdef.BPF_MAP_TYPE_LRU_HASH.Index() && mapInfo.Type != constdef.BPF_MAP_TYPE_HASH.Index() {
return fmt.Errorf("Unsupported map type, should be - LPM trie (egress/ingress maps) or LRU hash (Conntrack table)")
}
if mapInfo.Type == constdef.BPF_MAP_TYPE_LPM_TRIE.Index() {
iterKey := utils.BPFTrieKey{}
iterNextKey := utils.BPFTrieKey{}
err = goebpfmaps.GetFirstMapEntryByID(uintptr(unsafe.Pointer(&iterKey)), mapID)
if err != nil {
if errors.Is(err, unix.ENOENT) {
fmt.Println("No Entries found, Empty map")
return nil
}
return fmt.Errorf("Unable to get First key: %v", err)
} else {
for {
iterValue := [24]utils.BPFTrieVal{}
err = goebpfmaps.GetMapEntryByID(uintptr(unsafe.Pointer(&iterKey)), uintptr(unsafe.Pointer(&iterValue)), mapID)
if err != nil {
return fmt.Errorf("Unable to get map entry: %v", err)
} else {
retrievedKey := fmt.Sprintf("Key : IP/Prefixlen - %s/%d ", utils.ConvIntToIPv4(iterKey.IP).String(), iterKey.PrefixLen)
fmt.Println(retrievedKey)
for i := 0; i < len(iterValue); i++ {
if iterValue[i].Protocol == 0 {
continue
}
fmt.Println("-------------------")
fmt.Println("Value Entry : ", i)
fmt.Println("Protocol - ", utils.GetProtocol(int(iterValue[i].Protocol)))
fmt.Println("StartPort - ", iterValue[i].StartPort)
fmt.Println("Endport - ", iterValue[i].EndPort)
fmt.Println("-------------------")
}
fmt.Println("*******************************")
}
err = goebpfmaps.GetNextMapEntryByID(uintptr(unsafe.Pointer(&iterKey)), uintptr(unsafe.Pointer(&iterNextKey)), mapID)
if errors.Is(err, unix.ENOENT) {
fmt.Println("Done reading all entries")
break
}
if err != nil {
fmt.Println("Failed to get next entry Done searching")
break
}
iterKey = iterNextKey
}
}
}
if mapInfo.Type == constdef.BPF_MAP_TYPE_LRU_HASH.Index() {
iterKey := utils.ConntrackKey{}
iterNextKey := utils.ConntrackKey{}
err = goebpfmaps.GetFirstMapEntryByID(uintptr(unsafe.Pointer(&iterKey)), mapID)
if err != nil {
if errors.Is(err, unix.ENOENT) {
fmt.Println("No Entries found, Empty map")
return nil
}
return fmt.Errorf("Unable to get First key: %v", err)
} else {
for {
iterValue := utils.ConntrackVal{}
err = goebpfmaps.GetMapEntryByID(uintptr(unsafe.Pointer(&iterKey)), uintptr(unsafe.Pointer(&iterValue)), mapID)
if err != nil {
return fmt.Errorf("Unable to get map entry: %v", err)
} else {
retrievedKey := fmt.Sprintf("Conntrack Key : Source IP - %s Source port - %d Dest IP - %s Dest port - %d Protocol - %d Owner IP - %s", utils.ConvIntToIPv4(iterKey.Source_ip).String(), iterKey.Source_port, utils.ConvIntToIPv4(iterKey.Dest_ip).String(), iterKey.Dest_port, iterKey.Protocol, utils.ConvIntToIPv4(iterKey.Owner_ip).String())
fmt.Println(retrievedKey)
fmt.Println("Value : ")
fmt.Println("Conntrack Val - ", iterValue.Value)
fmt.Println("*******************************")
}
err = goebpfmaps.GetNextMapEntryByID(uintptr(unsafe.Pointer(&iterKey)), uintptr(unsafe.Pointer(&iterNextKey)), mapID)
if errors.Is(err, unix.ENOENT) {
fmt.Println("Done reading all entries")
break
}
if err != nil {
fmt.Println("Failed to get next entry Done searching")
break
}
iterKey = iterNextKey
}
}
}
if mapInfo.Type == constdef.BPF_MAP_TYPE_HASH.Index() {
var key, nextKey uint32
// Get the first entry
err = goebpfmaps.GetFirstMapEntryByID(
uintptr(unsafe.Pointer(&key)),
mapID)
if err != nil {
if errors.Is(err, unix.ENOENT) {
fmt.Println("No entries found, empty HASH map (pod_state_map?)")
return nil
}
return fmt.Errorf("unable to get first key (HASH): %v", err)
}
for {
var val PodState
err = goebpfmaps.GetMapEntryByID(
uintptr(unsafe.Pointer(&key)),
uintptr(unsafe.Pointer(&val)),
mapID)
if err != nil {
return fmt.Errorf("unable to get HASH entry for key=%d: %v", key, err)
}
fmt.Println("Key : ", key)
fmt.Println("State - ", val.State)
fmt.Println("*******************************")
err = goebpfmaps.GetNextMapEntryByID(
uintptr(unsafe.Pointer(&key)),
uintptr(unsafe.Pointer(&nextKey)),
mapID)
if errors.Is(err, unix.ENOENT) {
fmt.Println("Done reading all entries in BPF_MAP_TYPE_HASH")
break
}
if err != nil {
fmt.Println("Failed to get next entry, done searching")
break
}
key = nextKey
}
return nil
}
return nil
}