Commit Graph

248 Commits (9eefb48a0ad90831c09c7bd941d035b34e1f1771)

Author SHA1 Message Date
Tamir Duberstein de1e80c1d1 aya: encode perf_event ioctl contract
Enumerate the possible ioctls in an enum and bake in the knowledge that
they all return 0 on success and -1 on error.
8 months ago
Tamir Duberstein 055e36e8d9 aya: encode perf_event_open(2) contract
Per man 2 perf_event_open:

> RETURN VALUE
>   On success, perf_event_open() returns the new file descriptor.  On
>   error, -1 is returned and errno is set to indicate the error.

Bake this into our syscalls so we stop using `_` so much which can hide
information loss. Remove the type parameter to SysResult.
8 months ago
Tamir Duberstein bdd8ae2d0b *: avoid `_`
This can silently discard information, so we shouldn't do it.
8 months ago
Tamir Duberstein f6df60fa70 aya: encode bpf(2) contract
Per man 2 bpf:

> RETURN VALUE
>   For a successful call, the return value depends on the operation:
>
>   BPF_MAP_CREATE
>     The new file descriptor associated with the eBPF map.
>
>   BPF_PROG_LOAD
>     The new file descriptor associated with the eBPF program.
>
>   All other commands
>     Zero.
>
>   On error, -1 is returned, and errno is set to indicate the error.

Bake this into our syscalls so we stop using `_` so much which can hide
information loss.
8 months ago
Tamir Duberstein 2d782606fe *: avoid Result::is_{ok,err}
These methods discard information. Discarding information is bad.
8 months ago
Tamir Duberstein dab1aa4e29 maps: avoid retagging in tests 8 months ago
Tamir Duberstein f51ab80075 perf_buffer: attempt to preserve provenance
In tests, provide write provenance.
8 months ago
Tamir Duberstein 888701425b perf_buffer: use MMap from ring_buf 8 months ago
Tamir Duberstein e17feca2d6 maps: remove some stale comments 8 months ago
Tamir Duberstein 935ba20224 Enable test under miri
nr_cpus() is stubbed since 9e1bcd0ab8.
8 months ago
Tamir Duberstein 9a47495227 aya,aya-obj: preserve pointer provenance 8 months ago
Tamir Duberstein 122c49fca4 *: appease clippy
While I'm here convert a String to a PathBuf in an error to avoid lossy
conversions.

See https://rust-lang.github.io/rust-clippy/master/index.html#io_other_error.
8 months ago
aorhant 9e1bcd0ab8 aya: Fix PerCpuHashMap NotFound
PerCpuHashMap was never returning MapError::KeyNotFound because
bpf_map_lookup_elem_per_cpu was replacing Ok(None) with
Ok(Some(zeroed_value)).

Update bpf_map_lookup_elem_per_cpu to map the Option value.
8 months ago
Tamir Duberstein 9198335100 codegen: remove outdated workaround
bindgen can handle these macros now.
8 months ago
Tyrone Wu 665d4f20bb chore: remove aya_obj -> obj alias
When `aya::obj` was migrated to be its own crate `aya-obj`, the `obj`
alias was created to preserve existing imports that relied on
`crate::obj`.

This resulted in 3 ways to import `aya-obj` objects:
- `use aya_obj::*`
- `use obj::*`
- `use crate::obj::*`

The `obj` alias is now removed to avoid confusion, and all `obj` imports
are funneled through `aya_obj`.
9 months ago
Tamir Duberstein 78ee9a4634 Avoid useless conversions
Use native C types to avoid platform-dependent conversions.
10 months ago
Tamir Duberstein 4257643354 Clean up C type imports 10 months ago
Michal Rostecki 4f0559f2af chore: Fix cippy errors 10 months ago
Tamir Duberstein a77db17ec8 cargo fmt 11 months ago
banditopazzo a16755089b Avoid warning with `allow_unsupported_maps`
Remove the warning log altogether; either it's an error or it isn't.
11 months ago
Dave Tucker ca0c32d107 fix(aya): Fill bss maps with zeros
The loader should fill bss maps with zeros according to the size of the
ELF section.
Failure to do so yields weird verifier messages as follows:

