|
|
|
|
@ -133,66 +133,66 @@ int AppLayerHandleTCPData(AlpProtoDetectThreadCtx *dp_ctx, Flow *f,
|
|
|
|
|
SCReturnInt(r);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* if we don't know the proto yet and we have received a stream
|
|
|
|
|
* initializer message, we run proto detection.
|
|
|
|
|
* We receive 2 stream init msgs (one for each direction) but we
|
|
|
|
|
* only run the proto detection once. */
|
|
|
|
|
if (f->alproto == ALPROTO_UNKNOWN && (flags & STREAM_GAP)) {
|
|
|
|
|
ssn->flags |= STREAMTCP_FLAG_APPPROTO_DETECTION_COMPLETED;
|
|
|
|
|
SCLogDebug("ALPROTO_UNKNOWN flow %p, due to GAP in stream start", f);
|
|
|
|
|
StreamTcpSetSessionNoReassemblyFlag(ssn, 0);
|
|
|
|
|
} else if (f->alproto == ALPROTO_UNKNOWN && (flags & STREAM_START)) {
|
|
|
|
|
SCLogDebug("Stream initializer (len %" PRIu32 ")", data_len);
|
|
|
|
|
/* if we don't know the proto yet and we have received a stream
|
|
|
|
|
* initializer message, we run proto detection.
|
|
|
|
|
* We receive 2 stream init msgs (one for each direction) but we
|
|
|
|
|
* only run the proto detection once. */
|
|
|
|
|
if (f->alproto == ALPROTO_UNKNOWN && (flags & STREAM_GAP)) {
|
|
|
|
|
ssn->flags |= STREAMTCP_FLAG_APPPROTO_DETECTION_COMPLETED;
|
|
|
|
|
SCLogDebug("ALPROTO_UNKNOWN flow %p, due to GAP in stream start", f);
|
|
|
|
|
StreamTcpSetSessionNoReassemblyFlag(ssn, 0);
|
|
|
|
|
} else if (f->alproto == ALPROTO_UNKNOWN && (flags & STREAM_START)) {
|
|
|
|
|
SCLogDebug("Stream initializer (len %" PRIu32 ")", data_len);
|
|
|
|
|
#ifdef PRINT
|
|
|
|
|
if (data_len > 0) {
|
|
|
|
|
printf("=> Init Stream Data (app layer) -- start %s%s\n",
|
|
|
|
|
flags & STREAM_TOCLIENT ? "toclient" : "",
|
|
|
|
|
flags & STREAM_TOSERVER ? "toserver" : "");
|
|
|
|
|
PrintRawDataFp(stdout, data, data_len);
|
|
|
|
|
printf("=> Init Stream Data -- end\n");
|
|
|
|
|
}
|
|
|
|
|
if (data_len > 0) {
|
|
|
|
|
printf("=> Init Stream Data (app layer) -- start %s%s\n",
|
|
|
|
|
flags & STREAM_TOCLIENT ? "toclient" : "",
|
|
|
|
|
flags & STREAM_TOSERVER ? "toserver" : "");
|
|
|
|
|
PrintRawDataFp(stdout, data, data_len);
|
|
|
|
|
printf("=> Init Stream Data -- end\n");
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
PACKET_PROFILING_APP_PD_START(dp_ctx);
|
|
|
|
|
f->alproto = AppLayerDetectGetProto(&alp_proto_ctx, dp_ctx, f,
|
|
|
|
|
data, data_len, flags, IPPROTO_TCP);
|
|
|
|
|
PACKET_PROFILING_APP_PD_END(dp_ctx);
|
|
|
|
|
PACKET_PROFILING_APP_PD_START(dp_ctx);
|
|
|
|
|
f->alproto = AppLayerDetectGetProto(&alp_proto_ctx, dp_ctx, f,
|
|
|
|
|
data, data_len, flags, IPPROTO_TCP);
|
|
|
|
|
PACKET_PROFILING_APP_PD_END(dp_ctx);
|
|
|
|
|
|
|
|
|
|
if (f->alproto != ALPROTO_UNKNOWN) {
|
|
|
|
|
ssn->flags |= STREAMTCP_FLAG_APPPROTO_DETECTION_COMPLETED;
|
|
|
|
|
if (f->alproto != ALPROTO_UNKNOWN) {
|
|
|
|
|
ssn->flags |= STREAMTCP_FLAG_APPPROTO_DETECTION_COMPLETED;
|
|
|
|
|
|
|
|
|
|
PACKET_PROFILING_APP_START(dp_ctx, f->alproto);
|
|
|
|
|
r = AppLayerParse(dp_ctx->alproto_local_storage[f->alproto], f, f->alproto, flags, data, data_len);
|
|
|
|
|
PACKET_PROFILING_APP_END(dp_ctx, f->alproto);
|
|
|
|
|
} else {
|
|
|
|
|
if ((f->flags & FLOW_TS_PM_PP_ALPROTO_DETECT_DONE) &&
|
|
|
|
|
(f->flags & FLOW_TC_PM_PP_ALPROTO_DETECT_DONE)) {
|
|
|
|
|
FlowSetSessionNoApplayerInspectionFlag(f);
|
|
|
|
|
ssn->flags |= STREAMTCP_FLAG_APPPROTO_DETECTION_COMPLETED;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
PACKET_PROFILING_APP_START(dp_ctx, f->alproto);
|
|
|
|
|
r = AppLayerParse(dp_ctx->alproto_local_storage[f->alproto], f, f->alproto, flags, data, data_len);
|
|
|
|
|
PACKET_PROFILING_APP_END(dp_ctx, f->alproto);
|
|
|
|
|
} else {
|
|
|
|
|
SCLogDebug("stream data (len %" PRIu32 " alproto "
|
|
|
|
|
"%"PRIu16" (flow %p)", data_len, f->alproto, f);
|
|
|
|
|
#ifdef PRINT
|
|
|
|
|
if (data_len > 0) {
|
|
|
|
|
printf("=> Stream Data (app layer) -- start %s%s\n",
|
|
|
|
|
flags & STREAM_TOCLIENT ? "toclient" : "",
|
|
|
|
|
flags & STREAM_TOSERVER ? "toserver" : "");
|
|
|
|
|
PrintRawDataFp(stdout, data, data_len);
|
|
|
|
|
printf("=> Stream Data -- end\n");
|
|
|
|
|
if ((f->flags & FLOW_TS_PM_PP_ALPROTO_DETECT_DONE) &&
|
|
|
|
|
(f->flags & FLOW_TC_PM_PP_ALPROTO_DETECT_DONE)) {
|
|
|
|
|
FlowSetSessionNoApplayerInspectionFlag(f);
|
|
|
|
|
ssn->flags |= STREAMTCP_FLAG_APPPROTO_DETECTION_COMPLETED;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
SCLogDebug("stream data (len %" PRIu32 " alproto "
|
|
|
|
|
"%"PRIu16" (flow %p)", data_len, f->alproto, f);
|
|
|
|
|
#ifdef PRINT
|
|
|
|
|
if (data_len > 0) {
|
|
|
|
|
printf("=> Stream Data (app layer) -- start %s%s\n",
|
|
|
|
|
flags & STREAM_TOCLIENT ? "toclient" : "",
|
|
|
|
|
flags & STREAM_TOSERVER ? "toserver" : "");
|
|
|
|
|
PrintRawDataFp(stdout, data, data_len);
|
|
|
|
|
printf("=> Stream Data -- end\n");
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
/* if we don't have a data object here we are not getting it
|
|
|
|
|
* a start msg should have gotten us one */
|
|
|
|
|
if (f->alproto != ALPROTO_UNKNOWN) {
|
|
|
|
|
PACKET_PROFILING_APP_START(dp_ctx, f->alproto);
|
|
|
|
|
r = AppLayerParse(dp_ctx->alproto_local_storage[f->alproto], f, f->alproto, flags, data, data_len);
|
|
|
|
|
PACKET_PROFILING_APP_END(dp_ctx, f->alproto);
|
|
|
|
|
} else {
|
|
|
|
|
SCLogDebug(" smsg not start, but no l7 data? Weird");
|
|
|
|
|
}
|
|
|
|
|
/* if we don't have a data object here we are not getting it
|
|
|
|
|
* a start msg should have gotten us one */
|
|
|
|
|
if (f->alproto != ALPROTO_UNKNOWN) {
|
|
|
|
|
PACKET_PROFILING_APP_START(dp_ctx, f->alproto);
|
|
|
|
|
r = AppLayerParse(dp_ctx->alproto_local_storage[f->alproto], f, f->alproto, flags, data, data_len);
|
|
|
|
|
PACKET_PROFILING_APP_END(dp_ctx, f->alproto);
|
|
|
|
|
} else {
|
|
|
|
|
SCLogDebug(" smsg not start, but no l7 data? Weird");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
SCReturnInt(r);
|
|
|
|
|
}
|
|
|
|
|
|