@@ -159,6 +159,85 @@ impl From<PerfEventOpts> for libbpf_sys::bpf_perf_event_opts {
159159 }
160160}
161161
162+
163+ /// Options used when iterating over a map.
164+ #[ derive( Clone , Debug ) ]
165+ pub struct MapIterOpts < ' fd > {
166+ /// The file descriptor of the map.
167+ pub fd : BorrowedFd < ' fd > ,
168+ #[ doc( hidden) ]
169+ pub _non_exhaustive : ( ) ,
170+ }
171+
172+
173+ /// Iteration order for cgroups.
174+ #[ non_exhaustive]
175+ #[ repr( u32 ) ]
176+ #[ derive( Clone , Debug , Default ) ]
177+ pub enum CgroupIterOrder {
178+ /// Use the default iteration order.
179+ #[ default]
180+ Default = libbpf_sys:: BPF_CGROUP_ITER_ORDER_UNSPEC ,
181+ /// Process only a single object.
182+ SelfOnly = libbpf_sys:: BPF_CGROUP_ITER_SELF_ONLY ,
183+ /// Walk descendants in pre-order.
184+ DescendantsPre = libbpf_sys:: BPF_CGROUP_ITER_DESCENDANTS_PRE ,
185+ /// Walk descendants in post-order.
186+ DescendantsPost = libbpf_sys:: BPF_CGROUP_ITER_DESCENDANTS_POST ,
187+ /// Walk ancestors upward.
188+ AncestorsUp = libbpf_sys:: BPF_CGROUP_ITER_ANCESTORS_UP ,
189+ }
190+
191+ /// Options used when iterating over a cgroup.
192+ #[ derive( Clone , Debug ) ]
193+ pub struct CgroupIterOpts < ' fd > {
194+ /// The file descriptor of the cgroup.
195+ pub fd : BorrowedFd < ' fd > ,
196+ /// The iteration to use on the cgroup.
197+ pub order : CgroupIterOrder ,
198+ #[ doc( hidden) ]
199+ pub _non_exhaustive : ( ) ,
200+ }
201+
202+
203+ /// Options to optionally be provided when attaching to an iterator.
204+ #[ non_exhaustive]
205+ #[ derive( Clone , Debug ) ]
206+ pub enum IterOpts < ' fd > {
207+ /// Iterate over a map.
208+ Map ( MapIterOpts < ' fd > ) ,
209+ /// Iterate over a group.
210+ Cgroup ( CgroupIterOpts < ' fd > ) ,
211+ }
212+
213+ impl From < IterOpts < ' _ > > for libbpf_sys:: bpf_iter_link_info {
214+ fn from ( opts : IterOpts ) -> Self {
215+ let mut linkinfo = libbpf_sys:: bpf_iter_link_info:: default ( ) ;
216+ match opts {
217+ IterOpts :: Map ( map_opts) => {
218+ let MapIterOpts {
219+ fd,
220+ _non_exhaustive : ( ) ,
221+ } = map_opts;
222+
223+ linkinfo. map . map_fd = fd. as_raw_fd ( ) as _ ;
224+ }
225+ IterOpts :: Cgroup ( cgroup_opts) => {
226+ let CgroupIterOpts {
227+ fd,
228+ order,
229+ _non_exhaustive : ( ) ,
230+ } = cgroup_opts;
231+
232+ linkinfo. cgroup . cgroup_fd = fd. as_raw_fd ( ) as _ ;
233+ linkinfo. cgroup . order = order as libbpf_sys:: bpf_cgroup_iter_order ;
234+ }
235+ } ;
236+ linkinfo
237+ }
238+ }
239+
240+
162241/// An immutable parsed but not yet loaded BPF program.
163242pub type OpenProgram < ' obj > = OpenProgramImpl < ' obj > ;
164243/// A mutable parsed but not yet loaded BPF program.
@@ -1323,10 +1402,22 @@ impl<'obj> ProgramMut<'obj> {
13231402 /// [BPF Iterator](https://www.kernel.org/doc/html/latest/bpf/bpf_iterators.html).
13241403 /// The entry point of the program must be defined with `SEC("iter")` or `SEC("iter.s")`.
13251404 pub fn attach_iter ( & self , map_fd : BorrowedFd < ' _ > ) -> Result < Link > {
1326- let mut linkinfo = libbpf_sys:: bpf_iter_link_info:: default ( ) ;
1327- linkinfo. map . map_fd = map_fd. as_raw_fd ( ) as _ ;
1405+ let map_opts = MapIterOpts {
1406+ fd : map_fd,
1407+ _non_exhaustive : ( ) ,
1408+ } ;
1409+ self . attach_iter_with_opts ( IterOpts :: Map ( map_opts) )
1410+ }
1411+
1412+ /// Attach this program to a
1413+ /// [BPF Iterator](https://www.kernel.org/doc/html/latest/bpf/bpf_iterators.html),
1414+ /// providing additional options.
1415+ ///
1416+ /// The entry point of the program must be defined with `SEC("iter")` or `SEC("iter.s")`.
1417+ pub fn attach_iter_with_opts ( & self , opts : IterOpts < ' _ > ) -> Result < Link > {
1418+ let mut linkinfo = libbpf_sys:: bpf_iter_link_info:: from ( opts) ;
13281419 let attach_opt = libbpf_sys:: bpf_iter_attach_opts {
1329- link_info : & mut linkinfo as * mut libbpf_sys :: bpf_iter_link_info ,
1420+ link_info : & raw mut linkinfo ,
13301421 link_info_len : size_of :: < libbpf_sys:: bpf_iter_link_info > ( ) as _ ,
13311422 sz : size_of :: < libbpf_sys:: bpf_iter_attach_opts > ( ) as _ ,
13321423 ..Default :: default ( )
0 commit comments