tetragon

Форк
0
/
map_update.go 
74 строки · 1.5 Кб
1
// SPDX-License-Identifier: Apache-2.0
2
// Copyright Authors of Tetragon
3

4
package sensors
5

6
import (
7
	"fmt"
8

9
	"github.com/cilium/ebpf"
10
	"github.com/cilium/ebpf/asm"
11
)
12

13
func UpdateStatsMap(m *ebpf.Map, val int64) error {
14
	if m.KeySize() != uint32(4) || m.ValueSize() != uint32(8) {
15
		return fmt.Errorf("Wrong key/value size")
16
	}
17

18
	if m.Type() != ebpf.PerCPUArray {
19
		return fmt.Errorf("Wrong map type")
20
	}
21

22
	prog, err := ebpf.NewProgram(&ebpf.ProgramSpec{
23
		Type: ebpf.SocketFilter,
24
		Instructions: asm.Instructions{
25
			// map fd into r1
26
			asm.LoadMapPtr(asm.R1, m.FD()),
27

28
			// 0 into &FP[-4]
29
			asm.LoadImm(asm.R2, 0, asm.DWord),
30
			asm.StoreMem(asm.RFP, -4, asm.R2, asm.Word),
31

32
			// &FP[-4] into r2
33
			asm.Mov.Reg(asm.R2, asm.RFP),
34
			asm.Add.Imm(asm.R2, -4),
35

36
			asm.FnMapLookupElem.Call(),
37

38
			// NULL ptr, jump to error
39
			asm.JEq.Imm(asm.R0, 0, "error"),
40

41
			// add 'val' to the elem value
42
			asm.LoadImm(asm.R1, val, asm.DWord),
43
			asm.StoreXAdd(asm.R0, asm.R1, asm.DWord),
44

45
			// return 0
46
			asm.LoadImm(asm.R0, 0, asm.DWord),
47
			asm.Return(),
48

49
			// return 1
50
			asm.LoadImm(asm.R0, 1, asm.DWord).WithSymbol("error"),
51
			asm.Return(),
52
		},
53
		License: "GPL",
54
	})
55

56
	if err != nil {
57
		return err
58
	}
59
	defer prog.Close()
60

61
	// not used, but needed to pass program test run
62
	in := make([]byte, 20)
63

64
	var ret uint32
65

66
	opts := ebpf.RunOptions{Data: in}
67
	ret, err = prog.Run(&opts)
68

69
	// executed, but failed in bpf program above
70
	if err == nil && ret != 0 {
71
		err = fmt.Errorf("Failed to update map value")
72
	}
73
	return err
74
}
75

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

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

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

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