@@ -159,6 +159,85 @@ impl From<PerfEventOpts> for libbpf_sys::bpf_perf_event_opts {
159
159
}
160
160
}
161
161
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
+
162
241
/// An immutable parsed but not yet loaded BPF program.
163
242
pub type OpenProgram < ' obj > = OpenProgramImpl < ' obj > ;
164
243
/// A mutable parsed but not yet loaded BPF program.
@@ -1323,10 +1402,22 @@ impl<'obj> ProgramMut<'obj> {
1323
1402
/// [BPF Iterator](https://www.kernel.org/doc/html/latest/bpf/bpf_iterators.html).
1324
1403
/// The entry point of the program must be defined with `SEC("iter")` or `SEC("iter.s")`.
1325
1404
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) ;
1328
1419
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 ,
1330
1421
link_info_len : size_of :: < libbpf_sys:: bpf_iter_link_info > ( ) as _ ,
1331
1422
sz : size_of :: < libbpf_sys:: bpf_iter_attach_opts > ( ) as _ ,
1332
1423
..Default :: default ( )
0 commit comments