From d29f9c244ce9300275dbd741150ac7b2dabc54d5 Mon Sep 17 00:00:00 2001 From: grantseltzer Date: Wed, 4 May 2022 11:10:36 -0400 Subject: [PATCH 1/3] Add helper functions for checking if map and program types are supported Signed-off-by: grantseltzer --- libbpfgo.go | 18 +++++++- selftest/probe-features/Makefile | 1 + selftest/probe-features/go.mod | 7 ++++ selftest/probe-features/go.sum | 11 +++++ selftest/probe-features/main.bpf.c | 13 ++++++ selftest/probe-features/main.go | 66 ++++++++++++++++++++++++++++++ selftest/probe-features/run.sh | 1 + 7 files changed, 116 insertions(+), 1 deletion(-) create mode 120000 selftest/probe-features/Makefile create mode 100644 selftest/probe-features/go.mod create mode 100644 selftest/probe-features/go.sum create mode 100644 selftest/probe-features/main.bpf.c create mode 100644 selftest/probe-features/main.go create mode 120000 selftest/probe-features/run.sh diff --git a/libbpfgo.go b/libbpfgo.go index e5117390..ec886115 100644 --- a/libbpfgo.go +++ b/libbpfgo.go @@ -787,7 +787,7 @@ func (b *BPFMap) DeleteKeyBatch(keys unsafe.Pointer, count uint32) error { ElemFlags: C.BPF_ANY, Flags: C.BPF_ANY, } - + errC := C.bpf_map_delete_batch(b.fd, keys, &countC, bpfMapBatchOptsToC(opts)) if errC != 0 { sc := syscall.Errno(-errC) @@ -1641,3 +1641,19 @@ func (hook *TcHook) Query(tcOpts *TcOpts) error { return nil } + +func BPFMapTypeIsSupported(mapType MapType) (bool, error) { + cSupported := C.libbpf_probe_bpf_map_type(C.enum_bpf_map_type(int(mapType)), nil) + if cSupported < 1 { + return false, syscall.Errno(-cSupported) + } + return cSupported == 1, nil +} + +func BPFProgramTypeIsSupported(progType BPFProgType) (bool, error) { + cSupported := C.libbpf_probe_bpf_prog_type(C.enum_bpf_prog_type(int(progType)), nil) + if cSupported < 1 { + return false, syscall.Errno(-cSupported) + } + return cSupported == 1, nil +} diff --git a/selftest/probe-features/Makefile b/selftest/probe-features/Makefile new file mode 120000 index 00000000..d981720c --- /dev/null +++ b/selftest/probe-features/Makefile @@ -0,0 +1 @@ +../common/Makefile \ No newline at end of file diff --git a/selftest/probe-features/go.mod b/selftest/probe-features/go.mod new file mode 100644 index 00000000..0e8502bf --- /dev/null +++ b/selftest/probe-features/go.mod @@ -0,0 +1,7 @@ +module github.com/aquasecurity/libbpfgo/selftest/map-pin-info + +go 1.16 + +require github.com/aquasecurity/libbpfgo v0.2.1-libbpf-0.4.0 + +replace github.com/aquasecurity/libbpfgo => ../../ diff --git a/selftest/probe-features/go.sum b/selftest/probe-features/go.sum new file mode 100644 index 00000000..3b1886cc --- /dev/null +++ b/selftest/probe-features/go.sum @@ -0,0 +1,11 @@ +github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +golang.org/x/sys v0.0.0-20210514084401-e8d321eab015/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/selftest/probe-features/main.bpf.c b/selftest/probe-features/main.bpf.c new file mode 100644 index 00000000..e526e4cd --- /dev/null +++ b/selftest/probe-features/main.bpf.c @@ -0,0 +1,13 @@ +//+build ignore +#include "vmlinux.h" +#include + + +SEC("kprobe/sys_mmap") +int kprobe__sys_mmap(struct pt_regs *ctx) +{ + bpf_printk("Yankees will win the 2022 world series"); + return 0; +} + +char LICENSE[] SEC("license") = "Dual BSD/GPL"; diff --git a/selftest/probe-features/main.go b/selftest/probe-features/main.go new file mode 100644 index 00000000..8b2b0d5e --- /dev/null +++ b/selftest/probe-features/main.go @@ -0,0 +1,66 @@ +package main + +import "C" + +import ( + "fmt" + "log" + "os" + + "github.com/aquasecurity/libbpfgo" + 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() + + kprobeProg, err := bpfModule.GetProgram("kprobe__sys_mmap") + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(-1) + } + + err = kprobeProg.SetAutoload(false) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(-1) + } + + isSupported, err := bpf.BPFProgramTypeIsSupported(libbpfgo.BPFProgTypeKprobe) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(-1) + } + + if isSupported { + err = kprobeProg.SetAutoload(true) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(-1) + } + } + + err = bpfModule.BPFLoadObject() + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(-1) + } + + isSupported, err = bpf.BPFMapTypeIsSupported(libbpfgo.MapTypeHash) + if err != nil { + fmt.Fprintln(os.Stderr, err) + os.Exit(-1) + } + + if isSupported { + _, err = libbpfgo.CreateMap(libbpfgo.MapTypeHash, "foobar", 4, 4, 420, nil) + if err != nil { + log.Fatal(err) + } + } +} diff --git a/selftest/probe-features/run.sh b/selftest/probe-features/run.sh new file mode 120000 index 00000000..aee911b2 --- /dev/null +++ b/selftest/probe-features/run.sh @@ -0,0 +1 @@ +../common/run.sh \ No newline at end of file From e5e554326c6e62b690486f9948609fa6d2716bfd Mon Sep 17 00:00:00 2001 From: grantseltzer Date: Wed, 4 May 2022 15:54:13 -0400 Subject: [PATCH 2/3] Helper for getting section name Signed-off-by: grantseltzer --- libbpfgo.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libbpfgo.go b/libbpfgo.go index ec886115..4ac216aa 100644 --- a/libbpfgo.go +++ b/libbpfgo.go @@ -954,6 +954,12 @@ func (p *BPFProg) GetName() string { return p.name } +func (p *BPFProg) GetSectionName() string { + cs := C.bpf_program__section_name(p.prog) + gs := C.GoString(cs) + return gs +} + func (p *BPFProg) GetPinPath() string { return p.pinnedPath } From 9f0408e53407783904d7ef7eb02828f318f4aa04 Mon Sep 17 00:00:00 2001 From: grantseltzer Date: Fri, 6 May 2022 09:31:29 -0400 Subject: [PATCH 3/3] fix allignment Signed-off-by: grantseltzer --- selftest/probe-features/main.bpf.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/selftest/probe-features/main.bpf.c b/selftest/probe-features/main.bpf.c index e526e4cd..d8d10068 100644 --- a/selftest/probe-features/main.bpf.c +++ b/selftest/probe-features/main.bpf.c @@ -6,7 +6,7 @@ SEC("kprobe/sys_mmap") int kprobe__sys_mmap(struct pt_regs *ctx) { - bpf_printk("Yankees will win the 2022 world series"); + bpf_printk("Yankees will win the 2022 world series"); return 0; }