pub get_frame_id_by_name: Option<GetFrameIdByName>,
pub get_frame_name_by_id: Option<GetFrameNameById>,
+
+ pub get_state_id_by_name: Option<GetStateIdByName>,
+ pub get_state_name_by_id: Option<GetStateNameById>,
}
/// Create a slice, given a buffer and a length
pub type ApplyTxConfigFn = unsafe extern "C" fn (*mut c_void, *mut c_void, c_int, AppLayerTxConfig);
pub type GetFrameIdByName = unsafe extern "C" fn(*const c_char) -> c_int;
pub type GetFrameNameById = unsafe extern "C" fn(u8) -> *const c_char;
+pub type GetStateIdByName = unsafe extern "C" fn(*const c_char, u8) -> c_int;
+pub type GetStateNameById = unsafe extern "C" fn(c_int, u8) -> *const c_char;
// Defined in app-layer-register.h
/// cbindgen:ignore
flags: APP_LAYER_PARSER_OPT_ACCEPT_GAPS,
get_frame_id_by_name: None,
get_frame_name_by_id: None,
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("tcp").unwrap();
flags: 0,
get_frame_id_by_name: None,
get_frame_name_by_id: None,
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("udp").unwrap();
flags: APP_LAYER_PARSER_OPT_ACCEPT_GAPS,
get_frame_id_by_name: Some(DCERPCFrameType::ffi_id_from_name),
get_frame_name_by_id: Some(DCERPCFrameType::ffi_name_from_id),
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("tcp").unwrap();
flags: 0,
get_frame_id_by_name: None,
get_frame_name_by_id: None,
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("udp").unwrap();
flags: 0,
get_frame_id_by_name: None,
get_frame_name_by_id: None,
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("udp").unwrap();
flags: 0,
get_frame_id_by_name: Some(DnsFrameType::ffi_id_from_name),
get_frame_name_by_id: Some(DnsFrameType::ffi_name_from_id),
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("udp").unwrap();
flags: APP_LAYER_PARSER_OPT_ACCEPT_GAPS,
get_frame_id_by_name: Some(DnsFrameType::ffi_id_from_name),
get_frame_name_by_id: Some(DnsFrameType::ffi_name_from_id),
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("tcp").unwrap();
flags: 0,
get_frame_id_by_name: Some(EnipFrameType::ffi_id_from_name),
get_frame_name_by_id: Some(EnipFrameType::ffi_name_from_id),
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("udp").unwrap();
flags: 0,
get_frame_id_by_name: Some(Http2FrameType::ffi_id_from_name),
get_frame_name_by_id: Some(Http2FrameType::ffi_name_from_id),
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("tcp").unwrap();
flags: 0,
get_frame_id_by_name: None,
get_frame_name_by_id: None,
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("udp").unwrap();
flags : 0,
get_frame_id_by_name: None,
get_frame_name_by_id: None,
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
// register UDP parser
let ip_proto_str = CString::new("udp").unwrap();
flags: APP_LAYER_PARSER_OPT_ACCEPT_GAPS,
get_frame_id_by_name: Some(LdapFrameType::ffi_id_from_name),
get_frame_name_by_id: Some(LdapFrameType::ffi_name_from_id),
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("tcp").unwrap();
flags: 0,
get_frame_id_by_name: Some(LdapFrameType::ffi_id_from_name),
get_frame_name_by_id: Some(LdapFrameType::ffi_name_from_id),
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("udp").unwrap();
flags: 0,
get_frame_id_by_name: None,
get_frame_name_by_id: None,
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("tcp").unwrap();
flags: 0,
get_frame_id_by_name: Some(MQTTFrameType::ffi_id_from_name),
get_frame_name_by_id: Some(MQTTFrameType::ffi_name_from_id),
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("tcp").unwrap();
flags: APP_LAYER_PARSER_OPT_ACCEPT_GAPS,
get_frame_id_by_name: Some(NFSFrameType::ffi_id_from_name),
get_frame_name_by_id: Some(NFSFrameType::ffi_name_from_id),
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("tcp").unwrap();
flags: 0,
get_frame_id_by_name: Some(NFSFrameType::ffi_id_from_name),
get_frame_name_by_id: Some(NFSFrameType::ffi_name_from_id),
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("udp").unwrap();
flags: 0,
get_frame_id_by_name: None,
get_frame_name_by_id: None,
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("udp").unwrap();
flags: APP_LAYER_PARSER_OPT_ACCEPT_GAPS,
get_frame_id_by_name: None,
get_frame_name_by_id: None,
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("tcp").unwrap();
flags: 0,
get_frame_id_by_name: None,
get_frame_name_by_id: None,
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("udp").unwrap();
flags: 0,
get_frame_id_by_name: None,
get_frame_name_by_id: None,
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = std::ffi::CString::new("tcp").unwrap();
flags: 0,
get_frame_id_by_name: Some(RFBFrameType::ffi_id_from_name),
get_frame_name_by_id: Some(RFBFrameType::ffi_name_from_id),
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("tcp").unwrap();
flags: 0,
get_frame_id_by_name: Some(SIPFrameType::ffi_id_from_name),
get_frame_name_by_id: Some(SIPFrameType::ffi_name_from_id),
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("udp").unwrap();
flags: APP_LAYER_PARSER_OPT_ACCEPT_GAPS,
get_frame_id_by_name: Some(SMBFrameType::ffi_id_from_name),
get_frame_name_by_id: Some(SMBFrameType::ffi_name_from_id),
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("tcp").unwrap();
flags : 0,
get_frame_id_by_name: None,
get_frame_name_by_id: None,
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("udp").unwrap();
ALPROTO_SNMP = AppProtoNewProtoFromString(PARSER_NAME.as_ptr() as *const std::os::raw::c_char);
flags: 0,
get_frame_id_by_name: Some(SshFrameType::ffi_id_from_name),
get_frame_name_by_id: Some(SshFrameType::ffi_name_from_id),
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("tcp").unwrap();
flags: APP_LAYER_PARSER_OPT_ACCEPT_GAPS,
get_frame_id_by_name: Some(TelnetFrameType::ffi_id_from_name),
get_frame_name_by_id: Some(TelnetFrameType::ffi_name_from_id),
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
flags: 0, // do not accept gaps as there is no good way to resync
get_frame_id_by_name: Some(WebSocketFrameType::ffi_id_from_name),
get_frame_name_by_id: Some(WebSocketFrameType::ffi_name_from_id),
+ get_state_id_by_name: None,
+ get_state_name_by_id: None,
};
let ip_proto_str = CString::new("tcp").unwrap();
AppLayerParserGetFrameIdByNameFn GetFrameIdByName;
AppLayerParserGetFrameNameByIdFn GetFrameNameById;
+ AppLayerParserGetStateIdByNameFn GetStateIdByName;
+ AppLayerParserGetStateNameByIdFn GetStateNameById;
+
/* each app-layer has its own value */
uint32_t stream_depth;
SCReturn;
}
+void AppLayerParserRegisterGetStateFuncs(uint8_t ipproto, AppProto alproto,
+ AppLayerParserGetStateIdByNameFn GetIdByNameFunc,
+ AppLayerParserGetStateNameByIdFn GetNameByIdFunc)
+{
+ SCEnter();
+ alp_ctx.ctxs[alproto][FlowGetProtoMapping(ipproto)].GetStateIdByName = GetIdByNameFunc;
+ alp_ctx.ctxs[alproto][FlowGetProtoMapping(ipproto)].GetStateNameById = GetNameByIdFunc;
+ SCReturn;
+}
+
void AppLayerParserRegisterGetFrameFuncs(uint8_t ipproto, AppProto alproto,
AppLayerParserGetFrameIdByNameFn GetIdByNameFunc,
AppLayerParserGetFrameNameByIdFn GetNameByIdFunc)
SCReturn;
}
+/**
+ * \param id progress value id to get the name for
+ * \param direction STREAM_TOSERVER/STREAM_TOCLIENT
+ */
+int AppLayerParserGetStateIdByName(
+ uint8_t ipproto, AppProto alproto, const char *name, const uint8_t direction)
+{
+ if (alp_ctx.ctxs[alproto][FlowGetProtoMapping(ipproto)].GetStateIdByName != NULL) {
+ return alp_ctx.ctxs[alproto][FlowGetProtoMapping(ipproto)].GetStateIdByName(
+ name, direction);
+ } else {
+ return -1;
+ }
+}
+
+/**
+ * \param id progress value id to get the name for
+ * \param direction STREAM_TOSERVER/STREAM_TOCLIENT
+ */
+const char *AppLayerParserGetStateNameById(
+ uint8_t ipproto, AppProto alproto, const int id, const uint8_t direction)
+{
+ if (alp_ctx.ctxs[alproto][FlowGetProtoMapping(ipproto)].GetStateNameById != NULL) {
+ return alp_ctx.ctxs[alproto][FlowGetProtoMapping(ipproto)].GetStateNameById(id, direction);
+ } else {
+ return NULL;
+ }
+}
+
int AppLayerParserGetFrameIdByName(uint8_t ipproto, AppProto alproto, const char *name)
{
if (alp_ctx.ctxs[alproto][FlowGetProtoMapping(ipproto)].GetFrameIdByName != NULL) {
/***** Parser related registration *****/
+/**
+ * \param name progress name to get the id for
+ * \param direction STREAM_TOSERVER/STREAM_TOCLIENT
+ */
+typedef int (*AppLayerParserGetStateIdByNameFn)(const char *name, const uint8_t direction);
+/**
+ * \param id progress value id to get the name for
+ * \param direction STREAM_TOSERVER/STREAM_TOCLIENT
+ */
+typedef const char *(*AppLayerParserGetStateNameByIdFn)(const int id, const uint8_t direction);
+
typedef int (*AppLayerParserGetFrameIdByNameFn)(const char *frame_name);
typedef const char *(*AppLayerParserGetFrameNameByIdFn)(const uint8_t id);
AppLayerParserGetFrameNameByIdFn GetFrameNameById);
void AppLayerParserRegisterSetStreamDepthFlag(uint8_t ipproto, AppProto alproto,
void (*SetStreamDepthFlag)(void *tx, uint8_t flags));
+void AppLayerParserRegisterGetStateFuncs(uint8_t ipproto, AppProto alproto,
+ AppLayerParserGetStateIdByNameFn GetStateIdByName,
+ AppLayerParserGetStateNameByIdFn GetStateNameById);
void AppLayerParserRegisterTxDataFunc(uint8_t ipproto, AppProto alproto,
AppLayerTxData *(*GetTxData)(void *tx));
int AppLayerParserIsEnabled(AppProto alproto);
int AppLayerParserGetFrameIdByName(uint8_t ipproto, AppProto alproto, const char *name);
const char *AppLayerParserGetFrameNameById(uint8_t ipproto, AppProto alproto, const uint8_t id);
+/**
+ * \param name progress name to get the id for
+ * \param direction STREAM_TOSERVER/STREAM_TOCLIENT
+ */
+int AppLayerParserGetStateIdByName(
+ uint8_t ipproto, AppProto alproto, const char *name, uint8_t direction);
+/**
+ * \param id progress value id to get the name for
+ * \param direction STREAM_TOSERVER/STREAM_TOCLIENT
+ */
+const char *AppLayerParserGetStateNameById(
+ uint8_t ipproto, AppProto alproto, const int id, uint8_t direction);
/***** Cleanup *****/
p->ip_proto, alproto, p->GetFrameIdByName, p->GetFrameNameById);
}
+ if (p->GetStateIdByName && p->GetStateNameById) {
+ AppLayerParserRegisterGetStateFuncs(
+ p->ip_proto, alproto, p->GetStateIdByName, p->GetStateNameById);
+ }
+
return 0;
}
AppLayerParserGetFrameIdByNameFn GetFrameIdByName;
AppLayerParserGetFrameNameByIdFn GetFrameNameById;
+ AppLayerParserGetStateIdByNameFn GetStateIdByName;
+ AppLayerParserGetStateNameByIdFn GetStateNameById;
} AppLayerParser;
/**