...
1 package link
2
3 import (
4 "errors"
5 "fmt"
6
7 "github.com/cilium/ebpf"
8 "github.com/cilium/ebpf/internal/sys"
9 )
10
11 type RawTracepointOptions struct {
12
13 Name string
14
15 Program *ebpf.Program
16 }
17
18
19
20
21 func AttachRawTracepoint(opts RawTracepointOptions) (Link, error) {
22 if t := opts.Program.Type(); t != ebpf.RawTracepoint && t != ebpf.RawTracepointWritable {
23 return nil, fmt.Errorf("invalid program type %s, expected RawTracepoint(Writable)", t)
24 }
25 if opts.Program.FD() < 0 {
26 return nil, fmt.Errorf("invalid program: %w", sys.ErrClosedFd)
27 }
28
29 fd, err := sys.RawTracepointOpen(&sys.RawTracepointOpenAttr{
30 Name: sys.NewStringPointer(opts.Name),
31 ProgFd: uint32(opts.Program.FD()),
32 })
33 if err != nil {
34 return nil, err
35 }
36
37 err = haveBPFLink()
38 if errors.Is(err, ErrNotSupported) {
39
40
41 return &simpleRawTracepoint{fd}, nil
42 }
43
44 if err != nil {
45 return nil, err
46 }
47
48 return &rawTracepoint{RawLink{fd: fd}}, nil
49 }
50
51 type simpleRawTracepoint struct {
52 fd *sys.FD
53 }
54
55 var _ Link = (*simpleRawTracepoint)(nil)
56
57 func (frt *simpleRawTracepoint) isLink() {}
58
59 func (frt *simpleRawTracepoint) Close() error {
60 return frt.fd.Close()
61 }
62
63 func (frt *simpleRawTracepoint) Update(_ *ebpf.Program) error {
64 return fmt.Errorf("update raw_tracepoint: %w", ErrNotSupported)
65 }
66
67 func (frt *simpleRawTracepoint) Pin(string) error {
68 return fmt.Errorf("pin raw_tracepoint: %w", ErrNotSupported)
69 }
70
71 func (frt *simpleRawTracepoint) Unpin() error {
72 return fmt.Errorf("unpin raw_tracepoint: %w", ErrNotSupported)
73 }
74
75 func (frt *simpleRawTracepoint) Info() (*Info, error) {
76 return nil, fmt.Errorf("can't get raw_tracepoint info: %w", ErrNotSupported)
77 }
78
79 type rawTracepoint struct {
80 RawLink
81 }
82
83 var _ Link = (*rawTracepoint)(nil)
84
85 func (rt *rawTracepoint) Update(_ *ebpf.Program) error {
86 return fmt.Errorf("update raw_tracepoint: %w", ErrNotSupported)
87 }
88
View as plain text