Skip to content

aya-v0.13.0

Compare
Choose a tag to compare
@dave-tucker dave-tucker released this 09 Oct 10:23
· 64 commits to main since this release

Chore

  • Add comments in *_wrong_map tests
  • Rename bpf -> ebpf
  • Fix unused_qualifications lints
    This was failing the docs build.

Documentation

  • fix typo
  • Use Ebpf instead of Bpf

New Features

  • Implement TCX
    This commit adds the initial support for TCX
    bpf links. This is a new, multi-program, attachment
    type allows for the caller to specify where
    they would like to be attached relative to other
    programs at the attachment point using the LinkOrder
    type.
  • Provide a deprecated BpfError alias
  • 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.

Bug Fixes

  • 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

  • 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.

  • fix panic when creating map on custom ubuntu kernel

  • fix rustdocs-args ordering in taplo to -D warnings
    This fixes the current rustdoc build error by correcting the ordering of
    rustdoc-args to -D warnings. Additionally, this also removes the
    recorder_arrays field (defaults to false) so that the order is not
    modified, which is what caused the error in the first place.

Other

  • use FdLink in SockOps programs

  • remove unwrap and NonZero* in info
    Addresses the feedback from #1007:

    • remove panic from unwrap and expect
    • Option<NonZero*> => Option with 0 mapping to None
  • 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.
  • revamp ProgramInfo be more friendly with older kernels
    Purpose of this commit is to add detections for whether a field is
    available in ProgramInfo.

    • For program_type(), we return the new enum ProgramType instead of
      the integer representation.
    • For fields that we know cannot be zero, we return Option<NonZero*>
      type.
    • For name_as_str(), it now also uses the feature probe bpf_name()
      to detect if field is available or not.
    • Two additional feature probes are added for the fields:
      • prog_info_map_ids() probe -> map_ids() field
      • prog_info_gpl_compatible() probe -> gpl_compatible() field

    With the prog_info_map_ids() probe, the previous implementation that
    I had for bpf_prog_get_info_by_fd() is shortened to use the probe
    instead of having to make 2 potential syscalls.

    The test_loaded_at() test is also moved into info tests since it is
    better related to the info tests.

  • 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.

  • 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
  • adjust bpf programs for big endian
    In aya/src/sys/bpf.rs, there are several simple bpf programs written as
    byte arrays. These need to be adjusted to account for big endian.

  • expose run_time_ns and run_cnt fields in ProgramInfo
    Added functions to expose run_time_ns & run_cnt statistics from
    ProgramInfo/bpf_prog_info.

  • add BPF_ENABLE_STATS syscall function
    Add bpf syscall function for BPF_ENABLE_STATS to enable stats tracking
    for benchmarking purposes.

    Additionally, move #[cfg(test)] annotation around the Drop trait
    instead. Having separate functions causes some complications when
    needing ownership/moving of the inner value OwnedFd when Drop is
    manually implemented.

  • :programs::uprobe: fix bad variable name
    The variable fn_name was very much not the fn_name, but rather the
    object file path.

  • adjust symbol lookup tests for object crate alignment requirements
    The object::File::parse API requires parameter to be aligned with 8 bytes.
    Adjusted the Vec in the tests with miri to meet this requirement.

  • add symbol lookup in associated debug files
    This change enhances the logic for symbol lookup in uprobe or uretprobe.
    If the symbol is not found in the original binary, the search continues
    in the debug file associated through the debuglink section. Before
    searching the symbol table, it compares the build IDs of the two files.
    The symbol lookup will only be terminated if both build IDs exist and do
    not match. This modification does not affect the existing symbol lookup
    logic.

  • Generate new bindings

  • include license in crate workspace
    This PR includes the licenses files in the crate workspace subdirectory.
    Without this, they won't be showing on crates.io and would be giving out
    errors on tooling such as rust2rpm.

  • 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) });
           |
    

Performance

  • cache nr_cpus in a thread_local

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.

New Features (BREAKING)

  • Rename BpfRelocationError -> EbpfRelocationError
  • Rename BpfSectionKind to EbpfSectionKind

Commit Statistics

  • 65 commits contributed to the release.
  • 223 days passed between releases.
  • 31 commits were understood as conventional.
  • 0 issues like '(#ID)' were seen in commit messages

