gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

raw_tracepoint.go (2105B)


      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 	// Tracepoint name.
     13 	Name string
     14 	// Program must be of type RawTracepoint*
     15 	Program *ebpf.Program
     16 }
     17 
     18 // AttachRawTracepoint links a BPF program to a raw_tracepoint.
     19 //
     20 // Requires at least Linux 4.17.
     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 		// Prior to commit 70ed506c3bbc ("bpf: Introduce pinnable bpf_link abstraction")
     40 		// raw_tracepoints are just a plain fd.
     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 }