Skip to content

Commit b341a7a

Browse files
committed
Introduce Program::attach_iter_with_opts()
Add the Program::attach_iter_with_opts() method to allow for iterator attachment with support for providing additional options. Signed-off-by: Daniel Müller <deso@posteo.net>
1 parent 4bdf81b commit b341a7a

File tree

3 files changed

+102
-3
lines changed

3 files changed

+102
-3
lines changed

libbpf-rs/CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
Unreleased
2+
----------
3+
- Added `Program::attach_iter_with_opts` for attaching to iterators with
4+
additional options
5+
6+
17
0.26.0-beta.0
28
-------------
39
- Added `target_obj_id` and `target_btf_id` fields to `TracingLinkInfo`

libbpf-rs/src/lib.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,9 @@ pub use crate::print::get_print;
130130
pub use crate::print::set_print;
131131
pub use crate::print::PrintCallback;
132132
pub use crate::print::PrintLevel;
133+
pub use crate::program::CgroupIterOrder;
133134
pub use crate::program::Input as ProgramInput;
135+
pub use crate::program::IterOpts;
134136
pub use crate::program::KprobeMultiOpts;
135137
pub use crate::program::KprobeOpts;
136138
pub use crate::program::OpenProgram;

libbpf-rs/src/program.rs

Lines changed: 94 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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.
163242
pub 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

Comments
 (0)