2023-01-17 23:59:04 +03:00
|
|
|
package link
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"github.com/cilium/ebpf"
|
2023-04-03 12:16:17 +03:00
|
|
|
"github.com/cilium/ebpf/internal/sys"
|
2023-01-17 23:59:04 +03:00
|
|
|
)
|
|
|
|
|
|
|
|
type RawAttachProgramOptions struct {
|
|
|
|
// File descriptor to attach to. This differs for each attach type.
|
|
|
|
Target int
|
|
|
|
// Program to attach.
|
|
|
|
Program *ebpf.Program
|
|
|
|
// Program to replace (cgroups).
|
|
|
|
Replace *ebpf.Program
|
|
|
|
// Attach must match the attach type of Program (and Replace).
|
|
|
|
Attach ebpf.AttachType
|
|
|
|
// Flags control the attach behaviour. This differs for each attach type.
|
|
|
|
Flags uint32
|
|
|
|
}
|
|
|
|
|
|
|
|
// RawAttachProgram is a low level wrapper around BPF_PROG_ATTACH.
|
|
|
|
//
|
|
|
|
// You should use one of the higher level abstractions available in this
|
|
|
|
// package if possible.
|
|
|
|
func RawAttachProgram(opts RawAttachProgramOptions) error {
|
|
|
|
if err := haveProgAttach(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
var replaceFd uint32
|
|
|
|
if opts.Replace != nil {
|
|
|
|
replaceFd = uint32(opts.Replace.FD())
|
|
|
|
}
|
|
|
|
|
2023-04-03 12:16:17 +03:00
|
|
|
attr := sys.ProgAttachAttr{
|
2023-01-17 23:59:04 +03:00
|
|
|
TargetFd: uint32(opts.Target),
|
|
|
|
AttachBpfFd: uint32(opts.Program.FD()),
|
|
|
|
ReplaceBpfFd: replaceFd,
|
|
|
|
AttachType: uint32(opts.Attach),
|
|
|
|
AttachFlags: uint32(opts.Flags),
|
|
|
|
}
|
|
|
|
|
2023-04-03 12:16:17 +03:00
|
|
|
if err := sys.ProgAttach(&attr); err != nil {
|
|
|
|
return fmt.Errorf("can't attach program: %w", err)
|
2023-01-17 23:59:04 +03:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
type RawDetachProgramOptions struct {
|
|
|
|
Target int
|
|
|
|
Program *ebpf.Program
|
|
|
|
Attach ebpf.AttachType
|
|
|
|
}
|
|
|
|
|
|
|
|
// RawDetachProgram is a low level wrapper around BPF_PROG_DETACH.
|
|
|
|
//
|
|
|
|
// You should use one of the higher level abstractions available in this
|
|
|
|
// package if possible.
|
|
|
|
func RawDetachProgram(opts RawDetachProgramOptions) error {
|
|
|
|
if err := haveProgAttach(); err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2023-04-03 12:16:17 +03:00
|
|
|
attr := sys.ProgDetachAttr{
|
2023-01-17 23:59:04 +03:00
|
|
|
TargetFd: uint32(opts.Target),
|
|
|
|
AttachBpfFd: uint32(opts.Program.FD()),
|
|
|
|
AttachType: uint32(opts.Attach),
|
|
|
|
}
|
2023-04-03 12:16:17 +03:00
|
|
|
if err := sys.ProgDetach(&attr); err != nil {
|
|
|
|
return fmt.Errorf("can't detach program: %w", err)
|
2023-01-17 23:59:04 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|