ebpf_exporter

Форк
0
64 строки · 1.6 Кб
1
package exporter
2

3
/*
4
#include <stdlib.h>
5
#include <bpf/libbpf.h>
6

7
extern int attachXDPCallback(const struct bpf_program *prog,
8
                                   long cookie,
9
                                   struct bpf_link **link);
10
*/
11
import "C"
12

13
import (
14
	"fmt"
15
	"net"
16
	"strings"
17
	"syscall"
18
	"unsafe"
19

20
	"github.com/aquasecurity/libbpfgo"
21
	"golang.org/x/sys/unix"
22
)
23

24
var libbpfXDPHandlers []int
25

26
func registerXDPHandler() error {
27
	if libbpfXDPHandlers != nil {
28
		return nil
29
	}
30

31
	name := C.CString("xdp/")
32
	defer C.free(unsafe.Pointer(name))
33

34
	opts := C.struct_libbpf_prog_handler_opts{}
35
	opts.sz = C.sizeof_struct_libbpf_prog_handler_opts
36
	opts.prog_attach_fn = C.libbpf_prog_attach_fn_t(C.attachXDPCallback)
37

38
	handler := C.libbpf_register_prog_handler(name, uint32(libbpfgo.BPFProgTypeXdp), uint32(libbpfgo.BPFAttachTypeXDP), &opts)
39
	if handler < 0 {
40
		return fmt.Errorf("error registering prog handler: %s", unix.ErrnoName(syscall.Errno(handler)))
41
	}
42

43
	libbpfXDPHandlers = append(libbpfXDPHandlers, int(handler))
44

45
	return nil
46
}
47

48
func attachXDP(prog *C.struct_bpf_program) ([]*C.struct_bpf_link, error) {
49
	name := C.GoString(C.bpf_program__name(prog))
50
	section := C.GoString(C.bpf_program__section_name(prog))
51
	device := strings.TrimPrefix(section, "xdp/")
52

53
	iface, err := net.InterfaceByName(device)
54
	if err != nil {
55
		return nil, fmt.Errorf("failed to find device %q for program %q: %v", device, name, err)
56
	}
57

58
	link, err := C.bpf_program__attach_xdp(prog, C.int(iface.Index))
59
	if link == nil {
60
		return nil, fmt.Errorf("failed to attach xdp on device %q for program %s: %v", device, name, err)
61
	}
62

63
	return []*C.struct_bpf_link{link}, nil
64
}
65

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.