info.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package btf
  2. import (
  3. "bytes"
  4. "github.com/cilium/ebpf/internal"
  5. )
  6. // info describes a BTF object.
  7. type info struct {
  8. BTF *Spec
  9. ID ID
  10. // Name is an identifying name for the BTF, currently only used by the
  11. // kernel.
  12. Name string
  13. // KernelBTF is true if the BTf originated with the kernel and not
  14. // userspace.
  15. KernelBTF bool
  16. }
  17. func newInfoFromFd(fd *internal.FD) (*info, error) {
  18. // We invoke the syscall once with a empty BTF and name buffers to get size
  19. // information to allocate buffers. Then we invoke it a second time with
  20. // buffers to receive the data.
  21. bpfInfo, err := bpfGetBTFInfoByFD(fd, nil, nil)
  22. if err != nil {
  23. return nil, err
  24. }
  25. btfBuffer := make([]byte, bpfInfo.btfSize)
  26. nameBuffer := make([]byte, bpfInfo.nameLen)
  27. bpfInfo, err = bpfGetBTFInfoByFD(fd, btfBuffer, nameBuffer)
  28. if err != nil {
  29. return nil, err
  30. }
  31. spec, err := loadRawSpec(bytes.NewReader(btfBuffer), internal.NativeEndian, nil, nil)
  32. if err != nil {
  33. return nil, err
  34. }
  35. return &info{
  36. BTF: spec,
  37. ID: ID(bpfInfo.id),
  38. Name: internal.CString(nameBuffer),
  39. KernelBTF: bpfInfo.kernelBTF != 0,
  40. }, nil
  41. }