smb: use derive AppLayerFrameType

pull/6809/head
Jason Ish 3 years ago committed by Victor Julien
parent 0c9fdf8f4f
commit 3cdefd5f8b

@ -54,80 +54,20 @@ use crate::smb::events::*;
use crate::smb::files::*; use crate::smb::files::*;
use crate::smb::smb2_ioctl::*; use crate::smb::smb2_ioctl::*;
#[repr(C)] #[derive(AppLayerFrameType)]
pub enum SMBFrameType { pub enum SMBFrameType {
NBSSPdu = 0, NBSSPdu,
NBSSHdr = 1, NBSSHdr,
NBSSData = 2, NBSSData,
SMB1Pdu = 3, SMB1Pdu,
SMB1Hdr = 4, SMB1Hdr,
SMB1Data = 5, SMB1Data,
SMB2Pdu = 6, SMB2Pdu,
SMB2Hdr = 7, SMB2Hdr,
SMB2Data = 8, SMB2Data,
SMB3Pdu = 9, SMB3Pdu,
SMB3Hdr = 10, SMB3Hdr,
SMB3Data = 11, SMB3Data,
}
impl SMBFrameType {
fn from_u8(value: u8) -> Option<SMBFrameType> {
match value {
0 => Some(SMBFrameType::NBSSPdu),
1 => Some(SMBFrameType::NBSSHdr),
2 => Some(SMBFrameType::NBSSData),
3 => Some(SMBFrameType::SMB1Pdu),
4 => Some(SMBFrameType::SMB1Hdr),
5 => Some(SMBFrameType::SMB1Data),
6 => Some(SMBFrameType::SMB2Pdu),
7 => Some(SMBFrameType::SMB2Hdr),
8 => Some(SMBFrameType::SMB2Data),
9 => Some(SMBFrameType::SMB3Pdu),
10 => Some(SMBFrameType::SMB3Hdr),
11 => Some(SMBFrameType::SMB3Data),
_ => None,
}
}
}
fn smb_frame_type_string(s: &str) -> i32 {
match s {
"nbss.pdu" => SMBFrameType::NBSSPdu as i32,
"nbss.hdr" => SMBFrameType::NBSSHdr as i32,
"nbss.data" => SMBFrameType::NBSSData as i32,
"smb1.pdu" => SMBFrameType::SMB1Pdu as i32,
"smb1.hdr" => SMBFrameType::SMB1Hdr as i32,
"smb1.data" => SMBFrameType::SMB1Data as i32,
"smb2.pdu" => SMBFrameType::SMB2Pdu as i32,
"smb2.hdr" => SMBFrameType::SMB2Hdr as i32,
"smb2.data" => SMBFrameType::SMB2Data as i32,
"smb3.pdu" => SMBFrameType::SMB3Pdu as i32,
"smb3.hdr" => SMBFrameType::SMB3Hdr as i32,
"smb3.data" => SMBFrameType::SMB3Data as i32,
_ => -1,
}
}
fn smb_frame_string_type(id: u8) -> *const std::os::raw::c_char {
if let Some(s) = SMBFrameType::from_u8(id) {
let estr = match s {
SMBFrameType::NBSSPdu => "nbss.pdu\0",
SMBFrameType::NBSSHdr => "nbss.hdr\0",
SMBFrameType::NBSSData => "nbss.data\0",
SMBFrameType::SMB1Pdu => "smb1.pdu\0",
SMBFrameType::SMB1Hdr => "smb1.hdr\0",
SMBFrameType::SMB1Data => "smb1.data\0",
SMBFrameType::SMB2Pdu => "smb2.pdu\0",
SMBFrameType::SMB2Hdr => "smb2.hdr\0",
SMBFrameType::SMB2Data => "smb2.data\0",
SMBFrameType::SMB3Pdu => "smb3.pdu\0",
SMBFrameType::SMB3Hdr => "smb3.hdr\0",
SMBFrameType::SMB3Data => "smb3.data\0",
};
return estr.as_ptr() as *const std::os::raw::c_char;
}
return std::ptr::null();
} }
pub const MIN_REC_SIZE: u16 = 32 + 4; // SMB hdr + nbss hdr pub const MIN_REC_SIZE: u16 = 32 + 4; // SMB hdr + nbss hdr
@ -2321,18 +2261,6 @@ pub unsafe extern "C" fn smb3_probe_tcp(f: *const Flow, dir: u8, input: *const u
return ALPROTO_SMB; return ALPROTO_SMB;
} }
pub unsafe extern "C" fn smb_frames_get_frame_id_by_name(name: *const std::os::raw::c_char) -> std::os::raw::c_int {
if let Ok(s) = std::ffi::CStr::from_ptr(name).to_str() {
smb_frame_type_string(s) as std::os::raw::c_int
} else {
-1
}
}
pub unsafe extern "C" fn smb_frames_get_frame_by_id(id: u8) -> *const std::os::raw::c_char {
smb_frame_string_type(id)
}
fn register_pattern_probe() -> i8 { fn register_pattern_probe() -> i8 {
let mut r = 0; let mut r = 0;
unsafe { unsafe {
@ -2401,8 +2329,8 @@ pub unsafe extern "C" fn rs_smb_register_parser() {
apply_tx_config: None, apply_tx_config: None,
flags: APP_LAYER_PARSER_OPT_ACCEPT_GAPS, flags: APP_LAYER_PARSER_OPT_ACCEPT_GAPS,
truncate: Some(rs_smb_state_truncate), truncate: Some(rs_smb_state_truncate),
get_frame_id_by_name: Some(smb_frames_get_frame_id_by_name), get_frame_id_by_name: Some(SMBFrameType::ffi_id_from_name),
get_frame_name_by_id: Some(smb_frames_get_frame_by_id), get_frame_name_by_id: Some(SMBFrameType::ffi_name_from_id),
}; };
let ip_proto_str = CString::new("tcp").unwrap(); let ip_proto_str = CString::new("tcp").unwrap();

Loading…
Cancel
Save