From 6feebef9e551256156a8c22cf5de2165846a4793 Mon Sep 17 00:00:00 2001 From: Tamir Duberstein Date: Fri, 26 May 2023 13:10:21 -0400 Subject: [PATCH] aya-log-ebpf: simplify argument validation --- aya-log-common/src/lib.rs | 25 ------------ aya-log-ebpf-macros/src/expand.rs | 68 +++++++++++++------------------ bpf/aya-log-ebpf/src/lib.rs | 6 +-- 3 files changed, 31 insertions(+), 68 deletions(-) diff --git a/aya-log-common/src/lib.rs b/aya-log-common/src/lib.rs index 84208303..ac11efdd 100644 --- a/aya-log-common/src/lib.rs +++ b/aya-log-common/src/lib.rs @@ -85,31 +85,6 @@ impl LowerMacFormatter for [u8; 6] {} pub trait UpperMacFormatter {} impl UpperMacFormatter for [u8; 6] {} -#[inline(always)] -pub fn check_impl_default(t: T) -> T { - t -} -#[inline(always)] -pub fn check_impl_lower_hex(t: T) -> T { - t -} -#[inline(always)] -pub fn check_impl_upper_hex(t: T) -> T { - t -} -#[inline(always)] -pub fn check_impl_ip(t: T) -> T { - t -} -#[inline(always)] -pub fn check_impl_lower_mac(t: T) -> T { - t -} -#[inline(always)] -pub fn check_impl_upper_mac(t: T) -> T { - t -} - #[repr(u8)] #[derive(Copy, Clone, Debug)] pub enum RecordField { diff --git a/aya-log-ebpf-macros/src/expand.rs b/aya-log-ebpf-macros/src/expand.rs index d25cf519..4337894f 100644 --- a/aya-log-ebpf-macros/src/expand.rs +++ b/aya-log-ebpf-macros/src/expand.rs @@ -2,9 +2,8 @@ use proc_macro2::TokenStream; use quote::quote; use syn::{ parse::{Parse, ParseStream}, - parse_str, punctuated::Punctuated, - Error, Expr, ExprCall, LitStr, Result, Token, + Error, Expr, LitStr, Result, Token, }; use aya_log_common::DisplayHint; @@ -70,32 +69,6 @@ impl Parse for LogArgs { } } -fn string_to_expr(s: String) -> Result { - parse_str(&format!("\"{s}\"")) -} - -fn hint_to_expr(hint: DisplayHint) -> Result { - match hint { - DisplayHint::Default => parse_str("::aya_log_ebpf::macro_support::DisplayHint::Default"), - DisplayHint::LowerHex => parse_str("::aya_log_ebpf::macro_support::DisplayHint::LowerHex"), - DisplayHint::UpperHex => parse_str("::aya_log_ebpf::macro_support::DisplayHint::UpperHex"), - DisplayHint::Ip => parse_str("::aya_log_ebpf::macro_support::DisplayHint::Ip"), - DisplayHint::LowerMac => parse_str("::aya_log_ebpf::macro_support::DisplayHint::LowerMac"), - DisplayHint::UpperMac => parse_str("::aya_log_ebpf::macro_support::DisplayHint::UpperMac"), - } -} - -fn hint_to_format_check(hint: DisplayHint) -> Result { - match hint { - DisplayHint::Default => parse_str("::aya_log_ebpf::macro_support::check_impl_default"), - DisplayHint::LowerHex => parse_str("::aya_log_ebpf::macro_support::check_impl_lower_hex"), - DisplayHint::UpperHex => parse_str("::aya_log_ebpf::macro_support::check_impl_upper_hex"), - DisplayHint::Ip => parse_str("::aya_log_ebpf::macro_support::check_impl_ip"), - DisplayHint::LowerMac => parse_str("::aya_log_ebpf::macro_support::check_impl_lower_mac"), - DisplayHint::UpperMac => parse_str("::aya_log_ebpf::macro_support::check_impl_upper_mac"), - } -} - pub(crate) fn log(args: LogArgs, level: Option) -> Result { let ctx = args.ctx; let target = match args.target { @@ -127,23 +100,40 @@ pub(crate) fn log(args: LogArgs, level: Option) -> Result { - values.push(string_to_expr(s)?); - } + Fragment::Literal(s) => values.push(quote!(#s)), Fragment::Parameter(p) => { let arg = match args.formatting_args { Some(ref args) => args[arg_i].clone(), None => return Err(Error::new(format_string.span(), "no arguments provided")), }; - let hint = hint_to_expr(p.hint)?; - let format_check = hint_to_format_check(p.hint)?; + let (hint, formatter) = match p.hint { + DisplayHint::Default => { + (quote!(DisplayHint::Default), quote!(DefaultFormatter)) + } + DisplayHint::LowerHex => { + (quote!(DisplayHint::LowerHex), quote!(LowerHexFormatter)) + } + DisplayHint::UpperHex => { + (quote!(DisplayHint::UpperHex), quote!(UpperHexFormatter)) + } + DisplayHint::Ip => (quote!(DisplayHint::Ip), quote!(IpFormatter)), + DisplayHint::LowerMac => { + (quote!(DisplayHint::LowerMac), quote!(LowerMacFormatter)) + } + DisplayHint::UpperMac => { + (quote!(DisplayHint::UpperMac), quote!(UpperMacFormatter)) + } + }; + let hint = quote!(::aya_log_ebpf::macro_support::#hint); + let arg = quote!( + { + let tmp = #arg; + let _: &dyn ::aya_log_ebpf::macro_support::#formatter = &tmp; + tmp + } + ); values.push(hint); - values.push(Expr::Call(ExprCall { - attrs: Vec::new(), - func: Box::new(format_check), - paren_token: Default::default(), - args: Punctuated::from_iter(std::iter::once(arg)), - })); + values.push(arg); arg_i += 1; } diff --git a/bpf/aya-log-ebpf/src/lib.rs b/bpf/aya-log-ebpf/src/lib.rs index 42f352b6..d378bb47 100644 --- a/bpf/aya-log-ebpf/src/lib.rs +++ b/bpf/aya-log-ebpf/src/lib.rs @@ -23,10 +23,8 @@ pub static mut AYA_LOGS: PerfEventByteArray = PerfEventByteArray::new(0); #[doc(hidden)] pub mod macro_support { pub use aya_log_common::{ - check_impl_default, check_impl_ip, check_impl_lower_hex, check_impl_lower_mac, - check_impl_upper_hex, check_impl_upper_mac, DefaultFormatter, DisplayHint, IpFormatter, - Level, LowerHexFormatter, LowerMacFormatter, UpperHexFormatter, UpperMacFormatter, - LOG_BUF_CAPACITY, + DefaultFormatter, DisplayHint, IpFormatter, Level, LowerHexFormatter, LowerMacFormatter, + UpperHexFormatter, UpperMacFormatter, LOG_BUF_CAPACITY, }; pub use aya_log_ebpf_macros::log; }