@ -988,38 +988,40 @@ static inline bool CheckGap(TcpSession *ssn, TcpStream *stream, Packet *p)
/** \internal
* \ brief get stream buffer and update the app - layer
* \ param stream pointer to pointer as app - layer can switch flow dir
* \ retval 0 success
*/
static int ReassembleUpdateAppLayer ( ThreadVars * tv ,
TcpReassemblyThreadCtx * ra_ctx ,
TcpSession * ssn , TcpStream * stream ,
TcpSession * ssn , TcpStream * * stream ,
Packet * p , enum StreamUpdateDir dir )
{
uint64_t app_progress = STREAM_APP_PROGRESS ( stream ) ;
uint64_t app_progress = STREAM_APP_PROGRESS ( * stream ) ;
SCLogDebug ( " app progress % " PRIu64 , app_progress ) ;
SCLogDebug ( " last_ack %u, base_seq %u " , stream - > last_ack , stream - > base_seq ) ;
SCLogDebug ( " last_ack %u, base_seq %u " , ( * stream ) - > last_ack , ( * stream ) - > base_seq ) ;
const uint8_t * mydata ;
uint32_t mydata_len ;
while ( 1 ) {
GetAppBuffer ( stream , & mydata , & mydata_len , app_progress ) ;
if ( mydata = = NULL & & mydata_len > 0 & & CheckGap ( ssn , stream , p ) ) {
GetAppBuffer ( * stream , & mydata , & mydata_len , app_progress ) ;
if ( mydata = = NULL & & mydata_len > 0 & & CheckGap ( ssn , * stream , p ) ) {
SCLogDebug ( " sending GAP to app-layer (size: %u) " , mydata_len ) ;
int r = AppLayerHandleTCPData ( tv , ra_ctx , p , p - > flow , ssn , stream ,
NULL , mydata_len ,
StreamGetAppLayerFlags ( ssn , stream , p , dir ) | STREAM_GAP ) ;
StreamGetAppLayerFlags ( ssn , * stream , p , dir ) | STREAM_GAP ) ;
AppLayerProfilingStore ( ra_ctx - > app_tctx , p ) ;
StreamTcpSetEvent ( p , STREAM_REASSEMBLY_SEQ_GAP ) ;
StatsIncr ( tv , ra_ctx - > counter_tcp_reass_gap ) ;
stream - > app_progress_rel + = mydata_len ;
app_progress + = mydata_len ;
/* AppLayerHandleTCPData has likely updated progress. */
app_progress = STREAM_APP_PROGRESS ( * stream ) ;
if ( r < 0 )
break ;
return 0 ;
continue ;
} else if ( mydata = = NULL | | mydata_len = = 0 ) {
@ -1033,7 +1035,7 @@ static int ReassembleUpdateAppLayer (ThreadVars *tv,
//PrintRawDataFp(stdout, mydata, mydata_len);
SCLogDebug ( " stream %p data in buffer %p of len %u and offset % " PRIu64 ,
stream , & stream - > sb , mydata_len , app_progress ) ;
* stream , & ( * stream ) - > sb , mydata_len , app_progress ) ;
/* get window of data that is acked */
if ( StreamTcpInlineMode ( ) = = FALSE ) {
@ -1041,10 +1043,10 @@ static int ReassembleUpdateAppLayer (ThreadVars *tv,
// fall through, we use all available data
} else {
uint64_t last_ack_abs = app_progress ; /* absolute right edge of ack'd data */
if ( STREAM_LASTACK_GT_BASESEQ ( stream ) ) {
if ( STREAM_LASTACK_GT_BASESEQ ( * stream ) ) {
/* get window of data that is acked */
uint32_t delta = stream - > last_ack - stream - > base_seq ;
DEBUG_VALIDATE_BUG_ON ( delta > 10000000ULL & & delta > stream - > window ) ;
uint32_t delta = ( * stream ) - > last_ack - ( * stream ) - > base_seq ;
DEBUG_VALIDATE_BUG_ON ( delta > 10000000ULL & & delta > ( * stream ) - > window ) ;
/* get max absolute offset */
last_ack_abs + = delta ;
}
@ -1061,24 +1063,11 @@ static int ReassembleUpdateAppLayer (ThreadVars *tv,
}
/* update the app-layer */
int r = AppLayerHandleTCPData ( tv , ra_ctx , p , p - > flow , ssn , stream ,
( void ) AppLayerHandleTCPData ( tv , ra_ctx , p , p - > flow , ssn , stream ,
( uint8_t * ) mydata , mydata_len ,
StreamGetAppLayerFlags ( ssn , stream , p , dir ) ) ;
StreamGetAppLayerFlags ( ssn , * stream , p , dir ) ) ;
AppLayerProfilingStore ( ra_ctx - > app_tctx , p ) ;
/* see if we can update the progress */
if ( r = = 0 & & mydata_len > 0 & &
StreamTcpIsSetStreamFlagAppProtoDetectionCompleted ( stream ) )
{
SCLogDebug ( " app progress % " PRIu64 " increasing with data len %u to % " PRIu64 ,
app_progress , mydata_len , app_progress + mydata_len ) ;
stream - > app_progress_rel + = mydata_len ;
SCLogDebug ( " app progress now % " PRIu64 , STREAM_APP_PROGRESS ( stream ) ) ;
} else {
SCLogDebug ( " NOT UPDATED app progress still % " PRIu64 , app_progress ) ;
}
SCReturnInt ( 0 ) ;
}
@ -1121,7 +1110,7 @@ int StreamTcpReassembleAppLayer (ThreadVars *tv, TcpReassemblyThreadCtx *ra_ctx,
if ( ssn - > state > = TCP_CLOSING | | ( p - > flags & PKT_PSEUDO_STREAM_END ) ) {
SCLogDebug ( " sending empty eof message " ) ;
/* send EOF to app layer */
AppLayerHandleTCPData ( tv , ra_ctx , p , p - > flow , ssn , stream ,
AppLayerHandleTCPData ( tv , ra_ctx , p , p - > flow , ssn , & stream ,
NULL , 0 ,
StreamGetAppLayerFlags ( ssn , stream , p , dir ) ) ;
AppLayerProfilingStore ( ra_ctx - > app_tctx , p ) ;
@ -1131,7 +1120,7 @@ int StreamTcpReassembleAppLayer (ThreadVars *tv, TcpReassemblyThreadCtx *ra_ctx,
}
/* with all that out of the way, lets update the app-layer */
return ReassembleUpdateAppLayer ( tv , ra_ctx , ssn , stream , p , dir ) ;
return ReassembleUpdateAppLayer ( tv , ra_ctx , ssn , & stream , p , dir ) ;
}
/** \internal