-
Notifications
You must be signed in to change notification settings - Fork 2.7k
/
link.go
47 lines (40 loc) · 1.12 KB
/
link.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// SPDX-License-Identifier: Apache-2.0
// Copyright Authors of Cilium
package bpf
import (
"fmt"
"github.com/cilium/ebpf"
"github.com/cilium/ebpf/link"
)
// UpdateLink loads a pinned bpf_link at the given pin path and updates its
// program.
//
// Returns [os.ErrNotExist] if the pin is not found.
//
// Updating the link can fail if it is defunct (the hook it points to no longer
// exists).
func UpdateLink(pin string, prog *ebpf.Program) error {
l, err := link.LoadPinnedLink(pin, &ebpf.LoadPinOptions{})
if err != nil {
return fmt.Errorf("opening pinned link %s: %w", pin, err)
}
defer l.Close()
if err = l.Update(prog); err != nil {
return fmt.Errorf("updating link %s: %w", pin, err)
}
return nil
}
// DetachLink loads and unpins a bpf_link at the given pin path.
//
// Returns [os.ErrNotExist] if the pin is not found.
func UnpinLink(pin string) error {
l, err := link.LoadPinnedLink(pin, &ebpf.LoadPinOptions{})
if err != nil {
return fmt.Errorf("opening pinned link %s: %w", pin, err)
}
defer l.Close()
if err := l.Unpin(); err != nil {
return fmt.Errorf("unpinning link %s: %w", pin, err)
}
return nil
}