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)
383 memset(&f, 0,
sizeof(
Flow));
391 f.
proto = IPPROTO_TCP;
406 "(msg:\"Modbus Data mismatch\"; "
408 "modbus.value_mismatch; "
417 readWriteMultipleRegistersReq,
418 sizeof(readWriteMultipleRegistersReq));
421 ModbusState *modbus_state = f.
alstate;
424 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
434 uint8_t
const *data = SCModbusMessageGetRwMultreqWriteData(&
request, &data_len);
444 STREAM_TOCLIENT, readWriteMultipleRegistersRsp,
445 sizeof(readWriteMultipleRegistersRsp));
447 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
465 static int ModbusParserTest04(
void)
473 memset(&f, 0,
sizeof(f));
474 memset(&ssn, 0,
sizeof(ssn));
478 f.
proto = IPPROTO_TCP;
484 STREAM_TOSERVER, forceListenOnlyMode,
485 sizeof(forceListenOnlyMode));
488 ModbusState *modbus_state = f.
alstate;
491 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
503 static int ModbusParserTest05(
void)
517 memset(&f, 0,
sizeof(
Flow));
525 f.
proto = IPPROTO_TCP;
540 "(msg:\"Modbus invalid Protocol version\"; "
542 "modbus.invalid_protocol_id; "
550 STREAM_TOSERVER, invalidProtocolIdReq,
551 sizeof(invalidProtocolIdReq));
554 ModbusState *modbus_state = f.
alstate;
573 static int ModbusParserTest06(
void)
587 memset(&f, 0,
sizeof(
Flow));
595 f.
proto = IPPROTO_TCP;
610 "(msg:\"Modbus unsolicited response\"; "
612 "modbus.unsolicited_response; "
620 STREAM_TOCLIENT, readCoilsRsp,
621 sizeof(readCoilsRsp));
624 ModbusState *modbus_state = f.
alstate;
643 static int ModbusParserTest07(
void)
657 memset(&f, 0,
sizeof(
Flow));
665 f.
proto = IPPROTO_TCP;
680 "(msg:\"Modbus invalid Length\"; "
682 "modbus.invalid_length; "
691 invalidLengthWriteMultipleRegistersReq,
692 sizeof(invalidLengthWriteMultipleRegistersReq));
695 ModbusState *modbus_state = f.
alstate;
714 static int ModbusParserTest08(
void)
728 memset(&f, 0,
sizeof(
Flow));
736 f.
proto = IPPROTO_TCP;
751 "(msg:\"Modbus Exception code invalid\"; "
753 "modbus.invalid_exception_code; "
761 STREAM_TOSERVER, readCoilsReq,
762 sizeof(readCoilsReq));
765 ModbusState *modbus_state = f.
alstate;
768 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
775 STREAM_TOCLIENT, readCoilsErrorRsp,
776 sizeof(readCoilsErrorRsp));
778 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
796 static int ModbusParserTest09(
void) {
801 uint32_t input_len =
sizeof(readCoilsReq), part2_len = 3;
802 uint8_t *input = readCoilsReq;
806 memset(&f, 0,
sizeof(f));
807 memset(&ssn, 0,
sizeof(ssn));
811 f.
proto = IPPROTO_TCP;
817 STREAM_TOSERVER, input, input_len - part2_len);
821 STREAM_TOSERVER, input, input_len);
824 ModbusState *modbus_state = f.
alstate;
827 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
833 input_len =
sizeof(readCoilsRsp);
835 input = readCoilsRsp;
838 STREAM_TOCLIENT, input, input_len - part2_len);
842 STREAM_TOCLIENT, input, input_len);
844 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
853 static int ModbusParserTest10(
void) {
854 uint32_t input_len =
sizeof(readCoilsReq) +
sizeof(writeMultipleRegistersReq);
855 uint8_t *input, *ptr;
863 input = (uint8_t *)
SCMalloc (input_len *
sizeof(uint8_t));
866 memcpy(input, readCoilsReq,
sizeof(readCoilsReq));
867 memcpy(input +
sizeof(readCoilsReq), writeMultipleRegistersReq,
sizeof(writeMultipleRegistersReq));
869 memset(&f, 0,
sizeof(f));
870 memset(&ssn, 0,
sizeof(ssn));
874 f.
proto = IPPROTO_TCP;
880 STREAM_TOSERVER, input, input_len);
883 ModbusState *modbus_state = f.
alstate;
885 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 2);
887 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 1);
894 uint8_t
const *data = SCModbusMessageGetWriteMultreqData(&
request, &data_len);
901 input_len =
sizeof(readCoilsRsp) +
sizeof(writeMultipleRegistersRsp);
903 ptr = (uint8_t *)
SCRealloc (input, input_len *
sizeof(uint8_t));
907 memcpy(input, readCoilsRsp,
sizeof(readCoilsRsp));
908 memcpy(input +
sizeof(readCoilsRsp), writeMultipleRegistersRsp,
sizeof(writeMultipleRegistersRsp));
921 static int ModbusParserTest11(
void)
928 size_t input_len = 65536;
929 uint8_t *input =
SCCalloc(1, input_len);
932 memcpy(input, exceededLengthWriteMultipleRegistersReq,
933 sizeof(exceededLengthWriteMultipleRegistersReq));
940 memset(&f, 0,
sizeof(
Flow));
948 f.
proto = IPPROTO_TCP;
963 "(msg:\"Modbus invalid Length\"; "
965 "modbus.invalid_length; "
976 ModbusState *modbus_state = f.
alstate;
996 static int ModbusParserTest12(
void)
1009 memset(&f, 0,
sizeof(
Flow));
1017 f.
proto = IPPROTO_TCP;
1032 "(msg:\"Modbus invalid Length\"; "
1034 "modbus.invalid_length; "
1043 invalidLengthPDUWriteMultipleRegistersReq,
1044 sizeof(invalidLengthPDUWriteMultipleRegistersReq));
1047 ModbusState *modbus_state = f.
alstate;
1066 static int ModbusParserTest13(
void)
1074 memset(&f, 0,
sizeof(f));
1075 memset(&ssn, 0,
sizeof(ssn));
1079 f.
proto = IPPROTO_TCP;
1085 STREAM_TOSERVER, maskWriteRegisterReq,
1086 sizeof(maskWriteRegisterReq));
1089 ModbusState *modbus_state = f.
alstate;
1092 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
1099 STREAM_TOCLIENT, maskWriteRegisterRsp,
1100 sizeof(maskWriteRegisterRsp));
1102 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
1111 static int ModbusParserTest14(
void)
1119 memset(&f, 0,
sizeof(f));
1120 memset(&ssn, 0,
sizeof(ssn));
1124 f.
proto = IPPROTO_TCP;
1130 STREAM_TOSERVER, writeSingleRegisterReq,
1131 sizeof(writeSingleRegisterReq));
1134 ModbusState *modbus_state = f.
alstate;
1137 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
1144 STREAM_TOCLIENT, writeSingleRegisterRsp,
1145 sizeof(writeSingleRegisterRsp));
1147 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
1156 static int ModbusParserTest15(
void)
1170 memset(&f, 0,
sizeof(f));
1171 memset(&ssn, 0,
sizeof(ssn));
1178 f.
proto = IPPROTO_TCP;
1193 "(msg:\"Modbus invalid Length\"; "
1195 "modbus.invalid_length; "
1203 STREAM_TOSERVER, invalidMaskWriteRegisterReq,
1204 sizeof(invalidMaskWriteRegisterReq));
1207 ModbusState *modbus_state = f.
alstate;
1210 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
1219 STREAM_TOCLIENT, maskWriteRegisterRsp,
1220 sizeof(maskWriteRegisterRsp));
1222 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
1223 ModbusMessage
response = SCModbusStateGetTxResponse(modbus_state, 0);
1239 static int ModbusParserTest16(
void)
1253 memset(&f, 0,
sizeof(f));
1254 memset(&ssn, 0,
sizeof(ssn));
1261 f.
proto = IPPROTO_TCP;
1276 "(msg:\"Modbus invalid Length\"; "
1278 "modbus.invalid_length; "
1287 invalidWriteSingleRegisterReq,
1288 sizeof(invalidWriteSingleRegisterReq));
1291 ModbusState *modbus_state = f.
alstate;
1294 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
1298 const uint8_t *data = SCModbusMessageGetBytevecData(&
request, &data_len);
1308 STREAM_TOCLIENT, writeSingleRegisterRsp,
1309 sizeof(writeSingleRegisterRsp));
1312 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
1313 ModbusMessage
response = SCModbusStateGetTxResponse(modbus_state, 0);
1330 static int ModbusParserTest17(
void)
1338 memset(&f, 0,
sizeof(f));
1339 memset(&ssn, 0,
sizeof(ssn));
1343 f.
proto = IPPROTO_TCP;
1349 readCoilsReq,
sizeof(readCoilsReq));
1355 readCoilsRsp,
sizeof(readCoilsRsp));
1366 static int ModbusParserTest18(
void)
1371 uint32_t input_len =
sizeof(readCoilsReq), part2_len = 3;
1372 uint8_t *input = readCoilsReq;
1377 memset(&f, 0,
sizeof(f));
1378 memset(&ssn, 0,
sizeof(ssn));
1382 f.
proto = IPPROTO_TCP;
1388 input, input_len - part2_len);
1398 input_len =
sizeof(readCoilsRsp);
1400 input = readCoilsRsp;
1403 input, input_len - part2_len);
1419 static int ModbusParserTest19(
void)
1433 memset(&f, 0,
sizeof(
Flow));
1441 f.
proto = IPPROTO_TCP;
1456 "(msg:\"Modbus invalid Function code\"; "
1458 "modbus.invalid_function_code; "
1467 invalidFunctionCode,
1468 sizeof(invalidFunctionCode));
1471 ModbusState *modbus_state = f.
alstate;
1493 ModbusParserTest01);
1494 UtRegisterTest(
"ModbusParserTest02 - Modbus Write Multiple registers request",
1495 ModbusParserTest02);
1496 UtRegisterTest(
"ModbusParserTest03 - Modbus Read/Write Multiple registers request",
1497 ModbusParserTest03);
1498 UtRegisterTest(
"ModbusParserTest04 - Modbus Force Listen Only Mode request",
1499 ModbusParserTest04);
1500 UtRegisterTest(
"ModbusParserTest05 - Modbus invalid Protocol version",
1501 ModbusParserTest05);
1502 UtRegisterTest(
"ModbusParserTest06 - Modbus unsolicited response",
1503 ModbusParserTest06);
1504 UtRegisterTest(
"ModbusParserTest07 - Modbus invalid Length request",
1505 ModbusParserTest07);
1506 UtRegisterTest(
"ModbusParserTest08 - Modbus Exception code invalid",
1507 ModbusParserTest08);
1508 UtRegisterTest(
"ModbusParserTest09 - Modbus fragmentation - 1 ADU in 2 TCP packets",
1509 ModbusParserTest09);
1510 UtRegisterTest(
"ModbusParserTest10 - Modbus fragmentation - 2 ADU in 1 TCP packet",
1511 ModbusParserTest10);
1512 UtRegisterTest(
"ModbusParserTest11 - Modbus exceeded Length request",
1513 ModbusParserTest11);
1515 ModbusParserTest12);
1516 UtRegisterTest(
"ModbusParserTest13 - Modbus Mask Write register request",
1517 ModbusParserTest13);
1518 UtRegisterTest(
"ModbusParserTest14 - Modbus Write single register request",
1519 ModbusParserTest14);
1520 UtRegisterTest(
"ModbusParserTest15 - Modbus invalid Mask Write register request",
1521 ModbusParserTest15);
1522 UtRegisterTest(
"ModbusParserTest16 - Modbus invalid Write single register request",
1523 ModbusParserTest16);
1525 ModbusParserTest17);
1526 UtRegisterTest(
"ModbusParserTest18 - Modbus stream depth in 2 TCP packets",
1527 ModbusParserTest18);
1528 UtRegisterTest(
"ModbusParserTest19 - Modbus invalid Function code",
1529 ModbusParserTest19);