@ -655,6 +655,8 @@ int AFPReadFromRing(AFPThreadVars *ptv)
union thdr h ;
union thdr h ;
struct sockaddr_ll * from ;
struct sockaddr_ll * from ;
uint8_t emergency_flush = 0 ;
uint8_t emergency_flush = 0 ;
int read_pkts = 0 ;
/* Loop till we have packets available */
/* Loop till we have packets available */
while ( 1 ) {
while ( 1 ) {
@ -665,12 +667,21 @@ int AFPReadFromRing(AFPThreadVars *ptv)
}
}
if ( h . h2 - > tp_status = = TP_STATUS_KERNEL ) {
if ( h . h2 - > tp_status = = TP_STATUS_KERNEL ) {
if ( read_pkts = = 0 ) {
if ( + + ptv - > frame_offset > = ptv - > req . tp_frame_nr ) {
ptv - > frame_offset = 0 ;
}
continue ;
}
if ( ( emergency_flush ) & & ( ptv - > flags & AFP_EMERGENCY_MODE ) ) {
if ( ( emergency_flush ) & & ( ptv - > flags & AFP_EMERGENCY_MODE ) ) {
SCReturnInt ( AFP_KERNEL_DROP ) ;
SCReturnInt ( AFP_KERNEL_DROP ) ;
} else {
} else {
SCReturnInt ( AFP_READ_OK ) ;
SCReturnInt ( AFP_READ_OK ) ;
}
}
}
}
read_pkts + + ;
if ( ( ptv - > flags & AFP_EMERGENCY_MODE ) & & ( emergency_flush = = 1 ) ) {
if ( ( ptv - > flags & AFP_EMERGENCY_MODE ) & & ( emergency_flush = = 1 ) ) {
h . h2 - > tp_status = TP_STATUS_KERNEL ;
h . h2 - > tp_status = TP_STATUS_KERNEL ;
goto next_frame ;
goto next_frame ;