pub const APP_LAYER_PARSER_BYPASS_READY : u8 = 0b1000;
pub const APP_LAYER_PARSER_OPT_ACCEPT_GAPS: u32 = BIT_U32!(0);
+pub const APP_LAYER_PARSER_OPT_UNIDIR_TXS: u32 = BIT_U32!(1);
pub type AppLayerGetTxIteratorFn = extern "C" fn (ipproto: u8,
alproto: AppProto,
if AppLayerParserConfParserEnabled(ip_proto_str.as_ptr(), parser.name) != 0 {
let _ = AppLayerRegisterParser(&parser, alproto);
}
+ AppLayerParserRegisterOptionFlags(IPPROTO_UDP as u8, ALPROTO_DNS,
+ crate::applayer::APP_LAYER_PARSER_OPT_UNIDIR_TXS);
}
}
}
AppLayerParserRegisterOptionFlags(IPPROTO_TCP as u8, ALPROTO_DNS,
crate::applayer::APP_LAYER_PARSER_OPT_ACCEPT_GAPS);
+ AppLayerParserRegisterOptionFlags(IPPROTO_TCP as u8, ALPROTO_DNS,
+ crate::applayer::APP_LAYER_PARSER_OPT_UNIDIR_TXS);
}
}
SCReturn;
}
+uint32_t AppLayerParserGetOptionFlags(uint8_t protomap, AppProto alproto)
+{
+ SCEnter();
+ SCReturnUInt(alp_ctx.ctxs[protomap][alproto].option_flags);
+}
+
void AppLayerParserRegisterStateFuncs(uint8_t ipproto, AppProto alproto,
void *(*StateAlloc)(void),
void (*StateFree)(void *))
/* Flags for AppLayerParserProtoCtx. */
#define APP_LAYER_PARSER_OPT_ACCEPT_GAPS BIT_U32(0)
+#define APP_LAYER_PARSER_OPT_UNIDIR_TXS BIT_U32(1)
#define APP_LAYER_PARSER_INT_STREAM_DEPTH_SET BIT_U32(0)
/***** Get and transaction functions *****/
+uint32_t AppLayerParserGetOptionFlags(uint8_t protomap, AppProto alproto);
AppLayerGetTxIteratorFunc AppLayerGetTxIterator(const uint8_t ipproto,
const AppProto alproto);
} else {
SCLogDebug("no tx data");
}
+
+ if (AppLayerParserGetOptionFlags(f->protomap, f->alproto) &
+ APP_LAYER_PARSER_OPT_UNIDIR_TXS) {
+ SCLogDebug("handle unidir tx");
+ AppLayerTxConfig req;
+ memset(&req, 0, sizeof(req));
+ req.log_flags = BIT_U8(config->type);
+ AppLayerParserApplyTxConfig(f->proto, f->alproto, f->alstate, tx,
+ CONFIG_ACTION_SET, req);
+ }
} else {
SCLogDebug("no tx");
}