}
}
+ if ((ssn->flags & STREAMTCP_FLAG_APP_LAYER_DISABLED) &&
+ (stream->flags & STREAMTCP_STREAM_FLAG_NEW_RAW_DISABLED)) {
+ SCLogDebug("ssn %p: both app and raw reassembly disabled, not reassembling", ssn);
+ SCReturnInt(0);
+ }
+
/* If we have reached the defined depth for either of the stream, then stop
reassembling the TCP session */
uint32_t size = StreamTcpReassembleCheckDepth(stream, TCP_GET_SEQ(p), p->payload_len);
seg->payload_len = size;
seg->seq = TCP_GET_SEQ(p);
+ if (ssn->flags & STREAMTCP_FLAG_APP_LAYER_DISABLED)
+ seg->flags |= SEGMENTTCP_FLAG_APPLAYER_PROCESSED;
+
/* if raw reassembly is disabled for new segments, flag each
* segment as complete for raw before insert */
if (stream->flags & STREAMTCP_STREAM_FLAG_NEW_RAW_DISABLED) {
* \retval 1 app layer is done with this segment
* \retval 0 not done yet
*/
-#define StreamTcpAppLayerSegmentProcessed(stream, segment) \
- (( ( (stream)->flags & STREAMTCP_STREAM_FLAG_GAP ) || \
+#define StreamTcpAppLayerSegmentProcessed(ssn, stream, segment) \
+ (( ( (ssn)->flags & STREAMTCP_FLAG_APP_LAYER_DISABLED) || \
+ ( (stream)->flags & STREAMTCP_STREAM_FLAG_GAP ) || \
( (segment)->flags & SEGMENTTCP_FLAG_APPLAYER_PROCESSED ) ? 1 :0 ))
/** \internal
}
/* check app layer conditions */
- if (!(f->flags & FLOW_NO_APPLAYER_INSPECTION)) {
- if (!(StreamTcpAppLayerSegmentProcessed(stream, seg))) {
- SCReturnInt(0);
- }
+ if (!(StreamTcpAppLayerSegmentProcessed(ssn, stream, seg))) {
+ SCReturnInt(0);
}
/* check raw reassembly conditions */
seg->payload_len);
/* only remove if app layer reassembly is ready too */
- if (StreamTcpAppLayerSegmentProcessed(stream, seg)) {
+ if (StreamTcpAppLayerSegmentProcessed(ssn, stream, seg)) {
TcpSegment *next_seg = seg->next;
StreamTcpRemoveSegmentFromStream(stream, seg);
StreamTcpSegmentReturntoPool(seg);
* If the stream is in GAP state the app layer flag won't be set */
if (StreamTcpIsSetStreamFlagAppProtoDetectionCompleted(stream) &&
(seg->flags & SEGMENTTCP_FLAG_RAW_PROCESSED) &&
- StreamTcpAppLayerSegmentProcessed(stream, seg))
+ StreamTcpAppLayerSegmentProcessed(ssn, stream, seg))
{
SCLogDebug("segment(%p) of length %"PRIu16" has been processed,"
" so return it to pool", seg, seg->payload_len);
SCLogDebug("seg %p seq %"PRIu32", len %"PRIu16", sum %"PRIu32, seg, seg->seq, seg->payload_len, seg->seq+seg->payload_len);
/* only remove if app layer reassembly is ready too */
- if (StreamTcpAppLayerSegmentProcessed(stream, seg)) {
+ if (StreamTcpAppLayerSegmentProcessed(ssn, stream, seg)) {
TcpSegment *next_seg = seg->next;
StreamTcpRemoveSegmentFromStream(stream, seg);
StreamTcpSegmentReturntoPool(seg);
* next_seq, we know we are missing data that has been ack'd. That
* won't get retransmitted, so it's a data gap.
*/
- if (!(p->flow->flags & FLOW_NO_APPLAYER_INSPECTION)) {
+ if (!(ssn->flags & STREAMTCP_FLAG_APP_LAYER_DISABLED)) {
if (SEQ_GT(seg->seq, next_seq) && SEQ_LT(seg->seq, stream->last_ack)) {
/* send gap signal */
AppLayerHandleTCPData(tv, ra_ctx, p, p->flow, ssn, stream,
seg, seg->seq, seg->payload_len,
(uint32_t)(seg->seq + seg->payload_len));
- if (p->flow->flags & FLOW_NO_APPLAYER_INSPECTION) {
- SCLogDebug("FLOW_NO_APPLAYER_INSPECTION set, breaking out");
- break;
- }
-
if (StreamTcpReturnSegmentCheck(p->flow, ssn, stream, seg) == 1) {
SCLogDebug("removing segment");
TcpSegment *next_seg = seg->next;
StreamTcpSegmentReturntoPool(seg);
seg = next_seg;
continue;
- } else if (StreamTcpAppLayerSegmentProcessed(stream, seg)) {
+ } else if (StreamTcpAppLayerSegmentProcessed(ssn, stream, seg)) {
TcpSegment *next_seg = seg->next;
seg = next_seg;
continue;