mirror of https://github.com/aya-rs/aya
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.8 KiB
Rust
79 lines
2.8 KiB
Rust
#![no_std]
|
|
#![no_main]
|
|
#![expect(unused_crate_dependencies, reason = "used in other bins")]
|
|
|
|
use aya_ebpf::{
|
|
bindings::sk_action,
|
|
btf_maps::SkStorage,
|
|
macros::{btf_map, cgroup_sock_addr},
|
|
programs::SockAddrContext,
|
|
};
|
|
use integration_common::sk_storage::{Ip, Value};
|
|
#[cfg(not(test))]
|
|
extern crate ebpf_panic;
|
|
|
|
#[btf_map]
|
|
static SOCKET_STORAGE: SkStorage<Value> = SkStorage::new();
|
|
|
|
#[cgroup_sock_addr(connect4)]
|
|
pub(crate) fn sk_storage_connect4(ctx: SockAddrContext) -> i32 {
|
|
let sock_addr = unsafe { &*ctx.sock_addr };
|
|
|
|
let storage = unsafe { SOCKET_STORAGE.get_or_insert_ptr_mut(&ctx, None) };
|
|
if !storage.is_null() {
|
|
unsafe {
|
|
*storage = Value {
|
|
user_family: sock_addr.user_family,
|
|
user_ip: Ip::V4(sock_addr.user_ip4),
|
|
user_port: sock_addr.user_port,
|
|
family: sock_addr.family,
|
|
type_: sock_addr.type_,
|
|
protocol: sock_addr.protocol,
|
|
}
|
|
}
|
|
}
|
|
|
|
sk_action::SK_PASS as _
|
|
}
|
|
|
|
#[cgroup_sock_addr(connect6)]
|
|
pub(crate) fn sk_storage_connect6(ctx: SockAddrContext) -> i32 {
|
|
let sock_addr = unsafe { &*ctx.sock_addr };
|
|
|
|
let storage = unsafe { SOCKET_STORAGE.get_or_insert_ptr_mut(&ctx, None) };
|
|
if !storage.is_null() {
|
|
let mut user_ip6 = [0u32; 4];
|
|
unsafe {
|
|
// Verifier dislikes the naive thing:
|
|
//
|
|
// ; let sk = unsafe { sock_addr.__bindgen_anon_1.sk };
|
|
// 0: (79) r2 = *(u64 *)(r1 +64) ; R1=ctx(off=0,imm=0) R2_w=sock(off=0,imm=0)
|
|
// ; user_family: sock_addr.user_family,
|
|
// 1: (61) r3 = *(u32 *)(r1 +0) ; R1=ctx(off=0,imm=0) R3_w=scalar(umax=4294967295,var_off=(0x0; 0xffffffff))
|
|
// ; user_ip: Ip::V6(sock_addr.user_ip6),
|
|
// 2: (bf) r4 = r1 ; R1=ctx(off=0,imm=0) R4_w=ctx(off=0,imm=0)
|
|
// 3: (07) r4 += 8 ; R4_w=ctx(off=8,imm=0)
|
|
// ; let mut value = Value {
|
|
// 4: (bf) r5 = r10 ; R5_w=fp0 R10=fp0
|
|
// 5: (07) r5 += -32 ; R5_w=fp-32
|
|
// ; user_ip: Ip::V6(sock_addr.user_ip6),
|
|
// 6: (61) r0 = *(u32 *)(r4 +0)
|
|
// dereference of modified ctx ptr R4 off=8 disallowed
|
|
user_ip6[0] = sock_addr.user_ip6[0];
|
|
user_ip6[1] = sock_addr.user_ip6[1];
|
|
user_ip6[2] = sock_addr.user_ip6[2];
|
|
user_ip6[3] = sock_addr.user_ip6[3];
|
|
*storage = Value {
|
|
user_family: sock_addr.user_family,
|
|
user_ip: Ip::V6(user_ip6),
|
|
user_port: sock_addr.user_port,
|
|
family: sock_addr.family,
|
|
type_: sock_addr.type_,
|
|
protocol: sock_addr.protocol,
|
|
}
|
|
}
|
|
}
|
|
|
|
sk_action::SK_PASS as _
|
|
}
|