From c797c9f09cacfd4f3c6d72132ca10b847891a0b2 Mon Sep 17 00:00:00 2001 From: Victor Julien Date: Tue, 26 May 2020 12:39:44 +0200 Subject: [PATCH] app-layer: add logger flags to AppLayerTxData --- rust/src/applayer.rs | 7 ++++++- src/output-tx.c | 11 ++++++++--- 2 files changed, 14 insertions(+), 4 deletions(-) diff --git a/rust/src/applayer.rs b/rust/src/applayer.rs index 3514b5ef00..7e4d3732b5 100644 --- a/rust/src/applayer.rs +++ b/rust/src/applayer.rs @@ -54,12 +54,16 @@ impl AppLayerTxConfig { pub struct AppLayerTxData { /// config: log flags pub config: AppLayerTxConfig, + + /// logger flags for tx logging api + logged: LoggerFlags, } impl AppLayerTxData { pub fn new() -> Self { Self { config: AppLayerTxConfig::new(), + logged: LoggerFlags::new(), } } } @@ -339,7 +343,8 @@ impl AppLayerGetTxIterTuple { } /// LoggerFlags tracks which loggers have already been executed. -#[derive(Debug)] +#[repr(C)] +#[derive(Debug,PartialEq)] pub struct LoggerFlags { flags: u32, } diff --git a/src/output-tx.c b/src/output-tx.c index b091b751e8..99ad08b915 100644 --- a/src/output-tx.c +++ b/src/output-tx.c @@ -207,6 +207,7 @@ static TmEcode OutputTxLog(ThreadVars *tv, Packet *p, void *thread_data) break; void * const tx = ires.tx_ptr; tx_id = ires.tx_id; + AppLayerTxData *txd = AppLayerParserGetTxData(ipproto, alproto, tx); if (list[ALPROTO_UNKNOWN] != 0) { OutputTxLogList0(tv, op_thread_data, p, f, tx, tx_id); @@ -214,7 +215,7 @@ static TmEcode OutputTxLog(ThreadVars *tv, Packet *p, void *thread_data) goto next_tx; } - LoggerId tx_logged = AppLayerParserGetTxLogged(f, alstate, tx); + LoggerId tx_logged = txd ? txd->logged.flags : AppLayerParserGetTxLogged(f, alstate, tx); const LoggerId tx_logged_old = tx_logged; SCLogDebug("logger: expect %08x, have %08x", logger_expectation, tx_logged); if (tx_logged == logger_expectation) { @@ -286,8 +287,12 @@ next_logger: if (tx_logged != tx_logged_old) { SCLogDebug("logger: storing %08x (was %08x)", tx_logged, tx_logged_old); - AppLayerParserSetTxLogged(p->proto, alproto, alstate, tx, - tx_logged); + if (txd != NULL) { + txd->logged.flags |= tx_logged; + } else { + AppLayerParserSetTxLogged(p->proto, alproto, alstate, tx, + tx_logged); + } } /* If all loggers logged set a flag and update the last tx_id