-
Notifications
You must be signed in to change notification settings - Fork 308
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
The `bpf_strncmp` helper allows for better string comparison in eBPF programs. Added in torvalds/linux@c5fb19937455095573a19.
- Loading branch information
1 parent
a63b02c
commit 0c4a0fb
Showing
7 changed files
with
145 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,40 @@ | ||
#![no_std] | ||
#![no_main] | ||
|
||
use core::cmp::Ordering; | ||
|
||
use aya_ebpf::{ | ||
cty::c_long, | ||
helpers::{bpf_probe_read_user_str_bytes, bpf_strncmp}, | ||
macros::{map, uprobe}, | ||
maps::Array, | ||
programs::ProbeContext, | ||
}; | ||
|
||
#[repr(C)] | ||
struct TestResult(Ordering); | ||
|
||
#[map] | ||
static RESULT: Array<TestResult> = Array::with_max_entries(1, 0); | ||
|
||
#[uprobe] | ||
pub fn test_bpf_strncmp(ctx: ProbeContext) -> Result<(), c_long> { | ||
let str_bytes: *const u8 = ctx.arg(0).ok_or(-1)?; | ||
let mut buf = [0u8; 16]; | ||
let str_bytes = unsafe { bpf_probe_read_user_str_bytes(str_bytes, &mut buf)? }; | ||
|
||
let ptr = RESULT.get_ptr_mut(0).ok_or(-1)?; | ||
let dst = unsafe { ptr.as_mut() }; | ||
let TestResult(dst_res) = dst.ok_or(-1)?; | ||
|
||
let cmp_res = bpf_strncmp(str_bytes, c"fff"); | ||
*dst_res = cmp_res; | ||
|
||
Ok(()) | ||
} | ||
|
||
#[cfg(not(test))] | ||
#[panic_handler] | ||
fn panic(_info: &core::panic::PanicInfo) -> ! { | ||
loop {} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -8,5 +8,6 @@ mod rbpf; | |
mod relocations; | ||
mod ring_buf; | ||
mod smoke; | ||
mod strncmp; | ||
mod tcx; | ||
mod xdp; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
use std::cmp::Ordering; | ||
|
||
use aya::{maps::Array, programs::UProbe, Ebpf}; | ||
|
||
#[derive(Copy, Clone)] | ||
#[repr(C)] | ||
struct TestResult(Ordering); | ||
|
||
unsafe impl aya::Pod for TestResult {} | ||
|
||
#[test] | ||
fn bpf_strncmp_equal() { | ||
let bpf = load_and_attach_uprobe(); | ||
trigger_bpf_strncmp(b"fff".as_ptr()); | ||
let res = fetch_result(&bpf); | ||
assert_eq!(res, Ordering::Equal); | ||
} | ||
|
||
#[test] | ||
fn bpf_strncmp_equal_longer() { | ||
let bpf = load_and_attach_uprobe(); | ||
trigger_bpf_strncmp(b"ffffff".as_ptr()); | ||
let res = fetch_result(&bpf); | ||
assert_eq!(res, Ordering::Equal); | ||
} | ||
|
||
#[test] | ||
fn bpf_strncmp_less() { | ||
let bpf = load_and_attach_uprobe(); | ||
trigger_bpf_strncmp(b"aaa".as_ptr()); | ||
let res = fetch_result(&bpf); | ||
assert_eq!(res, Ordering::Less); | ||
} | ||
|
||
#[test] | ||
fn bpf_strncmp_greater() { | ||
let bpf = load_and_attach_uprobe(); | ||
trigger_bpf_strncmp(b"zzz".as_ptr()); | ||
let res = fetch_result(&bpf); | ||
assert_eq!(res, Ordering::Greater); | ||
} | ||
|
||
fn load_and_attach_uprobe() -> Ebpf { | ||
let mut bpf = Ebpf::load(crate::STRNCMP).unwrap(); | ||
|
||
let prog: &mut UProbe = bpf | ||
.program_mut("test_bpf_strncmp") | ||
.unwrap() | ||
.try_into() | ||
.unwrap(); | ||
prog.load().unwrap(); | ||
|
||
prog.attach(Some("trigger_bpf_strncmp"), 0, "/proc/self/exe", None) | ||
.unwrap(); | ||
|
||
bpf | ||
} | ||
|
||
fn fetch_result(bpf: &Ebpf) -> Ordering { | ||
let array = Array::<_, TestResult>::try_from(bpf.map("RESULT").unwrap()).unwrap(); | ||
let TestResult(res) = array.get(&0, 0).unwrap(); | ||
res | ||
} | ||
|
||
#[no_mangle] | ||
#[inline(never)] | ||
pub extern "C" fn trigger_bpf_strncmp(string: *const u8) { | ||
core::hint::black_box(string); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters