Skip to content

Commit

Permalink
feat(map): introduce GetMapFDByID()
Browse files Browse the repository at this point in the history
This function allows to get a file descriptor of a map by its ID.
  • Loading branch information
geyslan committed Aug 17, 2023
1 parent 21cf435 commit 26259e3
Show file tree
Hide file tree
Showing 7 changed files with 122 additions and 0 deletions.
10 changes: 10 additions & 0 deletions map-common.go
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,16 @@ type BPFMapInfo struct {
MapExtra uint64
}

// GetMapFDByID returns a file descriptor for the map with the given ID.
func GetMapFDByID(id uint32) (int, error) {
fdC := C.bpf_map_get_fd_by_id(C.uint(id))
if fdC < 0 {
return int(fdC), fmt.Errorf("could not find map id %d: %w", id, syscall.Errno(-fdC))
}

return int(fdC), nil
}

// GetMapInfoByFD returns the BPFMapInfo for the map with the given file descriptor.
func GetMapInfoByFD(fd int) (*BPFMapInfo, error) {
var info C.struct_bpf_map_info
Expand Down
1 change: 1 addition & 0 deletions selftest/map-getfdbyid/Makefile
7 changes: 7 additions & 0 deletions selftest/map-getfdbyid/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-getfdbyid/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=
14 changes: 14 additions & 0 deletions selftest/map-getfdbyid/main.bpf.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
//+build ignore

#include <vmlinux.h>

#include <bpf/bpf_helpers.h>

struct {
__uint(type, BPF_MAP_TYPE_HASH);
__type(key, u32);
__type(value, u32);
__uint(max_entries, 1);
} tester SEC(".maps");

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

import "C"

import (
"log"

bpf "github.com/aquasecurity/libbpfgo"
)

func main() {
bpfModule, err := bpf.NewModuleFromFile("main.bpf.o")
if err != nil {
log.Fatal(err)
}
defer bpfModule.Close()

bpfModule.BPFLoadObject()

testerMap, err := bpfModule.GetMap("tester")
if err != nil {
log.Fatal(err)
}

// Get info about the "tester" map
infoTester, err := bpf.GetMapInfoByFD(testerMap.FileDescriptor())
if err != nil {
log.Fatal(err)
}

// Get a new FD pointing to the "tester" map
newFD, err := bpf.GetMapFDByID(infoTester.ID)
if err != nil {
log.Fatal(err)
}

// Get info about the "tester" map again, this time using the new FD
infoNewFD, err := bpf.GetMapInfoByFD(newFD)
if err != nil {
log.Fatal(err)
}

if infoTester.Type != infoNewFD.Type {
log.Fatal("Types do not match")
}
if infoTester.ID != infoNewFD.ID {
log.Fatal("IDs do not match")
}
if infoTester.KeySize != infoNewFD.KeySize {
log.Fatal("Key sizes do not match")
}
if infoTester.ValueSize != infoNewFD.ValueSize {
log.Fatal("Value sizes do not match")
}
if infoTester.MaxEntries != infoNewFD.MaxEntries {
log.Fatal("Max entries do not match")
}
if infoTester.MapFlags != infoNewFD.MapFlags {
log.Fatal("Map flags do not match")
}
if infoTester.Name != infoNewFD.Name {
log.Fatal("Names do not match")
}
if infoTester.IfIndex != infoNewFD.IfIndex {
log.Fatal("Ifindexes do not match")
}
if infoTester.NetnsDev != infoNewFD.NetnsDev {
log.Fatal("Netns do not match")
}
if infoTester.NetnsIno != infoNewFD.NetnsIno {
log.Fatal("Netns inodes do not match")
}
if infoTester.BTFID != infoNewFD.BTFID {
log.Fatal("BTF IDs do not match")
}
if infoTester.BTFKeyTypeID != infoNewFD.BTFKeyTypeID {
log.Fatal("BTF key type IDs do not match")
}
if infoTester.BTFValueTypeID != infoNewFD.BTFValueTypeID {
log.Fatal("BTF value type IDs do not match")
}
if infoTester.MapExtra != infoNewFD.MapExtra {
log.Fatal("Map extras do not match")
}
}
1 change: 1 addition & 0 deletions selftest/map-getfdbyid/run.sh

0 comments on commit 26259e3

Please sign in to comment.