73 SCRegisterModbusParser();
85 #define MODBUS_CONFIG_DEFAULT_STREAM_DEPTH 0
88 static uint8_t invalidFunctionCode[] = {
98 static uint8_t readCoilsReq[] = { 0x00, 0x00,
106 static uint8_t readCoilsRsp[] = { 0x00, 0x00,
114 static uint8_t readCoilsErrorRsp[] = {
126 static uint8_t writeSingleRegisterReq[] = { 0x00, 0x0A,
134 static uint8_t invalidWriteSingleRegisterReq[] = { 0x00, 0x0A,
141 static uint8_t writeSingleRegisterRsp[] = { 0x00, 0x0A,
151 static uint8_t writeMultipleRegistersReq[] = { 0x00, 0x0A,
162 static uint8_t writeMultipleRegistersRsp[] = { 0x00, 0x0A,
172 static uint8_t maskWriteRegisterReq[] = { 0x00, 0x0A,
181 static uint8_t invalidMaskWriteRegisterReq[] = { 0x00, 0x0A,
189 static uint8_t maskWriteRegisterRsp[] = { 0x00, 0x0A,
201 static uint8_t readWriteMultipleRegistersReq[] = { 0x12, 0x34,
216 static uint8_t readWriteMultipleRegistersRsp[] = { 0x12, 0x34,
231 static uint8_t forceListenOnlyMode[] = { 0x0A, 0x00,
239 static uint8_t invalidProtocolIdReq[] = { 0x00, 0x00,
247 static uint8_t invalidLengthWriteMultipleRegistersReq[] = {
259 static uint8_t exceededLengthWriteMultipleRegistersReq[] = {
269 static uint8_t invalidLengthPDUWriteMultipleRegistersReq[] = {
277 static int ModbusParserTest01(
void)
285 memset(&
f, 0,
sizeof(
f));
286 memset(&
ssn, 0,
sizeof(
ssn));
296 STREAM_TOSERVER, readCoilsReq,
297 sizeof(readCoilsReq));
300 ModbusState *modbus_state =
f.
alstate;
303 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
310 STREAM_TOCLIENT, readCoilsRsp,
311 sizeof(readCoilsRsp));
313 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
322 static int ModbusParserTest02(
void)
330 memset(&
f, 0,
sizeof(
f));
331 memset(&
ssn, 0,
sizeof(
ssn));
341 STREAM_TOSERVER, writeMultipleRegistersReq,
342 sizeof(writeMultipleRegistersReq));
345 ModbusState *modbus_state =
f.
alstate;
348 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
355 const uint8_t *data = SCModbusMessageGetWriteMultreqData(&
request, &data_len);
363 STREAM_TOCLIENT, writeMultipleRegistersRsp,
364 sizeof(writeMultipleRegistersRsp));
366 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
375 static int ModbusParserTest03(
void)
389 memset(&
f, 0,
sizeof(
Flow));
412 "(msg:\"Modbus Data mismatch\"; "
414 "modbus.value_mismatch; "
423 readWriteMultipleRegistersReq,
424 sizeof(readWriteMultipleRegistersReq));
427 ModbusState *modbus_state =
f.
alstate;
430 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
440 uint8_t
const *data = SCModbusMessageGetRwMultreqWriteData(&
request, &data_len);
450 STREAM_TOCLIENT, readWriteMultipleRegistersRsp,
451 sizeof(readWriteMultipleRegistersRsp));
453 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
471 static int ModbusParserTest04(
void)
479 memset(&
f, 0,
sizeof(
f));
480 memset(&
ssn, 0,
sizeof(
ssn));
490 STREAM_TOSERVER, forceListenOnlyMode,
491 sizeof(forceListenOnlyMode));
494 ModbusState *modbus_state =
f.
alstate;
497 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
509 static int ModbusParserTest05(
void)
523 memset(&
f, 0,
sizeof(
Flow));
546 "(msg:\"Modbus invalid Protocol version\"; "
548 "modbus.invalid_protocol_id; "
556 STREAM_TOSERVER, invalidProtocolIdReq,
557 sizeof(invalidProtocolIdReq));
560 ModbusState *modbus_state =
f.
alstate;
579 static int ModbusParserTest06(
void)
593 memset(&
f, 0,
sizeof(
Flow));
616 "(msg:\"Modbus unsolicited response\"; "
618 "modbus.unsolicited_response; "
626 STREAM_TOCLIENT, readCoilsRsp,
627 sizeof(readCoilsRsp));
630 ModbusState *modbus_state =
f.
alstate;
649 static int ModbusParserTest07(
void)
663 memset(&
f, 0,
sizeof(
Flow));
686 "(msg:\"Modbus invalid Length\"; "
688 "modbus.invalid_length; "
697 invalidLengthWriteMultipleRegistersReq,
698 sizeof(invalidLengthWriteMultipleRegistersReq));
701 ModbusState *modbus_state =
f.
alstate;
720 static int ModbusParserTest08(
void)
734 memset(&
f, 0,
sizeof(
Flow));
757 "(msg:\"Modbus Exception code invalid\"; "
759 "modbus.invalid_exception_code; "
767 STREAM_TOSERVER, readCoilsReq,
768 sizeof(readCoilsReq));
771 ModbusState *modbus_state =
f.
alstate;
774 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
781 STREAM_TOCLIENT, readCoilsErrorRsp,
782 sizeof(readCoilsErrorRsp));
784 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
802 static int ModbusParserTest09(
void) {
807 uint32_t input_len =
sizeof(readCoilsReq), part2_len = 3;
808 uint8_t *input = readCoilsReq;
812 memset(&
f, 0,
sizeof(
f));
813 memset(&
ssn, 0,
sizeof(
ssn));
823 STREAM_TOSERVER, input, input_len - part2_len);
827 STREAM_TOSERVER, input, input_len);
830 ModbusState *modbus_state =
f.
alstate;
833 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
839 input_len =
sizeof(readCoilsRsp);
841 input = readCoilsRsp;
844 STREAM_TOCLIENT, input, input_len - part2_len);
848 STREAM_TOCLIENT, input, input_len);
850 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
859 static int ModbusParserTest10(
void) {
860 uint32_t input_len =
sizeof(readCoilsReq) +
sizeof(writeMultipleRegistersReq);
861 uint8_t *input, *ptr;
869 input = (uint8_t *)
SCMalloc (input_len *
sizeof(uint8_t));
872 memcpy(input, readCoilsReq,
sizeof(readCoilsReq));
873 memcpy(input +
sizeof(readCoilsReq), writeMultipleRegistersReq,
sizeof(writeMultipleRegistersReq));
875 memset(&
f, 0,
sizeof(
f));
876 memset(&
ssn, 0,
sizeof(
ssn));
886 STREAM_TOSERVER, input, input_len);
889 ModbusState *modbus_state =
f.
alstate;
891 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 2);
893 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 1);
900 uint8_t
const *data = SCModbusMessageGetWriteMultreqData(&
request, &data_len);
907 input_len =
sizeof(readCoilsRsp) +
sizeof(writeMultipleRegistersRsp);
909 ptr = (uint8_t *)
SCRealloc (input, input_len *
sizeof(uint8_t));
913 memcpy(input, readCoilsRsp,
sizeof(readCoilsRsp));
914 memcpy(input +
sizeof(readCoilsRsp), writeMultipleRegistersRsp,
sizeof(writeMultipleRegistersRsp));
927 static int ModbusParserTest11(
void)
934 size_t input_len = 65536;
935 uint8_t *input =
SCCalloc(1, input_len);
938 memcpy(input, exceededLengthWriteMultipleRegistersReq,
939 sizeof(exceededLengthWriteMultipleRegistersReq));
946 memset(&
f, 0,
sizeof(
Flow));
969 "(msg:\"Modbus invalid Length\"; "
971 "modbus.invalid_length; "
982 ModbusState *modbus_state =
f.
alstate;
1002 static int ModbusParserTest12(
void)
1015 memset(&
f, 0,
sizeof(
Flow));
1038 "(msg:\"Modbus invalid Length\"; "
1040 "modbus.invalid_length; "
1049 invalidLengthPDUWriteMultipleRegistersReq,
1050 sizeof(invalidLengthPDUWriteMultipleRegistersReq));
1053 ModbusState *modbus_state =
f.
alstate;
1072 static int ModbusParserTest13(
void)
1080 memset(&
f, 0,
sizeof(
f));
1081 memset(&
ssn, 0,
sizeof(
ssn));
1091 STREAM_TOSERVER, maskWriteRegisterReq,
1092 sizeof(maskWriteRegisterReq));
1095 ModbusState *modbus_state =
f.
alstate;
1098 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
1105 STREAM_TOCLIENT, maskWriteRegisterRsp,
1106 sizeof(maskWriteRegisterRsp));
1108 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
1117 static int ModbusParserTest14(
void)
1125 memset(&
f, 0,
sizeof(
f));
1126 memset(&
ssn, 0,
sizeof(
ssn));
1136 STREAM_TOSERVER, writeSingleRegisterReq,
1137 sizeof(writeSingleRegisterReq));
1140 ModbusState *modbus_state =
f.
alstate;
1143 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
1150 STREAM_TOCLIENT, writeSingleRegisterRsp,
1151 sizeof(writeSingleRegisterRsp));
1153 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
1162 static int ModbusParserTest15(
void)
1176 memset(&
f, 0,
sizeof(
f));
1177 memset(&
ssn, 0,
sizeof(
ssn));
1199 "(msg:\"Modbus invalid Length\"; "
1201 "modbus.invalid_length; "
1209 STREAM_TOSERVER, invalidMaskWriteRegisterReq,
1210 sizeof(invalidMaskWriteRegisterReq));
1213 ModbusState *modbus_state =
f.
alstate;
1216 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
1225 STREAM_TOCLIENT, maskWriteRegisterRsp,
1226 sizeof(maskWriteRegisterRsp));
1228 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
1229 ModbusMessage
response = SCModbusStateGetTxResponse(modbus_state, 0);
1245 static int ModbusParserTest16(
void)
1259 memset(&
f, 0,
sizeof(
f));
1260 memset(&
ssn, 0,
sizeof(
ssn));
1282 "(msg:\"Modbus invalid Length\"; "
1284 "modbus.invalid_length; "
1293 invalidWriteSingleRegisterReq,
1294 sizeof(invalidWriteSingleRegisterReq));
1297 ModbusState *modbus_state =
f.
alstate;
1300 ModbusMessage
request = SCModbusStateGetTxRequest(modbus_state, 0);
1304 const uint8_t *data = SCModbusMessageGetBytevecData(&
request, &data_len);
1314 STREAM_TOCLIENT, writeSingleRegisterRsp,
1315 sizeof(writeSingleRegisterRsp));
1318 FAIL_IF_NOT(SCModbusStateGetTxCount(modbus_state) == 1);
1319 ModbusMessage
response = SCModbusStateGetTxResponse(modbus_state, 0);
1336 static int ModbusParserTest17(
void)
1344 memset(&
f, 0,
sizeof(
f));
1345 memset(&
ssn, 0,
sizeof(
ssn));
1355 readCoilsReq,
sizeof(readCoilsReq));
1361 readCoilsRsp,
sizeof(readCoilsRsp));
1372 static int ModbusParserTest18(
void)
1377 uint32_t input_len =
sizeof(readCoilsReq), part2_len = 3;
1378 uint8_t *input = readCoilsReq;
1383 memset(&
f, 0,
sizeof(
f));
1384 memset(&
ssn, 0,
sizeof(
ssn));
1394 input, input_len - part2_len);
1404 input_len =
sizeof(readCoilsRsp);
1406 input = readCoilsRsp;
1409 input, input_len - part2_len);
1425 static int ModbusParserTest19(
void)
1439 memset(&
f, 0,
sizeof(
Flow));
1462 "(msg:\"Modbus invalid Function code\"; "
1464 "modbus.invalid_function_code; "
1473 invalidFunctionCode,
1474 sizeof(invalidFunctionCode));
1477 ModbusState *modbus_state =
f.
alstate;
1499 ModbusParserTest01);
1500 UtRegisterTest(
"ModbusParserTest02 - Modbus Write Multiple registers request",
1501 ModbusParserTest02);
1502 UtRegisterTest(
"ModbusParserTest03 - Modbus Read/Write Multiple registers request",
1503 ModbusParserTest03);
1504 UtRegisterTest(
"ModbusParserTest04 - Modbus Force Listen Only Mode request",
1505 ModbusParserTest04);
1506 UtRegisterTest(
"ModbusParserTest05 - Modbus invalid Protocol version",
1507 ModbusParserTest05);
1508 UtRegisterTest(
"ModbusParserTest06 - Modbus unsolicited response",
1509 ModbusParserTest06);
1510 UtRegisterTest(
"ModbusParserTest07 - Modbus invalid Length request",
1511 ModbusParserTest07);
1512 UtRegisterTest(
"ModbusParserTest08 - Modbus Exception code invalid",
1513 ModbusParserTest08);
1514 UtRegisterTest(
"ModbusParserTest09 - Modbus fragmentation - 1 ADU in 2 TCP packets",
1515 ModbusParserTest09);
1516 UtRegisterTest(
"ModbusParserTest10 - Modbus fragmentation - 2 ADU in 1 TCP packet",
1517 ModbusParserTest10);
1518 UtRegisterTest(
"ModbusParserTest11 - Modbus exceeded Length request",
1519 ModbusParserTest11);
1521 ModbusParserTest12);
1522 UtRegisterTest(
"ModbusParserTest13 - Modbus Mask Write register request",
1523 ModbusParserTest13);
1524 UtRegisterTest(
"ModbusParserTest14 - Modbus Write single register request",
1525 ModbusParserTest14);
1526 UtRegisterTest(
"ModbusParserTest15 - Modbus invalid Mask Write register request",
1527 ModbusParserTest15);
1528 UtRegisterTest(
"ModbusParserTest16 - Modbus invalid Write single register request",
1529 ModbusParserTest16);
1531 ModbusParserTest17);
1532 UtRegisterTest(
"ModbusParserTest18 - Modbus stream depth in 2 TCP packets",
1533 ModbusParserTest18);
1534 UtRegisterTest(
"ModbusParserTest19 - Modbus invalid Function code",
1535 ModbusParserTest19);