1 package link
2
3 import (
4 "testing"
5
6 "github.com/cilium/ebpf"
7 "github.com/cilium/ebpf/internal"
8 "github.com/cilium/ebpf/internal/testutils"
9 )
10
11 func TestFreplace(t *testing.T) {
12 testutils.SkipOnOldKernel(t, "5.10", "freplace")
13
14 testutils.Files(t, testutils.Glob(t, "../testdata/freplace-*.elf"), func(t *testing.T, file string) {
15 spec, err := ebpf.LoadCollectionSpec(file)
16 if err != nil {
17 t.Fatal("Can't parse ELF:", err)
18 }
19
20 if spec.ByteOrder != internal.NativeEndian {
21 return
22 }
23
24 target, err := ebpf.NewProgram(spec.Programs["sched_process_exec"])
25 testutils.SkipIfNotSupported(t, err)
26 if err != nil {
27 t.Fatal("Can't create target program:", err)
28 }
29 defer target.Close()
30
31
32 spec.Programs["replacement"].AttachTarget = target
33 replacement, err := ebpf.NewProgram(spec.Programs["replacement"])
34 testutils.SkipIfNotSupported(t, err)
35 if err != nil {
36 t.Fatal("Can't create replacement program:", err)
37 }
38 defer replacement.Close()
39
40 freplace, err := AttachFreplace(nil, "", replacement)
41 if err != nil {
42 t.Fatal("Can't create freplace:", err)
43 }
44
45 testLink(t, freplace, replacement)
46 })
47 }
48
49 func TestTracing(t *testing.T) {
50 testutils.SkipOnOldKernel(t, "5.11", "BPF_LINK_TYPE_TRACING")
51 tests := []struct {
52 name string
53 attachTo string
54 programType ebpf.ProgramType
55 attachType ebpf.AttachType
56 }{
57 {
58 name: "AttachTraceFEntry",
59 attachTo: "inet_dgram_connect",
60 programType: ebpf.Tracing,
61 attachType: ebpf.AttachTraceFEntry,
62 },
63 {
64 name: "AttachTraceFExit",
65 attachTo: "inet_dgram_connect",
66 programType: ebpf.Tracing,
67 attachType: ebpf.AttachTraceFExit,
68 },
69 {
70 name: "AttachModifyReturn",
71 attachTo: "bpf_modify_return_test",
72 programType: ebpf.Tracing,
73 attachType: ebpf.AttachModifyReturn,
74 },
75 {
76 name: "AttachTraceRawTp",
77 attachTo: "kfree_skb",
78 programType: ebpf.Tracing,
79 attachType: ebpf.AttachTraceRawTp,
80 },
81 }
82
83 for _, tt := range tests {
84 t.Run(tt.name, func(t *testing.T) {
85 prog := mustLoadProgram(t, tt.programType, tt.attachType, tt.attachTo)
86
87 link, err := AttachTracing(TracingOptions{Program: prog})
88 if err != nil {
89 t.Fatal(err)
90 }
91
92 testLink(t, link, prog)
93 })
94 }
95 }
96
97 func TestLSM(t *testing.T) {
98 testutils.SkipOnOldKernel(t, "5.11", "BPF_LINK_TYPE_TRACING")
99
100 prog := mustLoadProgram(t, ebpf.LSM, ebpf.AttachLSMMac, "file_mprotect")
101
102 link, err := AttachLSM(LSMOptions{Program: prog})
103 if err != nil {
104 t.Fatal(err)
105 }
106
107 testLink(t, link, prog)
108 }
109
View as plain text