52 SCRegisterModbusParser();
79 #define MODBUS_CONFIG_DEFAULT_STREAM_DEPTH 0
82 static uint8_t invalidFunctionCode[] = {
92 static uint8_t readCoilsReq[] = { 0x00, 0x00,
100 static uint8_t readCoilsRsp[] = { 0x00, 0x00,
108 static uint8_t readCoilsErrorRsp[] = {
120 static uint8_t writeSingleRegisterReq[] = { 0x00, 0x0A,
128 static uint8_t invalidWriteSingleRegisterReq[] = { 0x00, 0x0A,
135 static uint8_t writeSingleRegisterRsp[] = { 0x00, 0x0A,
145 static uint8_t writeMultipleRegistersReq[] = { 0x00, 0x0A,
156 static uint8_t writeMultipleRegistersRsp[] = { 0x00, 0x0A,
166 static uint8_t maskWriteRegisterReq[] = { 0x00, 0x0A,
175 static uint8_t invalidMaskWriteRegisterReq[] = { 0x00, 0x0A,
183 static uint8_t maskWriteRegisterRsp[] = { 0x00, 0x0A,
195 static uint8_t readWriteMultipleRegistersReq[] = { 0x12, 0x34,
210 static uint8_t readWriteMultipleRegistersRsp[] = { 0x12, 0x34,
225 static uint8_t forceListenOnlyMode[] = { 0x0A, 0x00,
233 static uint8_t invalidProtocolIdReq[] = { 0x00, 0x00,
241 static uint8_t invalidLengthWriteMultipleRegistersReq[] = {
253 static uint8_t exceededLengthWriteMultipleRegistersReq[] = {
263 static uint8_t invalidLengthPDUWriteMultipleRegistersReq[] = {
271 static int ModbusParserTest01(
void)
279 memset(&f, 0,
sizeof(f));
280 memset(&ssn, 0,
sizeof(ssn));
284 f.
proto = IPPROTO_TCP;
290 STREAM_TOSERVER, readCoilsReq,
291 sizeof(readCoilsReq));
294 ModbusState *modbus_state = f.
alstate;
297 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
304 STREAM_TOCLIENT, readCoilsRsp,
305 sizeof(readCoilsRsp));
307 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
316 static int ModbusParserTest02(
void)
324 memset(&f, 0,
sizeof(f));
325 memset(&ssn, 0,
sizeof(ssn));
329 f.
proto = IPPROTO_TCP;
335 STREAM_TOSERVER, writeMultipleRegistersReq,
336 sizeof(writeMultipleRegistersReq));
339 ModbusState *modbus_state = f.
alstate;
342 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
349 const uint8_t *data = SCModbusMessageGetWriteMultreqData(&
request, &data_len);
357 STREAM_TOCLIENT, writeMultipleRegistersRsp,
358 sizeof(writeMultipleRegistersRsp));
360 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
369 static int ModbusParserTest03(
void)
382 memset(&f, 0,
sizeof(
Flow));
390 f.
proto = IPPROTO_TCP;
405 "(msg:\"Modbus Data mismatch\"; "
407 "modbus.value_mismatch; "
416 readWriteMultipleRegistersReq,
417 sizeof(readWriteMultipleRegistersReq));
420 ModbusState *modbus_state = f.
alstate;
423 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
433 uint8_t
const *data = SCModbusMessageGetRwMultreqWriteData(&
request, &data_len);
443 STREAM_TOCLIENT, readWriteMultipleRegistersRsp,
444 sizeof(readWriteMultipleRegistersRsp));
446 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
464 static int ModbusParserTest04(
void)
472 memset(&f, 0,
sizeof(f));
473 memset(&ssn, 0,
sizeof(ssn));
477 f.
proto = IPPROTO_TCP;
483 STREAM_TOSERVER, forceListenOnlyMode,
484 sizeof(forceListenOnlyMode));
487 ModbusState *modbus_state = f.
alstate;
490 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
502 static int ModbusParserTest05(
void)
515 memset(&f, 0,
sizeof(
Flow));
523 f.
proto = IPPROTO_TCP;
538 "(msg:\"Modbus invalid Protocol version\"; "
540 "modbus.invalid_protocol_id; "
548 STREAM_TOSERVER, invalidProtocolIdReq,
549 sizeof(invalidProtocolIdReq));
552 ModbusState *modbus_state = f.
alstate;
571 static int ModbusParserTest06(
void)
584 memset(&f, 0,
sizeof(
Flow));
592 f.
proto = IPPROTO_TCP;
607 "(msg:\"Modbus unsolicited response\"; "
609 "modbus.unsolicited_response; "
617 STREAM_TOCLIENT, readCoilsRsp,
618 sizeof(readCoilsRsp));
621 ModbusState *modbus_state = f.
alstate;
640 static int ModbusParserTest07(
void)
653 memset(&f, 0,
sizeof(
Flow));
661 f.
proto = IPPROTO_TCP;
676 "(msg:\"Modbus invalid Length\"; "
678 "modbus.invalid_length; "
687 invalidLengthWriteMultipleRegistersReq,
688 sizeof(invalidLengthWriteMultipleRegistersReq));
691 ModbusState *modbus_state = f.
alstate;
710 static int ModbusParserTest08(
void)
723 memset(&f, 0,
sizeof(
Flow));
731 f.
proto = IPPROTO_TCP;
746 "(msg:\"Modbus Exception code invalid\"; "
748 "modbus.invalid_exception_code; "
756 STREAM_TOSERVER, readCoilsReq,
757 sizeof(readCoilsReq));
760 ModbusState *modbus_state = f.
alstate;
763 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
770 STREAM_TOCLIENT, readCoilsErrorRsp,
771 sizeof(readCoilsErrorRsp));
773 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
791 static int ModbusParserTest09(
void) {
796 uint32_t input_len =
sizeof(readCoilsReq), part2_len = 3;
797 uint8_t *input = readCoilsReq;
801 memset(&f, 0,
sizeof(f));
802 memset(&ssn, 0,
sizeof(ssn));
806 f.
proto = IPPROTO_TCP;
812 STREAM_TOSERVER, input, input_len - part2_len);
816 STREAM_TOSERVER, input, input_len);
819 ModbusState *modbus_state = f.
alstate;
822 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
828 input_len =
sizeof(readCoilsRsp);
830 input = readCoilsRsp;
833 STREAM_TOCLIENT, input, input_len - part2_len);
837 STREAM_TOCLIENT, input, input_len);
839 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
848 static int ModbusParserTest10(
void) {
849 uint32_t input_len =
sizeof(readCoilsReq) +
sizeof(writeMultipleRegistersReq);
850 uint8_t *input, *ptr;
858 input = (uint8_t *)
SCMalloc (input_len *
sizeof(uint8_t));
861 memcpy(input, readCoilsReq,
sizeof(readCoilsReq));
862 memcpy(input +
sizeof(readCoilsReq), writeMultipleRegistersReq,
sizeof(writeMultipleRegistersReq));
864 memset(&f, 0,
sizeof(f));
865 memset(&ssn, 0,
sizeof(ssn));
869 f.
proto = IPPROTO_TCP;
875 STREAM_TOSERVER, input, input_len);
878 ModbusState *modbus_state = f.
alstate;
880 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 2);
882 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 1);
889 uint8_t
const *data = SCModbusMessageGetWriteMultreqData(&
request, &data_len);
896 input_len =
sizeof(readCoilsRsp) +
sizeof(writeMultipleRegistersRsp);
898 ptr = (uint8_t *)
SCRealloc (input, input_len *
sizeof(uint8_t));
902 memcpy(input, readCoilsRsp,
sizeof(readCoilsRsp));
903 memcpy(input +
sizeof(readCoilsRsp), writeMultipleRegistersRsp,
sizeof(writeMultipleRegistersRsp));
916 static int ModbusParserTest11(
void)
923 size_t input_len = 65536;
924 uint8_t *input =
SCCalloc(1, input_len);
927 memcpy(input, exceededLengthWriteMultipleRegistersReq,
928 sizeof(exceededLengthWriteMultipleRegistersReq));
934 memset(&f, 0,
sizeof(
Flow));
942 f.
proto = IPPROTO_TCP;
957 "(msg:\"Modbus invalid Length\"; "
959 "modbus.invalid_length; "
970 ModbusState *modbus_state = f.
alstate;
990 static int ModbusParserTest12(
void)
1002 memset(&f, 0,
sizeof(
Flow));
1010 f.
proto = IPPROTO_TCP;
1025 "(msg:\"Modbus invalid Length\"; "
1027 "modbus.invalid_length; "
1036 invalidLengthPDUWriteMultipleRegistersReq,
1037 sizeof(invalidLengthPDUWriteMultipleRegistersReq));
1040 ModbusState *modbus_state = f.
alstate;
1059 static int ModbusParserTest13(
void)
1067 memset(&f, 0,
sizeof(f));
1068 memset(&ssn, 0,
sizeof(ssn));
1072 f.
proto = IPPROTO_TCP;
1078 STREAM_TOSERVER, maskWriteRegisterReq,
1079 sizeof(maskWriteRegisterReq));
1082 ModbusState *modbus_state = f.
alstate;
1085 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
1092 STREAM_TOCLIENT, maskWriteRegisterRsp,
1093 sizeof(maskWriteRegisterRsp));
1095 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
1104 static int ModbusParserTest14(
void)
1112 memset(&f, 0,
sizeof(f));
1113 memset(&ssn, 0,
sizeof(ssn));
1117 f.
proto = IPPROTO_TCP;
1123 STREAM_TOSERVER, writeSingleRegisterReq,
1124 sizeof(writeSingleRegisterReq));
1127 ModbusState *modbus_state = f.
alstate;
1130 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
1137 STREAM_TOCLIENT, writeSingleRegisterRsp,
1138 sizeof(writeSingleRegisterRsp));
1140 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
1149 static int ModbusParserTest15(
void)
1162 memset(&f, 0,
sizeof(f));
1163 memset(&ssn, 0,
sizeof(ssn));
1170 f.
proto = IPPROTO_TCP;
1185 "(msg:\"Modbus invalid Length\"; "
1187 "modbus.invalid_length; "
1195 STREAM_TOSERVER, invalidMaskWriteRegisterReq,
1196 sizeof(invalidMaskWriteRegisterReq));
1199 ModbusState *modbus_state = f.
alstate;
1202 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
1211 STREAM_TOCLIENT, maskWriteRegisterRsp,
1212 sizeof(maskWriteRegisterRsp));
1214 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
1215 ModbusMessage
response = SCModbusStateGetTxResponse(modbus_state, 0);
1231 static int ModbusParserTest16(
void)
1244 memset(&f, 0,
sizeof(f));
1245 memset(&ssn, 0,
sizeof(ssn));
1252 f.
proto = IPPROTO_TCP;
1267 "(msg:\"Modbus invalid Length\"; "
1269 "modbus.invalid_length; "
1278 invalidWriteSingleRegisterReq,
1279 sizeof(invalidWriteSingleRegisterReq));
1282 ModbusState *modbus_state = f.
alstate;
1285 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
1289 const uint8_t *data = SCModbusMessageGetBytevecData(&
request, &data_len);
1299 STREAM_TOCLIENT, writeSingleRegisterRsp,
1300 sizeof(writeSingleRegisterRsp));
1303 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
1304 ModbusMessage
response = SCModbusStateGetTxResponse(modbus_state, 0);
1321 static int ModbusParserTest17(
void)
1329 memset(&f, 0,
sizeof(f));
1330 memset(&ssn, 0,
sizeof(ssn));
1334 f.
proto = IPPROTO_TCP;
1340 readCoilsReq,
sizeof(readCoilsReq));
1346 readCoilsRsp,
sizeof(readCoilsRsp));
1357 static int ModbusParserTest18(
void)
1362 uint32_t input_len =
sizeof(readCoilsReq), part2_len = 3;
1363 uint8_t *input = readCoilsReq;
1368 memset(&f, 0,
sizeof(f));
1369 memset(&ssn, 0,
sizeof(ssn));
1373 f.
proto = IPPROTO_TCP;
1379 input, input_len - part2_len);
1389 input_len =
sizeof(readCoilsRsp);
1391 input = readCoilsRsp;
1394 input, input_len - part2_len);
1410 static int ModbusParserTest19(
void)
1423 memset(&f, 0,
sizeof(
Flow));
1431 f.
proto = IPPROTO_TCP;
1446 "(msg:\"Modbus invalid Function code\"; "
1448 "modbus.invalid_function_code; "
1457 invalidFunctionCode,
1458 sizeof(invalidFunctionCode));
1461 ModbusState *modbus_state = f.
alstate;
1483 ModbusParserTest01);
1484 UtRegisterTest(
"ModbusParserTest02 - Modbus Write Multiple registers request",
1485 ModbusParserTest02);
1486 UtRegisterTest(
"ModbusParserTest03 - Modbus Read/Write Multiple registers request",
1487 ModbusParserTest03);
1488 UtRegisterTest(
"ModbusParserTest04 - Modbus Force Listen Only Mode request",
1489 ModbusParserTest04);
1490 UtRegisterTest(
"ModbusParserTest05 - Modbus invalid Protocol version",
1491 ModbusParserTest05);
1492 UtRegisterTest(
"ModbusParserTest06 - Modbus unsolicited response",
1493 ModbusParserTest06);
1494 UtRegisterTest(
"ModbusParserTest07 - Modbus invalid Length request",
1495 ModbusParserTest07);
1496 UtRegisterTest(
"ModbusParserTest08 - Modbus Exception code invalid",
1497 ModbusParserTest08);
1498 UtRegisterTest(
"ModbusParserTest09 - Modbus fragmentation - 1 ADU in 2 TCP packets",
1499 ModbusParserTest09);
1500 UtRegisterTest(
"ModbusParserTest10 - Modbus fragmentation - 2 ADU in 1 TCP packet",
1501 ModbusParserTest10);
1502 UtRegisterTest(
"ModbusParserTest11 - Modbus exceeded Length request",
1503 ModbusParserTest11);
1505 ModbusParserTest12);
1506 UtRegisterTest(
"ModbusParserTest13 - Modbus Mask Write register request",
1507 ModbusParserTest13);
1508 UtRegisterTest(
"ModbusParserTest14 - Modbus Write single register request",
1509 ModbusParserTest14);
1510 UtRegisterTest(
"ModbusParserTest15 - Modbus invalid Mask Write register request",
1511 ModbusParserTest15);
1512 UtRegisterTest(
"ModbusParserTest16 - Modbus invalid Write single register request",
1513 ModbusParserTest16);
1515 ModbusParserTest17);
1516 UtRegisterTest(
"ModbusParserTest18 - Modbus stream depth in 2 TCP packets",
1517 ModbusParserTest18);
1518 UtRegisterTest(
"ModbusParserTest19 - Modbus invalid Function code",
1519 ModbusParserTest19);