Commit Details

view details
  • Uncategorized
    • Implement TCX (5478cac)
    • Cache nr_cpus in a thread_local (d05110f)
    • Clarify Arc usage (afd777b)
    • Replace Arc with &'static (e992c28)
    • Avoid intermediate allocations in parse_cpu_ranges (0e86757)
    • Reduce duplication in {nr,possible}_cpus (f3b2744)
    • Replace lazy_static with std::sync::LazyLock (2b299d4)
    • Appease clippy (0f16363)
    • Merge pull request #1023 from l2dy/fdlink/sockops (2cd3576)
    • Use FdLink in SockOps programs (c44f8b0)
    • Remove unwrap and NonZero* in info (02d1db5)
    • Merge pull request #985 from reyzell/main (40f3032)
    • Add the option to support multiple and overrideable programs per cgroup (f790685)
    • Merge pull request #1007 from tyrone-wu/aya/info-api (15eb935)
    • Revamp MapInfo be more friendly with older kernels (fbb0930)
    • Revamp ProgramInfo be more friendly with older kernels (88f5ac3)
    • Add conversion u32 to enum type for prog, link, & attach type (1634fa7)
    • Improve integration tests for info API (cb8e478)
    • Merge pull request #959 from tyrone-wu/aya/program_info_stats (ab000ad)
    • Merge pull request #974 from Billy99/billy99-arch-ppc64-s390x (ab5e688)
    • Adjust bpf programs for big endian (cd1db86)
    • Adjust test byte arrays for big endian (eef7346)
    • Simplify doctest (4362020)
    • Appease nightly clippy (bce3c4f)
    • Expose run_time_ns and run_cnt fields in ProgramInfo (a25f501)
    • Add BPF_ENABLE_STATS syscall function (fa6af6a)
    • Fix PerfEventArray resize logic (3d57d35)
    • Add comments in *_wrong_map tests (e575712)
    • Set PerfEventArray max_entries to nCPUs (25d986a)
    • Use MockableFd everywhere (e12fcf4)
    • Merge pull request #991 from l2dy/typo-1 (2cd9858)
    • Fix typo (f1773d5)
    • Merge pull request #983 from ajwerner/fix-variable-name (d5414bf)
    • :programs::uprobe: fix bad variable name (d413e2f)
    • Fix panic when creating map on custom ubuntu kernel (38d8e32)
    • Appease clippy (78acd74)
    • Don't deny unused_qualifications (781914f)
    • Fix rustdocs-args ordering in taplo to -D warnings (5e13283)
    • Remove deny(pointer_structural_match) (4e843a3)
    • Merge pull request #938 from swananan/enhance_urpobe_symbol_lookup (bde4b5f)
    • Fix clippy (c7898c5)
    • Adjust symbol lookup tests for object crate alignment requirements (462514e)
    • Add symbol lookup in associated debug files (e6e1bfe)
    • Merge pull request #928 from seanyoung/io-error (d0e9b95)
    • S/MiriSafeFd/MockableFd/ (a11b61e)
    • Remove miri ignores (cb6d3bd)
    • Document miri skip reasons (35962a4)
    • Avoid crashing under Miri (7a7d168)
    • Deduplicate test helpers (7e1666f)
    • Reduce duplication (58e154e)
    • Expose io_error in SyscallError (a6c45f6)
    • Appease clippy (09442c2)
    • Generate new bindings (b06ff40)
    • Appease clippy (0a32dac)
    • Merge pull request #528 from dave-tucker/rename-all-the-things (63d8d4d)
    • Include license in crate workspace (a4e68eb)
    • Use Ebpf instead of Bpf (57a69fe)
    • Provide a deprecated BpfError alias (110a76c)
    • Rename Bpf to Ebpf (8c79b71)
    • Rename BpfRelocationError -> EbpfRelocationError (fd48c55)
    • Rename BpfSectionKind to EbpfSectionKind (cf3e2ca)
    • Rename bpf -> ebpf (70ac91d)
    • Fix unused_qualifications lints (481b73b)
    • Add CgroupDevice::query (542306d)
    • Appease new nightly clippy lints (e38eac6)