/// Intermediary function between the C code and the parsing functions.
#[no_mangle]
-pub unsafe extern "C" fn rs_modbus_parse(c_arg: *const c_char) -> *mut c_void {
+pub unsafe extern "C" fn SCModbusParse(c_arg: *const c_char) -> *mut c_void {
if c_arg.is_null() {
return std::ptr::null_mut();
}
}
#[no_mangle]
-pub unsafe extern "C" fn rs_modbus_free(ptr: *mut c_void) {
+pub unsafe extern "C" fn SCModbusFree(ptr: *mut c_void) {
if !ptr.is_null() {
let _ = Box::from_raw(ptr as *mut DetectModbusRust);
}
/// Compares a transaction to a signature to determine whether the transaction
/// matches the signature. If it does, 1 is returned; otherwise 0 is returned.
#[no_mangle]
-pub extern "C" fn rs_modbus_inspect(tx: &ModbusTransaction, modbus: &DetectModbusRust) -> u8 {
+pub extern "C" fn SCModbusInspect(tx: &ModbusTransaction, modbus: &DetectModbusRust) -> u8 {
// All necessary information can be found in the request (value inspection currently
// only supports write functions, which hold the value in the request).
// Only inspect the response in the case where there is no request.
assert_eq!(modbus.transactions.len(), 1);
// function 23
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
function: Some(FunctionCode::RdWrMultRegs),
);
// access write holding, address 15, value <4660
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
access_type: Some(AccessType::WRITE | AccessType::HOLDING),
);
// access write holding, address 15, value 4661
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
access_type: Some(AccessType::WRITE | AccessType::HOLDING),
);
// access write holding, address 16, value 20000<>22136
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
access_type: Some(AccessType::WRITE | AccessType::HOLDING),
);
// access write holding, address 16, value 22136<>30000
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
access_type: Some(AccessType::WRITE | AccessType::HOLDING),
);
// access write holding, address 15, value >4660
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
access_type: Some(AccessType::WRITE | AccessType::HOLDING),
);
// access write holding, address 16, value <22137
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
access_type: Some(AccessType::WRITE | AccessType::HOLDING),
);
// access write holding, address 16, value <22137
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
access_type: Some(AccessType::WRITE | AccessType::HOLDING),
);
// access write holding, address 17, value 39612
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
access_type: Some(AccessType::WRITE | AccessType::HOLDING),
);
// access write holding, address 17, value 30000<>39613
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
access_type: Some(AccessType::WRITE | AccessType::HOLDING),
);
// access write holding, address 15, value 4659<>5000
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
access_type: Some(AccessType::WRITE | AccessType::HOLDING),
);
// access write holding, address 17, value >39611
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
access_type: Some(AccessType::WRITE | AccessType::HOLDING),
);
// unit 12
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
unit_id: Some(12..12),
);
// unit 5<>9
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
unit_id: Some(5..9),
);
// unit 11<>15
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
unit_id: Some(11..15),
);
// unit >11
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
unit_id: Some(11..u16::MAX),
);
// unit <9
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
unit_id: Some(u16::MIN..9),
);
// unit 10
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
unit_id: Some(10..10),
);
// unit 5<>15
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
unit_id: Some(5..15),
);
// unit >9
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
unit_id: Some(9..u16::MAX),
);
// unit <11
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
unit_id: Some(u16::MIN..11),
);
// unit 10, function 20
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
function: Some(FunctionCode::RdFileRec),
);
// unit 11, function 20
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
function: Some(FunctionCode::RdFileRec),
);
// unit 11, function 23
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
function: Some(FunctionCode::RdWrMultRegs),
);
// unit 11, function public
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
category: Some(CodeCategory::PUBLIC_ASSIGNED | CodeCategory::PUBLIC_UNASSIGNED),
);
// unit 10, function user
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
category: Some(Flags::from(CodeCategory::USER_DEFINED)),
);
// unit 10, function 23
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
function: Some(FunctionCode::RdWrMultRegs),
);
// unit 10, function public
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
category: Some(CodeCategory::PUBLIC_ASSIGNED | CodeCategory::PUBLIC_UNASSIGNED),
);
// unit 10, function !user
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[0],
&DetectModbusRust {
category: Some(!CodeCategory::USER_DEFINED),
assert_eq!(modbus.transactions.len(), 2);
// function 8, subfunction 4
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[1],
&DetectModbusRust {
function: Some(FunctionCode::Diagnostic),
assert_eq!(modbus.transactions.len(), 3);
// function reserved
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[2],
&DetectModbusRust {
category: Some(Flags::from(CodeCategory::RESERVED)),
assert_eq!(modbus.transactions.len(), 4);
// function !assigned
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[3],
&DetectModbusRust {
category: Some(!CodeCategory::PUBLIC_ASSIGNED),
assert_eq!(modbus.transactions.len(), 5);
// access read
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[4],
&DetectModbusRust {
access_type: Some(Flags::from(AccessType::READ)),
);
// access read, address 30870
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[4],
&DetectModbusRust {
access_type: Some(Flags::from(AccessType::READ)),
);
// unit 10, access read, address 30863
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[4],
&DetectModbusRust {
access_type: Some(Flags::from(AccessType::READ)),
);
// unit 11, access read, address 30870
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[4],
&DetectModbusRust {
access_type: Some(Flags::from(AccessType::READ)),
);
// unit 11, access read, address 30863
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[4],
&DetectModbusRust {
access_type: Some(Flags::from(AccessType::READ)),
);
// unit 10, access write
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[4],
&DetectModbusRust {
access_type: Some(Flags::from(AccessType::WRITE)),
);
// unit 10, access read, address 30870
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[4],
&DetectModbusRust {
access_type: Some(Flags::from(AccessType::READ)),
assert_eq!(modbus.transactions.len(), 6);
// access read input
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[5],
&DetectModbusRust {
access_type: Some(AccessType::READ | AccessType::INPUT),
);
// access read input, address <9
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[5],
&DetectModbusRust {
access_type: Some(AccessType::READ | AccessType::INPUT),
);
// access read input, address 5<>9
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[5],
&DetectModbusRust {
access_type: Some(AccessType::READ | AccessType::INPUT),
);
// access read input, address >104
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[5],
&DetectModbusRust {
access_type: Some(AccessType::READ | AccessType::INPUT),
);
// access read input, address 104<>110
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[5],
&DetectModbusRust {
access_type: Some(AccessType::READ | AccessType::INPUT),
);
// access read input, address 9
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[5],
&DetectModbusRust {
access_type: Some(AccessType::READ | AccessType::INPUT),
);
// access read input, address <10
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[5],
&DetectModbusRust {
access_type: Some(AccessType::READ | AccessType::INPUT),
);
// access read input, address 5<>10
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[5],
&DetectModbusRust {
access_type: Some(AccessType::READ | AccessType::INPUT),
);
// access read input, address >103
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[5],
&DetectModbusRust {
access_type: Some(AccessType::READ | AccessType::INPUT),
);
// access read input, address 103<>110
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[5],
&DetectModbusRust {
access_type: Some(AccessType::READ | AccessType::INPUT),
);
// access read input, address 104
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[5],
&DetectModbusRust {
access_type: Some(AccessType::READ | AccessType::INPUT),
assert_eq!(modbus.transactions.len(), 7);
// function 1
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[6],
&DetectModbusRust {
function: Some(FunctionCode::RdCoils),
// Fails because there was no request, and the address is not retrievable
// from the response.
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[6],
&DetectModbusRust {
access_type: Some(Flags::from(AccessType::READ)),
assert_eq!(modbus.transactions.len(), 8);
// function 6
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[7],
&DetectModbusRust {
function: Some(FunctionCode::WrSingleReg),
);
// access write, address 10
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[7],
&DetectModbusRust {
access_type: Some(Flags::from(AccessType::WRITE)),
assert_eq!(modbus.transactions.len(), 9);
// function 8
assert_eq!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[8],
&DetectModbusRust {
function: Some(FunctionCode::Diagnostic),
);
// access read
assert_ne!(
- rs_modbus_inspect(
+ SCModbusInspect(
&modbus.transactions[8],
&DetectModbusRust {
access_type: Some(Flags::from(AccessType::READ)),
}
/// Probe input to see if it looks like Modbus.
-#[no_mangle]
-pub extern "C" fn rs_modbus_probe(
+extern "C" fn modbus_probe(
_flow: *const Flow, _direction: u8, input: *const u8, len: u32, _rdir: *mut u8,
) -> AppProto {
if input.is_null() {
}
}
-#[no_mangle]
-pub extern "C" fn rs_modbus_state_new(
+extern "C" fn modbus_state_new(
_orig_state: *mut std::os::raw::c_void, _orig_proto: AppProto,
) -> *mut std::os::raw::c_void {
Box::into_raw(Box::new(ModbusState::new())) as *mut std::os::raw::c_void
}
-#[no_mangle]
-pub extern "C" fn rs_modbus_state_free(state: *mut std::os::raw::c_void) {
+extern "C" fn modbus_state_free(state: *mut std::os::raw::c_void) {
let _state: Box<ModbusState> = unsafe { Box::from_raw(state as *mut ModbusState) };
}
-#[no_mangle]
-pub unsafe extern "C" fn rs_modbus_state_tx_free(state: *mut std::os::raw::c_void, tx_id: u64) {
+unsafe extern "C" fn modbus_state_tx_free(state: *mut std::os::raw::c_void, tx_id: u64) {
let state = cast_pointer!(state, ModbusState);
state.free_tx(tx_id);
}
-#[no_mangle]
-pub unsafe extern "C" fn rs_modbus_parse_request(
+unsafe extern "C" fn modbus_parse_request(
_flow: *const Flow, state: *mut std::os::raw::c_void, pstate: *mut std::os::raw::c_void,
stream_slice: StreamSlice,
_data: *const std::os::raw::c_void,
state.parse(buf, Direction::ToServer)
}
-#[no_mangle]
-pub unsafe extern "C" fn rs_modbus_parse_response(
+unsafe extern "C" fn modbus_parse_response(
_flow: *const Flow, state: *mut std::os::raw::c_void, pstate: *mut std::os::raw::c_void,
stream_slice: StreamSlice,
_data: *const std::os::raw::c_void,
}
#[no_mangle]
-pub unsafe extern "C" fn rs_modbus_state_get_tx_count(state: *mut std::os::raw::c_void) -> u64 {
+pub unsafe extern "C" fn SCModbusStateGetTxCount(state: *mut std::os::raw::c_void) -> u64 {
let state = cast_pointer!(state, ModbusState);
state.tx_id
}
-#[no_mangle]
-pub unsafe extern "C" fn rs_modbus_state_get_tx(
+unsafe extern "C" fn modbus_state_get_tx(
state: *mut std::os::raw::c_void, tx_id: u64,
) -> *mut std::os::raw::c_void {
let state = cast_pointer!(state, ModbusState);
}
}
-#[no_mangle]
-pub unsafe extern "C" fn rs_modbus_tx_get_alstate_progress(
+unsafe extern "C" fn modbus_tx_get_alstate_progress(
tx: *mut std::os::raw::c_void, _direction: u8,
) -> std::os::raw::c_int {
let tx = cast_pointer!(tx, ModbusTransaction);
tx.response.is_some() as std::os::raw::c_int
}
-#[no_mangle]
-pub unsafe extern "C" fn rs_modbus_state_get_tx_data(
+unsafe extern "C" fn modbus_state_get_tx_data(
tx: *mut std::os::raw::c_void,
) -> *mut AppLayerTxData {
let tx = cast_pointer!(tx, ModbusTransaction);
&mut tx.tx_data
}
-export_state_data_get!(rs_modbus_get_state_data, ModbusState);
+export_state_data_get!(modbus_get_state_data, ModbusState);
#[no_mangle]
-pub unsafe extern "C" fn rs_modbus_register_parser() {
+pub unsafe extern "C" fn SCRegisterModbusParser() {
let default_port = std::ffi::CString::new("[502]").unwrap();
let parser = RustParser {
name: b"modbus\0".as_ptr() as *const std::os::raw::c_char,
default_port: default_port.as_ptr(),
ipproto: IPPROTO_TCP,
- probe_ts: Some(rs_modbus_probe),
- probe_tc: Some(rs_modbus_probe),
+ probe_ts: Some(modbus_probe),
+ probe_tc: Some(modbus_probe),
min_depth: 0,
max_depth: 16,
- state_new: rs_modbus_state_new,
- state_free: rs_modbus_state_free,
- tx_free: rs_modbus_state_tx_free,
- parse_ts: rs_modbus_parse_request,
- parse_tc: rs_modbus_parse_response,
- get_tx_count: rs_modbus_state_get_tx_count,
- get_tx: rs_modbus_state_get_tx,
+ state_new: modbus_state_new,
+ state_free: modbus_state_free,
+ tx_free: modbus_state_tx_free,
+ parse_ts: modbus_parse_request,
+ parse_tc: modbus_parse_response,
+ get_tx_count: SCModbusStateGetTxCount,
+ get_tx: modbus_state_get_tx,
tx_comp_st_ts: 1,
tx_comp_st_tc: 1,
- tx_get_progress: rs_modbus_tx_get_alstate_progress,
+ tx_get_progress: modbus_tx_get_alstate_progress,
get_eventinfo: Some(ModbusEvent::get_event_info),
get_eventinfo_byid: Some(ModbusEvent::get_event_info_by_id),
localstorage_new: None,
localstorage_free: None,
get_tx_files: None,
get_tx_iterator: Some(applayer::state_get_tx_iterator::<ModbusState, ModbusTransaction>),
- get_tx_data: rs_modbus_state_get_tx_data,
- get_state_data: rs_modbus_get_state_data,
+ get_tx_data: modbus_state_get_tx_data,
+ get_state_data: modbus_get_state_data,
apply_tx_config: None,
flags: 0,
get_frame_id_by_name: None,
pub struct ModbusMessage(*const c_void);
#[no_mangle]
- pub unsafe extern "C" fn rs_modbus_message_get_function(msg: *const ModbusMessage) -> u8 {
+ pub unsafe extern "C" fn SCModbusMessageGetFunction(msg: *const ModbusMessage) -> u8 {
let msg = msg.as_ref().unwrap().0 as *const Message;
let msg = msg.as_ref().unwrap();
msg.function.raw
}
#[no_mangle]
- pub unsafe extern "C" fn rs_modbus_message_get_subfunction(msg: *const ModbusMessage) -> u16 {
+ pub unsafe extern "C" fn SCModbusMessageGetSubfunction(msg: *const ModbusMessage) -> u16 {
let msg = msg.as_ref().unwrap().0 as *const Message;
let msg = msg.as_ref().unwrap();
if let Data::Diagnostic { func, data: _ } = &msg.data {
}
#[no_mangle]
- pub unsafe extern "C" fn rs_modbus_message_get_read_request_address(
+ pub unsafe extern "C" fn SCModbusMessageGetReadRequestAddress(
msg: *const ModbusMessage,
) -> u16 {
let msg = msg.as_ref().unwrap().0 as *const Message;
}
#[no_mangle]
- pub unsafe extern "C" fn rs_modbus_message_get_read_request_quantity(
+ pub unsafe extern "C" fn SCModbusMessageGetReadRequestQuantity(
msg: *const ModbusMessage,
) -> u16 {
let msg = msg.as_ref().unwrap().0 as *const Message;
}
#[no_mangle]
- pub unsafe extern "C" fn rs_modbus_message_get_rw_multreq_read_address(
+ pub unsafe extern "C" fn SCModbusMessageGetRwMultreqReadAddress(
msg: *const ModbusMessage,
) -> u16 {
let msg = msg.as_ref().unwrap().0 as *const Message;
}
#[no_mangle]
- pub unsafe extern "C" fn rs_modbus_message_get_rw_multreq_read_quantity(
+ pub unsafe extern "C" fn SCModbusMessageGetRwMultreqReadQuantity(
msg: *const ModbusMessage,
) -> u16 {
let msg = msg.as_ref().unwrap().0 as *const Message;
}
#[no_mangle]
- pub unsafe extern "C" fn rs_modbus_message_get_rw_multreq_write_address(
+ pub unsafe extern "C" fn SCModbusMessageGetRwMultreqWriteAddress(
msg: *const ModbusMessage,
) -> u16 {
let msg = msg.as_ref().unwrap().0 as *const Message;
}
#[no_mangle]
- pub unsafe extern "C" fn rs_modbus_message_get_rw_multreq_write_quantity(
+ pub unsafe extern "C" fn SCModbusMessageGetRwMultreqWriteQuantity(
msg: *const ModbusMessage,
) -> u16 {
let msg = msg.as_ref().unwrap().0 as *const Message;
}
#[no_mangle]
- pub unsafe extern "C" fn rs_modbus_message_get_rw_multreq_write_data(
+ pub unsafe extern "C" fn SCModbusMessageGetRwMultreqWriteData(
msg: *const ModbusMessage, data_len: *mut usize,
) -> *const u8 {
let msg = msg.as_ref().unwrap().0 as *const Message;
}
#[no_mangle]
- pub unsafe extern "C" fn rs_modbus_message_get_write_multreq_address(
+ pub unsafe extern "C" fn SCModbusMessageGetWriteMultreqAddress(
msg: *const ModbusMessage,
) -> u16 {
let msg = msg.as_ref().unwrap().0 as *const Message;
}
#[no_mangle]
- pub unsafe extern "C" fn rs_modbus_message_get_write_multreq_quantity(
+ pub unsafe extern "C" fn SCModbusMessageGetWriteMultreqQuantity(
msg: *const ModbusMessage,
) -> u16 {
let msg = msg.as_ref().unwrap().0 as *const Message;
}
#[no_mangle]
- pub unsafe extern "C" fn rs_modbus_message_get_write_multreq_data(
+ pub unsafe extern "C" fn SCModbusMessageGetWriteMultreqData(
msg: *const ModbusMessage, data_len: *mut usize,
) -> *const u8 {
let msg = msg.as_ref().unwrap().0 as *const Message;
}
#[no_mangle]
- pub unsafe extern "C" fn rs_modbus_message_get_and_mask(msg: *const ModbusMessage) -> u16 {
+ pub unsafe extern "C" fn SCModbusMessageGetAndMask(msg: *const ModbusMessage) -> u16 {
let msg = msg.as_ref().unwrap().0 as *const Message;
let msg = msg.as_ref().unwrap();
if let Data::Write(Write::Mask {
}
#[no_mangle]
- pub unsafe extern "C" fn rs_modbus_message_get_or_mask(msg: *const ModbusMessage) -> u16 {
+ pub unsafe extern "C" fn SCModbusMessageGetOrMask(msg: *const ModbusMessage) -> u16 {
let msg = msg.as_ref().unwrap().0 as *const Message;
let msg = msg.as_ref().unwrap();
if let Data::Write(Write::Mask {
}
#[no_mangle]
- pub unsafe extern "C" fn rs_modbus_message_get_write_address(msg: *const ModbusMessage) -> u16 {
+ pub unsafe extern "C" fn SCModbusMessageGetWriteAddress(msg: *const ModbusMessage) -> u16 {
let msg = msg.as_ref().unwrap().0 as *const Message;
let msg = msg.as_ref().unwrap();
if let Data::Write(Write::Other { address, data: _ }) = &msg.data {
}
#[no_mangle]
- pub unsafe extern "C" fn rs_modbus_message_get_write_data(msg: *const ModbusMessage) -> u16 {
+ pub unsafe extern "C" fn SCModbusMessageGetWriteData(msg: *const ModbusMessage) -> u16 {
let msg = msg.as_ref().unwrap().0 as *const Message;
let msg = msg.as_ref().unwrap();
if let Data::Write(Write::Other { address: _, data }) = &msg.data {
}
#[no_mangle]
- pub unsafe extern "C" fn rs_modbus_message_get_bytevec_data(
+ pub unsafe extern "C" fn SCModbusMessageGetBytevecData(
msg: *const ModbusMessage, data_len: *mut usize,
) -> *const u8 {
let msg = msg.as_ref().unwrap().0 as *const Message;
}
#[no_mangle]
- pub unsafe extern "C" fn rs_modbus_state_get_tx_request(
+ pub unsafe extern "C" fn SCModbusStateGetTxRequest(
state: *mut std::os::raw::c_void, tx_id: u64,
) -> ModbusMessage {
let state = cast_pointer!(state, ModbusState);
}
#[no_mangle]
- pub unsafe extern "C" fn rs_modbus_state_get_tx_response(
+ pub unsafe extern "C" fn SCModbusStateGetTxResponse(
state: *mut std::os::raw::c_void, tx_id: u64,
) -> ModbusMessage {
let state = cast_pointer!(state, ModbusState);
*/
void RegisterModbusParsers(void)
{
- rs_modbus_register_parser();
+ SCRegisterModbusParser();
#ifdef UNITTESTS
AppLayerParserRegisterProtocolUnittests(IPPROTO_TCP, ALPROTO_MODBUS, ModbusParserRegisterTests);
#endif
ModbusState *modbus_state = f.alstate;
FAIL_IF_NULL(modbus_state);
- ModbusMessage request = rs_modbus_state_get_tx_request(modbus_state, 0);
+ ModbusMessage request = SCModbusStateGetTxRequest(modbus_state, 0);
FAIL_IF_NULL(request._0);
- FAIL_IF_NOT(rs_modbus_message_get_function(&request) == 1);
- FAIL_IF_NOT(rs_modbus_message_get_read_request_address(&request) == 0x7890);
- FAIL_IF_NOT(rs_modbus_message_get_read_request_quantity(&request) == 19);
+ FAIL_IF_NOT(SCModbusMessageGetFunction(&request) == 1);
+ FAIL_IF_NOT(SCModbusMessageGetReadRequestAddress(&request) == 0x7890);
+ FAIL_IF_NOT(SCModbusMessageGetReadRequestQuantity(&request) == 19);
r = AppLayerParserParse(NULL, alp_tctx, &f, ALPROTO_MODBUS,
STREAM_TOCLIENT, readCoilsRsp,
sizeof(readCoilsRsp));
FAIL_IF_NOT(r == 0);
- FAIL_IF_NOT(rs_modbus_state_get_tx_count(modbus_state) == 1);
+ FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
AppLayerParserThreadCtxFree(alp_tctx);
StreamTcpFreeConfig(true);
ModbusState *modbus_state = f.alstate;
FAIL_IF_NULL(modbus_state);
- ModbusMessage request = rs_modbus_state_get_tx_request(modbus_state, 0);
+ ModbusMessage request = SCModbusStateGetTxRequest(modbus_state, 0);
FAIL_IF_NULL(request._0);
- FAIL_IF_NOT(rs_modbus_message_get_function(&request) == 16);
- FAIL_IF_NOT(rs_modbus_message_get_write_multreq_address(&request) == 0x01);
- FAIL_IF_NOT(rs_modbus_message_get_write_multreq_quantity(&request) == 2);
+ FAIL_IF_NOT(SCModbusMessageGetFunction(&request) == 16);
+ FAIL_IF_NOT(SCModbusMessageGetWriteMultreqAddress(&request) == 0x01);
+ FAIL_IF_NOT(SCModbusMessageGetWriteMultreqQuantity(&request) == 2);
size_t data_len;
- const uint8_t *data = rs_modbus_message_get_write_multreq_data(&request, &data_len);
+ const uint8_t *data = SCModbusMessageGetWriteMultreqData(&request, &data_len);
FAIL_IF_NOT(data_len == 4);
FAIL_IF_NOT(data[0] == 0x00);
FAIL_IF_NOT(data[1] == 0x0A);
sizeof(writeMultipleRegistersRsp));
FAIL_IF_NOT(r == 0);
- FAIL_IF_NOT(rs_modbus_state_get_tx_count(modbus_state) == 1);
+ FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
AppLayerParserThreadCtxFree(alp_tctx);
StreamTcpFreeConfig(true);
ModbusState *modbus_state = f.alstate;
FAIL_IF_NULL(modbus_state);
- ModbusMessage request = rs_modbus_state_get_tx_request(modbus_state, 0);
+ ModbusMessage request = SCModbusStateGetTxRequest(modbus_state, 0);
FAIL_IF_NULL(request._0);
- FAIL_IF_NOT(rs_modbus_message_get_function(&request) == 23);
- FAIL_IF_NOT(rs_modbus_message_get_rw_multreq_read_address(&request) == 0x03);
- FAIL_IF_NOT(rs_modbus_message_get_rw_multreq_read_quantity(&request) == 6);
- FAIL_IF_NOT(rs_modbus_message_get_rw_multreq_write_address(&request) == 0x0E);
- FAIL_IF_NOT(rs_modbus_message_get_rw_multreq_write_quantity(&request) == 3);
+ FAIL_IF_NOT(SCModbusMessageGetFunction(&request) == 23);
+ FAIL_IF_NOT(SCModbusMessageGetRwMultreqReadAddress(&request) == 0x03);
+ FAIL_IF_NOT(SCModbusMessageGetRwMultreqReadQuantity(&request) == 6);
+ FAIL_IF_NOT(SCModbusMessageGetRwMultreqWriteAddress(&request) == 0x0E);
+ FAIL_IF_NOT(SCModbusMessageGetRwMultreqWriteQuantity(&request) == 3);
size_t data_len;
- uint8_t const *data = rs_modbus_message_get_rw_multreq_write_data(&request, &data_len);
+ uint8_t const *data = SCModbusMessageGetRwMultreqWriteData(&request, &data_len);
FAIL_IF_NOT(data_len == 6);
FAIL_IF_NOT(data[0] == 0x12);
FAIL_IF_NOT(data[1] == 0x34);
sizeof(readWriteMultipleRegistersRsp));
FAIL_IF_NOT(r == 0);
- FAIL_IF_NOT(rs_modbus_state_get_tx_count(modbus_state) == 1);
+ FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
/* do detect */
SigMatchSignatures(&tv, de_ctx, det_ctx, p);
ModbusState *modbus_state = f.alstate;
FAIL_IF_NULL(modbus_state);
- ModbusMessage request = rs_modbus_state_get_tx_request(modbus_state, 0);
+ ModbusMessage request = SCModbusStateGetTxRequest(modbus_state, 0);
FAIL_IF_NULL(request._0);
- FAIL_IF_NOT(rs_modbus_message_get_function(&request) == 8);
- FAIL_IF_NOT(rs_modbus_message_get_subfunction(&request) == 4);
+ FAIL_IF_NOT(SCModbusMessageGetFunction(&request) == 8);
+ FAIL_IF_NOT(SCModbusMessageGetSubfunction(&request) == 4);
AppLayerParserThreadCtxFree(alp_tctx);
StreamTcpFreeConfig(true);
ModbusState *modbus_state = f.alstate;
FAIL_IF_NULL(modbus_state);
- ModbusMessage request = rs_modbus_state_get_tx_request(modbus_state, 0);
+ ModbusMessage request = SCModbusStateGetTxRequest(modbus_state, 0);
FAIL_IF_NULL(request._0);
- FAIL_IF_NOT(rs_modbus_message_get_function(&request) == 1);
- FAIL_IF_NOT(rs_modbus_message_get_read_request_address(&request) == 0x7890);
- FAIL_IF_NOT(rs_modbus_message_get_read_request_quantity(&request) == 19);
+ FAIL_IF_NOT(SCModbusMessageGetFunction(&request) == 1);
+ FAIL_IF_NOT(SCModbusMessageGetReadRequestAddress(&request) == 0x7890);
+ FAIL_IF_NOT(SCModbusMessageGetReadRequestQuantity(&request) == 19);
r = AppLayerParserParse(NULL, alp_tctx, &f, ALPROTO_MODBUS,
STREAM_TOCLIENT, readCoilsErrorRsp,
sizeof(readCoilsErrorRsp));
FAIL_IF_NOT(r == 0);
- FAIL_IF_NOT(rs_modbus_state_get_tx_count(modbus_state) == 1);
+ FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
/* do detect */
SigMatchSignatures(&tv, de_ctx, det_ctx, p);
ModbusState *modbus_state = f.alstate;
FAIL_IF_NULL(modbus_state);
- ModbusMessage request = rs_modbus_state_get_tx_request(modbus_state, 0);
+ ModbusMessage request = SCModbusStateGetTxRequest(modbus_state, 0);
FAIL_IF_NULL(request._0);
- FAIL_IF_NOT(rs_modbus_message_get_function(&request) == 1);
- FAIL_IF_NOT(rs_modbus_message_get_read_request_address(&request) == 0x7890);
- FAIL_IF_NOT(rs_modbus_message_get_read_request_quantity(&request) == 19);
+ FAIL_IF_NOT(SCModbusMessageGetFunction(&request) == 1);
+ FAIL_IF_NOT(SCModbusMessageGetReadRequestAddress(&request) == 0x7890);
+ FAIL_IF_NOT(SCModbusMessageGetReadRequestQuantity(&request) == 19);
input_len = sizeof(readCoilsRsp);
part2_len = 10;
STREAM_TOCLIENT, input, input_len);
FAIL_IF_NOT(r == 0);
- FAIL_IF_NOT(rs_modbus_state_get_tx_count(modbus_state) == 1);
+ FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
AppLayerParserThreadCtxFree(alp_tctx);
StreamTcpFreeConfig(true);
ModbusState *modbus_state = f.alstate;
FAIL_IF_NULL(modbus_state);
- FAIL_IF_NOT(rs_modbus_state_get_tx_count(modbus_state) == 2);
+ FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 2);
- ModbusMessage request = rs_modbus_state_get_tx_request(modbus_state, 1);
+ ModbusMessage request = SCModbusStateGetTxRequest(modbus_state, 1);
FAIL_IF_NULL(request._0);
- FAIL_IF_NOT(rs_modbus_message_get_function(&request) == 16);
- FAIL_IF_NOT(rs_modbus_message_get_write_multreq_address(&request) == 0x01);
- FAIL_IF_NOT(rs_modbus_message_get_write_multreq_quantity(&request) == 2);
+ FAIL_IF_NOT(SCModbusMessageGetFunction(&request) == 16);
+ FAIL_IF_NOT(SCModbusMessageGetWriteMultreqAddress(&request) == 0x01);
+ FAIL_IF_NOT(SCModbusMessageGetWriteMultreqQuantity(&request) == 2);
size_t data_len;
- uint8_t const *data = rs_modbus_message_get_write_multreq_data(&request, &data_len);
+ uint8_t const *data = SCModbusMessageGetWriteMultreqData(&request, &data_len);
FAIL_IF_NOT(data_len == 4);
FAIL_IF_NOT(data[0] == 0x00);
FAIL_IF_NOT(data[1] == 0x0A);
ModbusState *modbus_state = f.alstate;
FAIL_IF_NULL(modbus_state);
- ModbusMessage request = rs_modbus_state_get_tx_request(modbus_state, 0);
+ ModbusMessage request = SCModbusStateGetTxRequest(modbus_state, 0);
FAIL_IF_NULL(request._0);
- FAIL_IF_NOT(rs_modbus_message_get_function(&request) == 22);
- FAIL_IF_NOT(rs_modbus_message_get_and_mask(&request) == 0x00F2);
- FAIL_IF_NOT(rs_modbus_message_get_or_mask(&request) == 0x0025);
+ FAIL_IF_NOT(SCModbusMessageGetFunction(&request) == 22);
+ FAIL_IF_NOT(SCModbusMessageGetAndMask(&request) == 0x00F2);
+ FAIL_IF_NOT(SCModbusMessageGetOrMask(&request) == 0x0025);
r = AppLayerParserParse(NULL, alp_tctx, &f, ALPROTO_MODBUS,
STREAM_TOCLIENT, maskWriteRegisterRsp,
sizeof(maskWriteRegisterRsp));
FAIL_IF_NOT(r == 0);
- FAIL_IF_NOT(rs_modbus_state_get_tx_count(modbus_state) == 1);
+ FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
AppLayerParserThreadCtxFree(alp_tctx);
StreamTcpFreeConfig(true);
ModbusState *modbus_state = f.alstate;
FAIL_IF_NULL(modbus_state);
- ModbusMessage request = rs_modbus_state_get_tx_request(modbus_state, 0);
+ ModbusMessage request = SCModbusStateGetTxRequest(modbus_state, 0);
FAIL_IF_NULL(request._0);
- FAIL_IF_NOT(rs_modbus_message_get_function(&request) == 6);
- FAIL_IF_NOT(rs_modbus_message_get_write_address(&request) == 0x0001);
- FAIL_IF_NOT(rs_modbus_message_get_write_data(&request) == 0x0003);
+ FAIL_IF_NOT(SCModbusMessageGetFunction(&request) == 6);
+ FAIL_IF_NOT(SCModbusMessageGetWriteAddress(&request) == 0x0001);
+ FAIL_IF_NOT(SCModbusMessageGetWriteData(&request) == 0x0003);
r = AppLayerParserParse(NULL, alp_tctx, &f, ALPROTO_MODBUS,
STREAM_TOCLIENT, writeSingleRegisterRsp,
sizeof(writeSingleRegisterRsp));
FAIL_IF_NOT(r == 0);
- FAIL_IF_NOT(rs_modbus_state_get_tx_count(modbus_state) == 1);
+ FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
AppLayerParserThreadCtxFree(alp_tctx);
StreamTcpFreeConfig(true);
ModbusState *modbus_state = f.alstate;
FAIL_IF_NULL(modbus_state);
- ModbusMessage request = rs_modbus_state_get_tx_request(modbus_state, 0);
+ ModbusMessage request = SCModbusStateGetTxRequest(modbus_state, 0);
FAIL_IF_NULL(request._0);
- FAIL_IF_NOT(rs_modbus_message_get_function(&request) == 22);
+ FAIL_IF_NOT(SCModbusMessageGetFunction(&request) == 22);
/* do detect */
SigMatchSignatures(&tv, de_ctx, det_ctx, p);
sizeof(maskWriteRegisterRsp));
FAIL_IF_NOT(r == 0);
- FAIL_IF_NOT(rs_modbus_state_get_tx_count(modbus_state) == 1);
- ModbusMessage response = rs_modbus_state_get_tx_response(modbus_state, 0);
+ FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
+ ModbusMessage response = SCModbusStateGetTxResponse(modbus_state, 0);
FAIL_IF_NULL(response._0);
- FAIL_IF_NOT(rs_modbus_message_get_function(&response) == 22);
+ FAIL_IF_NOT(SCModbusMessageGetFunction(&response) == 22);
SigGroupCleanup(de_ctx);
SigCleanSignatures(de_ctx);
ModbusState *modbus_state = f.alstate;
FAIL_IF_NULL(modbus_state);
- ModbusMessage request = rs_modbus_state_get_tx_request(modbus_state, 0);
+ ModbusMessage request = SCModbusStateGetTxRequest(modbus_state, 0);
FAIL_IF_NULL(request._0);
- FAIL_IF_NOT(rs_modbus_message_get_function(&request) == 6);
+ FAIL_IF_NOT(SCModbusMessageGetFunction(&request) == 6);
size_t data_len;
- const uint8_t *data = rs_modbus_message_get_bytevec_data(&request, &data_len);
+ const uint8_t *data = SCModbusMessageGetBytevecData(&request, &data_len);
FAIL_IF_NOT(data_len == 2);
FAIL_IF_NOT(data[0] == 0x00);
FAIL_IF_NOT(data[1] == 0x01);
sizeof(writeSingleRegisterRsp));
FAIL_IF_NOT(r == 0);
- FAIL_IF_NOT(rs_modbus_state_get_tx_count(modbus_state) == 1);
- ModbusMessage response = rs_modbus_state_get_tx_response(modbus_state, 0);
+ FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
+ ModbusMessage response = SCModbusStateGetTxResponse(modbus_state, 0);
FAIL_IF_NULL(response._0);
- FAIL_IF_NOT(rs_modbus_message_get_function(&response) == 6);
- FAIL_IF_NOT(rs_modbus_message_get_write_address(&response) == 0x0001);
+ FAIL_IF_NOT(SCModbusMessageGetFunction(&response) == 6);
+ FAIL_IF_NOT(SCModbusMessageGetWriteAddress(&response) == 0x0001);
SigGroupCleanup(de_ctx);
SigCleanSignatures(de_ctx);
static void DetectModbusFree(DetectEngineCtx *de_ctx, void *ptr) {
SCEnter();
if (ptr != NULL) {
- rs_modbus_free(ptr);
+ SCModbusFree(ptr);
}
SCReturn;
}
if (DetectSignatureSetAppProto(s, ALPROTO_MODBUS) != 0)
return -1;
- if ((modbus = rs_modbus_parse(str)) == NULL) {
+ if ((modbus = SCModbusParse(str)) == NULL) {
SCLogError("invalid modbus option");
goto error;
}
static int DetectModbusMatch(DetectEngineThreadCtx *det_ctx, Flow *f, uint8_t flags, void *state,
void *txv, const Signature *s, const SigMatchCtx *ctx)
{
- return rs_modbus_inspect(txv, (void *)ctx);
+ return SCModbusInspect(txv, (void *)ctx);
}
/**