```
cannot access ptr member ops with moff 0 in struct bpf_map with off 0 size 4
```

Reference to this in the cilium/ebpf code is here [1].
I could not find a reference in libbpf.

1: d0c8fc1937/elf_reader.go (L1159-L1165)

Signed-off-by: Dave Tucker <dave@dtucker.co.uk>
12 months ago
Tamir Duberstein f3b2744072 Reduce duplication in `{nr,possible}_cpus` 1 year ago
Tamir Duberstein 0f163633e3 Appease clippy
See https://github.com/rust-lang/rust/pull/130778.

```
warning: empty line after doc comment
  --> test/integration-ebpf/build.rs:16:1
   |
16 | / /// [bindeps]: https://doc.rust-lang.org/nightly/cargo/reference/unstable.html?highlight=feature#artifact-dependencies
17 | |
   | |_
18 |   fn main() {
   |   --------- the comment documents this function
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#empty_line_after_doc_comments
   = note: `#[warn(clippy::empty_line_after_doc_comments)]` on by default
   = help: if the empty line is unintentional remove it

error: empty line after doc comment
  --> aya/src/maps/bloom_filter.rs:34:1
   |
34 | / /// ```
35 | |
   | |_
...
38 |   pub struct BloomFilter<T, V: Pod> {
   |   --------------------------------- the comment documents this struct
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#empty_line_after_doc_comments
note: the lint level is defined here
  --> aya/src/lib.rs:41:5
   |
41 |     clippy::all,
   |     ^^^^^^^^^^^
   = note: `#[deny(clippy::empty_line_after_doc_comments)]` implied by `#[deny(clippy::all)]`
   = help: if the empty line is unintentional remove it

error: empty line after doc comment
  --> aya/src/maps/lpm_trie.rs:46:1
   |
46 | / /// ```
47 | |
   | |_
...
50 |   pub struct LpmTrie<T, K, V> {
   |   --------------------------- the comment documents this struct
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#empty_line_after_doc_comments
   = help: if the empty line is unintentional remove it

warning: empty line after doc comment
  --> test/integration-test/build.rs:38:1
   |
38 | / /// [bindeps]: https://doc.rust-lang.org/nightly/cargo/reference/unstable.html?highlight=feature#artifact-dependencies
39 | |
   | |_
40 |   fn main() {
   |   --------- the comment documents this function
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#empty_line_after_doc_comments
   = note: `#[warn(clippy::empty_line_after_doc_comments)]` on by default
   = help: if the empty line is unintentional remove it

warning: calling `CStr::new` with a byte string literal
  --> test/integration-test/src/tests/xdp.rs:45:20
   |
45 |         .from_name(CStr::from_bytes_with_nul(b"lo\0").unwrap())
   |                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use a `c""` literal: `c"lo"`
   |
   = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#manual_c_str_literals
   = note: `#[warn(clippy::manual_c_str_literals)]` on by default
```
1 year ago
tyrone-wu 02d1db5fc0 aya: remove unwrap and NonZero* in info
Addresses the feedback from #1007:
- remove panic from `unwrap` and `expect`
- Option<NonZero*> => Option<int> with `0` mapping to `None`

Refs: #1007
1 year ago
tyrone-wu fbb09304a2
aya,int-test: revamp MapInfo be more friendly with older kernels
Adds detection for whether a field is available in `MapInfo`:
- For `map_type()`, we treturn new enum `MapType` instead of the integer
  representation.
- For fields that can't be zero, we return `Option<NonZero*>` type.
- For `name_as_str()`, it now uses the feature probe `bpf_name()` to
  detect if field is available.
  Although the feature probe checks for program name, it can also be
  used for map name since they were both introduced in the same commit.
1 year ago
tyrone-wu 1634fa7188
aya-obj: add conversion u32 to enum type for prog, link, & attach type
Add conversion from u32 to program type, link type, and attach type.
Additionally, remove duplicate match statement for u32 conversion to
`BPF_MAP_TYPE_BLOOM_FILTER` & `BPF_MAP_TYPE_CGRP_STORAGE`.

New error `InvalidTypeBinding<T>` is created to represent when a
parsed/received value binding to a type is invalid.
This is used in the new conversions added here, and also replaces
`InvalidMapTypeError` in `TryFrom` for `bpf_map_type`.
1 year ago
tyrone-wu cb8e478800
aya,integration-test: improve integration tests for info API
Improves the existing integraiton tests for `loaded_programs()` and
`loaded_maps()` in consideration for older kernels:
  - Opt for `SocketFilter` program in tests since XDP requires v4.8 and
    fragments requires v5.18.
  - For assertion tests, first perform the assertion, if the assertion
    fails, then it checks the host kernel version to see if it is above
    the minimum version requirement. If not, then continue with test,
    otherwise fail.
    For assertions that are skipped, they're logged in stderr which can
    be observed with `-- --nocapture`.

This also fixes the `bpf_prog_get_info_by_fd()` call for kernels below
v4.15. If calling syscall  on kernels below v4.15, it can produce an
`E2BIG` error  because `check_uarg_tail_zero()` expects the entire
struct to all-zero bytes (which is caused from the map info).

Instead, we first attempt the syscall with the map info filled, if it
returns `E2BIG`, then perform syscall again with empty closure.

Also adds doc for which version a kernel feature was introduced for
better  awareness.

The tests have been verified kernel versions:
  - 4.13.0
  - 4.15.0
  - 6.1.0
1 year ago
Billy McFall eef7346fb2 test: adjust test byte arrays for big endian
Adding support for s390x (big endian architecture) and found that some
of the unit tests have structures and files implemented as byte arrays.
They are all coded as little endian and need a bug endian version to
work properly.

Signed-off-by: Billy McFall <22157057+Billy99@users.noreply.github.com>
1 year ago
Dave Tucker 3d57d358e4 fix(aya): Fix PerfEventArray resize logic
There was a logic bug in the previously merged patch where we
set the correctly calculated max_entries size with the original.

To fix this and prevent regressions a unit test was added.
This highlighted that the original map definition needs to be
mutated in order for the max_entries change to be properly applied.

As such, this resize logic moved out of aya::sys into aya::maps

Signed-off-by: Dave Tucker <dave@dtucker.co.uk>
1 year ago
Michal Rostecki e575712c59 chore: Add comments in `*_wrong_map` tests 1 year ago
Dave Tucker 25d986a26d fix(aya): Set PerfEventArray max_entries to nCPUs
Both libbpf and cilium/ebpf have will set the max_entries of a
BPF_MAP_TYPE_PERF_EVENT_ARRAY to the number of online CPUs if
it was omitted at map definition time. This adds that same
logic to Aya.

Signed-off-by: Dave Tucker <dave@dtucker.co.uk>
1 year ago
Tamir Duberstein e12fcf46cb Use MockableFd everywhere
Rust 1.80 contains https://github.com/rust-lang/rust/pull/124210,
causing tests which we skip under miri to segfault.
1 year ago
Zero King f1773d5af4 docs(aya): fix typo 1 year ago
Tamir Duberstein a11b61ebfd s/MiriSafeFd/MockableFd/
The need for this type isn't specific to Miri; it is necessary on
toolchains containing https://github.com/rust-lang/rust/pull/124210 - it
just so happens that today this is nightly only, and so is Miri.
1 year ago
Tamir Duberstein cb6d3bd75d Remove miri ignores
These only warn now:

```
test maps::hash_map::hash_map::tests::test_iter ... warning: integer-to-pointer cast
   --> aya/src/maps/hash_map/hash_map.rs:304:15
    |
304 |         match unsafe { attr.__bindgen_anon_2.key } as *const T {
    |               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ integer-to-pointer cast
    |
    = help: This program is using integer-to-pointer casts or (equivalently) `ptr::with_exposed_provenance`,
    = help: which means that Miri might miss pointer bugs in this program.
    = help: See https://doc.rust-lang.org/nightly/std/ptr/fn.with_exposed_provenance.html for more details on that operation.
    = help: To ensure that Miri does not miss bugs in your program, use Strict Provenance APIs (https://doc.rust-lang.org/nightly/std/ptr/index.html#strict-provenance, https://crates.io/crates/sptr) instead.
    = help: You can then pass the `-Zmiri-strict-provenance` flag to Miri, to ensure you are not relying on `with_exposed_provenance` semantics.
    = help: Alternatively, the `-Zmiri-permissive-provenance` flag disables this warning.
    = note: BACKTRACE on thread `maps::hash_map:`:
    = note: inside `maps::hash_map::hash_map::tests::bpf_key::<i32>` at aya/src/maps/hash_map/hash_map.rs:304:15: 304:63
```
1 year ago
Tamir Duberstein 35962a4794 Document miri skip reasons 1 year ago
Tamir Duberstein 7a7d16885a Avoid crashing under Miri
See https://github.com/rust-lang/rust/pull/124210.
1 year ago
Tamir Duberstein 7e1666fb83 Deduplicate test helpers 1 year ago
Tamir Duberstein 58e154e1bc Reduce duplication 1 year ago
Tamir Duberstein 09442c2cbe Appease clippy
```
  warning: transmute used without annotations
     --> aya-log-common/src/lib.rs:220:41
      |
  220 |         let bytes = unsafe { core::mem::transmute::<_, [u8; 16]>(self) };
      |                                         ^^^^^^^^^^^^^^^^^^^^^^^^ help: consider adding missing annotations: `transmute::<[u16; 8], [u8; 16]>`
      |
      = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#missing_transmute_annotations
      = note: `#[warn(clippy::missing_transmute_annotations)]` on by default

  error: transmute used without annotations
      --> aya/src/maps/mod.rs:1130:52
       |
  1130 |                     .copy_from_slice(unsafe { mem::transmute(TEST_NAME) });
       |                                                    ^^^^^^^^^ help: consider adding missing annotations: `transmute::<&str, &[i8]>`
       |
       = help: for further information visit https://rust-lang.github.io/rust-clippy/master/index.html#missing_transmute_annotations
  note: the lint level is defined here
      --> aya/src/lib.rs:41:5
       |
  41   |     clippy::all,
       |     ^^^^^^^^^^^
       = note: `#[deny(clippy::missing_transmute_annotations)]` implied by `#[deny(clippy::all)]`
```
2 years ago
Dave Tucker 8c79b71bd5 feat(aya): Rename Bpf to Ebpf
And BpfLoader to EbpfLoader.
This also adds type aliases to preserve the use of the old names, making
updating to a new Aya release less of a burden. These aliases are marked
as deprecated since we'll likely remove them in a later release.

Signed-off-by: Dave Tucker <dave@dtucker.co.uk>
2 years ago
Dave Tucker cf3e2ca677 feat(aya-obj)!: Rename BpfSectionKind to EbpfSectionKind
Signed-off-by: Dave Tucker <dave@dtucker.co.uk>
2 years ago
Tamir Duberstein e38eac6352 aya: appease new nightly clippy lints
```
  error: unnecessary qualification
     --> aya/src/maps/ring_buf.rs:434:22
      |
  434 |                 ptr: ptr::NonNull::new(ptr).ok_or(
      |                      ^^^^^^^^^^^^^^^^^
      |
  note: the lint level is defined here
     --> aya/src/lib.rs:72:5
      |
  72  |     unused_qualifications,
      |     ^^^^^^^^^^^^^^^^^^^^^
  help: remove the unnecessary path segments
      |
  434 -                 ptr: ptr::NonNull::new(ptr).ok_or(
  434 +                 ptr: NonNull::new(ptr).ok_or(
      |

  error: unnecessary qualification
     --> aya/src/maps/mod.rs:225:21
      |
  225 |     let mut limit = std::mem::MaybeUninit::<rlimit>::uninit();
      |                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
      |
  help: remove the unnecessary path segments
      |
  225 -     let mut limit = std::mem::MaybeUninit::<rlimit>::uninit();
  225 +     let mut limit = mem::MaybeUninit::<rlimit>::uninit();
      |

  error: unnecessary qualification
     --> aya/src/programs/mod.rs:614:9
      |
  614 |         crate::obj::Program {
      |         ^^^^^^^^^^^^^^^^^^^
      |
  help: remove the unnecessary path segments
      |
  614 -         crate::obj::Program {
  614 +         obj::Program {
      |

  error: unnecessary qualification
     --> aya/src/util.rs:373:14
      |
  373 |     unsafe { std::slice::from_raw_parts(bpf_name.as_ptr() as
      *const _, length) }
      |              ^^^^^^^^^^^^^^^^^^^^^^^^^^
      |
  help: remove the unnecessary path segments
      |
  373 -     unsafe { std::slice::from_raw_parts(bpf_name.as_ptr() as
      *const _, length) }
  373 +     unsafe { slice::from_raw_parts(bpf_name.as_ptr() as *const _,
      length) }
      |

  error: unnecessary qualification
      --> aya/src/maps/mod.rs:1130:47
       |
  1130 |                     .copy_from_slice(unsafe {
       std::mem::transmute(TEST_NAME) });
       |                                               ^^^^^^^^^^^^^^^^^^^
       |
  note: the lint level is defined here
      --> aya/src/lib.rs:72:5
       |
  72   |     unused_qualifications,
       |     ^^^^^^^^^^^^^^^^^^^^^
  help: remove the unnecessary path segments
       |
  1130 -                     .copy_from_slice(unsafe {
       std::mem::transmute(TEST_NAME) });
  1130 +                     .copy_from_slice(unsafe {
       mem::transmute(TEST_NAME) });
       |
```
2 years ago
Dave Tucker 770a95e077 chore: Appease clippy unused imports
Signed-off-by: Dave Tucker <dave@dtucker.co.uk>
2 years ago
Tamir Duberstein 963dd13219 Appease rustc dead_code lint
Some of these are legit, others are false positives. I've filed
https://github.com/rust-lang/rust/issues/120770 for the latter.
2 years ago
Σrebe - Romain GERARD c31cce4a36 fix(aya-sock-map): invalid transmute when calling fd
Corrent an invalid transmutation for sock_map.
fd is already a ref of MapFd, so transmuting &fd to &SockMapFd is
equivalent to transmuting &&SockMapFd into &SockMapFd which is buggy.
2 years ago
Alessandro Decina 92b1947885 aya: add StackTraceMap::remove() 2 years ago
Dave Tucker e9e2f48d4f aya: Fix ringbuf docs
doctests are not running in CI and therefore the didn't catch the
ringbuf docs failures. This commit fixes the issues in the examples.

Signed-off-by: Dave Tucker <dave@dtucker.co.uk>
2 years ago
astoycos b1769678f4 aya/maps: pin for (async)perf_event_array
Implement pinning for perf_event_array and async_perf_event_array.
Additionally make the core MapData.pin method operate on a reference
rather than a mutable reference.

Signed-off-by: astoycos <astoycos@redhat.com>
2 years ago
Andrew Werner c06fcc3eda maps/ringbuf: make RingBuf: Send + Sync
There was no reason for them not to be -- the APIs all require mutable
references and hold onto mutable references, so there cannot be internal
concurrency. The !Send + !Sync came from the MMap, but not for any good
reason.
2 years ago