-/* Copyright (C) 2015-2024 Open Information Security Foundation
+/* Copyright (C) 2015-2025 Open Information Security Foundation
*
* You can copy, redistribute or modify this Program under the terms of
* the GNU General Public License version 2 as published by the Free
* \param input pointer to the DNP3 frame (starting with link header)
* \param input_len length of the input frame
*/
-static void DNP3HandleUserDataRequest(DNP3State *dnp3, const uint8_t *input,
- uint32_t input_len)
+static void DNP3HandleUserDataRequest(
+ Flow *f, DNP3State *dnp3, const uint8_t *input, uint32_t input_len)
{
DNP3LinkHeader *lh;
DNP3TransportHeader th;
tx->buffer_len - sizeof(DNP3ApplicationHeader), &tx->objects)) {
tx->complete = 1;
}
+ if (f != NULL) {
+ AppLayerParserTriggerRawStreamInspection(f, STREAM_TOSERVER);
+ }
}
-static void DNP3HandleUserDataResponse(DNP3State *dnp3, const uint8_t *input,
- uint32_t input_len)
+static void DNP3HandleUserDataResponse(
+ Flow *f, DNP3State *dnp3, const uint8_t *input, uint32_t input_len)
{
DNP3LinkHeader *lh;
DNP3TransportHeader th;
tx, tx->buffer + offset, tx->buffer_len - offset, &tx->objects)) {
tx->complete = 1;
}
+ if (f != NULL) {
+ AppLayerParserTriggerRawStreamInspection(f, STREAM_TOCLIENT);
+ }
}
/**
* \retval number of bytes processed or -1 if the data stream does not look
* like DNP3.
*/
-static int DNP3HandleRequestLinkLayer(DNP3State *dnp3, const uint8_t *input,
- uint32_t input_len)
+static int DNP3HandleRequestLinkLayer(
+ Flow *f, DNP3State *dnp3, const uint8_t *input, uint32_t input_len)
{
SCEnter();
uint32_t processed = 0;
goto next;
}
- DNP3HandleUserDataRequest(dnp3, input, frame_len);
+ DNP3HandleUserDataRequest(f, dnp3, input, frame_len);
next:
/* Advance the input buffer. */
if (!DNP3BufferAdd(buffer, input, input_len)) {
goto error;
}
- processed = DNP3HandleRequestLinkLayer(dnp3,
- buffer->buffer + buffer->offset,
- buffer->len - buffer->offset);
+ processed = DNP3HandleRequestLinkLayer(
+ f, dnp3, buffer->buffer + buffer->offset, buffer->len - buffer->offset);
if (processed < 0) {
goto error;
}
DNP3BufferTrim(buffer);
}
else {
- processed = DNP3HandleRequestLinkLayer(dnp3, input, input_len);
+ processed = DNP3HandleRequestLinkLayer(f, dnp3, input, input_len);
if (processed < 0) {
SCLogDebug("Failed to process request link layer.");
goto error;
* \retval number of bytes processed or -1 if the data stream does not
* like look DNP3.
*/
-static int DNP3HandleResponseLinkLayer(DNP3State *dnp3, const uint8_t *input,
- uint32_t input_len)
+static int DNP3HandleResponseLinkLayer(
+ Flow *f, DNP3State *dnp3, const uint8_t *input, uint32_t input_len)
{
SCEnter();
uint32_t processed = 0;
goto next;
}
- DNP3HandleUserDataResponse(dnp3, input, frame_len);
+ DNP3HandleUserDataResponse(f, dnp3, input, frame_len);
next:
/* Advance the input buffer. */
if (!DNP3BufferAdd(buffer, input, input_len)) {
goto error;
}
- processed = DNP3HandleResponseLinkLayer(dnp3,
- buffer->buffer + buffer->offset,
- buffer->len - buffer->offset);
+ processed = DNP3HandleResponseLinkLayer(
+ f, dnp3, buffer->buffer + buffer->offset, buffer->len - buffer->offset);
if (processed < 0) {
goto error;
}
goto done;
}
- processed = DNP3HandleResponseLinkLayer(dnp3, input, input_len);
+ processed = DNP3HandleResponseLinkLayer(f, dnp3, input, input_len);
if (processed < 0) {
goto error;
}
};
DNP3State *dnp3state = DNP3StateAlloc(NULL, ALPROTO_UNKNOWN);
- int pdus = DNP3HandleRequestLinkLayer(dnp3state, pkt, sizeof(pkt));
+ int pdus = DNP3HandleRequestLinkLayer(NULL, dnp3state, pkt, sizeof(pkt));
FAIL_IF(pdus < 1);
DNP3Transaction *dnp3tx = DNP3GetTx(dnp3state, 0);
FAIL_IF_NULL(dnp3tx);
DNP3State *dnp3state = DNP3StateAlloc(NULL, ALPROTO_UNKNOWN);
FAIL_IF_NULL(dnp3state);
- int bytes = DNP3HandleRequestLinkLayer(dnp3state, pkt, sizeof(pkt));
+ int bytes = DNP3HandleRequestLinkLayer(NULL, dnp3state, pkt, sizeof(pkt));
FAIL_IF(bytes != sizeof(pkt));
DNP3Transaction *tx = DNP3GetTx(dnp3state, 0);
FAIL_IF_NULL(tx);
DNP3State *dnp3state = DNP3StateAlloc(NULL, ALPROTO_UNKNOWN);
FAIL_IF_NULL(dnp3state);
- int bytes = DNP3HandleRequestLinkLayer(dnp3state, pkt, sizeof(pkt));
+ int bytes = DNP3HandleRequestLinkLayer(NULL, dnp3state, pkt, sizeof(pkt));
FAIL_IF(bytes != sizeof(pkt));
DNP3StateFree(dnp3state);