StreamTcpGetStreamSize(&ssn->client) > alp_proto_ctx.toserver.async_max) {
SCLogDebug("%u bytes toserver and no proto, no data to "
"client, giving up", alp_proto_ctx.toserver.async_max);
+ ssn->server.flags |= STREAMTCP_STREAM_FLAG_APPPROTO_DETECTION_SKIPPED;
flow_done = 1;
} else if (FLOW_IS_PM_DONE(f, STREAM_TOCLIENT) && FLOW_IS_PP_DONE(f, STREAM_TOCLIENT) &&
StreamTcpGetStreamSize(&ssn->client) == 0 &&
StreamTcpGetStreamSize(&ssn->server) > alp_proto_ctx.toclient.async_max) {
SCLogDebug("%u bytes toclient and no proto, no data to "
"server, giving up", alp_proto_ctx.toclient.async_max);
+ ssn->client.flags |= STREAMTCP_STREAM_FLAG_APPPROTO_DETECTION_SKIPPED;
flow_done = 1;
}
APPLAYER_WRONG_DIRECTION_FIRST_DATA },
{ "APPLAYER_DETECT_PROTOCOL_ONLY_ONE_DIRECTION",
APPLAYER_DETECT_PROTOCOL_ONLY_ONE_DIRECTION },
+ { "APPLAYER_PROTO_DETECTION_SKIPPED",
+ APPLAYER_PROTO_DETECTION_SKIPPED },
{ NULL,
-1 },
};
APPLAYER_MISMATCH_PROTOCOL_BOTH_DIRECTIONS,
APPLAYER_WRONG_DIRECTION_FIRST_DATA,
APPLAYER_DETECT_PROTOCOL_ONLY_ONE_DIRECTION,
+ APPLAYER_PROTO_DETECTION_SKIPPED,
};
#define DECODER_EVENTS_BUFFER_STEPS 5
#define STREAMTCP_STREAM_FLAG_ZERO_TIMESTAMP 0x40
/** App proto detection completed */
#define STREAMTCP_STREAM_FLAG_APPPROTO_DETECTION_COMPLETED 0x80
+/** App proto detection skipped */
+#define STREAMTCP_STREAM_FLAG_APPPROTO_DETECTION_SKIPPED 0x100
/*
* Per SEGMENT flags
seg->payload_len = size;
seg->seq = TCP_GET_SEQ(p);
+ /* proto detection skipped, but now we do get data. Set event. */
+ if (stream->seg_list == NULL &&
+ stream->flags & STREAMTCP_STREAM_FLAG_APPPROTO_DETECTION_SKIPPED) {
+
+ AppLayerDecoderEventsSetEventRaw(p->app_layer_events,
+ APPLAYER_PROTO_DETECTION_SKIPPED);
+ }
+
if (StreamTcpReassembleInsertSegment(tv, ra_ctx, stream, seg, p) != 0) {
SCLogDebug("StreamTcpReassembleInsertSegment failed");
SCReturnInt(-1);