mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
b79dec8138
Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
48 lines
1.1 KiB
Go
48 lines
1.1 KiB
Go
package btf
|
|
|
|
import (
|
|
"bytes"
|
|
|
|
"github.com/cilium/ebpf/internal"
|
|
)
|
|
|
|
// info describes a BTF object.
|
|
type info struct {
|
|
BTF *Spec
|
|
ID ID
|
|
// Name is an identifying name for the BTF, currently only used by the
|
|
// kernel.
|
|
Name string
|
|
// KernelBTF is true if the BTf originated with the kernel and not
|
|
// userspace.
|
|
KernelBTF bool
|
|
}
|
|
|
|
func newInfoFromFd(fd *internal.FD) (*info, error) {
|
|
// We invoke the syscall once with a empty BTF and name buffers to get size
|
|
// information to allocate buffers. Then we invoke it a second time with
|
|
// buffers to receive the data.
|
|
bpfInfo, err := bpfGetBTFInfoByFD(fd, nil, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
btfBuffer := make([]byte, bpfInfo.btfSize)
|
|
nameBuffer := make([]byte, bpfInfo.nameLen)
|
|
bpfInfo, err = bpfGetBTFInfoByFD(fd, btfBuffer, nameBuffer)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
spec, err := loadRawSpec(bytes.NewReader(btfBuffer), internal.NativeEndian, nil, nil)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return &info{
|
|
BTF: spec,
|
|
ID: ID(bpfInfo.id),
|
|
Name: internal.CString(nameBuffer),
|
|
KernelBTF: bpfInfo.kernelBTF != 0,
|
|
}, nil
|
|
}
|