Skip to content

Commit

Permalink
feat: GetMapsByName
Browse files Browse the repository at this point in the history
Allow a user to get a list of maps by name.
  • Loading branch information
aymericDD committed Sep 12, 2023
1 parent c11365c commit 585cbd5
Show file tree
Hide file tree
Showing 7 changed files with 97 additions and 0 deletions.
28 changes: 28 additions & 0 deletions libbpfgo.go
Original file line number Diff line number Diff line change
Expand Up @@ -393,6 +393,34 @@ func (m *Module) InitGlobalVariable(name string, value interface{}) error {
return err
}

// GetMapsByName retrieves BPF maps with the specified name.
func GetMapsByName(name string) []*BPFMapLow {
bpfMaps := []*BPFMapLow{}

startId := C.uint(0)
nextId := C.uint(0)

for {
err := C.bpf_map_get_next_id(startId, &nextId)
if err != 0 {
return bpfMaps
}

startId = nextId + 1

bpfMapLow, errMap := GetMapByID(uint32(nextId))
if errMap != nil {
return bpfMaps
}

if bpfMapLow.Name() != name {
continue
}

bpfMaps = append(bpfMaps, bpfMapLow)
}
}

func (m *Module) GetMap(mapName string) (*BPFMap, error) {
cs := C.CString(mapName)
bpfMapC, errno := C.bpf_object__find_map_by_name(m.obj, cs)
Expand Down
1 change: 1 addition & 0 deletions selftest/map-get-maps-by-name/Makefile
7 changes: 7 additions & 0 deletions selftest/map-get-maps-by-name/go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module github.com/aquasecurity/libbpfgo/selftest/map-update

go 1.18

require github.com/aquasecurity/libbpfgo v0.4.7-libbpf-1.2.0-b2e29a1

replace github.com/aquasecurity/libbpfgo => ../../
4 changes: 4 additions & 0 deletions selftest/map-get-maps-by-name/go.sum
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
20 changes: 20 additions & 0 deletions selftest/map-get-maps-by-name/main.bpf.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//+build ignore

#include <vmlinux.h>

#include <bpf/bpf_helpers.h>

struct {
__uint(type, BPF_MAP_TYPE_ARRAY);
__uint(max_entries, 1);
__uint(key_size, sizeof(u32));
__uint(value_size, sizeof(u32));
} test SEC(".maps");

SEC("kprobe/sys_execve")
int kprobe__sys_execve(struct pt_regs *ctx)
{
return 0;
}

char LICENSE[] SEC("license") = "Dual BSD/GPL";
36 changes: 36 additions & 0 deletions selftest/map-get-maps-by-name/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package main

import "C"

import (
"fmt"
"os"
"unsafe"

bpf "github.com/aquasecurity/libbpfgo"
)

func main() {
bpfModule, err := bpf.NewModuleFromFile("main.bpf.o")
if err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(-1)
}
defer bpfModule.Close()

bpfModule.BPFLoadObject()

testMaps := bpf.GetMapsByName("test")
if len(testMaps) == 0 {
fmt.Fprintln(os.Stderr, fmt.Errorf("no maps found"))
os.Exit(-1)
}

testMap := testMaps[0]
key1 := uint32(0)
value1 := uint32(55)
if err := testMap.Update(unsafe.Pointer(&key1), unsafe.Pointer(&value1)); err != nil {
fmt.Fprintln(os.Stderr, err)
os.Exit(-1)
}
}
1 change: 1 addition & 0 deletions selftest/map-get-maps-by-name/run.sh

0 comments on commit 585cbd5

Please sign in to comment.