diff options
Diffstat (limited to 'vendor/github.com/cilium/ebpf/link/iter.go')
-rw-r--r-- | vendor/github.com/cilium/ebpf/link/iter.go | 86 |
1 files changed, 40 insertions, 46 deletions
diff --git a/vendor/github.com/cilium/ebpf/link/iter.go b/vendor/github.com/cilium/ebpf/link/iter.go index 2b5f2846a..d2b32ef33 100644 --- a/vendor/github.com/cilium/ebpf/link/iter.go +++ b/vendor/github.com/cilium/ebpf/link/iter.go @@ -3,8 +3,10 @@ package link import ( "fmt" "io" + "unsafe" "github.com/cilium/ebpf" + "github.com/cilium/ebpf/internal/sys" ) type IterOptions struct { @@ -15,77 +17,69 @@ type IterOptions struct { // AttachTo requires the kernel to include BTF of itself, // and it to be compiled with a recent pahole (>= 1.16). Program *ebpf.Program + + // Map specifies the target map for bpf_map_elem and sockmap iterators. + // It may be nil. + Map *ebpf.Map } // AttachIter attaches a BPF seq_file iterator. func AttachIter(opts IterOptions) (*Iter, error) { - link, err := AttachRawLink(RawLinkOptions{ - Program: opts.Program, - Attach: ebpf.AttachTraceIter, - }) - if err != nil { - return nil, fmt.Errorf("can't link iterator: %w", err) + if err := haveBPFLink(); err != nil { + return nil, err } - return &Iter{link}, err -} + progFd := opts.Program.FD() + if progFd < 0 { + return nil, fmt.Errorf("invalid program: %s", sys.ErrClosedFd) + } + + var info bpfIterLinkInfoMap + if opts.Map != nil { + mapFd := opts.Map.FD() + if mapFd < 0 { + return nil, fmt.Errorf("invalid map: %w", sys.ErrClosedFd) + } + info.map_fd = uint32(mapFd) + } + + attr := sys.LinkCreateIterAttr{ + ProgFd: uint32(progFd), + AttachType: sys.AttachType(ebpf.AttachTraceIter), + IterInfo: sys.NewPointer(unsafe.Pointer(&info)), + IterInfoLen: uint32(unsafe.Sizeof(info)), + } -// LoadPinnedIter loads a pinned iterator from a bpffs. -func LoadPinnedIter(fileName string) (*Iter, error) { - link, err := LoadPinnedRawLink(fileName) + fd, err := sys.LinkCreateIter(&attr) if err != nil { - return nil, err + return nil, fmt.Errorf("can't link iterator: %w", err) } - return &Iter{link}, err + return &Iter{RawLink{fd, ""}}, err } // Iter represents an attached bpf_iter. type Iter struct { - link *RawLink -} - -var _ Link = (*Iter)(nil) - -func (it *Iter) isLink() {} - -// FD returns the underlying file descriptor. -func (it *Iter) FD() int { - return it.link.FD() -} - -// Close implements Link. -func (it *Iter) Close() error { - return it.link.Close() -} - -// Pin implements Link. -func (it *Iter) Pin(fileName string) error { - return it.link.Pin(fileName) -} - -// Update implements Link. -func (it *Iter) Update(new *ebpf.Program) error { - return it.link.Update(new) + RawLink } // Open creates a new instance of the iterator. // // Reading from the returned reader triggers the BPF program. func (it *Iter) Open() (io.ReadCloser, error) { - linkFd, err := it.link.fd.Value() - if err != nil { - return nil, err + attr := &sys.IterCreateAttr{ + LinkFd: it.fd.Uint(), } - attr := &bpfIterCreateAttr{ - linkFd: linkFd, - } - - fd, err := bpfIterCreate(attr) + fd, err := sys.IterCreate(attr) if err != nil { return nil, fmt.Errorf("can't create iterator: %w", err) } return fd.File("bpf_iter"), nil } + +// union bpf_iter_link_info.map +type bpfIterLinkInfoMap struct { + map_fd uint32 +} |