summaryrefslogtreecommitdiff
path: root/vendor/github.com/cilium/ebpf/internal
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/cilium/ebpf/internal')
-rw-r--r--vendor/github.com/cilium/ebpf/internal/align.go6
-rw-r--r--vendor/github.com/cilium/ebpf/internal/btf/btf.go791
-rw-r--r--vendor/github.com/cilium/ebpf/internal/btf/btf_types.go269
-rw-r--r--vendor/github.com/cilium/ebpf/internal/btf/core.go388
-rw-r--r--vendor/github.com/cilium/ebpf/internal/btf/doc.go8
-rw-r--r--vendor/github.com/cilium/ebpf/internal/btf/ext_info.go281
-rw-r--r--vendor/github.com/cilium/ebpf/internal/btf/fuzz.go49
-rw-r--r--vendor/github.com/cilium/ebpf/internal/btf/strings.go60
-rw-r--r--vendor/github.com/cilium/ebpf/internal/btf/types.go871
-rw-r--r--vendor/github.com/cilium/ebpf/internal/cpu.go4
-rw-r--r--vendor/github.com/cilium/ebpf/internal/elf.go50
-rw-r--r--vendor/github.com/cilium/ebpf/internal/endian.go24
-rw-r--r--vendor/github.com/cilium/ebpf/internal/endian_be.go13
-rw-r--r--vendor/github.com/cilium/ebpf/internal/endian_le.go13
-rw-r--r--vendor/github.com/cilium/ebpf/internal/errors.go205
-rw-r--r--vendor/github.com/cilium/ebpf/internal/fd.go69
-rw-r--r--vendor/github.com/cilium/ebpf/internal/feature.go48
-rw-r--r--vendor/github.com/cilium/ebpf/internal/io.go48
-rw-r--r--vendor/github.com/cilium/ebpf/internal/output.go84
-rw-r--r--vendor/github.com/cilium/ebpf/internal/pinning.go77
-rw-r--r--vendor/github.com/cilium/ebpf/internal/ptr_64.go14
-rw-r--r--vendor/github.com/cilium/ebpf/internal/sys/doc.go6
-rw-r--r--vendor/github.com/cilium/ebpf/internal/sys/fd.go96
-rw-r--r--vendor/github.com/cilium/ebpf/internal/sys/ptr.go (renamed from vendor/github.com/cilium/ebpf/internal/ptr.go)24
-rw-r--r--vendor/github.com/cilium/ebpf/internal/sys/ptr_32_be.go (renamed from vendor/github.com/cilium/ebpf/internal/ptr_32_be.go)3
-rw-r--r--vendor/github.com/cilium/ebpf/internal/sys/ptr_32_le.go (renamed from vendor/github.com/cilium/ebpf/internal/ptr_32_le.go)3
-rw-r--r--vendor/github.com/cilium/ebpf/internal/sys/ptr_64.go14
-rw-r--r--vendor/github.com/cilium/ebpf/internal/sys/syscall.go126
-rw-r--r--vendor/github.com/cilium/ebpf/internal/sys/types.go1052
-rw-r--r--vendor/github.com/cilium/ebpf/internal/syscall.go179
-rw-r--r--vendor/github.com/cilium/ebpf/internal/syscall_string.go56
-rw-r--r--vendor/github.com/cilium/ebpf/internal/unix/types_linux.go72
-rw-r--r--vendor/github.com/cilium/ebpf/internal/unix/types_other.go64
-rw-r--r--vendor/github.com/cilium/ebpf/internal/vdso.go150
-rw-r--r--vendor/github.com/cilium/ebpf/internal/version.go122
35 files changed, 2178 insertions, 3161 deletions
diff --git a/vendor/github.com/cilium/ebpf/internal/align.go b/vendor/github.com/cilium/ebpf/internal/align.go
new file mode 100644
index 000000000..8b4f2658e
--- /dev/null
+++ b/vendor/github.com/cilium/ebpf/internal/align.go
@@ -0,0 +1,6 @@
+package internal
+
+// Align returns 'n' updated to 'alignment' boundary.
+func Align(n, alignment int) int {
+ return (int(n) + alignment - 1) / alignment * alignment
+}
diff --git a/vendor/github.com/cilium/ebpf/internal/btf/btf.go b/vendor/github.com/cilium/ebpf/internal/btf/btf.go
deleted file mode 100644
index 1e66d9476..000000000
--- a/vendor/github.com/cilium/ebpf/internal/btf/btf.go
+++ /dev/null
@@ -1,791 +0,0 @@
-package btf
-
-import (
- "bytes"
- "debug/elf"
- "encoding/binary"
- "errors"
- "fmt"
- "io"
- "io/ioutil"
- "math"
- "os"
- "reflect"
- "sync"
- "unsafe"
-
- "github.com/cilium/ebpf/internal"
- "github.com/cilium/ebpf/internal/unix"
-)
-
-const btfMagic = 0xeB9F
-
-// Errors returned by BTF functions.
-var (
- ErrNotSupported = internal.ErrNotSupported
- ErrNotFound = errors.New("not found")
- ErrNoExtendedInfo = errors.New("no extended info")
-)
-
-// Spec represents decoded BTF.
-type Spec struct {
- rawTypes []rawType
- strings stringTable
- types []Type
- namedTypes map[string][]namedType
- funcInfos map[string]extInfo
- lineInfos map[string]extInfo
- coreRelos map[string]bpfCoreRelos
- byteOrder binary.ByteOrder
-}
-
-type btfHeader struct {
- Magic uint16
- Version uint8
- Flags uint8
- HdrLen uint32
-
- TypeOff uint32
- TypeLen uint32
- StringOff uint32
- StringLen uint32
-}
-
-// LoadSpecFromReader reads BTF sections from an ELF.
-//
-// Returns a nil Spec and no error if no BTF was present.
-func LoadSpecFromReader(rd io.ReaderAt) (*Spec, error) {
- file, err := internal.NewSafeELFFile(rd)
- if err != nil {
- return nil, err
- }
- defer file.Close()
-
- btfSection, btfExtSection, sectionSizes, err := findBtfSections(file)
- if err != nil {
- return nil, err
- }
-
- if btfSection == nil {
- return nil, nil
- }
-
- symbols, err := file.Symbols()
- if err != nil {
- return nil, fmt.Errorf("can't read symbols: %v", err)
- }
-
- variableOffsets := make(map[variable]uint32)
- for _, symbol := range symbols {
- if idx := symbol.Section; idx >= elf.SHN_LORESERVE && idx <= elf.SHN_HIRESERVE {
- // Ignore things like SHN_ABS
- continue
- }
-
- if int(symbol.Section) >= len(file.Sections) {
- return nil, fmt.Errorf("symbol %s: invalid section %d", symbol.Name, symbol.Section)
- }
-
- secName := file.Sections[symbol.Section].Name
- if _, ok := sectionSizes[secName]; !ok {
- continue
- }
-
- if symbol.Value > math.MaxUint32 {
- return nil, fmt.Errorf("section %s: symbol %s: size exceeds maximum", secName, symbol.Name)
- }
-
- variableOffsets[variable{secName, symbol.Name}] = uint32(symbol.Value)
- }
-
- spec, err := loadNakedSpec(btfSection.Open(), file.ByteOrder, sectionSizes, variableOffsets)
- if err != nil {
- return nil, err
- }
-
- if btfExtSection == nil {
- return spec, nil
- }
-
- spec.funcInfos, spec.lineInfos, spec.coreRelos, err = parseExtInfos(btfExtSection.Open(), file.ByteOrder, spec.strings)
- if err != nil {
- return nil, fmt.Errorf("can't read ext info: %w", err)
- }
-
- return spec, nil
-}
-
-func findBtfSections(file *internal.SafeELFFile) (*elf.Section, *elf.Section, map[string]uint32, error) {
- var (
- btfSection *elf.Section
- btfExtSection *elf.Section
- sectionSizes = make(map[string]uint32)
- )
-
- for _, sec := range file.Sections {
- switch sec.Name {
- case ".BTF":
- btfSection = sec
- case ".BTF.ext":
- btfExtSection = sec
- default:
- if sec.Type != elf.SHT_PROGBITS && sec.Type != elf.SHT_NOBITS {
- break
- }
-
- if sec.Size > math.MaxUint32 {
- return nil, nil, nil, fmt.Errorf("section %s exceeds maximum size", sec.Name)
- }
-
- sectionSizes[sec.Name] = uint32(sec.Size)
- }
- }
- return btfSection, btfExtSection, sectionSizes, nil
-}
-
-func loadSpecFromVmlinux(rd io.ReaderAt) (*Spec, error) {
- file, err := internal.NewSafeELFFile(rd)
- if err != nil {
- return nil, err
- }
- defer file.Close()
-
- btfSection, _, _, err := findBtfSections(file)
- if err != nil {
- return nil, fmt.Errorf(".BTF ELF section: %s", err)
- }
- if btfSection == nil {
- return nil, fmt.Errorf("unable to find .BTF ELF section")
- }
- return loadNakedSpec(btfSection.Open(), file.ByteOrder, nil, nil)
-}
-
-func loadNakedSpec(btf io.ReadSeeker, bo binary.ByteOrder, sectionSizes map[string]uint32, variableOffsets map[variable]uint32) (*Spec, error) {
- rawTypes, rawStrings, err := parseBTF(btf, bo)
- if err != nil {
- return nil, err
- }
-
- err = fixupDatasec(rawTypes, rawStrings, sectionSizes, variableOffsets)
- if err != nil {
- return nil, err
- }
-
- types, typesByName, err := inflateRawTypes(rawTypes, rawStrings)
- if err != nil {
- return nil, err
- }
-
- return &Spec{
- rawTypes: rawTypes,
- namedTypes: typesByName,
- types: types,
- strings: rawStrings,
- byteOrder: bo,
- }, nil
-}
-
-var kernelBTF struct {
- sync.Mutex
- *Spec
-}
-
-// LoadKernelSpec returns the current kernel's BTF information.
-//
-// Requires a >= 5.5 kernel with CONFIG_DEBUG_INFO_BTF enabled. Returns
-// ErrNotSupported if BTF is not enabled.
-func LoadKernelSpec() (*Spec, error) {
- kernelBTF.Lock()
- defer kernelBTF.Unlock()
-
- if kernelBTF.Spec != nil {
- return kernelBTF.Spec, nil
- }
-
- var err error
- kernelBTF.Spec, err = loadKernelSpec()
- return kernelBTF.Spec, err
-}
-
-func loadKernelSpec() (*Spec, error) {
- release, err := unix.KernelRelease()
- if err != nil {
- return nil, fmt.Errorf("can't read kernel release number: %w", err)
- }
-
- fh, err := os.Open("/sys/kernel/btf/vmlinux")
- if err == nil {
- defer fh.Close()
-
- return loadNakedSpec(fh, internal.NativeEndian, nil, nil)
- }
-
- // use same list of locations as libbpf
- // https://github.com/libbpf/libbpf/blob/9a3a42608dbe3731256a5682a125ac1e23bced8f/src/btf.c#L3114-L3122
- locations := []string{
- "/boot/vmlinux-%s",
- "/lib/modules/%s/vmlinux-%[1]s",
- "/lib/modules/%s/build/vmlinux",
- "/usr/lib/modules/%s/kernel/vmlinux",
- "/usr/lib/debug/boot/vmlinux-%s",
- "/usr/lib/debug/boot/vmlinux-%s.debug",
- "/usr/lib/debug/lib/modules/%s/vmlinux",
- }
-
- for _, loc := range locations {
- path := fmt.Sprintf(loc, release)
-
- fh, err := os.Open(path)
- if err != nil {
- continue
- }
- defer fh.Close()
-
- return loadSpecFromVmlinux(fh)
- }
-
- return nil, fmt.Errorf("no BTF for kernel version %s: %w", release, internal.ErrNotSupported)
-}
-
-func parseBTF(btf io.ReadSeeker, bo binary.ByteOrder) ([]rawType, stringTable, error) {
- rawBTF, err := ioutil.ReadAll(btf)
- if err != nil {
- return nil, nil, fmt.Errorf("can't read BTF: %v", err)
- }
-
- rd := bytes.NewReader(rawBTF)
-
- var header btfHeader
- if err := binary.Read(rd, bo, &header); err != nil {
- return nil, nil, fmt.Errorf("can't read header: %v", err)
- }
-
- if header.Magic != btfMagic {
- return nil, nil, fmt.Errorf("incorrect magic value %v", header.Magic)
- }
-
- if header.Version != 1 {
- return nil, nil, fmt.Errorf("unexpected version %v", header.Version)
- }
-
- if header.Flags != 0 {
- return nil, nil, fmt.Errorf("unsupported flags %v", header.Flags)
- }
-
- remainder := int64(header.HdrLen) - int64(binary.Size(&header))
- if remainder < 0 {
- return nil, nil, errors.New("header is too short")
- }
-
- if _, err := io.CopyN(internal.DiscardZeroes{}, rd, remainder); err != nil {
- return nil, nil, fmt.Errorf("header padding: %v", err)
- }
-
- if _, err := rd.Seek(int64(header.HdrLen+header.StringOff), io.SeekStart); err != nil {
- return nil, nil, fmt.Errorf("can't seek to start of string section: %v", err)
- }
-
- rawStrings, err := readStringTable(io.LimitReader(rd, int64(header.StringLen)))
- if err != nil {
- return nil, nil, fmt.Errorf("can't read type names: %w", err)
- }
-
- if _, err := rd.Seek(int64(header.HdrLen+header.TypeOff), io.SeekStart); err != nil {
- return nil, nil, fmt.Errorf("can't seek to start of type section: %v", err)
- }
-
- rawTypes, err := readTypes(io.LimitReader(rd, int64(header.TypeLen)), bo)
- if err != nil {
- return nil, nil, fmt.Errorf("can't read types: %w", err)
- }
-
- return rawTypes, rawStrings, nil
-}
-
-type variable struct {
- section string
- name string
-}
-
-func fixupDatasec(rawTypes []rawType, rawStrings stringTable, sectionSizes map[string]uint32, variableOffsets map[variable]uint32) error {
- for i, rawType := range rawTypes {
- if rawType.Kind() != kindDatasec {
- continue
- }
-
- name, err := rawStrings.Lookup(rawType.NameOff)
- if err != nil {
- return err
- }
-
- if name == ".kconfig" || name == ".ksyms" {
- return fmt.Errorf("reference to %s: %w", name, ErrNotSupported)
- }
-
- if rawTypes[i].SizeType != 0 {
- continue
- }
-
- size, ok := sectionSizes[name]
- if !ok {
- return fmt.Errorf("data section %s: missing size", name)
- }
-
- rawTypes[i].SizeType = size
-
- secinfos := rawType.data.([]btfVarSecinfo)
- for j, secInfo := range secinfos {
- id := int(secInfo.Type - 1)
- if id >= len(rawTypes) {
- return fmt.Errorf("data section %s: invalid type id %d for variable %d", name, id, j)
- }
-
- varName, err := rawStrings.Lookup(rawTypes[id].NameOff)
- if err != nil {
- return fmt.Errorf("data section %s: can't get name for type %d: %w", name, id, err)
- }
-
- offset, ok := variableOffsets[variable{name, varName}]
- if !ok {
- return fmt.Errorf("data section %s: missing offset for variable %s", name, varName)
- }
-
- secinfos[j].Offset = offset
- }
- }
-
- return nil
-}
-
-type marshalOpts struct {
- ByteOrder binary.ByteOrder
- StripFuncLinkage bool
-}
-
-func (s *Spec) marshal(opts marshalOpts) ([]byte, error) {
- var (
- buf bytes.Buffer
- header = new(btfHeader)
- headerLen = binary.Size(header)
- )
-
- // Reserve space for the header. We have to write it last since
- // we don't know the size of the type section yet.
- _, _ = buf.Write(make([]byte, headerLen))
-
- // Write type section, just after the header.
- for _, raw := range s.rawTypes {
- switch {
- case opts.StripFuncLinkage && raw.Kind() == kindFunc:
- raw.SetLinkage(linkageStatic)
- }
-
- if err := raw.Marshal(&buf, opts.ByteOrder); err != nil {
- return nil, fmt.Errorf("can't marshal BTF: %w", err)
- }
- }
-
- typeLen := uint32(buf.Len() - headerLen)
-
- // Write string section after type section.
- _, _ = buf.Write(s.strings)
-
- // Fill out the header, and write it out.
- header = &btfHeader{
- Magic: btfMagic,
- Version: 1,
- Flags: 0,
- HdrLen: uint32(headerLen),
- TypeOff: 0,
- TypeLen: typeLen,
- StringOff: typeLen,
- StringLen: uint32(len(s.strings)),
- }
-
- raw := buf.Bytes()
- err := binary.Write(sliceWriter(raw[:headerLen]), opts.ByteOrder, header)
- if err != nil {
- return nil, fmt.Errorf("can't write header: %v", err)
- }
-
- return raw, nil
-}
-
-type sliceWriter []byte
-
-func (sw sliceWriter) Write(p []byte) (int, error) {
- if len(p) != len(sw) {
- return 0, errors.New("size doesn't match")
- }
-
- return copy(sw, p), nil
-}
-
-// Program finds the BTF for a specific section.
-//
-// Length is the number of bytes in the raw BPF instruction stream.
-//
-// Returns an error which may wrap ErrNoExtendedInfo if the Spec doesn't
-// contain extended BTF info.
-func (s *Spec) Program(name string, length uint64) (*Program, error) {
- if length == 0 {
- return nil, errors.New("length musn't be zero")
- }
-
- if s.funcInfos == nil && s.lineInfos == nil && s.coreRelos == nil {
- return nil, fmt.Errorf("BTF for section %s: %w", name, ErrNoExtendedInfo)
- }
-
- funcInfos, funcOK := s.funcInfos[name]
- lineInfos, lineOK := s.lineInfos[name]
- coreRelos, coreOK := s.coreRelos[name]
-
- if !funcOK && !lineOK && !coreOK {
- return nil, fmt.Errorf("no extended BTF info for section %s", name)
- }
-
- return &Program{s, length, funcInfos, lineInfos, coreRelos}, nil
-}
-
-// Datasec returns the BTF required to create maps which represent data sections.
-func (s *Spec) Datasec(name string) (*Map, error) {
- var datasec Datasec
- if err := s.FindType(name, &datasec); err != nil {
- return nil, fmt.Errorf("data section %s: can't get BTF: %w", name, err)
- }
-
- m := NewMap(s, &Void{}, &datasec)
- return &m, nil
-}
-
-// FindType searches for a type with a specific name.
-//
-// hint determines the type of the returned Type.
-//
-// Returns an error wrapping ErrNotFound if no matching
-// type exists in spec.
-func (s *Spec) FindType(name string, typ Type) error {
- var (
- wanted = reflect.TypeOf(typ)
- candidate Type
- )
-
- for _, typ := range s.namedTypes[essentialName(name)] {
- if reflect.TypeOf(typ) != wanted {
- continue
- }
-
- // Match against the full name, not just the essential one.
- if typ.name() != name {
- continue
- }
-
- if candidate != nil {
- return fmt.Errorf("type %s: multiple candidates for %T", name, typ)
- }
-
- candidate = typ
- }
-
- if candidate == nil {
- return fmt.Errorf("type %s: %w", name, ErrNotFound)
- }
-
- value := reflect.Indirect(reflect.ValueOf(copyType(candidate)))
- reflect.Indirect(reflect.ValueOf(typ)).Set(value)
- return nil
-}
-
-// Handle is a reference to BTF loaded into the kernel.
-type Handle struct {
- fd *internal.FD
-}
-
-// NewHandle loads BTF into the kernel.
-//
-// Returns ErrNotSupported if BTF is not supported.
-func NewHandle(spec *Spec) (*Handle, error) {
- if err := haveBTF(); err != nil {
- return nil, err
- }
-
- if spec.byteOrder != internal.NativeEndian {
- return nil, fmt.Errorf("can't load %s BTF on %s", spec.byteOrder, internal.NativeEndian)
- }
-
- btf, err := spec.marshal(marshalOpts{
- ByteOrder: internal.NativeEndian,
- StripFuncLinkage: haveFuncLinkage() != nil,
- })
- if err != nil {
- return nil, fmt.Errorf("can't marshal BTF: %w", err)
- }
-
- if uint64(len(btf)) > math.MaxUint32 {
- return nil, errors.New("BTF exceeds the maximum size")
- }
-
- attr := &bpfLoadBTFAttr{
- btf: internal.NewSlicePointer(btf),
- btfSize: uint32(len(btf)),
- }
-
- fd, err := bpfLoadBTF(attr)
- if err != nil {
- logBuf := make([]byte, 64*1024)
- attr.logBuf = internal.NewSlicePointer(logBuf)
- attr.btfLogSize = uint32(len(logBuf))
- attr.btfLogLevel = 1
- _, logErr := bpfLoadBTF(attr)
- return nil, internal.ErrorWithLog(err, logBuf, logErr)
- }
-
- return &Handle{fd}, nil
-}
-
-// Close destroys the handle.
-//
-// Subsequent calls to FD will return an invalid value.
-func (h *Handle) Close() error {
- return h.fd.Close()
-}
-
-// FD returns the file descriptor for the handle.
-func (h *Handle) FD() int {
- value, err := h.fd.Value()
- if err != nil {
- return -1
- }
-
- return int(value)
-}
-
-// Map is the BTF for a map.
-type Map struct {
- spec *Spec
- key, value Type
-}
-
-// NewMap returns a new Map containing the given values.
-// The key and value arguments are initialized to Void if nil values are given.
-func NewMap(spec *Spec, key Type, value Type) Map {
- if key == nil {
- key = &Void{}
- }
- if value == nil {
- value = &Void{}
- }
-
- return Map{
- spec: spec,
- key: key,
- value: value,
- }
-}
-
-// MapSpec should be a method on Map, but is a free function
-// to hide it from users of the ebpf package.
-func MapSpec(m *Map) *Spec {
- return m.spec
-}
-
-// MapKey should be a method on Map, but is a free function
-// to hide it from users of the ebpf package.
-func MapKey(m *Map) Type {
- return m.key
-}
-
-// MapValue should be a method on Map, but is a free function
-// to hide it from users of the ebpf package.
-func MapValue(m *Map) Type {
- return m.value
-}
-
-// Program is the BTF information for a stream of instructions.
-type Program struct {
- spec *Spec
- length uint64
- funcInfos, lineInfos extInfo
- coreRelos bpfCoreRelos
-}
-
-// ProgramSpec returns the Spec needed for loading function and line infos into the kernel.
-//
-// This is a free function instead of a method to hide it from users
-// of package ebpf.
-func ProgramSpec(s *Program) *Spec {
- return s.spec
-}
-
-// ProgramAppend the information from other to the Program.
-//
-// This is a free function instead of a method to hide it from users
-// of package ebpf.
-func ProgramAppend(s, other *Program) error {
- funcInfos, err := s.funcInfos.append(other.funcInfos, s.length)
- if err != nil {
- return fmt.Errorf("func infos: %w", err)
- }
-
- lineInfos, err := s.lineInfos.append(other.lineInfos, s.length)
- if err != nil {
- return fmt.Errorf("line infos: %w", err)
- }
-
- s.funcInfos = funcInfos
- s.lineInfos = lineInfos
- s.coreRelos = s.coreRelos.append(other.coreRelos, s.length)
- s.length += other.length
- return nil
-}
-
-// ProgramFuncInfos returns the binary form of BTF function infos.
-//
-// This is a free function instead of a method to hide it from users
-// of package ebpf.
-func ProgramFuncInfos(s *Program) (recordSize uint32, bytes []byte, err error) {
- bytes, err = s.funcInfos.MarshalBinary()
- if err != nil {
- return 0, nil, err
- }
-
- return s.funcInfos.recordSize, bytes, nil
-}
-
-// ProgramLineInfos returns the binary form of BTF line infos.
-//
-// This is a free function instead of a method to hide it from users
-// of package ebpf.
-func ProgramLineInfos(s *Program) (recordSize uint32, bytes []byte, err error) {
- bytes, err = s.lineInfos.MarshalBinary()
- if err != nil {
- return 0, nil, err
- }
-
- return s.lineInfos.recordSize, bytes, nil
-}
-
-// ProgramRelocations returns the CO-RE relocations required to adjust the
-// program to the target.
-//
-// This is a free function instead of a method to hide it from users
-// of package ebpf.
-func ProgramRelocations(s *Program, target *Spec) (map[uint64]Relocation, error) {
- if len(s.coreRelos) == 0 {
- return nil, nil
- }
-
- return coreRelocate(s.spec, target, s.coreRelos)
-}
-
-type bpfLoadBTFAttr struct {
- btf internal.Pointer
- logBuf internal.Pointer
- btfSize uint32
- btfLogSize uint32
- btfLogLevel uint32
-}
-
-func bpfLoadBTF(attr *bpfLoadBTFAttr) (*internal.FD, error) {
- fd, err := internal.BPF(internal.BPF_BTF_LOAD, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
- if err != nil {
- return nil, err
- }
-
- return internal.NewFD(uint32(fd)), nil
-}
-
-func marshalBTF(types interface{}, strings []byte, bo binary.ByteOrder) []byte {
- const minHeaderLength = 24
-
- typesLen := uint32(binary.Size(types))
- header := btfHeader{
- Magic: btfMagic,
- Version: 1,
- HdrLen: minHeaderLength,
- TypeOff: 0,
- TypeLen: typesLen,
- StringOff: typesLen,
- StringLen: uint32(len(strings)),
- }
-
- buf := new(bytes.Buffer)
- _ = binary.Write(buf, bo, &header)
- _ = binary.Write(buf, bo, types)
- buf.Write(strings)
-
- return buf.Bytes()
-}
-
-var haveBTF = internal.FeatureTest("BTF", "5.1", func() error {
- var (
- types struct {
- Integer btfType
- Var btfType
- btfVar struct{ Linkage uint32 }
- }
- strings = []byte{0, 'a', 0}
- )
-
- // We use a BTF_KIND_VAR here, to make sure that
- // the kernel understands BTF at least as well as we
- // do. BTF_KIND_VAR was introduced ~5.1.
- types.Integer.SetKind(kindPointer)
- types.Var.NameOff = 1
- types.Var.SetKind(kindVar)
- types.Var.SizeType = 1
-
- btf := marshalBTF(&types, strings, internal.NativeEndian)
-
- fd, err := bpfLoadBTF(&bpfLoadBTFAttr{
- btf: internal.NewSlicePointer(btf),
- btfSize: uint32(len(btf)),
- })
- if errors.Is(err, unix.EINVAL) || errors.Is(err, unix.EPERM) {
- // Treat both EINVAL and EPERM as not supported: loading the program
- // might still succeed without BTF.
- return internal.ErrNotSupported
- }
- if err != nil {
- return err
- }
-
- fd.Close()
- return nil
-})
-
-var haveFuncLinkage = internal.FeatureTest("BTF func linkage", "5.6", func() error {
- if err := haveBTF(); err != nil {
- return err
- }
-
- var (
- types struct {
- FuncProto btfType
- Func btfType
- }
- strings = []byte{0, 'a', 0}
- )
-
- types.FuncProto.SetKind(kindFuncProto)
- types.Func.SetKind(kindFunc)
- types.Func.SizeType = 1 // aka FuncProto
- types.Func.NameOff = 1
- types.Func.SetLinkage(linkageGlobal)
-
- btf := marshalBTF(&types, strings, internal.NativeEndian)
-
- fd, err := bpfLoadBTF(&bpfLoadBTFAttr{
- btf: internal.NewSlicePointer(btf),
- btfSize: uint32(len(btf)),
- })
- if errors.Is(err, unix.EINVAL) {
- return internal.ErrNotSupported
- }
- if err != nil {
- return err
- }
-
- fd.Close()
- return nil
-})
diff --git a/vendor/github.com/cilium/ebpf/internal/btf/btf_types.go b/vendor/github.com/cilium/ebpf/internal/btf/btf_types.go
deleted file mode 100644
index a4cde3fe8..000000000
--- a/vendor/github.com/cilium/ebpf/internal/btf/btf_types.go
+++ /dev/null
@@ -1,269 +0,0 @@
-package btf
-
-import (
- "encoding/binary"
- "fmt"
- "io"
-)
-
-// btfKind describes a Type.
-type btfKind uint8
-
-// Equivalents of the BTF_KIND_* constants.
-const (
- kindUnknown btfKind = iota
- kindInt
- kindPointer
- kindArray
- kindStruct
- kindUnion
- kindEnum
- kindForward
- kindTypedef
- kindVolatile
- kindConst
- kindRestrict
- // Added ~4.20
- kindFunc
- kindFuncProto
- // Added ~5.1
- kindVar
- kindDatasec
-)
-
-type btfFuncLinkage uint8
-
-const (
- linkageStatic btfFuncLinkage = iota
- linkageGlobal
- linkageExtern
-)
-
-const (
- btfTypeKindShift = 24
- btfTypeKindLen = 4
- btfTypeVlenShift = 0
- btfTypeVlenMask = 16
- btfTypeKindFlagShift = 31
- btfTypeKindFlagMask = 1
-)
-
-// btfType is equivalent to struct btf_type in Documentation/bpf/btf.rst.
-type btfType struct {
- NameOff uint32
- /* "info" bits arrangement
- * bits 0-15: vlen (e.g. # of struct's members), linkage
- * bits 16-23: unused
- * bits 24-27: kind (e.g. int, ptr, array...etc)
- * bits 28-30: unused
- * bit 31: kind_flag, currently used by
- * struct, union and fwd
- */
- Info uint32
- /* "size" is used by INT, ENUM, STRUCT and UNION.
- * "size" tells the size of the type it is describing.
- *
- * "type" is used by PTR, TYPEDEF, VOLATILE, CONST, RESTRICT,
- * FUNC and FUNC_PROTO.
- * "type" is a type_id referring to another type.
- */
- SizeType uint32
-}
-
-func (k btfKind) String() string {
- switch k {
- case kindUnknown:
- return "Unknown"
- case kindInt:
- return "Integer"
- case kindPointer:
- return "Pointer"
- case kindArray:
- return "Array"
- case kindStruct:
- return "Struct"
- case kindUnion:
- return "Union"
- case kindEnum:
- return "Enumeration"
- case kindForward:
- return "Forward"
- case kindTypedef:
- return "Typedef"
- case kindVolatile:
- return "Volatile"
- case kindConst:
- return "Const"
- case kindRestrict:
- return "Restrict"
- case kindFunc:
- return "Function"
- case kindFuncProto:
- return "Function Proto"
- case kindVar:
- return "Variable"
- case kindDatasec:
- return "Section"
- default:
- return fmt.Sprintf("Unknown (%d)", k)
- }
-}
-
-func mask(len uint32) uint32 {
- return (1 << len) - 1
-}
-
-func (bt *btfType) info(len, shift uint32) uint32 {
- return (bt.Info >> shift) & mask(len)
-}
-
-func (bt *btfType) setInfo(value, len, shift uint32) {
- bt.Info &^= mask(len) << shift
- bt.Info |= (value & mask(len)) << shift
-}
-
-func (bt *btfType) Kind() btfKind {
- return btfKind(bt.info(btfTypeKindLen, btfTypeKindShift))
-}
-
-func (bt *btfType) SetKind(kind btfKind) {
- bt.setInfo(uint32(kind), btfTypeKindLen, btfTypeKindShift)
-}
-
-func (bt *btfType) Vlen() int {
- return int(bt.info(btfTypeVlenMask, btfTypeVlenShift))
-}
-
-func (bt *btfType) SetVlen(vlen int) {
- bt.setInfo(uint32(vlen), btfTypeVlenMask, btfTypeVlenShift)
-}
-
-func (bt *btfType) KindFlag() bool {
- return bt.info(btfTypeKindFlagMask, btfTypeKindFlagShift) == 1
-}
-
-func (bt *btfType) Linkage() btfFuncLinkage {
- return btfFuncLinkage(bt.info(btfTypeVlenMask, btfTypeVlenShift))
-}
-
-func (bt *btfType) SetLinkage(linkage btfFuncLinkage) {
- bt.setInfo(uint32(linkage), btfTypeVlenMask, btfTypeVlenShift)
-}
-
-func (bt *btfType) Type() TypeID {
- // TODO: Panic here if wrong kind?
- return TypeID(bt.SizeType)
-}
-
-func (bt *btfType) Size() uint32 {
- // TODO: Panic here if wrong kind?
- return bt.SizeType
-}
-
-type rawType struct {
- btfType
- data interface{}
-}
-
-func (rt *rawType) Marshal(w io.Writer, bo binary.ByteOrder) error {
- if err := binary.Write(w, bo, &rt.btfType); err != nil {
- return err
- }
-
- if rt.data == nil {
- return nil
- }
-
- return binary.Write(w, bo, rt.data)
-}
-
-type btfArray struct {
- Type TypeID
- IndexType TypeID
- Nelems uint32
-}
-
-type btfMember struct {
- NameOff uint32
- Type TypeID
- Offset uint32
-}
-
-type btfVarSecinfo struct {
- Type TypeID
- Offset uint32
- Size uint32
-}
-
-type btfVariable struct {
- Linkage uint32
-}
-
-type btfEnum struct {
- NameOff uint32
- Val int32
-}
-
-type btfParam struct {
- NameOff uint32
- Type TypeID
-}
-
-func readTypes(r io.Reader, bo binary.ByteOrder) ([]rawType, error) {
- var (
- header btfType
- types []rawType
- )
-
- for id := TypeID(1); ; id++ {
- if err := binary.Read(r, bo, &header); err == io.EOF {
- return types, nil
- } else if err != nil {
- return nil, fmt.Errorf("can't read type info for id %v: %v", id, err)
- }
-
- var data interface{}
- switch header.Kind() {
- case kindInt:
- data = new(uint32)
- case kindPointer:
- case kindArray:
- data = new(btfArray)
- case kindStruct:
- fallthrough
- case kindUnion:
- data = make([]btfMember, header.Vlen())
- case kindEnum:
- data = make([]btfEnum, header.Vlen())
- case kindForward:
- case kindTypedef:
- case kindVolatile:
- case kindConst:
- case kindRestrict:
- case kindFunc:
- case kindFuncProto:
- data = make([]btfParam, header.Vlen())
- case kindVar:
- data = new(btfVariable)
- case kindDatasec:
- data = make([]btfVarSecinfo, header.Vlen())
- default:
- return nil, fmt.Errorf("type id %v: unknown kind: %v", id, header.Kind())
- }
-
- if data == nil {
- types = append(types, rawType{header, nil})
- continue
- }
-
- if err := binary.Read(r, bo, data); err != nil {
- return nil, fmt.Errorf("type id %d: kind %v: can't read %T: %v", id, header.Kind(), data, err)
- }
-
- types = append(types, rawType{header, data})
- }
-}
-
-func intEncoding(raw uint32) (IntEncoding, uint32, byte) {
- return IntEncoding((raw & 0x0f000000) >> 24), (raw & 0x00ff0000) >> 16, byte(raw & 0x000000ff)
-}
diff --git a/vendor/github.com/cilium/ebpf/internal/btf/core.go b/vendor/github.com/cilium/ebpf/internal/btf/core.go
deleted file mode 100644
index 52b59ed18..000000000
--- a/vendor/github.com/cilium/ebpf/internal/btf/core.go
+++ /dev/null
@@ -1,388 +0,0 @@
-package btf
-
-import (
- "errors"
- "fmt"
- "reflect"
- "strconv"
- "strings"
-)
-
-// Code in this file is derived from libbpf, which is available under a BSD
-// 2-Clause license.
-
-// Relocation describes a CO-RE relocation.
-type Relocation struct {
- Current uint32
- New uint32
-}
-
-func (r Relocation) equal(other Relocation) bool {
- return r.Current == other.Current && r.New == other.New
-}
-
-// coreReloKind is the type of CO-RE relocation
-type coreReloKind uint32
-
-const (
- reloFieldByteOffset coreReloKind = iota /* field byte offset */
- reloFieldByteSize /* field size in bytes */
- reloFieldExists /* field existence in target kernel */
- reloFieldSigned /* field signedness (0 - unsigned, 1 - signed) */
- reloFieldLShiftU64 /* bitfield-specific left bitshift */
- reloFieldRShiftU64 /* bitfield-specific right bitshift */
- reloTypeIDLocal /* type ID in local BPF object */
- reloTypeIDTarget /* type ID in target kernel */
- reloTypeExists /* type existence in target kernel */
- reloTypeSize /* type size in bytes */
- reloEnumvalExists /* enum value existence in target kernel */
- reloEnumvalValue /* enum value integer value */
-)
-
-func (k coreReloKind) String() string {
- switch k {
- case reloFieldByteOffset:
- return "byte_off"
- case reloFieldByteSize:
- return "byte_sz"
- case reloFieldExists:
- return "field_exists"
- case reloFieldSigned:
- return "signed"
- case reloFieldLShiftU64:
- return "lshift_u64"
- case reloFieldRShiftU64:
- return "rshift_u64"
- case reloTypeIDLocal:
- return "local_type_id"
- case reloTypeIDTarget:
- return "target_type_id"
- case reloTypeExists:
- return "type_exists"
- case reloTypeSize:
- return "type_size"
- case reloEnumvalExists:
- return "enumval_exists"
- case reloEnumvalValue:
- return "enumval_value"
- default:
- return "unknown"
- }
-}
-
-func coreRelocate(local, target *Spec, coreRelos bpfCoreRelos) (map[uint64]Relocation, error) {
- if target == nil {
- var err error
- target, err = loadKernelSpec()
- if err != nil {
- return nil, err
- }
- }
-
- if local.byteOrder != target.byteOrder {
- return nil, fmt.Errorf("can't relocate %s against %s", local.byteOrder, target.byteOrder)
- }
-
- relocations := make(map[uint64]Relocation, len(coreRelos))
- for _, relo := range coreRelos {
- accessorStr, err := local.strings.Lookup(relo.AccessStrOff)
- if err != nil {
- return nil, err
- }
-
- accessor, err := parseCoreAccessor(accessorStr)
- if err != nil {
- return nil, fmt.Errorf("accessor %q: %s", accessorStr, err)
- }
-
- if int(relo.TypeID) >= len(local.types) {
- return nil, fmt.Errorf("invalid type id %d", relo.TypeID)
- }
-
- typ := local.types[relo.TypeID]
-
- if relo.ReloKind == reloTypeIDLocal {
- relocations[uint64(relo.InsnOff)] = Relocation{
- uint32(typ.ID()),
- uint32(typ.ID()),
- }
- continue
- }
-
- named, ok := typ.(namedType)
- if !ok || named.name() == "" {
- return nil, fmt.Errorf("relocate anonymous type %s: %w", typ.String(), ErrNotSupported)
- }
-
- name := essentialName(named.name())
- res, err := coreCalculateRelocation(typ, target.namedTypes[name], relo.ReloKind, accessor)
- if err != nil {
- return nil, fmt.Errorf("relocate %s: %w", name, err)
- }
-
- relocations[uint64(relo.InsnOff)] = res
- }
-
- return relocations, nil
-}
-
-var errAmbiguousRelocation = errors.New("ambiguous relocation")
-
-func coreCalculateRelocation(local Type, targets []namedType, kind coreReloKind, localAccessor coreAccessor) (Relocation, error) {
- var relos []Relocation
- var matches []Type
- for _, target := range targets {
- switch kind {
- case reloTypeIDTarget:
- if localAccessor[0] != 0 {
- return Relocation{}, fmt.Errorf("%s: unexpected non-zero accessor", kind)
- }
-
- if compat, err := coreAreTypesCompatible(local, target); err != nil {
- return Relocation{}, fmt.Errorf("%s: %s", kind, err)
- } else if !compat {
- continue
- }
-
- relos = append(relos, Relocation{uint32(target.ID()), uint32(target.ID())})
-
- default:
- return Relocation{}, fmt.Errorf("relocation %s: %w", kind, ErrNotSupported)
- }
- matches = append(matches, target)
- }
-
- if len(relos) == 0 {
- // TODO: Add switch for existence checks like reloEnumvalExists here.
-
- // TODO: This might have to be poisoned.
- return Relocation{}, fmt.Errorf("no relocation found, tried %v", targets)
- }
-
- relo := relos[0]
- for _, altRelo := range relos[1:] {
- if !altRelo.equal(relo) {
- return Relocation{}, fmt.Errorf("multiple types %v match: %w", matches, errAmbiguousRelocation)
- }
- }
-
- return relo, nil
-}
-
-/* coreAccessor contains a path through a struct. It contains at least one index.
- *
- * The interpretation depends on the kind of the relocation. The following is
- * taken from struct bpf_core_relo in libbpf_internal.h:
- *
- * - for field-based relocations, string encodes an accessed field using
- * a sequence of field and array indices, separated by colon (:). It's
- * conceptually very close to LLVM's getelementptr ([0]) instruction's
- * arguments for identifying offset to a field.
- * - for type-based relocations, strings is expected to be just "0";
- * - for enum value-based relocations, string contains an index of enum
- * value within its enum type;
- *
- * Example to provide a better feel.
- *
- * struct sample {
- * int a;
- * struct {
- * int b[10];
- * };
- * };
- *
- * struct sample s = ...;
- * int x = &s->a; // encoded as "0:0" (a is field #0)
- * int y = &s->b[5]; // encoded as "0:1:0:5" (anon struct is field #1,
- * // b is field #0 inside anon struct, accessing elem #5)
- * int z = &s[10]->b; // encoded as "10:1" (ptr is used as an array)
- */
-type coreAccessor []int
-
-func parseCoreAccessor(accessor string) (coreAccessor, error) {
- if accessor == "" {
- return nil, fmt.Errorf("empty accessor")
- }
-
- var result coreAccessor
- parts := strings.Split(accessor, ":")
- for _, part := range parts {
- // 31 bits to avoid overflowing int on 32 bit platforms.
- index, err := strconv.ParseUint(part, 10, 31)
- if err != nil {
- return nil, fmt.Errorf("accessor index %q: %s", part, err)
- }
-
- result = append(result, int(index))
- }
-
- return result, nil
-}
-
-/* The comment below is from bpf_core_types_are_compat in libbpf.c:
- *
- * Check local and target types for compatibility. This check is used for
- * type-based CO-RE relocations and follow slightly different rules than
- * field-based relocations. This function assumes that root types were already
- * checked for name match. Beyond that initial root-level name check, names
- * are completely ignored. Compatibility rules are as follows:
- * - any two STRUCTs/UNIONs/FWDs/ENUMs/INTs are considered compatible, but
- * kind should match for local and target types (i.e., STRUCT is not
- * compatible with UNION);
- * - for ENUMs, the size is ignored;
- * - for INT, size and signedness are ignored;
- * - for ARRAY, dimensionality is ignored, element types are checked for
- * compatibility recursively;
- * - CONST/VOLATILE/RESTRICT modifiers are ignored;
- * - TYPEDEFs/PTRs are compatible if types they pointing to are compatible;
- * - FUNC_PROTOs are compatible if they have compatible signature: same
- * number of input args and compatible return and argument types.
- * These rules are not set in stone and probably will be adjusted as we get
- * more experience with using BPF CO-RE relocations.
- */
-func coreAreTypesCompatible(localType Type, targetType Type) (bool, error) {
- var (
- localTs, targetTs typeDeque
- l, t = &localType, &targetType
- depth = 0
- )
-
- for ; l != nil && t != nil; l, t = localTs.shift(), targetTs.shift() {
- if depth >= maxTypeDepth {
- return false, errors.New("types are nested too deep")
- }
-
- localType = skipQualifierAndTypedef(*l)
- targetType = skipQualifierAndTypedef(*t)
-
- if reflect.TypeOf(localType) != reflect.TypeOf(targetType) {
- return false, nil
- }
-
- switch lv := (localType).(type) {
- case *Void, *Struct, *Union, *Enum, *Fwd:
- // Nothing to do here
-
- case *Int:
- tv := targetType.(*Int)
- if lv.isBitfield() || tv.isBitfield() {
- return false, nil
- }
-
- case *Pointer, *Array:
- depth++
- localType.walk(&localTs)
- targetType.walk(&targetTs)
-
- case *FuncProto:
- tv := targetType.(*FuncProto)
- if len(lv.Params) != len(tv.Params) {
- return false, nil
- }
-
- depth++
- localType.walk(&localTs)
- targetType.walk(&targetTs)
-
- default:
- return false, fmt.Errorf("unsupported type %T", localType)
- }
- }
-
- if l != nil {
- return false, fmt.Errorf("dangling local type %T", *l)
- }
-
- if t != nil {
- return false, fmt.Errorf("dangling target type %T", *t)
- }
-
- return true, nil
-}
-
-/* The comment below is from bpf_core_fields_are_compat in libbpf.c:
- *
- * Check two types for compatibility for the purpose of field access
- * relocation. const/volatile/restrict and typedefs are skipped to ensure we
- * are relocating semantically compatible entities:
- * - any two STRUCTs/UNIONs are compatible and can be mixed;
- * - any two FWDs are compatible, if their names match (modulo flavor suffix);
- * - any two PTRs are always compatible;
- * - for ENUMs, names should be the same (ignoring flavor suffix) or at
- * least one of enums should be anonymous;
- * - for ENUMs, check sizes, names are ignored;
- * - for INT, size and signedness are ignored;
- * - for ARRAY, dimensionality is ignored, element types are checked for
- * compatibility recursively;
- * - everything else shouldn't be ever a target of relocation.
- * These rules are not set in stone and probably will be adjusted as we get
- * more experience with using BPF CO-RE relocations.
- */
-func coreAreMembersCompatible(localType Type, targetType Type) (bool, error) {
- doNamesMatch := func(a, b string) bool {
- if a == "" || b == "" {
- // allow anonymous and named type to match
- return true
- }
-
- return essentialName(a) == essentialName(b)
- }
-
- for depth := 0; depth <= maxTypeDepth; depth++ {
- localType = skipQualifierAndTypedef(localType)
- targetType = skipQualifierAndTypedef(targetType)
-
- _, lok := localType.(composite)
- _, tok := targetType.(composite)
- if lok && tok {
- return true, nil
- }
-
- if reflect.TypeOf(localType) != reflect.TypeOf(targetType) {
- return false, nil
- }
-
- switch lv := localType.(type) {
- case *Pointer:
- return true, nil
-
- case *Enum:
- tv := targetType.(*Enum)
- return doNamesMatch(lv.name(), tv.name()), nil
-
- case *Fwd:
- tv := targetType.(*Fwd)
- return doNamesMatch(lv.name(), tv.name()), nil
-
- case *Int:
- tv := targetType.(*Int)
- return !lv.isBitfield() && !tv.isBitfield(), nil
-
- case *Array:
- tv := targetType.(*Array)
-
- localType = lv.Type
- targetType = tv.Type
-
- default:
- return false, fmt.Errorf("unsupported type %T", localType)
- }
- }
-
- return false, errors.New("types are nested too deep")
-}
-
-func skipQualifierAndTypedef(typ Type) Type {
- result := typ
- for depth := 0; depth <= maxTypeDepth; depth++ {
- switch v := (result).(type) {
- case qualifier:
- result = v.qualify()
- case *Typedef:
- result = v.Type
- default:
- return result
- }
- }
- return typ
-}
diff --git a/vendor/github.com/cilium/ebpf/internal/btf/doc.go b/vendor/github.com/cilium/ebpf/internal/btf/doc.go
deleted file mode 100644
index ad2576cb2..000000000
--- a/vendor/github.com/cilium/ebpf/internal/btf/doc.go
+++ /dev/null
@@ -1,8 +0,0 @@
-// Package btf handles data encoded according to the BPF Type Format.
-//
-// The canonical documentation lives in the Linux kernel repository and is
-// available at https://www.kernel.org/doc/html/latest/bpf/btf.html
-//
-// The API is very much unstable. You should only use this via the main
-// ebpf library.
-package btf
diff --git a/vendor/github.com/cilium/ebpf/internal/btf/ext_info.go b/vendor/github.com/cilium/ebpf/internal/btf/ext_info.go
deleted file mode 100644
index 6a21b6bda..000000000
--- a/vendor/github.com/cilium/ebpf/internal/btf/ext_info.go
+++ /dev/null
@@ -1,281 +0,0 @@
-package btf
-
-import (
- "bufio"
- "bytes"
- "encoding/binary"
- "errors"
- "fmt"
- "io"
- "io/ioutil"
-
- "github.com/cilium/ebpf/asm"
- "github.com/cilium/ebpf/internal"
-)
-
-type btfExtHeader struct {
- Magic uint16
- Version uint8
- Flags uint8
- HdrLen uint32
-
- FuncInfoOff uint32
- FuncInfoLen uint32
- LineInfoOff uint32
- LineInfoLen uint32
-}
-
-type btfExtCoreHeader struct {
- CoreReloOff uint32
- CoreReloLen uint32
-}
-
-func parseExtInfos(r io.ReadSeeker, bo binary.ByteOrder, strings stringTable) (funcInfo, lineInfo map[string]extInfo, coreRelos map[string]bpfCoreRelos, err error) {
- var header btfExtHeader
- var coreHeader btfExtCoreHeader
- if err := binary.Read(r, bo, &header); err != nil {
- return nil, nil, nil, fmt.Errorf("can't read header: %v", err)
- }
-
- if header.Magic != btfMagic {
- return nil, nil, nil, fmt.Errorf("incorrect magic value %v", header.Magic)
- }
-
- if header.Version != 1 {
- return nil, nil, nil, fmt.Errorf("unexpected version %v", header.Version)
- }
-
- if header.Flags != 0 {
- return nil, nil, nil, fmt.Errorf("unsupported flags %v", header.Flags)
- }
-
- remainder := int64(header.HdrLen) - int64(binary.Size(&header))
- if remainder < 0 {
- return nil, nil, nil, errors.New("header is too short")
- }
-
- coreHdrSize := int64(binary.Size(&coreHeader))
- if remainder >= coreHdrSize {
- if err := binary.Read(r, bo, &coreHeader); err != nil {
- return nil, nil, nil, fmt.Errorf("can't read CO-RE relocation header: %v", err)
- }
- remainder -= coreHdrSize
- }
-
- // Of course, the .BTF.ext header has different semantics than the
- // .BTF ext header. We need to ignore non-null values.
- _, err = io.CopyN(ioutil.Discard, r, remainder)
- if err != nil {
- return nil, nil, nil, fmt.Errorf("header padding: %v", err)
- }
-
- if _, err := r.Seek(int64(header.HdrLen+header.FuncInfoOff), io.SeekStart); err != nil {
- return nil, nil, nil, fmt.Errorf("can't seek to function info section: %v", err)
- }
-
- buf := bufio.NewReader(io.LimitReader(r, int64(header.FuncInfoLen)))
- funcInfo, err = parseExtInfo(buf, bo, strings)
- if err != nil {
- return nil, nil, nil, fmt.Errorf("function info: %w", err)
- }
-
- if _, err := r.Seek(int64(header.HdrLen+header.LineInfoOff), io.SeekStart); err != nil {
- return nil, nil, nil, fmt.Errorf("can't seek to line info section: %v", err)
- }
-
- buf = bufio.NewReader(io.LimitReader(r, int64(header.LineInfoLen)))
- lineInfo, err = parseExtInfo(buf, bo, strings)
- if err != nil {
- return nil, nil, nil, fmt.Errorf("line info: %w", err)
- }
-
- if coreHeader.CoreReloOff > 0 && coreHeader.CoreReloLen > 0 {
- if _, err := r.Seek(int64(header.HdrLen+coreHeader.CoreReloOff), io.SeekStart); err != nil {
- return nil, nil, nil, fmt.Errorf("can't seek to CO-RE relocation section: %v", err)
- }
-
- coreRelos, err = parseExtInfoRelos(io.LimitReader(r, int64(coreHeader.CoreReloLen)), bo, strings)
- if err != nil {
- return nil, nil, nil, fmt.Errorf("CO-RE relocation info: %w", err)
- }
- }
-
- return funcInfo, lineInfo, coreRelos, nil
-}
-
-type btfExtInfoSec struct {
- SecNameOff uint32
- NumInfo uint32
-}
-
-type extInfoRecord struct {
- InsnOff uint64
- Opaque []byte
-}
-
-type extInfo struct {
- recordSize uint32
- records []extInfoRecord
-}
-
-func (ei extInfo) append(other extInfo, offset uint64) (extInfo, error) {
- if other.recordSize != ei.recordSize {
- return extInfo{}, fmt.Errorf("ext_info record size mismatch, want %d (got %d)", ei.recordSize, other.recordSize)
- }
-
- records := make([]extInfoRecord, 0, len(ei.records)+len(other.records))
- records = append(records, ei.records...)
- for _, info := range other.records {
- records = append(records, extInfoRecord{
- InsnOff: info.InsnOff + offset,
- Opaque: info.Opaque,
- })
- }
- return extInfo{ei.recordSize, records}, nil
-}
-
-func (ei extInfo) MarshalBinary() ([]byte, error) {
- if len(ei.records) == 0 {
- return nil, nil
- }
-
- buf := bytes.NewBuffer(make([]byte, 0, int(ei.recordSize)*len(ei.records)))
- for _, info := range ei.records {
- // The kernel expects offsets in number of raw bpf instructions,
- // while the ELF tracks it in bytes.
- insnOff := uint32(info.InsnOff / asm.InstructionSize)
- if err := binary.Write(buf, internal.NativeEndian, insnOff); err != nil {
- return nil, fmt.Errorf("can't write instruction offset: %v", err)
- }
-
- buf.Write(info.Opaque)
- }
-
- return buf.Bytes(), nil
-}
-
-func parseExtInfo(r io.Reader, bo binary.ByteOrder, strings stringTable) (map[string]extInfo, error) {
- const maxRecordSize = 256
-
- var recordSize uint32
- if err := binary.Read(r, bo, &recordSize); err != nil {
- return nil, fmt.Errorf("can't read record size: %v", err)
- }
-
- if recordSize < 4 {
- // Need at least insnOff
- return nil, errors.New("record size too short")
- }
- if recordSize > maxRecordSize {
- return nil, fmt.Errorf("record size %v exceeds %v", recordSize, maxRecordSize)
- }
-
- result := make(map[string]extInfo)
- for {
- secName, infoHeader, err := parseExtInfoHeader(r, bo, strings)
- if errors.Is(err, io.EOF) {
- return result, nil
- }
-
- var records []extInfoRecord
- for i := uint32(0); i < infoHeader.NumInfo; i++ {
- var byteOff uint32
- if err := binary.Read(r, bo, &byteOff); err != nil {
- return nil, fmt.Errorf("section %v: can't read extended info offset: %v", secName, err)
- }
-
- buf := make([]byte, int(recordSize-4))
- if _, err := io.ReadFull(r, buf); err != nil {
- return nil, fmt.Errorf("section %v: can't read record: %v", secName, err)
- }
-
- if byteOff%asm.InstructionSize != 0 {
- return nil, fmt.Errorf("section %v: offset %v is not aligned with instruction size", secName, byteOff)
- }
-
- records = append(records, extInfoRecord{uint64(byteOff), buf})
- }
-
- result[secName] = extInfo{
- recordSize,
- records,
- }
- }
-}
-
-// bpfCoreRelo matches `struct bpf_core_relo` from the kernel
-type bpfCoreRelo struct {
- InsnOff uint32
- TypeID TypeID
- AccessStrOff uint32
- ReloKind coreReloKind
-}
-
-type bpfCoreRelos []bpfCoreRelo
-
-// append two slices of extInfoRelo to each other. The InsnOff of b are adjusted
-// by offset.
-func (r bpfCoreRelos) append(other bpfCoreRelos, offset uint64) bpfCoreRelos {
- result := make([]bpfCoreRelo, 0, len(r)+len(other))
- result = append(result, r...)
- for _, relo := range other {
- relo.InsnOff += uint32(offset)
- result = append(result, relo)
- }
- return result
-}
-
-var extInfoReloSize = binary.Size(bpfCoreRelo{})
-
-func parseExtInfoRelos(r io.Reader, bo binary.ByteOrder, strings stringTable) (map[string]bpfCoreRelos, error) {
- var recordSize uint32
- if err := binary.Read(r, bo, &recordSize); err != nil {
- return nil, fmt.Errorf("read record size: %v", err)
- }
-
- if recordSize != uint32(extInfoReloSize) {
- return nil, fmt.Errorf("expected record size %d, got %d", extInfoReloSize, recordSize)
- }
-
- result := make(map[string]bpfCoreRelos)
- for {
- secName, infoHeader, err := parseExtInfoHeader(r, bo, strings)
- if errors.Is(err, io.EOF) {
- return result, nil
- }
-
- var relos []bpfCoreRelo
- for i := uint32(0); i < infoHeader.NumInfo; i++ {
- var relo bpfCoreRelo
- if err := binary.Read(r, bo, &relo); err != nil {
- return nil, fmt.Errorf("section %v: read record: %v", secName, err)
- }
-
- if relo.InsnOff%asm.InstructionSize != 0 {
- return nil, fmt.Errorf("section %v: offset %v is not aligned with instruction size", secName, relo.InsnOff)
- }
-
- relos = append(relos, relo)
- }
-
- result[secName] = relos
- }
-}
-
-func parseExtInfoHeader(r io.Reader, bo binary.ByteOrder, strings stringTable) (string, *btfExtInfoSec, error) {
- var infoHeader btfExtInfoSec
- if err := binary.Read(r, bo, &infoHeader); err != nil {
- return "", nil, fmt.Errorf("read ext info header: %w", err)
- }
-
- secName, err := strings.Lookup(infoHeader.SecNameOff)
- if err != nil {
- return "", nil, fmt.Errorf("get section name: %w", err)
- }
-
- if infoHeader.NumInfo == 0 {
- return "", nil, fmt.Errorf("section %s has zero records", secName)
- }
-
- return secName, &infoHeader, nil
-}
diff --git a/vendor/github.com/cilium/ebpf/internal/btf/fuzz.go b/vendor/github.com/cilium/ebpf/internal/btf/fuzz.go
deleted file mode 100644
index 37e043fd3..000000000
--- a/vendor/github.com/cilium/ebpf/internal/btf/fuzz.go
+++ /dev/null
@@ -1,49 +0,0 @@
-// +build gofuzz
-
-// Use with https://github.com/dvyukov/go-fuzz
-
-package btf
-
-import (
- "bytes"
- "encoding/binary"
-
- "github.com/cilium/ebpf/internal"
-)
-
-func FuzzSpec(data []byte) int {
- if len(data) < binary.Size(btfHeader{}) {
- return -1
- }
-
- spec, err := loadNakedSpec(bytes.NewReader(data), internal.NativeEndian, nil, nil)
- if err != nil {
- if spec != nil {
- panic("spec is not nil")
- }
- return 0
- }
- if spec == nil {
- panic("spec is nil")
- }
- return 1
-}
-
-func FuzzExtInfo(data []byte) int {
- if len(data) < binary.Size(btfExtHeader{}) {
- return -1
- }
-
- table := stringTable("\x00foo\x00barfoo\x00")
- info, err := parseExtInfo(bytes.NewReader(data), internal.NativeEndian, table)
- if err != nil {
- if info != nil {
- panic("info is not nil")
- }
- return 0
- }
- if info == nil {
- panic("info is nil")
- }
- return 1
-}
diff --git a/vendor/github.com/cilium/ebpf/internal/btf/strings.go b/vendor/github.com/cilium/ebpf/internal/btf/strings.go
deleted file mode 100644
index 8782643a0..000000000
--- a/vendor/github.com/cilium/ebpf/internal/btf/strings.go
+++ /dev/null
@@ -1,60 +0,0 @@
-package btf
-
-import (
- "bytes"
- "errors"
- "fmt"
- "io"
- "io/ioutil"
-)
-
-type stringTable []byte
-
-func readStringTable(r io.Reader) (stringTable, error) {
- contents, err := ioutil.ReadAll(r)
- if err != nil {
- return nil, fmt.Errorf("can't read string table: %v", err)
- }
-
- if len(contents) < 1 {
- return nil, errors.New("string table is empty")
- }
-
- if contents[0] != '\x00' {
- return nil, errors.New("first item in string table is non-empty")
- }
-
- if contents[len(contents)-1] != '\x00' {
- return nil, errors.New("string table isn't null terminated")
- }
-
- return stringTable(contents), nil
-}
-
-func (st stringTable) Lookup(offset uint32) (string, error) {
- if int64(offset) > int64(^uint(0)>>1) {
- return "", fmt.Errorf("offset %d overflows int", offset)
- }
-
- pos := int(offset)
- if pos >= len(st) {
- return "", fmt.Errorf("offset %d is out of bounds", offset)
- }
-
- if pos > 0 && st[pos-1] != '\x00' {
- return "", fmt.Errorf("offset %d isn't start of a string", offset)
- }
-
- str := st[pos:]
- end := bytes.IndexByte(str, '\x00')
- if end == -1 {
- return "", fmt.Errorf("offset %d isn't null terminated", offset)
- }
-
- return string(str[:end]), nil
-}
-
-func (st stringTable) LookupName(offset uint32) (Name, error) {
- str, err := st.Lookup(offset)
- return Name(str), err
-}
diff --git a/vendor/github.com/cilium/ebpf/internal/btf/types.go b/vendor/github.com/cilium/ebpf/internal/btf/types.go
deleted file mode 100644
index 9e1fd8d0b..000000000
--- a/vendor/github.com/cilium/ebpf/internal/btf/types.go
+++ /dev/null
@@ -1,871 +0,0 @@
-package btf
-
-import (
- "errors"
- "fmt"
- "math"
- "strings"
-)
-
-const maxTypeDepth = 32
-
-// TypeID identifies a type in a BTF section.
-type TypeID uint32
-
-// ID implements part of the Type interface.
-func (tid TypeID) ID() TypeID {
- return tid
-}
-
-// Type represents a type described by BTF.
-type Type interface {
- ID() TypeID
-
- String() string
-
- // Make a copy of the type, without copying Type members.
- copy() Type
-
- // Enumerate all nested Types. Repeated calls must visit nested
- // types in the same order.
- walk(*typeDeque)
-}
-
-// namedType is a type with a name.
-//
-// Most named types simply embed Name.
-type namedType interface {
- Type
- name() string
-}
-
-// Name identifies a type.
-//
-// Anonymous types have an empty name.
-type Name string
-
-func (n Name) name() string {
- return string(n)
-}
-
-// Void is the unit type of BTF.
-type Void struct{}
-
-func (v *Void) ID() TypeID { return 0 }
-func (v *Void) String() string { return "void#0" }
-func (v *Void) size() uint32 { return 0 }
-func (v *Void) copy() Type { return (*Void)(nil) }
-func (v *Void) walk(*typeDeque) {}
-
-type IntEncoding byte
-
-const (
- Signed IntEncoding = 1 << iota
- Char
- Bool
-)
-
-// Int is an integer of a given length.
-type Int struct {
- TypeID
- Name
-
- // The size of the integer in bytes.
- Size uint32
- Encoding IntEncoding
- // Offset is the starting bit offset. Currently always 0.
- // See https://www.kernel.org/doc/html/latest/bpf/btf.html#btf-kind-int
- Offset uint32
- Bits byte
-}
-
-var _ namedType = (*Int)(nil)
-
-func (i *Int) String() string {
- var s strings.Builder
-
- switch {
- case i.Encoding&Char != 0:
- s.WriteString("char")
- case i.Encoding&Bool != 0:
- s.WriteString("bool")
- default:
- if i.Encoding&Signed == 0 {
- s.WriteRune('u')
- }
- s.WriteString("int")
- fmt.Fprintf(&s, "%d", i.Size*8)
- }
-
- fmt.Fprintf(&s, "#%d", i.TypeID)
-
- if i.Bits > 0 {
- fmt.Fprintf(&s, "[bits=%d]", i.Bits)
- }
-
- return s.String()
-}
-
-func (i *Int) size() uint32 { return i.Size }
-func (i *Int) walk(*typeDeque) {}
-func (i *Int) copy() Type {
- cpy := *i
- return &cpy
-}
-
-func (i *Int) isBitfield() bool {
- return i.Offset > 0
-}
-
-// Pointer is a pointer to another type.
-type Pointer struct {
- TypeID
- Target Type
-}
-
-func (p *Pointer) String() string {
- return fmt.Sprintf("pointer#%d[target=#%d]", p.TypeID, p.Target.ID())
-}
-
-func (p *Pointer) size() uint32 { return 8 }
-func (p *Pointer) walk(tdq *typeDeque) { tdq.push(&p.Target) }
-func (p *Pointer) copy() Type {
- cpy := *p
- return &cpy
-}
-
-// Array is an array with a fixed number of elements.
-type Array struct {
- TypeID
- Type Type
- Nelems uint32
-}
-
-func (arr *Array) String() string {
- return fmt.Sprintf("array#%d[type=#%d n=%d]", arr.TypeID, arr.Type.ID(), arr.Nelems)
-}
-
-func (arr *Array) walk(tdq *typeDeque) { tdq.push(&arr.Type) }
-func (arr *Array) copy() Type {
- cpy := *arr
- return &cpy
-}
-
-// Struct is a compound type of consecutive members.
-type Struct struct {
- TypeID
- Name
- // The size of the struct including padding, in bytes
- Size uint32
- Members []Member
-}
-
-func (s *Struct) String() string {
- return fmt.Sprintf("struct#%d[%q]", s.TypeID, s.Name)
-}
-
-func (s *Struct) size() uint32 { return s.Size }
-
-func (s *Struct) walk(tdq *typeDeque) {
- for i := range s.Members {
- tdq.push(&s.Members[i].Type)
- }
-}
-
-func (s *Struct) copy() Type {
- cpy := *s
- cpy.Members = make([]Member, len(s.Members))
- copy(cpy.Members, s.Members)
- return &cpy
-}
-
-func (s *Struct) members() []Member {
- return s.Members
-}
-
-// Union is a compound type where members occupy the same memory.
-type Union struct {
- TypeID
- Name
- // The size of the union including padding, in bytes.
- Size uint32
- Members []Member
-}
-
-func (u *Union) String() string {
- return fmt.Sprintf("union#%d[%q]", u.TypeID, u.Name)
-}
-
-func (u *Union) size() uint32 { return u.Size }
-
-func (u *Union) walk(tdq *typeDeque) {
- for i := range u.Members {
- tdq.push(&u.Members[i].Type)
- }
-}
-
-func (u *Union) copy() Type {
- cpy := *u
- cpy.Members = make([]Member, len(u.Members))
- copy(cpy.Members, u.Members)
- return &cpy
-}
-
-func (u *Union) members() []Member {
- return u.Members
-}
-
-type composite interface {
- members() []Member
-}
-
-var (
- _ composite = (*Struct)(nil)
- _ composite = (*Union)(nil)
-)
-
-// Member is part of a Struct or Union.
-//
-// It is not a valid Type.
-type Member struct {
- Name
- Type Type
- // Offset is the bit offset of this member
- Offset uint32
- BitfieldSize uint32
-}
-
-// Enum lists possible values.
-type Enum struct {
- TypeID
- Name
- Values []EnumValue
-}
-
-func (e *Enum) String() string {
- return fmt.Sprintf("enum#%d[%q]", e.TypeID, e.Name)
-}
-
-// EnumValue is part of an Enum
-//
-// Is is not a valid Type
-type EnumValue struct {
- Name
- Value int32
-}
-
-func (e *Enum) size() uint32 { return 4 }
-func (e *Enum) walk(*typeDeque) {}
-func (e *Enum) copy() Type {
- cpy := *e
- cpy.Values = make([]EnumValue, len(e.Values))
- copy(cpy.Values, e.Values)
- return &cpy
-}
-
-// FwdKind is the type of forward declaration.
-type FwdKind int
-
-// Valid types of forward declaration.
-const (
- FwdStruct FwdKind = iota
- FwdUnion
-)
-
-func (fk FwdKind) String() string {
- switch fk {
- case FwdStruct:
- return "struct"
- case FwdUnion:
- return "union"
- default:
- return fmt.Sprintf("%T(%d)", fk, int(fk))
- }
-}
-
-// Fwd is a forward declaration of a Type.
-type Fwd struct {
- TypeID
- Name
- Kind FwdKind
-}
-
-func (f *Fwd) String() string {
- return fmt.Sprintf("fwd#%d[%s %q]", f.TypeID, f.Kind, f.Name)
-}
-
-func (f *Fwd) walk(*typeDeque) {}
-func (f *Fwd) copy() Type {
- cpy := *f
- return &cpy
-}
-
-// Typedef is an alias of a Type.
-type Typedef struct {
- TypeID
- Name
- Type Type
-}
-
-func (td *Typedef) String() string {
- return fmt.Sprintf("typedef#%d[%q #%d]", td.TypeID, td.Name, td.Type.ID())
-}
-
-func (td *Typedef) walk(tdq *typeDeque) { tdq.push(&td.Type) }
-func (td *Typedef) copy() Type {
- cpy := *td
- return &cpy
-}
-
-// Volatile is a qualifier.
-type Volatile struct {
- TypeID
- Type Type
-}
-
-func (v *Volatile) String() string {
- return fmt.Sprintf("volatile#%d[#%d]", v.TypeID, v.Type.ID())
-}
-
-func (v *Volatile) qualify() Type { return v.Type }
-func (v *Volatile) walk(tdq *typeDeque) { tdq.push(&v.Type) }
-func (v *Volatile) copy() Type {
- cpy := *v
- return &cpy
-}
-
-// Const is a qualifier.
-type Const struct {
- TypeID
- Type Type
-}
-
-func (c *Const) String() string {
- return fmt.Sprintf("const#%d[#%d]", c.TypeID, c.Type.ID())
-}
-
-func (c *Const) qualify() Type { return c.Type }
-func (c *Const) walk(tdq *typeDeque) { tdq.push(&c.Type) }
-func (c *Const) copy() Type {
- cpy := *c
- return &cpy
-}
-
-// Restrict is a qualifier.
-type Restrict struct {
- TypeID
- Type Type
-}
-
-func (r *Restrict) String() string {
- return fmt.Sprintf("restrict#%d[#%d]", r.TypeID, r.Type.ID())
-}
-
-func (r *Restrict) qualify() Type { return r.Type }
-func (r *Restrict) walk(tdq *typeDeque) { tdq.push(&r.Type) }
-func (r *Restrict) copy() Type {
- cpy := *r
- return &cpy
-}
-
-// Func is a function definition.
-type Func struct {
- TypeID
- Name
- Type Type
-}
-
-func (f *Func) String() string {
- return fmt.Sprintf("func#%d[%q proto=#%d]", f.TypeID, f.Name, f.Type.ID())
-}
-
-func (f *Func) walk(tdq *typeDeque) { tdq.push(&f.Type) }
-func (f *Func) copy() Type {
- cpy := *f
- return &cpy
-}
-
-// FuncProto is a function declaration.
-type FuncProto struct {
- TypeID
- Return Type
- Params []FuncParam
-}
-
-func (fp *FuncProto) String() string {
- var s strings.Builder
- fmt.Fprintf(&s, "proto#%d[", fp.TypeID)
- for _, param := range fp.Params {
- fmt.Fprintf(&s, "%q=#%d, ", param.Name, param.Type.ID())
- }
- fmt.Fprintf(&s, "return=#%d]", fp.Return.ID())
- return s.String()
-}
-
-func (fp *FuncProto) walk(tdq *typeDeque) {
- tdq.push(&fp.Return)
- for i := range fp.Params {
- tdq.push(&fp.Params[i].Type)
- }
-}
-
-func (fp *FuncProto) copy() Type {
- cpy := *fp
- cpy.Params = make([]FuncParam, len(fp.Params))
- copy(cpy.Params, fp.Params)
- return &cpy
-}
-
-type FuncParam struct {
- Name
- Type Type
-}
-
-// Var is a global variable.
-type Var struct {
- TypeID
- Name
- Type Type
-}
-
-func (v *Var) String() string {
- // TODO: Linkage
- return fmt.Sprintf("var#%d[%q]", v.TypeID, v.Name)
-}
-
-func (v *Var) walk(tdq *typeDeque) { tdq.push(&v.Type) }
-func (v *Var) copy() Type {
- cpy := *v
- return &cpy
-}
-
-// Datasec is a global program section containing data.
-type Datasec struct {
- TypeID
- Name
- Size uint32
- Vars []VarSecinfo
-}
-
-func (ds *Datasec) String() string {
- return fmt.Sprintf("section#%d[%q]", ds.TypeID, ds.Name)
-}
-
-func (ds *Datasec) size() uint32 { return ds.Size }
-
-func (ds *Datasec) walk(tdq *typeDeque) {
- for i := range ds.Vars {
- tdq.push(&ds.Vars[i].Type)
- }
-}
-
-func (ds *Datasec) copy() Type {
- cpy := *ds
- cpy.Vars = make([]VarSecinfo, len(ds.Vars))
- copy(cpy.Vars, ds.Vars)
- return &cpy
-}
-
-// VarSecinfo describes variable in a Datasec
-//
-// It is not a valid Type.
-type VarSecinfo struct {
- Type Type
- Offset uint32
- Size uint32
-}
-
-type sizer interface {
- size() uint32
-}
-
-var (
- _ sizer = (*Int)(nil)
- _ sizer = (*Pointer)(nil)
- _ sizer = (*Struct)(nil)
- _ sizer = (*Union)(nil)
- _ sizer = (*Enum)(nil)
- _ sizer = (*Datasec)(nil)
-)
-
-type qualifier interface {
- qualify() Type
-}
-
-var (
- _ qualifier = (*Const)(nil)
- _ qualifier = (*Restrict)(nil)
- _ qualifier = (*Volatile)(nil)
-)
-
-// Sizeof returns the size of a type in bytes.
-//
-// Returns an error if the size can't be computed.
-func Sizeof(typ Type) (int, error) {
- var (
- n = int64(1)
- elem int64
- )
-
- for i := 0; i < maxTypeDepth; i++ {
- switch v := typ.(type) {
- case *Array:
- if n > 0 && int64(v.Nelems) > math.MaxInt64/n {
- return 0, errors.New("overflow")
- }
-
- // Arrays may be of zero length, which allows
- // n to be zero as well.
- n *= int64(v.Nelems)
- typ = v.Type
- continue
-
- case sizer:
- elem = int64(v.size())
-
- case *Typedef:
- typ = v.Type
- continue
-
- case qualifier:
- typ = v.qualify()
- continue
-
- default:
- return 0, fmt.Errorf("unrecognized type %T", typ)
- }
-
- if n > 0 && elem > math.MaxInt64/n {
- return 0, errors.New("overflow")
- }
-
- size := n * elem
- if int64(int(size)) != size {
- return 0, errors.New("overflow")
- }
-
- return int(size), nil
- }
-
- return 0, errors.New("exceeded type depth")
-}
-
-// copy a Type recursively.
-//
-// typ may form a cycle.
-func copyType(typ Type) Type {
- var (
- copies = make(map[Type]Type)
- work typeDeque
- )
-
- for t := &typ; t != nil; t = work.pop() {
- // *t is the identity of the type.
- if cpy := copies[*t]; cpy != nil {
- *t = cpy
- continue
- }
-
- cpy := (*t).copy()
- copies[*t] = cpy
- *t = cpy
-
- // Mark any nested types for copying.
- cpy.walk(&work)
- }
-
- return typ
-}
-
-// typeDeque keeps track of pointers to types which still
-// need to be visited.
-type typeDeque struct {
- types []*Type
- read, write uint64
- mask uint64
-}
-
-// push adds a type to the stack.
-func (dq *typeDeque) push(t *Type) {
- if dq.write-dq.read < uint64(len(dq.types)) {
- dq.types[dq.write&dq.mask] = t
- dq.write++
- return
- }
-
- new := len(dq.types) * 2
- if new == 0 {
- new = 8
- }
-
- types := make([]*Type, new)
- pivot := dq.read & dq.mask
- n := copy(types, dq.types[pivot:])
- n += copy(types[n:], dq.types[:pivot])
- types[n] = t
-
- dq.types = types
- dq.mask = uint64(new) - 1
- dq.read, dq.write = 0, uint64(n+1)
-}
-
-// shift returns the first element or null.
-func (dq *typeDeque) shift() *Type {
- if dq.read == dq.write {
- return nil
- }
-
- index := dq.read & dq.mask
- t := dq.types[index]
- dq.types[index] = nil
- dq.read++
- return t
-}
-
-// pop returns the last element or null.
-func (dq *typeDeque) pop() *Type {
- if dq.read == dq.write {
- return nil
- }
-
- dq.write--
- index := dq.write & dq.mask
- t := dq.types[index]
- dq.types[index] = nil
- return t
-}
-
-// all returns all elements.
-//
-// The deque is empty after calling this method.
-func (dq *typeDeque) all() []*Type {
- length := dq.write - dq.read
- types := make([]*Type, 0, length)
- for t := dq.shift(); t != nil; t = dq.shift() {
- types = append(types, t)
- }
- return types
-}
-
-// inflateRawTypes takes a list of raw btf types linked via type IDs, and turns
-// it into a graph of Types connected via pointers.
-//
-// Returns a map of named types (so, where NameOff is non-zero) and a slice of types
-// indexed by TypeID. Since BTF ignores compilation units, multiple types may share
-// the same name. A Type may form a cyclic graph by pointing at itself.
-func inflateRawTypes(rawTypes []rawType, rawStrings stringTable) (types []Type, namedTypes map[string][]namedType, err error) {
- type fixupDef struct {
- id TypeID
- expectedKind btfKind
- typ *Type
- }
-
- var fixups []fixupDef
- fixup := func(id TypeID, expectedKind btfKind, typ *Type) {
- fixups = append(fixups, fixupDef{id, expectedKind, typ})
- }
-
- convertMembers := func(raw []btfMember, kindFlag bool) ([]Member, error) {
- // NB: The fixup below relies on pre-allocating this array to
- // work, since otherwise append might re-allocate members.
- members := make([]Member, 0, len(raw))
- for i, btfMember := range raw {
- name, err := rawStrings.LookupName(btfMember.NameOff)
- if err != nil {
- return nil, fmt.Errorf("can't get name for member %d: %w", i, err)
- }
- m := Member{
- Name: name,
- Offset: btfMember.Offset,
- }
- if kindFlag {
- m.BitfieldSize = btfMember.Offset >> 24
- m.Offset &= 0xffffff
- }
- members = append(members, m)
- }
- for i := range members {
- fixup(raw[i].Type, kindUnknown, &members[i].Type)
- }
- return members, nil
- }
-
- types = make([]Type, 0, len(rawTypes))
- types = append(types, (*Void)(nil))
- namedTypes = make(map[string][]namedType)
-
- for i, raw := range rawTypes {
- var (
- // Void is defined to always be type ID 0, and is thus
- // omitted from BTF.
- id = TypeID(i + 1)
- typ Type
- )
-
- name, err := rawStrings.LookupName(raw.NameOff)
- if err != nil {
- return nil, nil, fmt.Errorf("get name for type id %d: %w", id, err)
- }
-
- switch raw.Kind() {
- case kindInt:
- encoding, offset, bits := intEncoding(*raw.data.(*uint32))
- typ = &Int{id, name, raw.Size(), encoding, offset, bits}
-
- case kindPointer:
- ptr := &Pointer{id, nil}
- fixup(raw.Type(), kindUnknown, &ptr.Target)
- typ = ptr
-
- case kindArray:
- btfArr := raw.data.(*btfArray)
-
- // IndexType is unused according to btf.rst.
- // Don't make it available right now.
- arr := &Array{id, nil, btfArr.Nelems}
- fixup(btfArr.Type, kindUnknown, &arr.Type)
- typ = arr
-
- case kindStruct:
- members, err := convertMembers(raw.data.([]btfMember), raw.KindFlag())
- if err != nil {
- return nil, nil, fmt.Errorf("struct %s (id %d): %w", name, id, err)
- }
- typ = &Struct{id, name, raw.Size(), members}
-
- case kindUnion:
- members, err := convertMembers(raw.data.([]btfMember), raw.KindFlag())
- if err != nil {
- return nil, nil, fmt.Errorf("union %s (id %d): %w", name, id, err)
- }
- typ = &Union{id, name, raw.Size(), members}
-
- case kindEnum:
- rawvals := raw.data.([]btfEnum)
- vals := make([]EnumValue, 0, len(rawvals))
- for i, btfVal := range rawvals {
- name, err := rawStrings.LookupName(btfVal.NameOff)
- if err != nil {
- return nil, nil, fmt.Errorf("get name for enum value %d: %s", i, err)
- }
- vals = append(vals, EnumValue{
- Name: name,
- Value: btfVal.Val,
- })
- }
- typ = &Enum{id, name, vals}
-
- case kindForward:
- if raw.KindFlag() {
- typ = &Fwd{id, name, FwdUnion}
- } else {
- typ = &Fwd{id, name, FwdStruct}
- }
-
- case kindTypedef:
- typedef := &Typedef{id, name, nil}
- fixup(raw.Type(), kindUnknown, &typedef.Type)
- typ = typedef
-
- case kindVolatile:
- volatile := &Volatile{id, nil}
- fixup(raw.Type(), kindUnknown, &volatile.Type)
- typ = volatile
-
- case kindConst:
- cnst := &Const{id, nil}
- fixup(raw.Type(), kindUnknown, &cnst.Type)
- typ = cnst
-
- case kindRestrict:
- restrict := &Restrict{id, nil}
- fixup(raw.Type(), kindUnknown, &restrict.Type)
- typ = restrict
-
- case kindFunc:
- fn := &Func{id, name, nil}
- fixup(raw.Type(), kindFuncProto, &fn.Type)
- typ = fn
-
- case kindFuncProto:
- rawparams := raw.data.([]btfParam)
- params := make([]FuncParam, 0, len(rawparams))
- for i, param := range rawparams {
- name, err := rawStrings.LookupName(param.NameOff)
- if err != nil {
- return nil, nil, fmt.Errorf("get name for func proto parameter %d: %s", i, err)
- }
- params = append(params, FuncParam{
- Name: name,
- })
- }
- for i := range params {
- fixup(rawparams[i].Type, kindUnknown, &params[i].Type)
- }
-
- fp := &FuncProto{id, nil, params}
- fixup(raw.Type(), kindUnknown, &fp.Return)
- typ = fp
-
- case kindVar:
- v := &Var{id, name, nil}
- fixup(raw.Type(), kindUnknown, &v.Type)
- typ = v
-
- case kindDatasec:
- btfVars := raw.data.([]btfVarSecinfo)
- vars := make([]VarSecinfo, 0, len(btfVars))
- for _, btfVar := range btfVars {
- vars = append(vars, VarSecinfo{
- Offset: btfVar.Offset,
- Size: btfVar.Size,
- })
- }
- for i := range vars {
- fixup(btfVars[i].Type, kindVar, &vars[i].Type)
- }
- typ = &Datasec{id, name, raw.SizeType, vars}
-
- default:
- return nil, nil, fmt.Errorf("type id %d: unknown kind: %v", id, raw.Kind())
- }
-
- types = append(types, typ)
-
- if named, ok := typ.(namedType); ok {
- if name := essentialName(named.name()); name != "" {
- namedTypes[name] = append(namedTypes[name], named)
- }
- }
- }
-
- for _, fixup := range fixups {
- i := int(fixup.id)
- if i >= len(types) {
- return nil, nil, fmt.Errorf("reference to invalid type id: %d", fixup.id)
- }
-
- // Default void (id 0) to unknown
- rawKind := kindUnknown
- if i > 0 {
- rawKind = rawTypes[i-1].Kind()
- }
-
- if expected := fixup.expectedKind; expected != kindUnknown && rawKind != expected {
- return nil, nil, fmt.Errorf("expected type id %d to have kind %s, found %s", fixup.id, expected, rawKind)
- }
-
- *fixup.typ = types[i]
- }
-
- return types, namedTypes, nil
-}
-
-// essentialName returns name without a ___ suffix.
-func essentialName(name string) string {
- lastIdx := strings.LastIndex(name, "___")
- if lastIdx > 0 {
- return name[:lastIdx]
- }
- return name
-}
diff --git a/vendor/github.com/cilium/ebpf/internal/cpu.go b/vendor/github.com/cilium/ebpf/internal/cpu.go
index d3424ba43..3affa1efb 100644
--- a/vendor/github.com/cilium/ebpf/internal/cpu.go
+++ b/vendor/github.com/cilium/ebpf/internal/cpu.go
@@ -2,7 +2,7 @@ package internal
import (
"fmt"
- "io/ioutil"
+ "os"
"strings"
"sync"
)
@@ -24,7 +24,7 @@ func PossibleCPUs() (int, error) {
}
func parseCPUsFromFile(path string) (int, error) {
- spec, err := ioutil.ReadFile(path)
+ spec, err := os.ReadFile(path)
if err != nil {
return 0, err
}
diff --git a/vendor/github.com/cilium/ebpf/internal/elf.go b/vendor/github.com/cilium/ebpf/internal/elf.go
index c3f9ea0f8..011581938 100644
--- a/vendor/github.com/cilium/ebpf/internal/elf.go
+++ b/vendor/github.com/cilium/ebpf/internal/elf.go
@@ -35,6 +35,29 @@ func NewSafeELFFile(r io.ReaderAt) (safe *SafeELFFile, err error) {
return &SafeELFFile{file}, nil
}
+// OpenSafeELFFile reads an ELF from a file.
+//
+// It works like NewSafeELFFile, with the exception that safe.Close will
+// close the underlying file.
+func OpenSafeELFFile(path string) (safe *SafeELFFile, err error) {
+ defer func() {
+ r := recover()
+ if r == nil {
+ return
+ }
+
+ safe = nil
+ err = fmt.Errorf("reading ELF file panicked: %s", r)
+ }()
+
+ file, err := elf.Open(path)
+ if err != nil {
+ return nil, err
+ }
+
+ return &SafeELFFile{file}, nil
+}
+
// Symbols is the safe version of elf.File.Symbols.
func (se *SafeELFFile) Symbols() (syms []elf.Symbol, err error) {
defer func() {
@@ -50,3 +73,30 @@ func (se *SafeELFFile) Symbols() (syms []elf.Symbol, err error) {
syms, err = se.File.Symbols()
return
}
+
+// DynamicSymbols is the safe version of elf.File.DynamicSymbols.
+func (se *SafeELFFile) DynamicSymbols() (syms []elf.Symbol, err error) {
+ defer func() {
+ r := recover()
+ if r == nil {
+ return
+ }
+
+ syms = nil
+ err = fmt.Errorf("reading ELF dynamic symbols panicked: %s", r)
+ }()
+
+ syms, err = se.File.DynamicSymbols()
+ return
+}
+
+// SectionsByType returns all sections in the file with the specified section type.
+func (se *SafeELFFile) SectionsByType(typ elf.SectionType) []*elf.Section {
+ sections := make([]*elf.Section, 0, 1)
+ for _, section := range se.Sections {
+ if section.Type == typ {
+ sections = append(sections, section)
+ }
+ }
+ return sections
+}
diff --git a/vendor/github.com/cilium/ebpf/internal/endian.go b/vendor/github.com/cilium/ebpf/internal/endian.go
deleted file mode 100644
index ac8a94e51..000000000
--- a/vendor/github.com/cilium/ebpf/internal/endian.go
+++ /dev/null
@@ -1,24 +0,0 @@
-package internal
-
-import (
- "encoding/binary"
- "unsafe"
-)
-
-// NativeEndian is set to either binary.BigEndian or binary.LittleEndian,
-// depending on the host's endianness.
-var NativeEndian binary.ByteOrder
-
-func init() {
- if isBigEndian() {
- NativeEndian = binary.BigEndian
- } else {
- NativeEndian = binary.LittleEndian
- }
-}
-
-func isBigEndian() (ret bool) {
- i := int(0x1)
- bs := (*[int(unsafe.Sizeof(i))]byte)(unsafe.Pointer(&i))
- return bs[0] == 0
-}
diff --git a/vendor/github.com/cilium/ebpf/internal/endian_be.go b/vendor/github.com/cilium/ebpf/internal/endian_be.go
new file mode 100644
index 000000000..ad33cda85
--- /dev/null
+++ b/vendor/github.com/cilium/ebpf/internal/endian_be.go
@@ -0,0 +1,13 @@
+//go:build armbe || arm64be || mips || mips64 || mips64p32 || ppc64 || s390 || s390x || sparc || sparc64
+// +build armbe arm64be mips mips64 mips64p32 ppc64 s390 s390x sparc sparc64
+
+package internal
+
+import "encoding/binary"
+
+// NativeEndian is set to either binary.BigEndian or binary.LittleEndian,
+// depending on the host's endianness.
+var NativeEndian binary.ByteOrder = binary.BigEndian
+
+// ClangEndian is set to either "el" or "eb" depending on the host's endianness.
+const ClangEndian = "eb"
diff --git a/vendor/github.com/cilium/ebpf/internal/endian_le.go b/vendor/github.com/cilium/ebpf/internal/endian_le.go
new file mode 100644
index 000000000..41a68224c
--- /dev/null
+++ b/vendor/github.com/cilium/ebpf/internal/endian_le.go
@@ -0,0 +1,13 @@
+//go:build 386 || amd64 || amd64p32 || arm || arm64 || mipsle || mips64le || mips64p32le || ppc64le || riscv64
+// +build 386 amd64 amd64p32 arm arm64 mipsle mips64le mips64p32le ppc64le riscv64
+
+package internal
+
+import "encoding/binary"
+
+// NativeEndian is set to either binary.BigEndian or binary.LittleEndian,
+// depending on the host's endianness.
+var NativeEndian binary.ByteOrder = binary.LittleEndian
+
+// ClangEndian is set to either "el" or "eb" depending on the host's endianness.
+const ClangEndian = "el"
diff --git a/vendor/github.com/cilium/ebpf/internal/errors.go b/vendor/github.com/cilium/ebpf/internal/errors.go
index b6aee81f7..b5ccdd7d0 100644
--- a/vendor/github.com/cilium/ebpf/internal/errors.go
+++ b/vendor/github.com/cilium/ebpf/internal/errors.go
@@ -2,46 +2,205 @@ package internal
import (
"bytes"
- "errors"
"fmt"
+ "io"
"strings"
-
- "github.com/cilium/ebpf/internal/unix"
)
-// ErrorWithLog returns an error that includes logs from the
-// kernel verifier.
+// ErrorWithLog returns an error which includes logs from the kernel verifier.
+//
+// The default error output is a summary of the full log. The latter can be
+// accessed via VerifierError.Log or by formatting the error, see Format.
//
-// logErr should be the error returned by the syscall that generated
-// the log. It is used to check for truncation of the output.
-func ErrorWithLog(err error, log []byte, logErr error) error {
- logStr := strings.Trim(CString(log), "\t\r\n ")
- if errors.Is(logErr, unix.ENOSPC) {
- logStr += " (truncated...)"
+// A set of heuristics is used to determine whether the log has been truncated.
+func ErrorWithLog(err error, log []byte) *VerifierError {
+ const whitespace = "\t\r\v\n "
+
+ // Convert verifier log C string by truncating it on the first 0 byte
+ // and trimming trailing whitespace before interpreting as a Go string.
+ truncated := false
+ if i := bytes.IndexByte(log, 0); i != -1 {
+ if i == len(log)-1 && !bytes.HasSuffix(log[:i], []byte{'\n'}) {
+ // The null byte is at the end of the buffer and it's not preceded
+ // by a newline character. Most likely the buffer was too short.
+ truncated = true
+ }
+
+ log = log[:i]
+ } else if len(log) > 0 {
+ // No null byte? Dodgy!
+ truncated = true
+ }
+
+ log = bytes.Trim(log, whitespace)
+ logLines := bytes.Split(log, []byte{'\n'})
+ lines := make([]string, 0, len(logLines))
+ for _, line := range logLines {
+ // Don't remove leading white space on individual lines. We rely on it
+ // when outputting logs.
+ lines = append(lines, string(bytes.TrimRight(line, whitespace)))
}
- return &VerifierError{err, logStr}
+ return &VerifierError{err, lines, truncated}
}
// VerifierError includes information from the eBPF verifier.
+//
+// It summarises the log output, see Format if you want to output the full contents.
type VerifierError struct {
- cause error
- log string
+ // The error which caused this error.
+ Cause error
+ // The verifier output split into lines.
+ Log []string
+ // Whether the log output is truncated, based on several heuristics.
+ Truncated bool
+}
+
+func (le *VerifierError) Unwrap() error {
+ return le.Cause
}
func (le *VerifierError) Error() string {
- if le.log == "" {
- return le.cause.Error()
+ log := le.Log
+ if n := len(log); n > 0 && strings.HasPrefix(log[n-1], "processed ") {
+ // Get rid of "processed 39 insns (limit 1000000) ..." from summary.
+ log = log[:n-1]
+ }
+
+ n := len(log)
+ if n == 0 {
+ return le.Cause.Error()
+ }
+
+ lines := log[n-1:]
+ if n >= 2 && (includePreviousLine(log[n-1]) || le.Truncated) {
+ // Add one more line of context if it aids understanding the error.
+ lines = log[n-2:]
+ }
+
+ var b strings.Builder
+ fmt.Fprintf(&b, "%s: ", le.Cause.Error())
+
+ for i, line := range lines {
+ b.WriteString(strings.TrimSpace(line))
+ if i != len(lines)-1 {
+ b.WriteString(": ")
+ }
+ }
+
+ omitted := len(le.Log) - len(lines)
+ if omitted == 0 && !le.Truncated {
+ return b.String()
+ }
+
+ b.WriteString(" (")
+ if le.Truncated {
+ b.WriteString("truncated")
+ }
+
+ if omitted > 0 {
+ if le.Truncated {
+ b.WriteString(", ")
+ }
+ fmt.Fprintf(&b, "%d line(s) omitted", omitted)
}
+ b.WriteString(")")
- return fmt.Sprintf("%s: %s", le.cause, le.log)
+ return b.String()
}
-// CString turns a NUL / zero terminated byte buffer into a string.
-func CString(in []byte) string {
- inLen := bytes.IndexByte(in, 0)
- if inLen == -1 {
- return ""
+// includePreviousLine returns true if the given line likely is better
+// understood with additional context from the preceding line.
+func includePreviousLine(line string) bool {
+ // We need to find a good trade off between understandable error messages
+ // and too much complexity here. Checking the string prefix is ok, requiring
+ // regular expressions to do it is probably overkill.
+
+ if strings.HasPrefix(line, "\t") {
+ // [13] STRUCT drm_rect size=16 vlen=4
+ // \tx1 type_id=2
+ return true
+ }
+
+ if len(line) >= 2 && line[0] == 'R' && line[1] >= '0' && line[1] <= '9' {
+ // 0: (95) exit
+ // R0 !read_ok
+ return true
+ }
+
+ if strings.HasPrefix(line, "invalid bpf_context access") {
+ // 0: (79) r6 = *(u64 *)(r1 +0)
+ // func '__x64_sys_recvfrom' arg0 type FWD is not a struct
+ // invalid bpf_context access off=0 size=8
+ return true
+ }
+
+ return false
+}
+
+// Format the error.
+//
+// Understood verbs are %s and %v, which are equivalent to calling Error(). %v
+// allows outputting additional information using the following flags:
+//
+// + Output the first <width> lines, or all lines if no width is given.
+// - Output the last <width> lines, or all lines if no width is given.
+//
+// Use width to specify how many lines to output. Use the '-' flag to output
+// lines from the end of the log instead of the beginning.
+func (le *VerifierError) Format(f fmt.State, verb rune) {
+ switch verb {
+ case 's':
+ _, _ = io.WriteString(f, le.Error())
+
+ case 'v':
+ n, haveWidth := f.Width()
+ if !haveWidth || n > len(le.Log) {
+ n = len(le.Log)
+ }
+
+ if !f.Flag('+') && !f.Flag('-') {
+ if haveWidth {
+ _, _ = io.WriteString(f, "%!v(BADWIDTH)")
+ return
+ }
+
+ _, _ = io.WriteString(f, le.Error())
+ return
+ }
+
+ if f.Flag('+') && f.Flag('-') {
+ _, _ = io.WriteString(f, "%!v(BADFLAG)")
+ return
+ }
+
+ fmt.Fprintf(f, "%s:", le.Cause.Error())
+
+ omitted := len(le.Log) - n
+ lines := le.Log[:n]
+ if f.Flag('-') {
+ // Print last instead of first lines.
+ lines = le.Log[len(le.Log)-n:]
+ if omitted > 0 {
+ fmt.Fprintf(f, "\n\t(%d line(s) omitted)", omitted)
+ }
+ }
+
+ for _, line := range lines {
+ fmt.Fprintf(f, "\n\t%s", line)
+ }
+
+ if !f.Flag('-') {
+ if omitted > 0 {
+ fmt.Fprintf(f, "\n\t(%d line(s) omitted)", omitted)
+ }
+ }
+
+ if le.Truncated {
+ fmt.Fprintf(f, "\n\t(truncated)")
+ }
+
+ default:
+ fmt.Fprintf(f, "%%!%c(BADVERB)", verb)
}
- return string(in[:inLen])
}
diff --git a/vendor/github.com/cilium/ebpf/internal/fd.go b/vendor/github.com/cilium/ebpf/internal/fd.go
deleted file mode 100644
index af04955bd..000000000
--- a/vendor/github.com/cilium/ebpf/internal/fd.go
+++ /dev/null
@@ -1,69 +0,0 @@
-package internal
-
-import (
- "errors"
- "fmt"
- "os"
- "runtime"
- "strconv"
-
- "github.com/cilium/ebpf/internal/unix"
-)
-
-var ErrClosedFd = errors.New("use of closed file descriptor")
-
-type FD struct {
- raw int64
-}
-
-func NewFD(value uint32) *FD {
- fd := &FD{int64(value)}
- runtime.SetFinalizer(fd, (*FD).Close)
- return fd
-}
-
-func (fd *FD) String() string {
- return strconv.FormatInt(fd.raw, 10)
-}
-
-func (fd *FD) Value() (uint32, error) {
- if fd.raw < 0 {
- return 0, ErrClosedFd
- }
-
- return uint32(fd.raw), nil
-}
-
-func (fd *FD) Close() error {
- if fd.raw < 0 {
- return nil
- }
-
- value := int(fd.raw)
- fd.raw = -1
-
- fd.Forget()
- return unix.Close(value)
-}
-
-func (fd *FD) Forget() {
- runtime.SetFinalizer(fd, nil)
-}
-
-func (fd *FD) Dup() (*FD, error) {
- if fd.raw < 0 {
- return nil, ErrClosedFd
- }
-
- dup, err := unix.FcntlInt(uintptr(fd.raw), unix.F_DUPFD_CLOEXEC, 0)
- if err != nil {
- return nil, fmt.Errorf("can't dup fd: %v", err)
- }
-
- return NewFD(uint32(dup)), nil
-}
-
-func (fd *FD) File(name string) *os.File {
- fd.Forget()
- return os.NewFile(uintptr(fd.raw), name)
-}
diff --git a/vendor/github.com/cilium/ebpf/internal/feature.go b/vendor/github.com/cilium/ebpf/internal/feature.go
index ec62ed39b..0a6c2d1d5 100644
--- a/vendor/github.com/cilium/ebpf/internal/feature.go
+++ b/vendor/github.com/cilium/ebpf/internal/feature.go
@@ -54,11 +54,6 @@ type FeatureTestFn func() error
//
// Returns an error wrapping ErrNotSupported if the feature is not supported.
func FeatureTest(name, version string, fn FeatureTestFn) func() error {
- v, err := NewVersion(version)
- if err != nil {
- return func() error { return err }
- }
-
ft := new(featureTest)
return func() error {
ft.RLock()
@@ -79,6 +74,11 @@ func FeatureTest(name, version string, fn FeatureTestFn) func() error {
err := fn()
switch {
case errors.Is(err, ErrNotSupported):
+ v, err := NewVersion(version)
+ if err != nil {
+ return err
+ }
+
ft.result = &UnsupportedFeatureError{
MinimumVersion: v,
Name: name,
@@ -98,41 +98,3 @@ func FeatureTest(name, version string, fn FeatureTestFn) func() error {
return ft.result
}
}
-
-// A Version in the form Major.Minor.Patch.
-type Version [3]uint16
-
-// NewVersion creates a version from a string like "Major.Minor.Patch".
-//
-// Patch is optional.
-func NewVersion(ver string) (Version, error) {
- var major, minor, patch uint16
- n, _ := fmt.Sscanf(ver, "%d.%d.%d", &major, &minor, &patch)
- if n < 2 {
- return Version{}, fmt.Errorf("invalid version: %s", ver)
- }
- return Version{major, minor, patch}, nil
-}
-
-func (v Version) String() string {
- if v[2] == 0 {
- return fmt.Sprintf("v%d.%d", v[0], v[1])
- }
- return fmt.Sprintf("v%d.%d.%d", v[0], v[1], v[2])
-}
-
-// Less returns true if the version is less than another version.
-func (v Version) Less(other Version) bool {
- for i, a := range v {
- if a == other[i] {
- continue
- }
- return a < other[i]
- }
- return false
-}
-
-// Unspecified returns true if the version is all zero.
-func (v Version) Unspecified() bool {
- return v[0] == 0 && v[1] == 0 && v[2] == 0
-}
diff --git a/vendor/github.com/cilium/ebpf/internal/io.go b/vendor/github.com/cilium/ebpf/internal/io.go
index fa7402782..30b6641f0 100644
--- a/vendor/github.com/cilium/ebpf/internal/io.go
+++ b/vendor/github.com/cilium/ebpf/internal/io.go
@@ -1,6 +1,35 @@
package internal
-import "errors"
+import (
+ "bufio"
+ "compress/gzip"
+ "errors"
+ "io"
+ "os"
+)
+
+// NewBufferedSectionReader wraps an io.ReaderAt in an appropriately-sized
+// buffered reader. It is a convenience function for reading subsections of
+// ELF sections while minimizing the amount of read() syscalls made.
+//
+// Syscall overhead is non-negligible in continuous integration context
+// where ELFs might be accessed over virtual filesystems with poor random
+// access performance. Buffering reads makes sense because (sub)sections
+// end up being read completely anyway.
+//
+// Use instead of the r.Seek() + io.LimitReader() pattern.
+func NewBufferedSectionReader(ra io.ReaderAt, off, n int64) *bufio.Reader {
+ // Clamp the size of the buffer to one page to avoid slurping large parts
+ // of a file into memory. bufio.NewReader uses a hardcoded default buffer
+ // of 4096. Allow arches with larger pages to allocate more, but don't
+ // allocate a fixed 4k buffer if we only need to read a small segment.
+ buf := n
+ if ps := int64(os.Getpagesize()); n > ps {
+ buf = ps
+ }
+
+ return bufio.NewReaderSize(io.NewSectionReader(ra, off, n), int(buf))
+}
// DiscardZeroes makes sure that all written bytes are zero
// before discarding them.
@@ -14,3 +43,20 @@ func (DiscardZeroes) Write(p []byte) (int, error) {
}
return len(p), nil
}
+
+// ReadAllCompressed decompresses a gzipped file into memory.
+func ReadAllCompressed(file string) ([]byte, error) {
+ fh, err := os.Open(file)
+ if err != nil {
+ return nil, err
+ }
+ defer fh.Close()
+
+ gz, err := gzip.NewReader(fh)
+ if err != nil {
+ return nil, err
+ }
+ defer gz.Close()
+
+ return io.ReadAll(gz)
+}
diff --git a/vendor/github.com/cilium/ebpf/internal/output.go b/vendor/github.com/cilium/ebpf/internal/output.go
new file mode 100644
index 000000000..aeab37fcf
--- /dev/null
+++ b/vendor/github.com/cilium/ebpf/internal/output.go
@@ -0,0 +1,84 @@
+package internal
+
+import (
+ "bytes"
+ "errors"
+ "go/format"
+ "go/scanner"
+ "io"
+ "strings"
+ "unicode"
+)
+
+// Identifier turns a C style type or field name into an exportable Go equivalent.
+func Identifier(str string) string {
+ prev := rune(-1)
+ return strings.Map(func(r rune) rune {
+ // See https://golang.org/ref/spec#Identifiers
+ switch {
+ case unicode.IsLetter(r):
+ if prev == -1 {
+ r = unicode.ToUpper(r)
+ }
+
+ case r == '_':
+ switch {
+ // The previous rune was deleted, or we are at the
+ // beginning of the string.
+ case prev == -1:
+ fallthrough
+
+ // The previous rune is a lower case letter or a digit.
+ case unicode.IsDigit(prev) || (unicode.IsLetter(prev) && unicode.IsLower(prev)):
+ // delete the current rune, and force the
+ // next character to be uppercased.
+ r = -1
+ }
+
+ case unicode.IsDigit(r):
+
+ default:
+ // Delete the current rune. prev is unchanged.
+ return -1
+ }
+
+ prev = r
+ return r
+ }, str)
+}
+
+// WriteFormatted outputs a formatted src into out.
+//
+// If formatting fails it returns an informative error message.
+func WriteFormatted(src []byte, out io.Writer) error {
+ formatted, err := format.Source(src)
+ if err == nil {
+ _, err = out.Write(formatted)
+ return err
+ }
+
+ var el scanner.ErrorList
+ if !errors.As(err, &el) {
+ return err
+ }
+
+ var nel scanner.ErrorList
+ for _, err := range el {
+ if !err.Pos.IsValid() {
+ nel = append(nel, err)
+ continue
+ }
+
+ buf := src[err.Pos.Offset:]
+ nl := bytes.IndexRune(buf, '\n')
+ if nl == -1 {
+ nel = append(nel, err)
+ continue
+ }
+
+ err.Msg += ": " + string(buf[:nl])
+ nel = append(nel, err)
+ }
+
+ return nel
+}
diff --git a/vendor/github.com/cilium/ebpf/internal/pinning.go b/vendor/github.com/cilium/ebpf/internal/pinning.go
new file mode 100644
index 000000000..c711353c3
--- /dev/null
+++ b/vendor/github.com/cilium/ebpf/internal/pinning.go
@@ -0,0 +1,77 @@
+package internal
+
+import (
+ "errors"
+ "fmt"
+ "os"
+ "path/filepath"
+ "runtime"
+ "unsafe"
+
+ "github.com/cilium/ebpf/internal/sys"
+ "github.com/cilium/ebpf/internal/unix"
+)
+
+func Pin(currentPath, newPath string, fd *sys.FD) error {
+ const bpfFSType = 0xcafe4a11
+
+ if newPath == "" {
+ return errors.New("given pinning path cannot be empty")
+ }
+ if currentPath == newPath {
+ return nil
+ }
+
+ var statfs unix.Statfs_t
+ if err := unix.Statfs(filepath.Dir(newPath), &statfs); err != nil {
+ return err
+ }
+
+ fsType := int64(statfs.Type)
+ if unsafe.Sizeof(statfs.Type) == 4 {
+ // We're on a 32 bit arch, where statfs.Type is int32. bpfFSType is a
+ // negative number when interpreted as int32 so we need to cast via
+ // uint32 to avoid sign extension.
+ fsType = int64(uint32(statfs.Type))
+ }
+
+ if fsType != bpfFSType {
+ return fmt.Errorf("%s is not on a bpf filesystem", newPath)
+ }
+
+ defer runtime.KeepAlive(fd)
+
+ if currentPath == "" {
+ return sys.ObjPin(&sys.ObjPinAttr{
+ Pathname: sys.NewStringPointer(newPath),
+ BpfFd: fd.Uint(),
+ })
+ }
+
+ // Renameat2 is used instead of os.Rename to disallow the new path replacing
+ // an existing path.
+ err := unix.Renameat2(unix.AT_FDCWD, currentPath, unix.AT_FDCWD, newPath, unix.RENAME_NOREPLACE)
+ if err == nil {
+ // Object is now moved to the new pinning path.
+ return nil
+ }
+ if !os.IsNotExist(err) {
+ return fmt.Errorf("unable to move pinned object to new path %v: %w", newPath, err)
+ }
+ // Internal state not in sync with the file system so let's fix it.
+ return sys.ObjPin(&sys.ObjPinAttr{
+ Pathname: sys.NewStringPointer(newPath),
+ BpfFd: fd.Uint(),
+ })
+}
+
+func Unpin(pinnedPath string) error {
+ if pinnedPath == "" {
+ return nil
+ }
+ err := os.Remove(pinnedPath)
+ if err == nil || os.IsNotExist(err) {
+ return nil
+ }
+ return err
+}
diff --git a/vendor/github.com/cilium/ebpf/internal/ptr_64.go b/vendor/github.com/cilium/ebpf/internal/ptr_64.go
deleted file mode 100644
index 69452dceb..000000000
--- a/vendor/github.com/cilium/ebpf/internal/ptr_64.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// +build !386,!amd64p32,!arm,!mipsle,!mips64p32le
-// +build !armbe,!mips,!mips64p32
-
-package internal
-
-import (
- "unsafe"
-)
-
-// Pointer wraps an unsafe.Pointer to be 64bit to
-// conform to the syscall specification.
-type Pointer struct {
- ptr unsafe.Pointer
-}
diff --git a/vendor/github.com/cilium/ebpf/internal/sys/doc.go b/vendor/github.com/cilium/ebpf/internal/sys/doc.go
new file mode 100644
index 000000000..dfe174448
--- /dev/null
+++ b/vendor/github.com/cilium/ebpf/internal/sys/doc.go
@@ -0,0 +1,6 @@
+// Package sys contains bindings for the BPF syscall.
+package sys
+
+// Regenerate types.go by invoking go generate in the current directory.
+
+//go:generate go run github.com/cilium/ebpf/internal/cmd/gentypes ../../btf/testdata/vmlinux.btf.gz
diff --git a/vendor/github.com/cilium/ebpf/internal/sys/fd.go b/vendor/github.com/cilium/ebpf/internal/sys/fd.go
new file mode 100644
index 000000000..65517d45e
--- /dev/null
+++ b/vendor/github.com/cilium/ebpf/internal/sys/fd.go
@@ -0,0 +1,96 @@
+package sys
+
+import (
+ "fmt"
+ "math"
+ "os"
+ "runtime"
+ "strconv"
+
+ "github.com/cilium/ebpf/internal/unix"
+)
+
+var ErrClosedFd = unix.EBADF
+
+type FD struct {
+ raw int
+}
+
+func newFD(value int) *FD {
+ fd := &FD{value}
+ runtime.SetFinalizer(fd, (*FD).Close)
+ return fd
+}
+
+// NewFD wraps a raw fd with a finalizer.
+//
+// You must not use the raw fd after calling this function, since the underlying
+// file descriptor number may change. This is because the BPF UAPI assumes that
+// zero is not a valid fd value.
+func NewFD(value int) (*FD, error) {
+ if value < 0 {
+ return nil, fmt.Errorf("invalid fd %d", value)
+ }
+
+ fd := newFD(value)
+ if value != 0 {
+ return fd, nil
+ }
+
+ dup, err := fd.Dup()
+ _ = fd.Close()
+ return dup, err
+}
+
+func (fd *FD) String() string {
+ return strconv.FormatInt(int64(fd.raw), 10)
+}
+
+func (fd *FD) Int() int {
+ return fd.raw
+}
+
+func (fd *FD) Uint() uint32 {
+ if fd.raw < 0 || int64(fd.raw) > math.MaxUint32 {
+ // Best effort: this is the number most likely to be an invalid file
+ // descriptor. It is equal to -1 (on two's complement arches).
+ return math.MaxUint32
+ }
+ return uint32(fd.raw)
+}
+
+func (fd *FD) Close() error {
+ if fd.raw < 0 {
+ return nil
+ }
+
+ value := int(fd.raw)
+ fd.raw = -1
+
+ fd.Forget()
+ return unix.Close(value)
+}
+
+func (fd *FD) Forget() {
+ runtime.SetFinalizer(fd, nil)
+}
+
+func (fd *FD) Dup() (*FD, error) {
+ if fd.raw < 0 {
+ return nil, ErrClosedFd
+ }
+
+ // Always require the fd to be larger than zero: the BPF API treats the value
+ // as "no argument provided".
+ dup, err := unix.FcntlInt(uintptr(fd.raw), unix.F_DUPFD_CLOEXEC, 1)
+ if err != nil {
+ return nil, fmt.Errorf("can't dup fd: %v", err)
+ }
+
+ return newFD(dup), nil
+}
+
+func (fd *FD) File(name string) *os.File {
+ fd.Forget()
+ return os.NewFile(uintptr(fd.raw), name)
+}
diff --git a/vendor/github.com/cilium/ebpf/internal/ptr.go b/vendor/github.com/cilium/ebpf/internal/sys/ptr.go
index a7f12b2db..a22100688 100644
--- a/vendor/github.com/cilium/ebpf/internal/ptr.go
+++ b/vendor/github.com/cilium/ebpf/internal/sys/ptr.go
@@ -1,6 +1,10 @@
-package internal
+package sys
-import "unsafe"
+import (
+ "unsafe"
+
+ "github.com/cilium/ebpf/internal/unix"
+)
// NewPointer creates a 64-bit pointer from an unsafe Pointer.
func NewPointer(ptr unsafe.Pointer) Pointer {
@@ -16,15 +20,19 @@ func NewSlicePointer(buf []byte) Pointer {
return Pointer{ptr: unsafe.Pointer(&buf[0])}
}
+// NewSlicePointer creates a 64-bit pointer from a byte slice.
+//
+// Useful to assign both the pointer and the length in one go.
+func NewSlicePointerLen(buf []byte) (Pointer, uint32) {
+ return NewSlicePointer(buf), uint32(len(buf))
+}
+
// NewStringPointer creates a 64-bit pointer from a string.
func NewStringPointer(str string) Pointer {
- if str == "" {
+ p, err := unix.BytePtrFromString(str)
+ if err != nil {
return Pointer{}
}
- // The kernel expects strings to be zero terminated
- buf := make([]byte, len(str)+1)
- copy(buf, str)
-
- return Pointer{ptr: unsafe.Pointer(&buf[0])}
+ return Pointer{ptr: unsafe.Pointer(p)}
}
diff --git a/vendor/github.com/cilium/ebpf/internal/ptr_32_be.go b/vendor/github.com/cilium/ebpf/internal/sys/ptr_32_be.go
index a56fbcc8e..df903d780 100644
--- a/vendor/github.com/cilium/ebpf/internal/ptr_32_be.go
+++ b/vendor/github.com/cilium/ebpf/internal/sys/ptr_32_be.go
@@ -1,6 +1,7 @@
+//go:build armbe || mips || mips64p32
// +build armbe mips mips64p32
-package internal
+package sys
import (
"unsafe"
diff --git a/vendor/github.com/cilium/ebpf/internal/ptr_32_le.go b/vendor/github.com/cilium/ebpf/internal/sys/ptr_32_le.go
index be2ecfca7..a6a51edb6 100644
--- a/vendor/github.com/cilium/ebpf/internal/ptr_32_le.go
+++ b/vendor/github.com/cilium/ebpf/internal/sys/ptr_32_le.go
@@ -1,6 +1,7 @@
+//go:build 386 || amd64p32 || arm || mipsle || mips64p32le
// +build 386 amd64p32 arm mipsle mips64p32le
-package internal
+package sys
import (
"unsafe"
diff --git a/vendor/github.com/cilium/ebpf/internal/sys/ptr_64.go b/vendor/github.com/cilium/ebpf/internal/sys/ptr_64.go
new file mode 100644
index 000000000..7c0279e48
--- /dev/null
+++ b/vendor/github.com/cilium/ebpf/internal/sys/ptr_64.go
@@ -0,0 +1,14 @@
+//go:build !386 && !amd64p32 && !arm && !mipsle && !mips64p32le && !armbe && !mips && !mips64p32
+// +build !386,!amd64p32,!arm,!mipsle,!mips64p32le,!armbe,!mips,!mips64p32
+
+package sys
+
+import (
+ "unsafe"
+)
+
+// Pointer wraps an unsafe.Pointer to be 64bit to
+// conform to the syscall specification.
+type Pointer struct {
+ ptr unsafe.Pointer
+}
diff --git a/vendor/github.com/cilium/ebpf/internal/sys/syscall.go b/vendor/github.com/cilium/ebpf/internal/sys/syscall.go
new file mode 100644
index 000000000..2a5935dc9
--- /dev/null
+++ b/vendor/github.com/cilium/ebpf/internal/sys/syscall.go
@@ -0,0 +1,126 @@
+package sys
+
+import (
+ "runtime"
+ "syscall"
+ "unsafe"
+
+ "github.com/cilium/ebpf/internal/unix"
+)
+
+// BPF wraps SYS_BPF.
+//
+// Any pointers contained in attr must use the Pointer type from this package.
+func BPF(cmd Cmd, attr unsafe.Pointer, size uintptr) (uintptr, error) {
+ for {
+ r1, _, errNo := unix.Syscall(unix.SYS_BPF, uintptr(cmd), uintptr(attr), size)
+ runtime.KeepAlive(attr)
+
+ // As of ~4.20 the verifier can be interrupted by a signal,
+ // and returns EAGAIN in that case.
+ if errNo == unix.EAGAIN && cmd == BPF_PROG_LOAD {
+ continue
+ }
+
+ var err error
+ if errNo != 0 {
+ err = wrappedErrno{errNo}
+ }
+
+ return r1, err
+ }
+}
+
+// Info is implemented by all structs that can be passed to the ObjInfo syscall.
+//
+// MapInfo
+// ProgInfo
+// LinkInfo
+// BtfInfo
+type Info interface {
+ info() (unsafe.Pointer, uint32)
+}
+
+var _ Info = (*MapInfo)(nil)
+
+func (i *MapInfo) info() (unsafe.Pointer, uint32) {
+ return unsafe.Pointer(i), uint32(unsafe.Sizeof(*i))
+}
+
+var _ Info = (*ProgInfo)(nil)
+
+func (i *ProgInfo) info() (unsafe.Pointer, uint32) {
+ return unsafe.Pointer(i), uint32(unsafe.Sizeof(*i))
+}
+
+var _ Info = (*LinkInfo)(nil)
+
+func (i *LinkInfo) info() (unsafe.Pointer, uint32) {
+ return unsafe.Pointer(i), uint32(unsafe.Sizeof(*i))
+}
+
+var _ Info = (*BtfInfo)(nil)
+
+func (i *BtfInfo) info() (unsafe.Pointer, uint32) {
+ return unsafe.Pointer(i), uint32(unsafe.Sizeof(*i))
+}
+
+// ObjInfo retrieves information about a BPF Fd.
+//
+// info may be one of MapInfo, ProgInfo, LinkInfo and BtfInfo.
+func ObjInfo(fd *FD, info Info) error {
+ ptr, len := info.info()
+ err := ObjGetInfoByFd(&ObjGetInfoByFdAttr{
+ BpfFd: fd.Uint(),
+ InfoLen: len,
+ Info: NewPointer(ptr),
+ })
+ runtime.KeepAlive(fd)
+ return err
+}
+
+// BPFObjName is a null-terminated string made up of
+// 'A-Za-z0-9_' characters.
+type ObjName [unix.BPF_OBJ_NAME_LEN]byte
+
+// NewObjName truncates the result if it is too long.
+func NewObjName(name string) ObjName {
+ var result ObjName
+ copy(result[:unix.BPF_OBJ_NAME_LEN-1], name)
+ return result
+}
+
+// LinkID uniquely identifies a bpf_link.
+type LinkID uint32
+
+// BTFID uniquely identifies a BTF blob loaded into the kernel.
+type BTFID uint32
+
+// wrappedErrno wraps syscall.Errno to prevent direct comparisons with
+// syscall.E* or unix.E* constants.
+//
+// You should never export an error of this type.
+type wrappedErrno struct {
+ syscall.Errno
+}
+
+func (we wrappedErrno) Unwrap() error {
+ return we.Errno
+}
+
+type syscallError struct {
+ error
+ errno syscall.Errno
+}
+
+func Error(err error, errno syscall.Errno) error {
+ return &syscallError{err, errno}
+}
+
+func (se *syscallError) Is(target error) bool {
+ return target == se.error
+}
+
+func (se *syscallError) Unwrap() error {
+ return se.errno
+}
diff --git a/vendor/github.com/cilium/ebpf/internal/sys/types.go b/vendor/github.com/cilium/ebpf/internal/sys/types.go
new file mode 100644
index 000000000..291e3a619
--- /dev/null
+++ b/vendor/github.com/cilium/ebpf/internal/sys/types.go
@@ -0,0 +1,1052 @@
+// Code generated by internal/cmd/gentypes; DO NOT EDIT.
+
+package sys
+
+import (
+ "unsafe"
+)
+
+type AdjRoomMode int32
+
+const (
+ BPF_ADJ_ROOM_NET AdjRoomMode = 0
+ BPF_ADJ_ROOM_MAC AdjRoomMode = 1
+)
+
+type AttachType int32
+
+const (
+ BPF_CGROUP_INET_INGRESS AttachType = 0
+ BPF_CGROUP_INET_EGRESS AttachType = 1
+ BPF_CGROUP_INET_SOCK_CREATE AttachType = 2
+ BPF_CGROUP_SOCK_OPS AttachType = 3
+ BPF_SK_SKB_STREAM_PARSER AttachType = 4
+ BPF_SK_SKB_STREAM_VERDICT AttachType = 5
+ BPF_CGROUP_DEVICE AttachType = 6
+ BPF_SK_MSG_VERDICT AttachType = 7
+ BPF_CGROUP_INET4_BIND AttachType = 8
+ BPF_CGROUP_INET6_BIND AttachType = 9
+ BPF_CGROUP_INET4_CONNECT AttachType = 10
+ BPF_CGROUP_INET6_CONNECT AttachType = 11
+ BPF_CGROUP_INET4_POST_BIND AttachType = 12
+ BPF_CGROUP_INET6_POST_BIND AttachType = 13
+ BPF_CGROUP_UDP4_SENDMSG AttachType = 14
+ BPF_CGROUP_UDP6_SENDMSG AttachType = 15
+ BPF_LIRC_MODE2 AttachType = 16
+ BPF_FLOW_DISSECTOR AttachType = 17
+ BPF_CGROUP_SYSCTL AttachType = 18
+ BPF_CGROUP_UDP4_RECVMSG AttachType = 19
+ BPF_CGROUP_UDP6_RECVMSG AttachType = 20
+ BPF_CGROUP_GETSOCKOPT AttachType = 21
+ BPF_CGROUP_SETSOCKOPT AttachType = 22
+ BPF_TRACE_RAW_TP AttachType = 23
+ BPF_TRACE_FENTRY AttachType = 24
+ BPF_TRACE_FEXIT AttachType = 25
+ BPF_MODIFY_RETURN AttachType = 26
+ BPF_LSM_MAC AttachType = 27
+ BPF_TRACE_ITER AttachType = 28
+ BPF_CGROUP_INET4_GETPEERNAME AttachType = 29
+ BPF_CGROUP_INET6_GETPEERNAME AttachType = 30
+ BPF_CGROUP_INET4_GETSOCKNAME AttachType = 31
+ BPF_CGROUP_INET6_GETSOCKNAME AttachType = 32
+ BPF_XDP_DEVMAP AttachType = 33
+ BPF_CGROUP_INET_SOCK_RELEASE AttachType = 34
+ BPF_XDP_CPUMAP AttachType = 35
+ BPF_SK_LOOKUP AttachType = 36
+ BPF_XDP AttachType = 37
+ BPF_SK_SKB_VERDICT AttachType = 38
+ BPF_SK_REUSEPORT_SELECT AttachType = 39
+ BPF_SK_REUSEPORT_SELECT_OR_MIGRATE AttachType = 40
+ BPF_PERF_EVENT AttachType = 41
+ BPF_TRACE_KPROBE_MULTI AttachType = 42
+ __MAX_BPF_ATTACH_TYPE AttachType = 43
+)
+
+type Cmd int32
+
+const (
+ BPF_MAP_CREATE Cmd = 0
+ BPF_MAP_LOOKUP_ELEM Cmd = 1
+ BPF_MAP_UPDATE_ELEM Cmd = 2
+ BPF_MAP_DELETE_ELEM Cmd = 3
+ BPF_MAP_GET_NEXT_KEY Cmd = 4
+ BPF_PROG_LOAD Cmd = 5
+ BPF_OBJ_PIN Cmd = 6
+ BPF_OBJ_GET Cmd = 7
+ BPF_PROG_ATTACH Cmd = 8
+ BPF_PROG_DETACH Cmd = 9
+ BPF_PROG_TEST_RUN Cmd = 10
+ BPF_PROG_RUN Cmd = 10
+ BPF_PROG_GET_NEXT_ID Cmd = 11
+ BPF_MAP_GET_NEXT_ID Cmd = 12
+ BPF_PROG_GET_FD_BY_ID Cmd = 13
+ BPF_MAP_GET_FD_BY_ID Cmd = 14
+ BPF_OBJ_GET_INFO_BY_FD Cmd = 15
+ BPF_PROG_QUERY Cmd = 16
+ BPF_RAW_TRACEPOINT_OPEN Cmd = 17
+ BPF_BTF_LOAD Cmd = 18
+ BPF_BTF_GET_FD_BY_ID Cmd = 19
+ BPF_TASK_FD_QUERY Cmd = 20
+ BPF_MAP_LOOKUP_AND_DELETE_ELEM Cmd = 21
+ BPF_MAP_FREEZE Cmd = 22
+ BPF_BTF_GET_NEXT_ID Cmd = 23
+ BPF_MAP_LOOKUP_BATCH Cmd = 24
+ BPF_MAP_LOOKUP_AND_DELETE_BATCH Cmd = 25
+ BPF_MAP_UPDATE_BATCH Cmd = 26
+ BPF_MAP_DELETE_BATCH Cmd = 27
+ BPF_LINK_CREATE Cmd = 28
+ BPF_LINK_UPDATE Cmd = 29
+ BPF_LINK_GET_FD_BY_ID Cmd = 30
+ BPF_LINK_GET_NEXT_ID Cmd = 31
+ BPF_ENABLE_STATS Cmd = 32
+ BPF_ITER_CREATE Cmd = 33
+ BPF_LINK_DETACH Cmd = 34
+ BPF_PROG_BIND_MAP Cmd = 35
+)
+
+type FunctionId int32
+
+const (
+ BPF_FUNC_unspec FunctionId = 0
+ BPF_FUNC_map_lookup_elem FunctionId = 1
+ BPF_FUNC_map_update_elem FunctionId = 2
+ BPF_FUNC_map_delete_elem FunctionId = 3
+ BPF_FUNC_probe_read FunctionId = 4
+ BPF_FUNC_ktime_get_ns FunctionId = 5
+ BPF_FUNC_trace_printk FunctionId = 6
+ BPF_FUNC_get_prandom_u32 FunctionId = 7
+ BPF_FUNC_get_smp_processor_id FunctionId = 8
+ BPF_FUNC_skb_store_bytes FunctionId = 9
+ BPF_FUNC_l3_csum_replace FunctionId = 10
+ BPF_FUNC_l4_csum_replace FunctionId = 11
+ BPF_FUNC_tail_call FunctionId = 12
+ BPF_FUNC_clone_redirect FunctionId = 13
+ BPF_FUNC_get_current_pid_tgid FunctionId = 14
+ BPF_FUNC_get_current_uid_gid FunctionId = 15
+ BPF_FUNC_get_current_comm FunctionId = 16
+ BPF_FUNC_get_cgroup_classid FunctionId = 17
+ BPF_FUNC_skb_vlan_push FunctionId = 18
+ BPF_FUNC_skb_vlan_pop FunctionId = 19
+ BPF_FUNC_skb_get_tunnel_key FunctionId = 20
+ BPF_FUNC_skb_set_tunnel_key FunctionId = 21
+ BPF_FUNC_perf_event_read FunctionId = 22
+ BPF_FUNC_redirect FunctionId = 23
+ BPF_FUNC_get_route_realm FunctionId = 24
+ BPF_FUNC_perf_event_output FunctionId = 25
+ BPF_FUNC_skb_load_bytes FunctionId = 26
+ BPF_FUNC_get_stackid FunctionId = 27
+ BPF_FUNC_csum_diff FunctionId = 28
+ BPF_FUNC_skb_get_tunnel_opt FunctionId = 29
+ BPF_FUNC_skb_set_tunnel_opt FunctionId = 30
+ BPF_FUNC_skb_change_proto FunctionId = 31
+ BPF_FUNC_skb_change_type FunctionId = 32
+ BPF_FUNC_skb_under_cgroup FunctionId = 33
+ BPF_FUNC_get_hash_recalc FunctionId = 34
+ BPF_FUNC_get_current_task FunctionId = 35
+ BPF_FUNC_probe_write_user FunctionId = 36
+ BPF_FUNC_current_task_under_cgroup FunctionId = 37
+ BPF_FUNC_skb_change_tail FunctionId = 38
+ BPF_FUNC_skb_pull_data FunctionId = 39
+ BPF_FUNC_csum_update FunctionId = 40
+ BPF_FUNC_set_hash_invalid FunctionId = 41
+ BPF_FUNC_get_numa_node_id FunctionId = 42
+ BPF_FUNC_skb_change_head FunctionId = 43
+ BPF_FUNC_xdp_adjust_head FunctionId = 44
+ BPF_FUNC_probe_read_str FunctionId = 45
+ BPF_FUNC_get_socket_cookie FunctionId = 46
+ BPF_FUNC_get_socket_uid FunctionId = 47
+ BPF_FUNC_set_hash FunctionId = 48
+ BPF_FUNC_setsockopt FunctionId = 49
+ BPF_FUNC_skb_adjust_room FunctionId = 50
+ BPF_FUNC_redirect_map FunctionId = 51
+ BPF_FUNC_sk_redirect_map FunctionId = 52
+ BPF_FUNC_sock_map_update FunctionId = 53
+ BPF_FUNC_xdp_adjust_meta FunctionId = 54
+ BPF_FUNC_perf_event_read_value FunctionId = 55
+ BPF_FUNC_perf_prog_read_value FunctionId = 56
+ BPF_FUNC_getsockopt FunctionId = 57
+ BPF_FUNC_override_return FunctionId = 58
+ BPF_FUNC_sock_ops_cb_flags_set FunctionId = 59
+ BPF_FUNC_msg_redirect_map FunctionId = 60
+ BPF_FUNC_msg_apply_bytes FunctionId = 61
+ BPF_FUNC_msg_cork_bytes FunctionId = 62
+ BPF_FUNC_msg_pull_data FunctionId = 63
+ BPF_FUNC_bind FunctionId = 64
+ BPF_FUNC_xdp_adjust_tail FunctionId = 65
+ BPF_FUNC_skb_get_xfrm_state FunctionId = 66
+ BPF_FUNC_get_stack FunctionId = 67
+ BPF_FUNC_skb_load_bytes_relative FunctionId = 68
+ BPF_FUNC_fib_lookup FunctionId = 69
+ BPF_FUNC_sock_hash_update FunctionId = 70
+ BPF_FUNC_msg_redirect_hash FunctionId = 71
+ BPF_FUNC_sk_redirect_hash FunctionId = 72
+ BPF_FUNC_lwt_push_encap FunctionId = 73
+ BPF_FUNC_lwt_seg6_store_bytes FunctionId = 74
+ BPF_FUNC_lwt_seg6_adjust_srh FunctionId = 75
+ BPF_FUNC_lwt_seg6_action FunctionId = 76
+ BPF_FUNC_rc_repeat FunctionId = 77
+ BPF_FUNC_rc_keydown FunctionId = 78
+ BPF_FUNC_skb_cgroup_id FunctionId = 79
+ BPF_FUNC_get_current_cgroup_id FunctionId = 80
+ BPF_FUNC_get_local_storage FunctionId = 81
+ BPF_FUNC_sk_select_reuseport FunctionId = 82
+ BPF_FUNC_skb_ancestor_cgroup_id FunctionId = 83
+ BPF_FUNC_sk_lookup_tcp FunctionId = 84
+ BPF_FUNC_sk_lookup_udp FunctionId = 85
+ BPF_FUNC_sk_release FunctionId = 86
+ BPF_FUNC_map_push_elem FunctionId = 87
+ BPF_FUNC_map_pop_elem FunctionId = 88
+ BPF_FUNC_map_peek_elem FunctionId = 89
+ BPF_FUNC_msg_push_data FunctionId = 90
+ BPF_FUNC_msg_pop_data FunctionId = 91
+ BPF_FUNC_rc_pointer_rel FunctionId = 92
+ BPF_FUNC_spin_lock FunctionId = 93
+ BPF_FUNC_spin_unlock FunctionId = 94
+ BPF_FUNC_sk_fullsock FunctionId = 95
+ BPF_FUNC_tcp_sock FunctionId = 96
+ BPF_FUNC_skb_ecn_set_ce FunctionId = 97
+ BPF_FUNC_get_listener_sock FunctionId = 98
+ BPF_FUNC_skc_lookup_tcp FunctionId = 99
+ BPF_FUNC_tcp_check_syncookie FunctionId = 100
+ BPF_FUNC_sysctl_get_name FunctionId = 101
+ BPF_FUNC_sysctl_get_current_value FunctionId = 102
+ BPF_FUNC_sysctl_get_new_value FunctionId = 103
+ BPF_FUNC_sysctl_set_new_value FunctionId = 104
+ BPF_FUNC_strtol FunctionId = 105
+ BPF_FUNC_strtoul FunctionId = 106
+ BPF_FUNC_sk_storage_get FunctionId = 107
+ BPF_FUNC_sk_storage_delete FunctionId = 108
+ BPF_FUNC_send_signal FunctionId = 109
+ BPF_FUNC_tcp_gen_syncookie FunctionId = 110
+ BPF_FUNC_skb_output FunctionId = 111
+ BPF_FUNC_probe_read_user FunctionId = 112
+ BPF_FUNC_probe_read_kernel FunctionId = 113
+ BPF_FUNC_probe_read_user_str FunctionId = 114
+ BPF_FUNC_probe_read_kernel_str FunctionId = 115
+ BPF_FUNC_tcp_send_ack FunctionId = 116
+ BPF_FUNC_send_signal_thread FunctionId = 117
+ BPF_FUNC_jiffies64 FunctionId = 118
+ BPF_FUNC_read_branch_records FunctionId = 119
+ BPF_FUNC_get_ns_current_pid_tgid FunctionId = 120
+ BPF_FUNC_xdp_output FunctionId = 121
+ BPF_FUNC_get_netns_cookie FunctionId = 122
+ BPF_FUNC_get_current_ancestor_cgroup_id FunctionId = 123
+ BPF_FUNC_sk_assign FunctionId = 124
+ BPF_FUNC_ktime_get_boot_ns FunctionId = 125
+ BPF_FUNC_seq_printf FunctionId = 126
+ BPF_FUNC_seq_write FunctionId = 127
+ BPF_FUNC_sk_cgroup_id FunctionId = 128
+ BPF_FUNC_sk_ancestor_cgroup_id FunctionId = 129
+ BPF_FUNC_ringbuf_output FunctionId = 130
+ BPF_FUNC_ringbuf_reserve FunctionId = 131
+ BPF_FUNC_ringbuf_submit FunctionId = 132
+ BPF_FUNC_ringbuf_discard FunctionId = 133
+ BPF_FUNC_ringbuf_query FunctionId = 134
+ BPF_FUNC_csum_level FunctionId = 135
+ BPF_FUNC_skc_to_tcp6_sock FunctionId = 136
+ BPF_FUNC_skc_to_tcp_sock FunctionId = 137
+ BPF_FUNC_skc_to_tcp_timewait_sock FunctionId = 138
+ BPF_FUNC_skc_to_tcp_request_sock FunctionId = 139
+ BPF_FUNC_skc_to_udp6_sock FunctionId = 140
+ BPF_FUNC_get_task_stack FunctionId = 141
+ BPF_FUNC_load_hdr_opt FunctionId = 142
+ BPF_FUNC_store_hdr_opt FunctionId = 143
+ BPF_FUNC_reserve_hdr_opt FunctionId = 144
+ BPF_FUNC_inode_storage_get FunctionId = 145
+ BPF_FUNC_inode_storage_delete FunctionId = 146
+ BPF_FUNC_d_path FunctionId = 147
+ BPF_FUNC_copy_from_user FunctionId = 148
+ BPF_FUNC_snprintf_btf FunctionId = 149
+ BPF_FUNC_seq_printf_btf FunctionId = 150
+ BPF_FUNC_skb_cgroup_classid FunctionId = 151
+ BPF_FUNC_redirect_neigh FunctionId = 152
+ BPF_FUNC_per_cpu_ptr FunctionId = 153
+ BPF_FUNC_this_cpu_ptr FunctionId = 154
+ BPF_FUNC_redirect_peer FunctionId = 155
+ BPF_FUNC_task_storage_get FunctionId = 156
+ BPF_FUNC_task_storage_delete FunctionId = 157
+ BPF_FUNC_get_current_task_btf FunctionId = 158
+ BPF_FUNC_bprm_opts_set FunctionId = 159
+ BPF_FUNC_ktime_get_coarse_ns FunctionId = 160
+ BPF_FUNC_ima_inode_hash FunctionId = 161
+ BPF_FUNC_sock_from_file FunctionId = 162
+ BPF_FUNC_check_mtu FunctionId = 163
+ BPF_FUNC_for_each_map_elem FunctionId = 164
+ BPF_FUNC_snprintf FunctionId = 165
+ BPF_FUNC_sys_bpf FunctionId = 166
+ BPF_FUNC_btf_find_by_name_kind FunctionId = 167
+ BPF_FUNC_sys_close FunctionId = 168
+ BPF_FUNC_timer_init FunctionId = 169
+ BPF_FUNC_timer_set_callback FunctionId = 170
+ BPF_FUNC_timer_start FunctionId = 171
+ BPF_FUNC_timer_cancel FunctionId = 172
+ BPF_FUNC_get_func_ip FunctionId = 173
+ BPF_FUNC_get_attach_cookie FunctionId = 174
+ BPF_FUNC_task_pt_regs FunctionId = 175
+ BPF_FUNC_get_branch_snapshot FunctionId = 176
+ BPF_FUNC_trace_vprintk FunctionId = 177
+ BPF_FUNC_skc_to_unix_sock FunctionId = 178
+ BPF_FUNC_kallsyms_lookup_name FunctionId = 179
+ BPF_FUNC_find_vma FunctionId = 180
+ BPF_FUNC_loop FunctionId = 181
+ BPF_FUNC_strncmp FunctionId = 182
+ BPF_FUNC_get_func_arg FunctionId = 183
+ BPF_FUNC_get_func_ret FunctionId = 184
+ BPF_FUNC_get_func_arg_cnt FunctionId = 185
+ BPF_FUNC_get_retval FunctionId = 186
+ BPF_FUNC_set_retval FunctionId = 187
+ BPF_FUNC_xdp_get_buff_len FunctionId = 188
+ BPF_FUNC_xdp_load_bytes FunctionId = 189
+ BPF_FUNC_xdp_store_bytes FunctionId = 190
+ BPF_FUNC_copy_from_user_task FunctionId = 191
+ BPF_FUNC_skb_set_tstamp FunctionId = 192
+ BPF_FUNC_ima_file_hash FunctionId = 193
+ __BPF_FUNC_MAX_ID FunctionId = 194
+)
+
+type HdrStartOff int32
+
+const (
+ BPF_HDR_START_MAC HdrStartOff = 0
+ BPF_HDR_START_NET HdrStartOff = 1
+)
+
+type LinkType int32
+
+const (
+ BPF_LINK_TYPE_UNSPEC LinkType = 0
+ BPF_LINK_TYPE_RAW_TRACEPOINT LinkType = 1
+ BPF_LINK_TYPE_TRACING LinkType = 2
+ BPF_LINK_TYPE_CGROUP LinkType = 3
+ BPF_LINK_TYPE_ITER LinkType = 4
+ BPF_LINK_TYPE_NETNS LinkType = 5
+ BPF_LINK_TYPE_XDP LinkType = 6
+ BPF_LINK_TYPE_PERF_EVENT LinkType = 7
+ BPF_LINK_TYPE_KPROBE_MULTI LinkType = 8
+ MAX_BPF_LINK_TYPE LinkType = 9
+)
+
+type MapType int32
+
+const (
+ BPF_MAP_TYPE_UNSPEC MapType = 0
+ BPF_MAP_TYPE_HASH MapType = 1
+ BPF_MAP_TYPE_ARRAY MapType = 2
+ BPF_MAP_TYPE_PROG_ARRAY MapType = 3
+ BPF_MAP_TYPE_PERF_EVENT_ARRAY MapType = 4
+ BPF_MAP_TYPE_PERCPU_HASH MapType = 5
+ BPF_MAP_TYPE_PERCPU_ARRAY MapType = 6
+ BPF_MAP_TYPE_STACK_TRACE MapType = 7
+ BPF_MAP_TYPE_CGROUP_ARRAY MapType = 8
+ BPF_MAP_TYPE_LRU_HASH MapType = 9
+ BPF_MAP_TYPE_LRU_PERCPU_HASH MapType = 10
+ BPF_MAP_TYPE_LPM_TRIE MapType = 11
+ BPF_MAP_TYPE_ARRAY_OF_MAPS MapType = 12
+ BPF_MAP_TYPE_HASH_OF_MAPS MapType = 13
+ BPF_MAP_TYPE_DEVMAP MapType = 14
+ BPF_MAP_TYPE_SOCKMAP MapType = 15
+ BPF_MAP_TYPE_CPUMAP MapType = 16
+ BPF_MAP_TYPE_XSKMAP MapType = 17
+ BPF_MAP_TYPE_SOCKHASH MapType = 18
+ BPF_MAP_TYPE_CGROUP_STORAGE MapType = 19
+ BPF_MAP_TYPE_REUSEPORT_SOCKARRAY MapType = 20
+ BPF_MAP_TYPE_PERCPU_CGROUP_STORAGE MapType = 21
+ BPF_MAP_TYPE_QUEUE MapType = 22
+ BPF_MAP_TYPE_STACK MapType = 23
+ BPF_MAP_TYPE_SK_STORAGE MapType = 24
+ BPF_MAP_TYPE_DEVMAP_HASH MapType = 25
+ BPF_MAP_TYPE_STRUCT_OPS MapType = 26
+ BPF_MAP_TYPE_RINGBUF MapType = 27
+ BPF_MAP_TYPE_INODE_STORAGE MapType = 28
+ BPF_MAP_TYPE_TASK_STORAGE MapType = 29
+ BPF_MAP_TYPE_BLOOM_FILTER MapType = 30
+)
+
+type ProgType int32
+
+const (
+ BPF_PROG_TYPE_UNSPEC ProgType = 0
+ BPF_PROG_TYPE_SOCKET_FILTER ProgType = 1
+ BPF_PROG_TYPE_KPROBE ProgType = 2
+ BPF_PROG_TYPE_SCHED_CLS ProgType = 3
+ BPF_PROG_TYPE_SCHED_ACT ProgType = 4
+ BPF_PROG_TYPE_TRACEPOINT ProgType = 5
+ BPF_PROG_TYPE_XDP ProgType = 6
+ BPF_PROG_TYPE_PERF_EVENT ProgType = 7
+ BPF_PROG_TYPE_CGROUP_SKB ProgType = 8
+ BPF_PROG_TYPE_CGROUP_SOCK ProgType = 9
+ BPF_PROG_TYPE_LWT_IN ProgType = 10
+ BPF_PROG_TYPE_LWT_OUT ProgType = 11
+ BPF_PROG_TYPE_LWT_XMIT ProgType = 12
+ BPF_PROG_TYPE_SOCK_OPS ProgType = 13
+ BPF_PROG_TYPE_SK_SKB ProgType = 14
+ BPF_PROG_TYPE_CGROUP_DEVICE ProgType = 15
+ BPF_PROG_TYPE_SK_MSG ProgType = 16
+ BPF_PROG_TYPE_RAW_TRACEPOINT ProgType = 17
+ BPF_PROG_TYPE_CGROUP_SOCK_ADDR ProgType = 18
+ BPF_PROG_TYPE_LWT_SEG6LOCAL ProgType = 19
+ BPF_PROG_TYPE_LIRC_MODE2 ProgType = 20
+ BPF_PROG_TYPE_SK_REUSEPORT ProgType = 21
+ BPF_PROG_TYPE_FLOW_DISSECTOR ProgType = 22
+ BPF_PROG_TYPE_CGROUP_SYSCTL ProgType = 23
+ BPF_PROG_TYPE_RAW_TRACEPOINT_WRITABLE ProgType = 24
+ BPF_PROG_TYPE_CGROUP_SOCKOPT ProgType = 25
+ BPF_PROG_TYPE_TRACING ProgType = 26
+ BPF_PROG_TYPE_STRUCT_OPS ProgType = 27
+ BPF_PROG_TYPE_EXT ProgType = 28
+ BPF_PROG_TYPE_LSM ProgType = 29
+ BPF_PROG_TYPE_SK_LOOKUP ProgType = 30
+ BPF_PROG_TYPE_SYSCALL ProgType = 31
+)
+
+type RetCode int32
+
+const (
+ BPF_OK RetCode = 0
+ BPF_DROP RetCode = 2
+ BPF_REDIRECT RetCode = 7
+ BPF_LWT_REROUTE RetCode = 128
+)
+
+type SkAction int32
+
+const (
+ SK_DROP SkAction = 0
+ SK_PASS SkAction = 1
+)
+
+type StackBuildIdStatus int32
+
+const (
+ BPF_STACK_BUILD_ID_EMPTY StackBuildIdStatus = 0
+ BPF_STACK_BUILD_ID_VALID StackBuildIdStatus = 1
+ BPF_STACK_BUILD_ID_IP StackBuildIdStatus = 2
+)
+
+type StatsType int32
+
+const (
+ BPF_STATS_RUN_TIME StatsType = 0
+)
+
+type XdpAction int32
+
+const (
+ XDP_ABORTED XdpAction = 0
+ XDP_DROP XdpAction = 1
+ XDP_PASS XdpAction = 2
+ XDP_TX XdpAction = 3
+ XDP_REDIRECT XdpAction = 4
+)
+
+type BtfInfo struct {
+ Btf Pointer
+ BtfSize uint32
+ Id BTFID
+ Name Pointer
+ NameLen uint32
+ KernelBtf uint32
+}
+
+type FuncInfo struct {
+ InsnOff uint32
+ TypeId uint32
+}
+
+type LineInfo struct {
+ InsnOff uint32
+ FileNameOff uint32
+ LineOff uint32
+ LineCol uint32
+}
+
+type LinkInfo struct {
+ Type LinkType
+ Id LinkID
+ ProgId uint32
+ _ [4]byte
+ Extra [16]uint8
+}
+
+type MapInfo struct {
+ Type uint32
+ Id uint32
+ KeySize uint32
+ ValueSize uint32
+ MaxEntries uint32
+ MapFlags uint32
+ Name ObjName
+ Ifindex uint32
+ BtfVmlinuxValueTypeId uint32
+ NetnsDev uint64
+ NetnsIno uint64
+ BtfId uint32
+ BtfKeyTypeId uint32
+ BtfValueTypeId uint32
+ _ [4]byte
+ MapExtra uint64
+}
+
+type ProgInfo struct {
+ Type uint32
+ Id uint32
+ Tag [8]uint8
+ JitedProgLen uint32
+ XlatedProgLen uint32
+ JitedProgInsns uint64
+ XlatedProgInsns Pointer
+ LoadTime uint64
+ CreatedByUid uint32
+ NrMapIds uint32
+ MapIds Pointer
+ Name ObjName
+ Ifindex uint32
+ _ [4]byte /* unsupported bitfield */
+ NetnsDev uint64
+ NetnsIno uint64
+ NrJitedKsyms uint32
+ NrJitedFuncLens uint32
+ JitedKsyms uint64
+ JitedFuncLens uint64
+ BtfId uint32
+ FuncInfoRecSize uint32
+ FuncInfo uint64
+ NrFuncInfo uint32
+ NrLineInfo uint32
+ LineInfo uint64
+ JitedLineInfo uint64
+ NrJitedLineInfo uint32
+ LineInfoRecSize uint32
+ JitedLineInfoRecSize uint32
+ NrProgTags uint32
+ ProgTags uint64
+ RunTimeNs uint64
+ RunCnt uint64
+ RecursionMisses uint64
+ VerifiedInsns uint32
+ _ [4]byte
+}
+
+type SkLookup struct {
+ Cookie uint64
+ Family uint32
+ Protocol uint32
+ RemoteIp4 [4]uint8
+ RemoteIp6 [16]uint8
+ RemotePort uint16
+ _ [2]byte
+ LocalIp4 [4]uint8
+ LocalIp6 [16]uint8
+ LocalPort uint32
+ IngressIfindex uint32
+ _ [4]byte
+}
+
+type XdpMd struct {
+ Data uint32
+ DataEnd uint32
+ DataMeta uint32
+ IngressIfindex uint32
+ RxQueueIndex uint32
+ EgressIfindex uint32
+}
+
+type BtfGetFdByIdAttr struct{ Id uint32 }
+
+func BtfGetFdById(attr *BtfGetFdByIdAttr) (*FD, error) {
+ fd, err := BPF(BPF_BTF_GET_FD_BY_ID, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ if err != nil {
+ return nil, err
+ }
+ return NewFD(int(fd))
+}
+
+type BtfGetNextIdAttr struct {
+ Id BTFID
+ NextId BTFID
+}
+
+func BtfGetNextId(attr *BtfGetNextIdAttr) error {
+ _, err := BPF(BPF_BTF_GET_NEXT_ID, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type BtfLoadAttr struct {
+ Btf Pointer
+ BtfLogBuf Pointer
+ BtfSize uint32
+ BtfLogSize uint32
+ BtfLogLevel uint32
+ _ [4]byte
+}
+
+func BtfLoad(attr *BtfLoadAttr) (*FD, error) {
+ fd, err := BPF(BPF_BTF_LOAD, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ if err != nil {
+ return nil, err
+ }
+ return NewFD(int(fd))
+}
+
+type EnableStatsAttr struct{ Type uint32 }
+
+func EnableStats(attr *EnableStatsAttr) (*FD, error) {
+ fd, err := BPF(BPF_ENABLE_STATS, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ if err != nil {
+ return nil, err
+ }
+ return NewFD(int(fd))
+}
+
+type IterCreateAttr struct {
+ LinkFd uint32
+ Flags uint32
+}
+
+func IterCreate(attr *IterCreateAttr) (*FD, error) {
+ fd, err := BPF(BPF_ITER_CREATE, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ if err != nil {
+ return nil, err
+ }
+ return NewFD(int(fd))
+}
+
+type LinkCreateAttr struct {
+ ProgFd uint32
+ TargetFd uint32
+ AttachType AttachType
+ Flags uint32
+ TargetBtfId uint32
+ _ [28]byte
+}
+
+func LinkCreate(attr *LinkCreateAttr) (*FD, error) {
+ fd, err := BPF(BPF_LINK_CREATE, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ if err != nil {
+ return nil, err
+ }
+ return NewFD(int(fd))
+}
+
+type LinkCreateIterAttr struct {
+ ProgFd uint32
+ TargetFd uint32
+ AttachType AttachType
+ Flags uint32
+ IterInfo Pointer
+ IterInfoLen uint32
+ _ [20]byte
+}
+
+func LinkCreateIter(attr *LinkCreateIterAttr) (*FD, error) {
+ fd, err := BPF(BPF_LINK_CREATE, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ if err != nil {
+ return nil, err
+ }
+ return NewFD(int(fd))
+}
+
+type LinkCreatePerfEventAttr struct {
+ ProgFd uint32
+ TargetFd uint32
+ AttachType AttachType
+ Flags uint32
+ BpfCookie uint64
+ _ [24]byte
+}
+
+func LinkCreatePerfEvent(attr *LinkCreatePerfEventAttr) (*FD, error) {
+ fd, err := BPF(BPF_LINK_CREATE, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ if err != nil {
+ return nil, err
+ }
+ return NewFD(int(fd))
+}
+
+type LinkUpdateAttr struct {
+ LinkFd uint32
+ NewProgFd uint32
+ Flags uint32
+ OldProgFd uint32
+}
+
+func LinkUpdate(attr *LinkUpdateAttr) error {
+ _, err := BPF(BPF_LINK_UPDATE, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type MapCreateAttr struct {
+ MapType MapType
+ KeySize uint32
+ ValueSize uint32
+ MaxEntries uint32
+ MapFlags uint32
+ InnerMapFd uint32
+ NumaNode uint32
+ MapName ObjName
+ MapIfindex uint32
+ BtfFd uint32
+ BtfKeyTypeId uint32
+ BtfValueTypeId uint32
+ BtfVmlinuxValueTypeId uint32
+ MapExtra uint64
+}
+
+func MapCreate(attr *MapCreateAttr) (*FD, error) {
+ fd, err := BPF(BPF_MAP_CREATE, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ if err != nil {
+ return nil, err
+ }
+ return NewFD(int(fd))
+}
+
+type MapDeleteBatchAttr struct {
+ InBatch Pointer
+ OutBatch Pointer
+ Keys Pointer
+ Values Pointer
+ Count uint32
+ MapFd uint32
+ ElemFlags uint64
+ Flags uint64
+}
+
+func MapDeleteBatch(attr *MapDeleteBatchAttr) error {
+ _, err := BPF(BPF_MAP_DELETE_BATCH, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type MapDeleteElemAttr struct {
+ MapFd uint32
+ _ [4]byte
+ Key Pointer
+ Value Pointer
+ Flags uint64
+}
+
+func MapDeleteElem(attr *MapDeleteElemAttr) error {
+ _, err := BPF(BPF_MAP_DELETE_ELEM, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type MapFreezeAttr struct{ MapFd uint32 }
+
+func MapFreeze(attr *MapFreezeAttr) error {
+ _, err := BPF(BPF_MAP_FREEZE, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type MapGetFdByIdAttr struct{ Id uint32 }
+
+func MapGetFdById(attr *MapGetFdByIdAttr) (*FD, error) {
+ fd, err := BPF(BPF_MAP_GET_FD_BY_ID, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ if err != nil {
+ return nil, err
+ }
+ return NewFD(int(fd))
+}
+
+type MapGetNextIdAttr struct {
+ Id uint32
+ NextId uint32
+}
+
+func MapGetNextId(attr *MapGetNextIdAttr) error {
+ _, err := BPF(BPF_MAP_GET_NEXT_ID, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type MapGetNextKeyAttr struct {
+ MapFd uint32
+ _ [4]byte
+ Key Pointer
+ NextKey Pointer
+}
+
+func MapGetNextKey(attr *MapGetNextKeyAttr) error {
+ _, err := BPF(BPF_MAP_GET_NEXT_KEY, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type MapLookupAndDeleteBatchAttr struct {
+ InBatch Pointer
+ OutBatch Pointer
+ Keys Pointer
+ Values Pointer
+ Count uint32
+ MapFd uint32
+ ElemFlags uint64
+ Flags uint64
+}
+
+func MapLookupAndDeleteBatch(attr *MapLookupAndDeleteBatchAttr) error {
+ _, err := BPF(BPF_MAP_LOOKUP_AND_DELETE_BATCH, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type MapLookupAndDeleteElemAttr struct {
+ MapFd uint32
+ _ [4]byte
+ Key Pointer
+ Value Pointer
+ Flags uint64
+}
+
+func MapLookupAndDeleteElem(attr *MapLookupAndDeleteElemAttr) error {
+ _, err := BPF(BPF_MAP_LOOKUP_AND_DELETE_ELEM, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type MapLookupBatchAttr struct {
+ InBatch Pointer
+ OutBatch Pointer
+ Keys Pointer
+ Values Pointer
+ Count uint32
+ MapFd uint32
+ ElemFlags uint64
+ Flags uint64
+}
+
+func MapLookupBatch(attr *MapLookupBatchAttr) error {
+ _, err := BPF(BPF_MAP_LOOKUP_BATCH, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type MapLookupElemAttr struct {
+ MapFd uint32
+ _ [4]byte
+ Key Pointer
+ Value Pointer
+ Flags uint64
+}
+
+func MapLookupElem(attr *MapLookupElemAttr) error {
+ _, err := BPF(BPF_MAP_LOOKUP_ELEM, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type MapUpdateBatchAttr struct {
+ InBatch Pointer
+ OutBatch Pointer
+ Keys Pointer
+ Values Pointer
+ Count uint32
+ MapFd uint32
+ ElemFlags uint64
+ Flags uint64
+}
+
+func MapUpdateBatch(attr *MapUpdateBatchAttr) error {
+ _, err := BPF(BPF_MAP_UPDATE_BATCH, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type MapUpdateElemAttr struct {
+ MapFd uint32
+ _ [4]byte
+ Key Pointer
+ Value Pointer
+ Flags uint64
+}
+
+func MapUpdateElem(attr *MapUpdateElemAttr) error {
+ _, err := BPF(BPF_MAP_UPDATE_ELEM, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type ObjGetAttr struct {
+ Pathname Pointer
+ BpfFd uint32
+ FileFlags uint32
+}
+
+func ObjGet(attr *ObjGetAttr) (*FD, error) {
+ fd, err := BPF(BPF_OBJ_GET, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ if err != nil {
+ return nil, err
+ }
+ return NewFD(int(fd))
+}
+
+type ObjGetInfoByFdAttr struct {
+ BpfFd uint32
+ InfoLen uint32
+ Info Pointer
+}
+
+func ObjGetInfoByFd(attr *ObjGetInfoByFdAttr) error {
+ _, err := BPF(BPF_OBJ_GET_INFO_BY_FD, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type ObjPinAttr struct {
+ Pathname Pointer
+ BpfFd uint32
+ FileFlags uint32
+}
+
+func ObjPin(attr *ObjPinAttr) error {
+ _, err := BPF(BPF_OBJ_PIN, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type ProgAttachAttr struct {
+ TargetFd uint32
+ AttachBpfFd uint32
+ AttachType uint32
+ AttachFlags uint32
+ ReplaceBpfFd uint32
+}
+
+func ProgAttach(attr *ProgAttachAttr) error {
+ _, err := BPF(BPF_PROG_ATTACH, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type ProgBindMapAttr struct {
+ ProgFd uint32
+ MapFd uint32
+ Flags uint32
+}
+
+func ProgBindMap(attr *ProgBindMapAttr) error {
+ _, err := BPF(BPF_PROG_BIND_MAP, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type ProgDetachAttr struct {
+ TargetFd uint32
+ AttachBpfFd uint32
+ AttachType uint32
+}
+
+func ProgDetach(attr *ProgDetachAttr) error {
+ _, err := BPF(BPF_PROG_DETACH, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type ProgGetFdByIdAttr struct{ Id uint32 }
+
+func ProgGetFdById(attr *ProgGetFdByIdAttr) (*FD, error) {
+ fd, err := BPF(BPF_PROG_GET_FD_BY_ID, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ if err != nil {
+ return nil, err
+ }
+ return NewFD(int(fd))
+}
+
+type ProgGetNextIdAttr struct {
+ Id uint32
+ NextId uint32
+}
+
+func ProgGetNextId(attr *ProgGetNextIdAttr) error {
+ _, err := BPF(BPF_PROG_GET_NEXT_ID, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type ProgLoadAttr struct {
+ ProgType ProgType
+ InsnCnt uint32
+ Insns Pointer
+ License Pointer
+ LogLevel uint32
+ LogSize uint32
+ LogBuf Pointer
+ KernVersion uint32
+ ProgFlags uint32
+ ProgName ObjName
+ ProgIfindex uint32
+ ExpectedAttachType AttachType
+ ProgBtfFd uint32
+ FuncInfoRecSize uint32
+ FuncInfo Pointer
+ FuncInfoCnt uint32
+ LineInfoRecSize uint32
+ LineInfo Pointer
+ LineInfoCnt uint32
+ AttachBtfId uint32
+ AttachProgFd uint32
+ CoreReloCnt uint32
+ FdArray Pointer
+ CoreRelos Pointer
+ CoreReloRecSize uint32
+ _ [4]byte
+}
+
+func ProgLoad(attr *ProgLoadAttr) (*FD, error) {
+ fd, err := BPF(BPF_PROG_LOAD, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ if err != nil {
+ return nil, err
+ }
+ return NewFD(int(fd))
+}
+
+type ProgRunAttr struct {
+ ProgFd uint32
+ Retval uint32
+ DataSizeIn uint32
+ DataSizeOut uint32
+ DataIn Pointer
+ DataOut Pointer
+ Repeat uint32
+ Duration uint32
+ CtxSizeIn uint32
+ CtxSizeOut uint32
+ CtxIn Pointer
+ CtxOut Pointer
+ Flags uint32
+ Cpu uint32
+ BatchSize uint32
+ _ [4]byte
+}
+
+func ProgRun(attr *ProgRunAttr) error {
+ _, err := BPF(BPF_PROG_TEST_RUN, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ return err
+}
+
+type RawTracepointOpenAttr struct {
+ Name Pointer
+ ProgFd uint32
+ _ [4]byte
+}
+
+func RawTracepointOpen(attr *RawTracepointOpenAttr) (*FD, error) {
+ fd, err := BPF(BPF_RAW_TRACEPOINT_OPEN, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
+ if err != nil {
+ return nil, err
+ }
+ return NewFD(int(fd))
+}
+
+type CgroupLinkInfo struct {
+ CgroupId uint64
+ AttachType AttachType
+ _ [4]byte
+}
+
+type IterLinkInfo struct {
+ TargetName Pointer
+ TargetNameLen uint32
+}
+
+type NetNsLinkInfo struct {
+ NetnsIno uint32
+ AttachType AttachType
+}
+
+type RawTracepointLinkInfo struct {
+ TpName Pointer
+ TpNameLen uint32
+ _ [4]byte
+}
+
+type TracingLinkInfo struct {
+ AttachType AttachType
+ TargetObjId uint32
+ TargetBtfId uint32
+}
+
+type XDPLinkInfo struct{ Ifindex uint32 }
diff --git a/vendor/github.com/cilium/ebpf/internal/syscall.go b/vendor/github.com/cilium/ebpf/internal/syscall.go
deleted file mode 100644
index c80815131..000000000
--- a/vendor/github.com/cilium/ebpf/internal/syscall.go
+++ /dev/null
@@ -1,179 +0,0 @@
-package internal
-
-import (
- "fmt"
- "path/filepath"
- "runtime"
- "unsafe"
-
- "github.com/cilium/ebpf/internal/unix"
-)
-
-//go:generate stringer -output syscall_string.go -type=BPFCmd
-
-// BPFCmd identifies a subcommand of the bpf syscall.
-type BPFCmd int
-
-// Well known BPF commands.
-const (
- BPF_MAP_CREATE BPFCmd = iota
- BPF_MAP_LOOKUP_ELEM
- BPF_MAP_UPDATE_ELEM
- BPF_MAP_DELETE_ELEM
- BPF_MAP_GET_NEXT_KEY
- BPF_PROG_LOAD
- BPF_OBJ_PIN
- BPF_OBJ_GET
- BPF_PROG_ATTACH
- BPF_PROG_DETACH
- BPF_PROG_TEST_RUN
- BPF_PROG_GET_NEXT_ID
- BPF_MAP_GET_NEXT_ID
- BPF_PROG_GET_FD_BY_ID
- BPF_MAP_GET_FD_BY_ID
- BPF_OBJ_GET_INFO_BY_FD
- BPF_PROG_QUERY
- BPF_RAW_TRACEPOINT_OPEN
- BPF_BTF_LOAD
- BPF_BTF_GET_FD_BY_ID
- BPF_TASK_FD_QUERY
- BPF_MAP_LOOKUP_AND_DELETE_ELEM
- BPF_MAP_FREEZE
- BPF_BTF_GET_NEXT_ID
- BPF_MAP_LOOKUP_BATCH
- BPF_MAP_LOOKUP_AND_DELETE_BATCH
- BPF_MAP_UPDATE_BATCH
- BPF_MAP_DELETE_BATCH
- BPF_LINK_CREATE
- BPF_LINK_UPDATE
- BPF_LINK_GET_FD_BY_ID
- BPF_LINK_GET_NEXT_ID
- BPF_ENABLE_STATS
- BPF_ITER_CREATE
-)
-
-// BPF wraps SYS_BPF.
-//
-// Any pointers contained in attr must use the Pointer type from this package.
-func BPF(cmd BPFCmd, attr unsafe.Pointer, size uintptr) (uintptr, error) {
- r1, _, errNo := unix.Syscall(unix.SYS_BPF, uintptr(cmd), uintptr(attr), size)
- runtime.KeepAlive(attr)
-
- var err error
- if errNo != 0 {
- err = errNo
- }
-
- return r1, err
-}
-
-type BPFProgAttachAttr struct {
- TargetFd uint32
- AttachBpfFd uint32
- AttachType uint32
- AttachFlags uint32
- ReplaceBpfFd uint32
-}
-
-func BPFProgAttach(attr *BPFProgAttachAttr) error {
- _, err := BPF(BPF_PROG_ATTACH, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
- return err
-}
-
-type BPFProgDetachAttr struct {
- TargetFd uint32
- AttachBpfFd uint32
- AttachType uint32
-}
-
-func BPFProgDetach(attr *BPFProgDetachAttr) error {
- _, err := BPF(BPF_PROG_DETACH, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
- return err
-}
-
-type BPFEnableStatsAttr struct {
- StatsType uint32
-}
-
-func BPFEnableStats(attr *BPFEnableStatsAttr) (*FD, error) {
- ptr, err := BPF(BPF_ENABLE_STATS, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
- if err != nil {
- return nil, fmt.Errorf("enable stats: %w", err)
- }
- return NewFD(uint32(ptr)), nil
-
-}
-
-type bpfObjAttr struct {
- fileName Pointer
- fd uint32
- fileFlags uint32
-}
-
-const bpfFSType = 0xcafe4a11
-
-// BPFObjPin wraps BPF_OBJ_PIN.
-func BPFObjPin(fileName string, fd *FD) error {
- dirName := filepath.Dir(fileName)
- var statfs unix.Statfs_t
- if err := unix.Statfs(dirName, &statfs); err != nil {
- return err
- }
- if uint64(statfs.Type) != bpfFSType {
- return fmt.Errorf("%s is not on a bpf filesystem", fileName)
- }
-
- value, err := fd.Value()
- if err != nil {
- return err
- }
-
- attr := bpfObjAttr{
- fileName: NewStringPointer(fileName),
- fd: value,
- }
- _, err = BPF(BPF_OBJ_PIN, unsafe.Pointer(&attr), unsafe.Sizeof(attr))
- if err != nil {
- return fmt.Errorf("pin object %s: %w", fileName, err)
- }
- return nil
-}
-
-// BPFObjGet wraps BPF_OBJ_GET.
-func BPFObjGet(fileName string) (*FD, error) {
- attr := bpfObjAttr{
- fileName: NewStringPointer(fileName),
- }
- ptr, err := BPF(BPF_OBJ_GET, unsafe.Pointer(&attr), unsafe.Sizeof(attr))
- if err != nil {
- return nil, fmt.Errorf("get object %s: %w", fileName, err)
- }
- return NewFD(uint32(ptr)), nil
-}
-
-type bpfObjGetInfoByFDAttr struct {
- fd uint32
- infoLen uint32
- info Pointer
-}
-
-// BPFObjGetInfoByFD wraps BPF_OBJ_GET_INFO_BY_FD.
-//
-// Available from 4.13.
-func BPFObjGetInfoByFD(fd *FD, info unsafe.Pointer, size uintptr) error {
- value, err := fd.Value()
- if err != nil {
- return err
- }
-
- attr := bpfObjGetInfoByFDAttr{
- fd: value,
- infoLen: uint32(size),
- info: NewPointer(info),
- }
- _, err = BPF(BPF_OBJ_GET_INFO_BY_FD, unsafe.Pointer(&attr), unsafe.Sizeof(attr))
- if err != nil {
- return fmt.Errorf("fd %v: %w", fd, err)
- }
- return nil
-}
diff --git a/vendor/github.com/cilium/ebpf/internal/syscall_string.go b/vendor/github.com/cilium/ebpf/internal/syscall_string.go
deleted file mode 100644
index 85df04779..000000000
--- a/vendor/github.com/cilium/ebpf/internal/syscall_string.go
+++ /dev/null
@@ -1,56 +0,0 @@
-// Code generated by "stringer -output syscall_string.go -type=BPFCmd"; DO NOT EDIT.
-
-package internal
-
-import "strconv"
-
-func _() {
- // An "invalid array index" compiler error signifies that the constant values have changed.
- // Re-run the stringer command to generate them again.
- var x [1]struct{}
- _ = x[BPF_MAP_CREATE-0]
- _ = x[BPF_MAP_LOOKUP_ELEM-1]
- _ = x[BPF_MAP_UPDATE_ELEM-2]
- _ = x[BPF_MAP_DELETE_ELEM-3]
- _ = x[BPF_MAP_GET_NEXT_KEY-4]
- _ = x[BPF_PROG_LOAD-5]
- _ = x[BPF_OBJ_PIN-6]
- _ = x[BPF_OBJ_GET-7]
- _ = x[BPF_PROG_ATTACH-8]
- _ = x[BPF_PROG_DETACH-9]
- _ = x[BPF_PROG_TEST_RUN-10]
- _ = x[BPF_PROG_GET_NEXT_ID-11]
- _ = x[BPF_MAP_GET_NEXT_ID-12]
- _ = x[BPF_PROG_GET_FD_BY_ID-13]
- _ = x[BPF_MAP_GET_FD_BY_ID-14]
- _ = x[BPF_OBJ_GET_INFO_BY_FD-15]
- _ = x[BPF_PROG_QUERY-16]
- _ = x[BPF_RAW_TRACEPOINT_OPEN-17]
- _ = x[BPF_BTF_LOAD-18]
- _ = x[BPF_BTF_GET_FD_BY_ID-19]
- _ = x[BPF_TASK_FD_QUERY-20]
- _ = x[BPF_MAP_LOOKUP_AND_DELETE_ELEM-21]
- _ = x[BPF_MAP_FREEZE-22]
- _ = x[BPF_BTF_GET_NEXT_ID-23]
- _ = x[BPF_MAP_LOOKUP_BATCH-24]
- _ = x[BPF_MAP_LOOKUP_AND_DELETE_BATCH-25]
- _ = x[BPF_MAP_UPDATE_BATCH-26]
- _ = x[BPF_MAP_DELETE_BATCH-27]
- _ = x[BPF_LINK_CREATE-28]
- _ = x[BPF_LINK_UPDATE-29]
- _ = x[BPF_LINK_GET_FD_BY_ID-30]
- _ = x[BPF_LINK_GET_NEXT_ID-31]
- _ = x[BPF_ENABLE_STATS-32]
- _ = x[BPF_ITER_CREATE-33]
-}
-
-const _BPFCmd_name = "BPF_MAP_CREATEBPF_MAP_LOOKUP_ELEMBPF_MAP_UPDATE_ELEMBPF_MAP_DELETE_ELEMBPF_MAP_GET_NEXT_KEYBPF_PROG_LOADBPF_OBJ_PINBPF_OBJ_GETBPF_PROG_ATTACHBPF_PROG_DETACHBPF_PROG_TEST_RUNBPF_PROG_GET_NEXT_IDBPF_MAP_GET_NEXT_IDBPF_PROG_GET_FD_BY_IDBPF_MAP_GET_FD_BY_IDBPF_OBJ_GET_INFO_BY_FDBPF_PROG_QUERYBPF_RAW_TRACEPOINT_OPENBPF_BTF_LOADBPF_BTF_GET_FD_BY_IDBPF_TASK_FD_QUERYBPF_MAP_LOOKUP_AND_DELETE_ELEMBPF_MAP_FREEZEBPF_BTF_GET_NEXT_IDBPF_MAP_LOOKUP_BATCHBPF_MAP_LOOKUP_AND_DELETE_BATCHBPF_MAP_UPDATE_BATCHBPF_MAP_DELETE_BATCHBPF_LINK_CREATEBPF_LINK_UPDATEBPF_LINK_GET_FD_BY_IDBPF_LINK_GET_NEXT_IDBPF_ENABLE_STATSBPF_ITER_CREATE"
-
-var _BPFCmd_index = [...]uint16{0, 14, 33, 52, 71, 91, 104, 115, 126, 141, 156, 173, 193, 212, 233, 253, 275, 289, 312, 324, 344, 361, 391, 405, 424, 444, 475, 495, 515, 530, 545, 566, 586, 602, 617}
-
-func (i BPFCmd) String() string {
- if i < 0 || i >= BPFCmd(len(_BPFCmd_index)-1) {
- return "BPFCmd(" + strconv.FormatInt(int64(i), 10) + ")"
- }
- return _BPFCmd_name[_BPFCmd_index[i]:_BPFCmd_index[i+1]]
-}
diff --git a/vendor/github.com/cilium/ebpf/internal/unix/types_linux.go b/vendor/github.com/cilium/ebpf/internal/unix/types_linux.go
index 86d2a10f9..db4a1f5bf 100644
--- a/vendor/github.com/cilium/ebpf/internal/unix/types_linux.go
+++ b/vendor/github.com/cilium/ebpf/internal/unix/types_linux.go
@@ -1,9 +1,9 @@
+//go:build linux
// +build linux
package unix
import (
- "bytes"
"syscall"
linux "golang.org/x/sys/unix"
@@ -20,16 +20,27 @@ const (
EPERM = linux.EPERM
ESRCH = linux.ESRCH
ENODEV = linux.ENODEV
+ EBADF = linux.EBADF
+ E2BIG = linux.E2BIG
+ EFAULT = linux.EFAULT
+ EACCES = linux.EACCES
// ENOTSUPP is not the same as ENOTSUP or EOPNOTSUP
ENOTSUPP = syscall.Errno(0x20c)
- EBADF = linux.EBADF
BPF_F_NO_PREALLOC = linux.BPF_F_NO_PREALLOC
BPF_F_NUMA_NODE = linux.BPF_F_NUMA_NODE
+ BPF_F_RDONLY = linux.BPF_F_RDONLY
+ BPF_F_WRONLY = linux.BPF_F_WRONLY
BPF_F_RDONLY_PROG = linux.BPF_F_RDONLY_PROG
BPF_F_WRONLY_PROG = linux.BPF_F_WRONLY_PROG
+ BPF_F_SLEEPABLE = linux.BPF_F_SLEEPABLE
+ BPF_F_MMAPABLE = linux.BPF_F_MMAPABLE
+ BPF_F_INNER_MAP = linux.BPF_F_INNER_MAP
BPF_OBJ_NAME_LEN = linux.BPF_OBJ_NAME_LEN
BPF_TAG_SIZE = linux.BPF_TAG_SIZE
+ BPF_RINGBUF_BUSY_BIT = linux.BPF_RINGBUF_BUSY_BIT
+ BPF_RINGBUF_DISCARD_BIT = linux.BPF_RINGBUF_DISCARD_BIT
+ BPF_RINGBUF_HDR_SZ = linux.BPF_RINGBUF_HDR_SZ
SYS_BPF = linux.SYS_BPF
F_DUPFD_CLOEXEC = linux.F_DUPFD_CLOEXEC
EPOLL_CTL_ADD = linux.EPOLL_CTL_ADD
@@ -39,27 +50,36 @@ const (
PROT_READ = linux.PROT_READ
PROT_WRITE = linux.PROT_WRITE
MAP_SHARED = linux.MAP_SHARED
+ PERF_ATTR_SIZE_VER1 = linux.PERF_ATTR_SIZE_VER1
PERF_TYPE_SOFTWARE = linux.PERF_TYPE_SOFTWARE
+ PERF_TYPE_TRACEPOINT = linux.PERF_TYPE_TRACEPOINT
PERF_COUNT_SW_BPF_OUTPUT = linux.PERF_COUNT_SW_BPF_OUTPUT
+ PERF_EVENT_IOC_DISABLE = linux.PERF_EVENT_IOC_DISABLE
+ PERF_EVENT_IOC_ENABLE = linux.PERF_EVENT_IOC_ENABLE
+ PERF_EVENT_IOC_SET_BPF = linux.PERF_EVENT_IOC_SET_BPF
PerfBitWatermark = linux.PerfBitWatermark
PERF_SAMPLE_RAW = linux.PERF_SAMPLE_RAW
PERF_FLAG_FD_CLOEXEC = linux.PERF_FLAG_FD_CLOEXEC
RLIM_INFINITY = linux.RLIM_INFINITY
RLIMIT_MEMLOCK = linux.RLIMIT_MEMLOCK
BPF_STATS_RUN_TIME = linux.BPF_STATS_RUN_TIME
+ PERF_RECORD_LOST = linux.PERF_RECORD_LOST
+ PERF_RECORD_SAMPLE = linux.PERF_RECORD_SAMPLE
+ AT_FDCWD = linux.AT_FDCWD
+ RENAME_NOREPLACE = linux.RENAME_NOREPLACE
+ SO_ATTACH_BPF = linux.SO_ATTACH_BPF
+ SO_DETACH_BPF = linux.SO_DETACH_BPF
+ SOL_SOCKET = linux.SOL_SOCKET
)
// Statfs_t is a wrapper
type Statfs_t = linux.Statfs_t
+type Stat_t = linux.Stat_t
+
// Rlimit is a wrapper
type Rlimit = linux.Rlimit
-// Setrlimit is a wrapper
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
- return linux.Setrlimit(resource, rlim)
-}
-
// Syscall is a wrapper
func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) {
return linux.Syscall(trap, a1, a2, a3)
@@ -70,6 +90,11 @@ func FcntlInt(fd uintptr, cmd, arg int) (int, error) {
return linux.FcntlInt(fd, cmd, arg)
}
+// IoctlSetInt is a wrapper
+func IoctlSetInt(fd int, req uint, value int) error {
+ return linux.IoctlSetInt(fd, req, value)
+}
+
// Statfs is a wrapper
func Statfs(path string, buf *Statfs_t) (err error) {
return linux.Statfs(path, buf)
@@ -157,14 +182,29 @@ func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) {
return linux.Tgkill(tgid, tid, sig)
}
-func KernelRelease() (string, error) {
- var uname Utsname
- err := Uname(&uname)
- if err != nil {
- return "", err
- }
+// BytePtrFromString is a wrapper
+func BytePtrFromString(s string) (*byte, error) {
+ return linux.BytePtrFromString(s)
+}
+
+// ByteSliceToString is a wrapper
+func ByteSliceToString(s []byte) string {
+ return linux.ByteSliceToString(s)
+}
+
+// Renameat2 is a wrapper
+func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) error {
+ return linux.Renameat2(olddirfd, oldpath, newdirfd, newpath, flags)
+}
+
+func Prlimit(pid, resource int, new, old *Rlimit) error {
+ return linux.Prlimit(pid, resource, new, old)
+}
+
+func Open(path string, mode int, perm uint32) (int, error) {
+ return linux.Open(path, mode, perm)
+}
- end := bytes.IndexByte(uname.Release[:], 0)
- release := string(uname.Release[:end])
- return release, nil
+func Fstat(fd int, stat *Stat_t) error {
+ return linux.Fstat(fd, stat)
}
diff --git a/vendor/github.com/cilium/ebpf/internal/unix/types_other.go b/vendor/github.com/cilium/ebpf/internal/unix/types_other.go
index 8c291796a..133c267db 100644
--- a/vendor/github.com/cilium/ebpf/internal/unix/types_other.go
+++ b/vendor/github.com/cilium/ebpf/internal/unix/types_other.go
@@ -1,3 +1,4 @@
+//go:build !linux
// +build !linux
package unix
@@ -21,15 +22,26 @@ const (
ESRCH = syscall.ESRCH
ENODEV = syscall.ENODEV
EBADF = syscall.Errno(0)
+ E2BIG = syscall.Errno(0)
+ EFAULT = syscall.EFAULT
+ EACCES = syscall.Errno(0)
// ENOTSUPP is not the same as ENOTSUP or EOPNOTSUP
ENOTSUPP = syscall.Errno(0x20c)
BPF_F_NO_PREALLOC = 0
BPF_F_NUMA_NODE = 0
+ BPF_F_RDONLY = 0
+ BPF_F_WRONLY = 0
BPF_F_RDONLY_PROG = 0
BPF_F_WRONLY_PROG = 0
+ BPF_F_SLEEPABLE = 0
+ BPF_F_MMAPABLE = 0
+ BPF_F_INNER_MAP = 0
BPF_OBJ_NAME_LEN = 0x10
BPF_TAG_SIZE = 0x8
+ BPF_RINGBUF_BUSY_BIT = 0
+ BPF_RINGBUF_DISCARD_BIT = 0
+ BPF_RINGBUF_HDR_SZ = 0
SYS_BPF = 321
F_DUPFD_CLOEXEC = 0x406
EPOLLIN = 0x1
@@ -40,14 +52,26 @@ const (
PROT_READ = 0x1
PROT_WRITE = 0x2
MAP_SHARED = 0x1
+ PERF_ATTR_SIZE_VER1 = 0
PERF_TYPE_SOFTWARE = 0x1
+ PERF_TYPE_TRACEPOINT = 0
PERF_COUNT_SW_BPF_OUTPUT = 0xa
+ PERF_EVENT_IOC_DISABLE = 0
+ PERF_EVENT_IOC_ENABLE = 0
+ PERF_EVENT_IOC_SET_BPF = 0
PerfBitWatermark = 0x4000
PERF_SAMPLE_RAW = 0x400
PERF_FLAG_FD_CLOEXEC = 0x8
RLIM_INFINITY = 0x7fffffffffffffff
RLIMIT_MEMLOCK = 8
BPF_STATS_RUN_TIME = 0
+ PERF_RECORD_LOST = 2
+ PERF_RECORD_SAMPLE = 9
+ AT_FDCWD = -0x2
+ RENAME_NOREPLACE = 0x1
+ SO_ATTACH_BPF = 0x32
+ SO_DETACH_BPF = 0x1b
+ SOL_SOCKET = 0x1
)
// Statfs_t is a wrapper
@@ -66,17 +90,14 @@ type Statfs_t struct {
Spare [4]int64
}
+type Stat_t struct{}
+
// Rlimit is a wrapper
type Rlimit struct {
Cur uint64
Max uint64
}
-// Setrlimit is a wrapper
-func Setrlimit(resource int, rlim *Rlimit) (err error) {
- return errNonLinux
-}
-
// Syscall is a wrapper
func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err syscall.Errno) {
return 0, 0, syscall.Errno(1)
@@ -87,6 +108,11 @@ func FcntlInt(fd uintptr, cmd, arg int) (int, error) {
return -1, errNonLinux
}
+// IoctlSetInt is a wrapper
+func IoctlSetInt(fd int, req uint, value int) error {
+ return errNonLinux
+}
+
// Statfs is a wrapper
func Statfs(path string, buf *Statfs_t) error {
return errNonLinux
@@ -201,6 +227,7 @@ func PerfEventOpen(attr *PerfEventAttr, pid int, cpu int, groupFd int, flags int
// Utsname is a wrapper
type Utsname struct {
Release [65]byte
+ Version [65]byte
}
// Uname is a wrapper
@@ -223,6 +250,29 @@ func Tgkill(tgid int, tid int, sig syscall.Signal) (err error) {
return errNonLinux
}
-func KernelRelease() (string, error) {
- return "", errNonLinux
+// BytePtrFromString is a wrapper
+func BytePtrFromString(s string) (*byte, error) {
+ return nil, errNonLinux
+}
+
+// ByteSliceToString is a wrapper
+func ByteSliceToString(s []byte) string {
+ return ""
+}
+
+// Renameat2 is a wrapper
+func Renameat2(olddirfd int, oldpath string, newdirfd int, newpath string, flags uint) error {
+ return errNonLinux
+}
+
+func Prlimit(pid, resource int, new, old *Rlimit) error {
+ return errNonLinux
+}
+
+func Open(path string, mode int, perm uint32) (int, error) {
+ return -1, errNonLinux
+}
+
+func Fstat(fd int, stat *Stat_t) error {
+ return errNonLinux
}
diff --git a/vendor/github.com/cilium/ebpf/internal/vdso.go b/vendor/github.com/cilium/ebpf/internal/vdso.go
new file mode 100644
index 000000000..ae4821de2
--- /dev/null
+++ b/vendor/github.com/cilium/ebpf/internal/vdso.go
@@ -0,0 +1,150 @@
+package internal
+
+import (
+ "debug/elf"
+ "encoding/binary"
+ "errors"
+ "fmt"
+ "io"
+ "math"
+ "os"
+
+ "github.com/cilium/ebpf/internal/unix"
+)
+
+var (
+ errAuxvNoVDSO = errors.New("no vdso address found in auxv")
+)
+
+// vdsoVersion returns the LINUX_VERSION_CODE embedded in the vDSO library
+// linked into the current process image.
+func vdsoVersion() (uint32, error) {
+ // Read data from the auxiliary vector, which is normally passed directly
+ // to the process. Go does not expose that data, so we must read it from procfs.
+ // https://man7.org/linux/man-pages/man3/getauxval.3.html
+ av, err := os.Open("/proc/self/auxv")
+ if err != nil {
+ return 0, fmt.Errorf("opening auxv: %w", err)
+ }
+ defer av.Close()
+
+ vdsoAddr, err := vdsoMemoryAddress(av)
+ if err != nil {
+ return 0, fmt.Errorf("finding vDSO memory address: %w", err)
+ }
+
+ // Use /proc/self/mem rather than unsafe.Pointer tricks.
+ mem, err := os.Open("/proc/self/mem")
+ if err != nil {
+ return 0, fmt.Errorf("opening mem: %w", err)
+ }
+ defer mem.Close()
+
+ // Open ELF at provided memory address, as offset into /proc/self/mem.
+ c, err := vdsoLinuxVersionCode(io.NewSectionReader(mem, int64(vdsoAddr), math.MaxInt64))
+ if err != nil {
+ return 0, fmt.Errorf("reading linux version code: %w", err)
+ }
+
+ return c, nil
+}
+
+// vdsoMemoryAddress returns the memory address of the vDSO library
+// linked into the current process image. r is an io.Reader into an auxv blob.
+func vdsoMemoryAddress(r io.Reader) (uint64, error) {
+ const (
+ _AT_NULL = 0 // End of vector
+ _AT_SYSINFO_EHDR = 33 // Offset to vDSO blob in process image
+ )
+
+ // Loop through all tag/value pairs in auxv until we find `AT_SYSINFO_EHDR`,
+ // the address of a page containing the virtual Dynamic Shared Object (vDSO).
+ aux := struct{ Tag, Val uint64 }{}
+ for {
+ if err := binary.Read(r, NativeEndian, &aux); err != nil {
+ return 0, fmt.Errorf("reading auxv entry: %w", err)
+ }
+
+ switch aux.Tag {
+ case _AT_SYSINFO_EHDR:
+ if aux.Val != 0 {
+ return aux.Val, nil
+ }
+ return 0, fmt.Errorf("invalid vDSO address in auxv")
+ // _AT_NULL is always the last tag/val pair in the aux vector
+ // and can be treated like EOF.
+ case _AT_NULL:
+ return 0, errAuxvNoVDSO
+ }
+ }
+}
+
+// format described at https://www.man7.org/linux/man-pages/man5/elf.5.html in section 'Notes (Nhdr)'
+type elfNoteHeader struct {
+ NameSize int32
+ DescSize int32
+ Type int32
+}
+
+// vdsoLinuxVersionCode returns the LINUX_VERSION_CODE embedded in
+// the ELF notes section of the binary provided by the reader.
+func vdsoLinuxVersionCode(r io.ReaderAt) (uint32, error) {
+ hdr, err := NewSafeELFFile(r)
+ if err != nil {
+ return 0, fmt.Errorf("reading vDSO ELF: %w", err)
+ }
+
+ sections := hdr.SectionsByType(elf.SHT_NOTE)
+ if len(sections) == 0 {
+ return 0, fmt.Errorf("no note section found in vDSO ELF")
+ }
+
+ for _, sec := range sections {
+ sr := sec.Open()
+ var n elfNoteHeader
+
+ // Read notes until we find one named 'Linux'.
+ for {
+ if err := binary.Read(sr, hdr.ByteOrder, &n); err != nil {
+ if errors.Is(err, io.EOF) {
+ // We looked at all the notes in this section
+ break
+ }
+ return 0, fmt.Errorf("reading note header: %w", err)
+ }
+
+ // If a note name is defined, it follows the note header.
+ var name string
+ if n.NameSize > 0 {
+ // Read the note name, aligned to 4 bytes.
+ buf := make([]byte, Align(int(n.NameSize), 4))
+ if err := binary.Read(sr, hdr.ByteOrder, &buf); err != nil {
+ return 0, fmt.Errorf("reading note name: %w", err)
+ }
+
+ // Read nul-terminated string.
+ name = unix.ByteSliceToString(buf[:n.NameSize])
+ }
+
+ // If a note descriptor is defined, it follows the name.
+ // It is possible for a note to have a descriptor but not a name.
+ if n.DescSize > 0 {
+ // LINUX_VERSION_CODE is a uint32 value.
+ if name == "Linux" && n.DescSize == 4 && n.Type == 0 {
+ var version uint32
+ if err := binary.Read(sr, hdr.ByteOrder, &version); err != nil {
+ return 0, fmt.Errorf("reading note descriptor: %w", err)
+ }
+ return version, nil
+ }
+
+ // Discard the note descriptor if it exists but we're not interested in it.
+ if _, err := io.CopyN(io.Discard, sr, int64(Align(int(n.DescSize), 4))); err != nil {
+ return 0, err
+ }
+ }
+ }
+ }
+
+ return 0, fmt.Errorf("no Linux note in ELF")
+}
diff --git a/vendor/github.com/cilium/ebpf/internal/version.go b/vendor/github.com/cilium/ebpf/internal/version.go
new file mode 100644
index 000000000..370e01e44
--- /dev/null
+++ b/vendor/github.com/cilium/ebpf/internal/version.go
@@ -0,0 +1,122 @@
+package internal
+
+import (
+ "fmt"
+ "sync"
+
+ "github.com/cilium/ebpf/internal/unix"
+)
+
+const (
+ // Version constant used in ELF binaries indicating that the loader needs to
+ // substitute the eBPF program's version with the value of the kernel's
+ // KERNEL_VERSION compile-time macro. Used for compatibility with BCC, gobpf
+ // and RedSift.
+ MagicKernelVersion = 0xFFFFFFFE
+)
+
+var (
+ kernelVersion = struct {
+ once sync.Once
+ version Version
+ err error
+ }{}
+)
+
+// A Version in the form Major.Minor.Patch.
+type Version [3]uint16
+
+// NewVersion creates a version from a string like "Major.Minor.Patch".
+//
+// Patch is optional.
+func NewVersion(ver string) (Version, error) {
+ var major, minor, patch uint16
+ n, _ := fmt.Sscanf(ver, "%d.%d.%d", &major, &minor, &patch)
+ if n < 2 {
+ return Version{}, fmt.Errorf("invalid version: %s", ver)
+ }
+ return Version{major, minor, patch}, nil
+}
+
+// NewVersionFromCode creates a version from a LINUX_VERSION_CODE.
+func NewVersionFromCode(code uint32) Version {
+ return Version{
+ uint16(uint8(code >> 16)),
+ uint16(uint8(code >> 8)),
+ uint16(uint8(code)),
+ }
+}
+
+func (v Version) String() string {
+ if v[2] == 0 {
+ return fmt.Sprintf("v%d.%d", v[0], v[1])
+ }
+ return fmt.Sprintf("v%d.%d.%d", v[0], v[1], v[2])
+}
+
+// Less returns true if the version is less than another version.
+func (v Version) Less(other Version) bool {
+ for i, a := range v {
+ if a == other[i] {
+ continue
+ }
+ return a < other[i]
+ }
+ return false
+}
+
+// Unspecified returns true if the version is all zero.
+func (v Version) Unspecified() bool {
+ return v[0] == 0 && v[1] == 0 && v[2] == 0
+}
+
+// Kernel implements the kernel's KERNEL_VERSION macro from linux/version.h.
+// It represents the kernel version and patch level as a single value.
+func (v Version) Kernel() uint32 {
+
+ // Kernels 4.4 and 4.9 have their SUBLEVEL clamped to 255 to avoid
+ // overflowing into PATCHLEVEL.
+ // See kernel commit 9b82f13e7ef3 ("kbuild: clamp SUBLEVEL to 255").
+ s := v[2]
+ if s > 255 {
+ s = 255
+ }
+
+ // Truncate members to uint8 to prevent them from spilling over into
+ // each other when overflowing 8 bits.
+ return uint32(uint8(v[0]))<<16 | uint32(uint8(v[1]))<<8 | uint32(uint8(s))
+}
+
+// KernelVersion returns the version of the currently running kernel.
+func KernelVersion() (Version, error) {
+ kernelVersion.once.Do(func() {
+ kernelVersion.version, kernelVersion.err = detectKernelVersion()
+ })
+
+ if kernelVersion.err != nil {
+ return Version{}, kernelVersion.err
+ }
+ return kernelVersion.version, nil
+}
+
+// detectKernelVersion returns the version of the running kernel.
+func detectKernelVersion() (Version, error) {
+ vc, err := vdsoVersion()
+ if err != nil {
+ return Version{}, err
+ }
+ return NewVersionFromCode(vc), nil
+}
+
+// KernelRelease returns the release string of the running kernel.
+// Its format depends on the Linux distribution and corresponds to directory
+// names in /lib/modules by convention. Some examples are 5.15.17-1-lts and
+// 4.19.0-16-amd64.
+func KernelRelease() (string, error) {
+ var uname unix.Utsname
+ if err := unix.Uname(&uname); err != nil {
+ return "", fmt.Errorf("uname failed: %w", err)
+ }
+
+ return unix.ByteSliceToString(uname.Release[:]), nil
+}