}
int StreamTcpReassembleHandleSegment(ThreadVars *tv, TcpReassemblyThreadCtx *ra_ctx,
- TcpSession *ssn, TcpStream *stream,
- Packet *p, PacketQueueNoLock *pq)
+ TcpSession *ssn, TcpStream *stream, Packet *p)
{
SCEnter();
StreamTcpUTInit(&ra_ctx);
StreamTcpUTSetupSession(&ssn);
- PacketQueueNoLock pq;
- memset(&pq,0,sizeof(PacketQueueNoLock));
memset(&f, 0, sizeof (Flow));
memset(&tcph, 0, sizeof (TCPHdr));
ThreadVars tv;
p->tcph->th_ack = htonl(31);
p->payload_len = 10;
- FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p, &pq) == -1);
+ FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, &ssn.client, p) == -1);
p->tcph->th_seq = htonl(20);
p->tcph->th_ack = htonl(31);
p->payload_len = 10;
- FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p, &pq) == -1);
+ FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, &ssn.client, p) == -1);
p->tcph->th_seq = htonl(40);
p->tcph->th_ack = htonl(31);
p->payload_len = 10;
- FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p, &pq) == -1);
+ FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, &ssn.client, p) == -1);
p->tcph->th_seq = htonl(5);
p->tcph->th_ack = htonl(31);
p->payload_len = 30;
- FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p, &pq) == -1);
+ FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, &ssn.client, p) == -1);
StreamTcpUTClearSession(&ssn);
StreamTcpUTDeinit(ra_ctx);
StreamTcpUTInit(&ra_ctx);
StreamTcpUTSetupSession(&ssn);
- PacketQueueNoLock pq;
- memset(&pq,0,sizeof(PacketQueueNoLock));
memset(&f, 0, sizeof (Flow));
memset(&tcph, 0, sizeof (TCPHdr));
ThreadVars tv;
p->tcph->th_ack = htonl(31);
p->payload_len = 304;
- FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p, &pq) == -1);
+ FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, &ssn.client, p) == -1);
p->tcph->th_seq = htonl(857961534);
p->tcph->th_ack = htonl(31);
p->payload_len = 1460;
- FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p, &pq) == -1);
+ FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, &ssn.client, p) == -1);
p->tcph->th_seq = htonl(857963582);
p->tcph->th_ack = htonl(31);
p->payload_len = 1460;
- FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p, &pq) == -1);
+ FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, &ssn.client, p) == -1);
p->tcph->th_seq = htonl(857960946);
p->tcph->th_ack = htonl(31);
p->payload_len = 1460;
- FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p, &pq) == -1);
+ FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, &ssn.client, p) == -1);
StreamTcpUTClearSession(&ssn);
StreamTcpUTDeinit(ra_ctx);
Flow *f = NULL;
TCPHdr tcph;
TcpSession ssn;
- PacketQueueNoLock pq;
- memset(&pq,0,sizeof(PacketQueueNoLock));
memset(&tcph, 0, sizeof (TCPHdr));
ThreadVars tv;
memset(&tv, 0, sizeof (ThreadVars));
ssn.state = TCP_ESTABLISHED;
TcpStream *s = &ssn.client;
SCLogDebug("1 -- start");
- FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1);
+ FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1);
p->flowflags = FLOW_PKT_TOCLIENT;
p->payload = httpbuf2;
s = &ssn.server;
ssn.server.last_ack = 11;
SCLogDebug("2 -- start");
- FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1);
+ FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1);
p->flowflags = FLOW_PKT_TOSERVER;
p->payload = httpbuf3;
s = &ssn.client;
ssn.client.last_ack = 55;
SCLogDebug("3 -- start");
- FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1);
+ FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1);
p->flowflags = FLOW_PKT_TOCLIENT;
p->payload = httpbuf2;
s = &ssn.server;
ssn.server.last_ack = 12;
SCLogDebug("4 -- start");
- FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1);
+ FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1);
/* check is have the segment in the list and flagged or not */
TcpSegment *seg = RB_MIN(TCPSEG, &ssn.client.seg_tree);
s = &ssn.client;
ssn.client.last_ack = 100;
SCLogDebug("5 -- start");
- FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1);
+ FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1);
p->flowflags = FLOW_PKT_TOCLIENT;
p->payload = httpbuf2;
s = &ssn.server;
ssn.server.last_ack = 13;
SCLogDebug("6 -- start");
- FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1);
+ FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1);
p->flowflags = FLOW_PKT_TOSERVER;
p->payload = httpbuf5;
s = &ssn.client;
ssn.client.last_ack = 145;
SCLogDebug("7 -- start");
- FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1);
+ FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1);
p->flowflags = FLOW_PKT_TOCLIENT;
p->payload = httpbuf2;
s = &ssn.server;
ssn.server.last_ack = 16;
SCLogDebug("8 -- start");
- FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1);
+ FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1);
FAIL_IF(f->alproto != ALPROTO_HTTP1);
StreamTcpUTClearSession(&ssn);
TCPHdr tcph;
TcpSession ssn;
ThreadVars tv;
- PacketQueueNoLock pq;
- memset(&pq,0,sizeof(PacketQueueNoLock));
memset(&tcph, 0, sizeof (TCPHdr));
memset(&tv, 0, sizeof (ThreadVars));
StreamTcpInitConfig(true);
p->payload_len = 1;
s = &ssn.client;
- FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1);
+ FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1);
p->flowflags = FLOW_PKT_TOCLIENT;
p->payload = NULL;
p->tcph = &tcph;
s = &ssn.server;
- FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1);
+ FAIL_IF(StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1);
}
FAIL_IF(f->alproto != ALPROTO_HTTP1);
#define STREAMTCP_DEFAULT_TOCLIENT_CHUNK_SIZE 2560
#define STREAMTCP_DEFAULT_MAX_SYNACK_QUEUED 5
-static int StreamTcpHandleFin(ThreadVars *tv, StreamTcpThread *, TcpSession *, Packet *, PacketQueueNoLock *);
+static int StreamTcpHandleFin(ThreadVars *tv, StreamTcpThread *, TcpSession *, Packet *);
void StreamTcpReturnStreamSegments (TcpStream *);
void StreamTcpInitConfig(bool);
int StreamTcpGetFlowState(void *);
static int StreamTcpHandleTimestamp(TcpSession * , Packet *);
static int StreamTcpValidateRst(TcpSession * , Packet *);
static inline int StreamTcpValidateAck(TcpSession *ssn, TcpStream *, Packet *);
-static int StreamTcpStateDispatch(ThreadVars *tv, Packet *p,
- StreamTcpThread *stt, TcpSession *ssn, PacketQueueNoLock *pq,
- uint8_t state);
+static int StreamTcpStateDispatch(
+ ThreadVars *tv, Packet *p, StreamTcpThread *stt, TcpSession *ssn, const uint8_t state);
extern thread_local uint64_t t_pcapcnt;
extern int g_detect_disabled;
* \retval 0 ok
* \retval -1 error
*/
-static int StreamTcpPacketStateNone(ThreadVars *tv, Packet *p,
- StreamTcpThread *stt, TcpSession *ssn,
- PacketQueueNoLock *pq)
+static int StreamTcpPacketStateNone(
+ ThreadVars *tv, Packet *p, StreamTcpThread *stt, TcpSession *ssn)
{
if (p->tcph->th_flags & TH_RST) {
StreamTcpSetEvent(p, STREAM_RST_BUT_NO_SESSION);
ssn->client.last_ts = 0;
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
ssn->flags |= STREAMTCP_FLAG_SACKOK;
SCLogDebug("ssn %p: assuming SACK permitted for both sides", ssn);
StreamTcpUpdateNextSeq(ssn, &ssn->client, (ssn->client.next_seq + p->payload_len));
SCLogDebug("ssn: %p (TFO) [len: %d] isn %u base_seq %u next_seq %u payload len %u",
ssn, p->tcpvars.tfo.len, ssn->client.isn, ssn->client.base_seq, ssn->client.next_seq, p->payload_len);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
}
}
ssn->client.last_ts = 0;
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
ssn->flags |= STREAMTCP_FLAG_SACKOK;
SCLogDebug("ssn %p: assuming SACK permitted for both sides", ssn);
* \param stt Strean Thread module registered to handle the stream handling
*/
-static int StreamTcpPacketStateSynSent(ThreadVars *tv, Packet *p,
- StreamTcpThread *stt, TcpSession *ssn,
- PacketQueueNoLock *pq)
+static int StreamTcpPacketStateSynSent(
+ ThreadVars *tv, Packet *p, StreamTcpThread *stt, TcpSession *ssn)
{
DEBUG_VALIDATE_BUG_ON(ssn == NULL);
ssn->flags |= STREAMTCP_FLAG_SACKOK;
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
} else {
SCLogDebug("ssn %p: default case", ssn);
* \retval -1 error
*/
-static int StreamTcpPacketStateSynRecv(ThreadVars *tv, Packet *p,
- StreamTcpThread *stt, TcpSession *ssn,
- PacketQueueNoLock *pq)
+static int StreamTcpPacketStateSynRecv(
+ ThreadVars *tv, Packet *p, StreamTcpThread *stt, TcpSession *ssn)
{
DEBUG_VALIDATE_BUG_ON(ssn == NULL);
return -1;
}
- if ((StreamTcpHandleFin(tv, stt, ssn, p, pq)) == -1)
+ if ((StreamTcpHandleFin(tv, stt, ssn, p)) == -1)
return -1;
/* SYN/ACK */
StreamTcpPacketSetState(p, ssn, TCP_ESTABLISHED);
SCLogDebug("ssn %p: =~ ssn state is now TCP_ESTABLISHED", ssn);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
SCLogDebug("ssn %p: ssn->client.next_win %" PRIu32 ", "
"ssn->client.last_ack %"PRIu32"", ssn,
StreamTcpPacketSetState(p, ssn, TCP_ESTABLISHED);
SCLogDebug("ssn %p: =~ ssn state is now TCP_ESTABLISHED", ssn);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
/* If asynchronous stream handling is allowed then set the session,
if packet's seq number is equal the expected seq no.*/
StreamTcpPacketSetState(p, ssn, TCP_ESTABLISHED);
SCLogDebug("ssn %p: =~ ssn state is now TCP_ESTABLISHED", ssn);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
/* Upon receiving the packet with correct seq number and wrong
ACK number, it causes the other end to send RST. But some target
system (Linux & solaris) does not RST the connection, so it is
StreamTcpPacketSetState(p, ssn, TCP_ESTABLISHED);
SCLogDebug("ssn %p: =~ ssn state is now TCP_ESTABLISHED", ssn);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
/* if we get a packet with a proper ack, but a seq that is beyond
* next_seq but in-window, we probably missed some packets */
StreamTcpPacketSetState(p, ssn, TCP_ESTABLISHED);
SCLogDebug("ssn %p: =~ ssn state is now TCP_ESTABLISHED", ssn);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
- /* toclient packet: after having missed the 3whs's final ACK */
+ /* toclient packet: after having missed the 3whs's final ACK */
} else if ((ack_indicates_missed_3whs_ack_packet ||
(ssn->flags & STREAMTCP_FLAG_TCP_FAST_OPEN)) &&
SEQ_EQ(TCP_GET_ACK(p), ssn->client.last_ack) &&
StreamTcpPacketSetState(p, ssn, TCP_ESTABLISHED);
SCLogDebug("ssn %p: =~ ssn state is now TCP_ESTABLISHED", ssn);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
} else {
SCLogDebug("ssn %p: wrong seq nr on packet", ssn);
* \param p Packet which has to be handled in this TCP state.
* \param stt Strean Thread module registered to handle the stream handling
*/
-static int HandleEstablishedPacketToServer(ThreadVars *tv, TcpSession *ssn, Packet *p,
- StreamTcpThread *stt, PacketQueueNoLock *pq)
+static int HandleEstablishedPacketToServer(
+ ThreadVars *tv, TcpSession *ssn, Packet *p, StreamTcpThread *stt)
{
SCLogDebug("ssn %p: =+ pkt (%" PRIu32 ") is to server: SEQ %" PRIu32 ","
"ACK %" PRIu32 ", WIN %"PRIu16"", ssn, p->payload_len,
StreamTcpUpdateNextWin(ssn, &ssn->server, (ssn->server.last_ack + ssn->server.window));
/* handle data (if any) */
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
} else {
SCLogDebug("ssn %p: toserver => SEQ out of window, packet SEQ "
* \param p Packet which has to be handled in this TCP state.
* \param stt Strean Thread module registered to handle the stream handling
*/
-static int HandleEstablishedPacketToClient(ThreadVars *tv, TcpSession *ssn, Packet *p,
- StreamTcpThread *stt, PacketQueueNoLock *pq)
+static int HandleEstablishedPacketToClient(
+ ThreadVars *tv, TcpSession *ssn, Packet *p, StreamTcpThread *stt)
{
SCLogDebug("ssn %p: =+ pkt (%" PRIu32 ") is to client: SEQ %" PRIu32 ","
" ACK %" PRIu32 ", WIN %"PRIu16"", ssn, p->payload_len,
StreamTcpUpdateNextWin(ssn, &ssn->client, (ssn->client.last_ack + ssn->client.window));
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
} else {
SCLogDebug("ssn %p: client => SEQ out of window, packet SEQ"
"%" PRIu32 ", payload size %" PRIu32 " (%" PRIu32 "),"
* \param stt Strean Thread module registered to handle the stream handling
*/
-static int StreamTcpPacketStateEstablished(ThreadVars *tv, Packet *p,
- StreamTcpThread *stt, TcpSession *ssn, PacketQueueNoLock *pq)
+static int StreamTcpPacketStateEstablished(
+ ThreadVars *tv, Packet *p, StreamTcpThread *stt, TcpSession *ssn)
{
DEBUG_VALIDATE_BUG_ON(ssn == NULL);
StreamTcpHandleTimestamp(ssn, p);
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->client.next_seq,
ssn->server.last_ack);
StreamTcpHandleTimestamp(ssn, p);
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->server.next_seq,
ssn->client.last_ack);
ssn->client.last_ack, ssn->server.next_win,
ssn->server.window);
- if ((StreamTcpHandleFin(tv, stt, ssn, p, pq)) == -1)
+ if ((StreamTcpHandleFin(tv, stt, ssn, p)) == -1)
return -1;
/* SYN/ACK */
if (PKT_IS_TOSERVER(p)) {
/* Process the received packet to server */
- HandleEstablishedPacketToServer(tv, ssn, p, stt, pq);
+ HandleEstablishedPacketToServer(tv, ssn, p, stt);
SCLogDebug("ssn %p: next SEQ %" PRIu32 ", last ACK %" PRIu32 ","
" next win %" PRIu32 ", win %" PRIu32 "", ssn,
}
/* Process the received packet to client */
- HandleEstablishedPacketToClient(tv, ssn, p, stt, pq);
+ HandleEstablishedPacketToClient(tv, ssn, p, stt);
SCLogDebug("ssn %p: next SEQ %" PRIu32 ", last ACK %" PRIu32 ","
" next win %" PRIu32 ", win %" PRIu32 "", ssn,
* \retval -1 something wrong with the packet
*/
-static int StreamTcpHandleFin(ThreadVars *tv, StreamTcpThread *stt,
- TcpSession *ssn, Packet *p, PacketQueueNoLock *pq)
+static int StreamTcpHandleFin(ThreadVars *tv, StreamTcpThread *stt, TcpSession *ssn, Packet *p)
{
if (PKT_IS_TOSERVER(p)) {
SCLogDebug("ssn %p: pkt (%" PRIu32 ") is to server: SEQ %" PRIu32 ","
if (SEQ_LT(ssn->server.next_seq, TCP_GET_ACK(p)))
ssn->server.next_seq = TCP_GET_ACK(p);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK %" PRIu32 "",
ssn, ssn->client.next_seq, ssn->server.last_ack);
if (SEQ_LT(ssn->client.next_seq, TCP_GET_ACK(p)))
ssn->client.next_seq = TCP_GET_ACK(p);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK %" PRIu32 "",
ssn, ssn->server.next_seq, ssn->client.last_ack);
* \retval -1 something wrong with the packet
*/
-static int StreamTcpPacketStateFinWait1(ThreadVars *tv, Packet *p,
- StreamTcpThread *stt, TcpSession *ssn, PacketQueueNoLock *pq)
+static int StreamTcpPacketStateFinWait1(
+ ThreadVars *tv, Packet *p, StreamTcpThread *stt, TcpSession *ssn)
{
DEBUG_VALIDATE_BUG_ON(ssn == NULL);
StreamTcpHandleTimestamp(ssn, p);
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
} else {
if ((p->tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->client, p) == 0)
StreamTcpUpdateLastAck(ssn, &ssn->client,
StreamTcpHandleTimestamp(ssn, p);
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
}
} else if ((p->tcph->th_flags & (TH_FIN|TH_ACK)) == (TH_FIN|TH_ACK)) {
StreamTcpUpdateNextSeq(ssn, &ssn->client, (ssn->client.next_seq + p->payload_len));
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->client.next_seq,
StreamTcpUpdateNextSeq(ssn, &ssn->server, (ssn->server.next_seq + p->payload_len));
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->server.next_seq,
StreamTcpUpdateNextSeq(ssn, &ssn->client, (ssn->client.next_seq + p->payload_len));
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->client.next_seq,
StreamTcpUpdateNextSeq(ssn, &ssn->server, (ssn->server.next_seq + p->payload_len));
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->server.next_seq,
/* update next_win */
StreamTcpUpdateNextWin(ssn, &ssn->server, (ssn->server.last_ack + ssn->server.window));
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->client.next_seq,
/* update next_win */
StreamTcpUpdateNextWin(ssn, &ssn->client, (ssn->client.last_ack + ssn->client.window));
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->server.next_seq,
* \param stt Strean Thread module registered to handle the stream handling
*/
-static int StreamTcpPacketStateFinWait2(ThreadVars *tv, Packet *p,
- StreamTcpThread *stt, TcpSession *ssn, PacketQueueNoLock *pq)
+static int StreamTcpPacketStateFinWait2(
+ ThreadVars *tv, Packet *p, StreamTcpThread *stt, TcpSession *ssn)
{
DEBUG_VALIDATE_BUG_ON(ssn == NULL);
StreamTcpHandleTimestamp(ssn, p);
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
} else {
if ((p->tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->client, p) == 0)
StreamTcpUpdateLastAck(ssn, &ssn->client,
StreamTcpHandleTimestamp(ssn, p);
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
}
} else if (p->tcph->th_flags & TH_FIN) {
if (SEQ_LT(ssn->server.next_seq, TCP_GET_ACK(p)))
ssn->server.next_seq = TCP_GET_ACK(p);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->client.next_seq,
if (SEQ_LT(ssn->client.next_seq, TCP_GET_ACK(p)))
ssn->client.next_seq = TCP_GET_ACK(p);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->server.next_seq,
ssn->client.last_ack);
/* update next_win */
StreamTcpUpdateNextWin(ssn, &ssn->server, (ssn->server.last_ack + ssn->server.window));
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->client.next_seq,
/* update next_win */
StreamTcpUpdateNextWin(ssn, &ssn->client, (ssn->client.last_ack + ssn->client.window));
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->server.next_seq,
* \param stt Strean Thread module registered to handle the stream handling
*/
-static int StreamTcpPacketStateClosing(ThreadVars *tv, Packet *p,
- StreamTcpThread *stt, TcpSession *ssn, PacketQueueNoLock *pq)
+static int StreamTcpPacketStateClosing(
+ ThreadVars *tv, Packet *p, StreamTcpThread *stt, TcpSession *ssn)
{
DEBUG_VALIDATE_BUG_ON(ssn == NULL);
StreamTcpHandleTimestamp(ssn, p);
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
} else {
if ((p->tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->client, p) == 0)
StreamTcpUpdateLastAck(ssn, &ssn->client,
StreamTcpHandleTimestamp(ssn, p);
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
}
} else if (p->tcph->th_flags & TH_SYN) {
if (SEQ_LT(ssn->server.next_seq, TCP_GET_ACK(p)))
ssn->server.next_seq = TCP_GET_ACK(p);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->client.next_seq,
ssn->server.last_ack);
if (SEQ_LT(ssn->client.next_seq, TCP_GET_ACK(p)))
ssn->client.next_seq = TCP_GET_ACK(p);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
SCLogDebug("StreamTcpPacketStateClosing (%p): =+ next SEQ "
"%" PRIu32 ", last ACK %" PRIu32 "", ssn,
ssn->server.next_seq, ssn->client.last_ack);
* \param stt Strean Thread module registered to handle the stream handling
*/
-static int StreamTcpPacketStateCloseWait(ThreadVars *tv, Packet *p,
- StreamTcpThread *stt, TcpSession *ssn, PacketQueueNoLock *pq)
+static int StreamTcpPacketStateCloseWait(
+ ThreadVars *tv, Packet *p, StreamTcpThread *stt, TcpSession *ssn)
{
SCEnter();
StreamTcpHandleTimestamp(ssn, p);
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
} else {
if ((p->tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->client, p) == 0)
StreamTcpUpdateLastAck(ssn, &ssn->client,
StreamTcpHandleTimestamp(ssn, p);
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
}
} else if (p->tcph->th_flags & TH_FIN) {
if (SEQ_LT(ssn->server.next_seq, TCP_GET_ACK(p)))
ssn->server.next_seq = TCP_GET_ACK(p);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->client.next_seq,
ssn->server.last_ack);
if (SEQ_LT(ssn->client.next_seq, TCP_GET_ACK(p)))
ssn->client.next_seq = TCP_GET_ACK(p);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->server.next_seq,
ssn->client.last_ack);
if (SEQ_EQ(TCP_GET_SEQ(p),ssn->client.next_seq))
StreamTcpUpdateNextSeq(ssn, &ssn->client, (ssn->client.next_seq + p->payload_len));
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->client.next_seq,
ssn->server.last_ack);
if (SEQ_EQ(TCP_GET_SEQ(p),ssn->server.next_seq))
StreamTcpUpdateNextSeq(ssn, &ssn->server, (ssn->server.next_seq + p->payload_len));
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->server.next_seq,
ssn->client.last_ack);
* \param stt Strean Thread module registered to handle the stream handling
*/
-static int StreamTcpPacketStateLastAck(ThreadVars *tv, Packet *p,
- StreamTcpThread *stt, TcpSession *ssn, PacketQueueNoLock *pq)
+static int StreamTcpPacketStateLastAck(
+ ThreadVars *tv, Packet *p, StreamTcpThread *stt, TcpSession *ssn)
{
DEBUG_VALIDATE_BUG_ON(ssn == NULL);
StreamTcpHandleTimestamp(ssn, p);
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
} else {
if ((p->tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->client, p) == 0)
StreamTcpUpdateLastAck(ssn, &ssn->client,
StreamTcpHandleTimestamp(ssn, p);
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
}
} else if (p->tcph->th_flags & TH_FIN) {
if (SEQ_LT(ssn->server.next_seq, TCP_GET_ACK(p)))
ssn->server.next_seq = TCP_GET_ACK(p);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->client.next_seq,
ssn->server.last_ack);
* \param stt Strean Thread module registered to handle the stream handling
*/
-static int StreamTcpPacketStateTimeWait(ThreadVars *tv, Packet *p,
- StreamTcpThread *stt, TcpSession *ssn, PacketQueueNoLock *pq)
+static int StreamTcpPacketStateTimeWait(
+ ThreadVars *tv, Packet *p, StreamTcpThread *stt, TcpSession *ssn)
{
DEBUG_VALIDATE_BUG_ON(ssn == NULL);
StreamTcpHandleTimestamp(ssn, p);
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
} else {
if ((p->tcph->th_flags & TH_ACK) && StreamTcpValidateAck(ssn, &ssn->client, p) == 0)
StreamTcpUpdateLastAck(ssn, &ssn->client,
StreamTcpHandleTimestamp(ssn, p);
}
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
}
} else if (p->tcph->th_flags & TH_FIN) {
if (SEQ_LT(ssn->server.next_seq, TCP_GET_ACK(p)))
ssn->server.next_seq = TCP_GET_ACK(p);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->client.next_seq,
ssn->server.last_ack);
if (SEQ_LT(ssn->client.next_seq, TCP_GET_ACK(p)))
ssn->client.next_seq = TCP_GET_ACK(p);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK "
"%" PRIu32 "", ssn, ssn->server.next_seq,
ssn->client.last_ack);
return 0;
}
-static int StreamTcpPacketStateClosed(ThreadVars *tv, Packet *p,
- StreamTcpThread *stt, TcpSession *ssn, PacketQueueNoLock *pq)
+static int StreamTcpPacketStateClosed(
+ ThreadVars *tv, Packet *p, StreamTcpThread *stt, TcpSession *ssn)
{
DEBUG_VALIDATE_BUG_ON(ssn == NULL);
* see if we perhaps need to continue processing anyway. */
if ((stream->flags & STREAMTCP_STREAM_FLAG_RST_RECV) == 0) {
if (ostream->flags & STREAMTCP_STREAM_FLAG_RST_RECV) {
- if (StreamTcpStateDispatch(tv, p, stt, ssn, &stt->pseudo_queue, ssn->pstate) < 0)
+ if (StreamTcpStateDispatch(tv, p, stt, ssn, ssn->pstate) < 0)
return -1;
/* if state is still "closed", it wasn't updated by our dispatch. */
if (ssn->state == TCP_CLOSED)
* \brief call packet handling function for 'state'
* \param state current TCP state
*/
-static inline int StreamTcpStateDispatch(ThreadVars *tv, Packet *p,
- StreamTcpThread *stt, TcpSession *ssn, PacketQueueNoLock *pq,
- const uint8_t state)
+static inline int StreamTcpStateDispatch(
+ ThreadVars *tv, Packet *p, StreamTcpThread *stt, TcpSession *ssn, const uint8_t state)
{
DEBUG_VALIDATE_BUG_ON(ssn == NULL);
switch (state) {
case TCP_SYN_SENT:
SCLogDebug("packet received on TCP_SYN_SENT state");
- if (StreamTcpPacketStateSynSent(tv, p, stt, ssn, pq)) {
+ if (StreamTcpPacketStateSynSent(tv, p, stt, ssn)) {
return -1;
}
break;
case TCP_SYN_RECV:
SCLogDebug("packet received on TCP_SYN_RECV state");
- if (StreamTcpPacketStateSynRecv(tv, p, stt, ssn, pq)) {
+ if (StreamTcpPacketStateSynRecv(tv, p, stt, ssn)) {
return -1;
}
break;
case TCP_ESTABLISHED:
SCLogDebug("packet received on TCP_ESTABLISHED state");
- if (StreamTcpPacketStateEstablished(tv, p, stt, ssn, pq)) {
+ if (StreamTcpPacketStateEstablished(tv, p, stt, ssn)) {
return -1;
}
break;
case TCP_FIN_WAIT1:
SCLogDebug("packet received on TCP_FIN_WAIT1 state");
- if (StreamTcpPacketStateFinWait1(tv, p, stt, ssn, pq)) {
+ if (StreamTcpPacketStateFinWait1(tv, p, stt, ssn)) {
return -1;
}
break;
case TCP_FIN_WAIT2:
SCLogDebug("packet received on TCP_FIN_WAIT2 state");
- if (StreamTcpPacketStateFinWait2(tv, p, stt, ssn, pq)) {
+ if (StreamTcpPacketStateFinWait2(tv, p, stt, ssn)) {
return -1;
}
break;
case TCP_CLOSING:
SCLogDebug("packet received on TCP_CLOSING state");
- if (StreamTcpPacketStateClosing(tv, p, stt, ssn, pq)) {
+ if (StreamTcpPacketStateClosing(tv, p, stt, ssn)) {
return -1;
}
break;
case TCP_CLOSE_WAIT:
SCLogDebug("packet received on TCP_CLOSE_WAIT state");
- if (StreamTcpPacketStateCloseWait(tv, p, stt, ssn, pq)) {
+ if (StreamTcpPacketStateCloseWait(tv, p, stt, ssn)) {
return -1;
}
break;
case TCP_LAST_ACK:
SCLogDebug("packet received on TCP_LAST_ACK state");
- if (StreamTcpPacketStateLastAck(tv, p, stt, ssn, pq)) {
+ if (StreamTcpPacketStateLastAck(tv, p, stt, ssn)) {
return -1;
}
break;
case TCP_TIME_WAIT:
SCLogDebug("packet received on TCP_TIME_WAIT state");
- if (StreamTcpPacketStateTimeWait(tv, p, stt, ssn, pq)) {
+ if (StreamTcpPacketStateTimeWait(tv, p, stt, ssn)) {
return -1;
}
break;
/* TCP session memory is not returned to pool until timeout. */
SCLogDebug("packet received on closed state");
- if (StreamTcpPacketStateClosed(tv, p, stt, ssn, pq)) {
+ if (StreamTcpPacketStateClosed(tv, p, stt, ssn)) {
return -1;
}
}
if (ssn == NULL || ssn->state == TCP_NONE) {
- if (StreamTcpPacketStateNone(tv, p, stt, ssn, &stt->pseudo_queue) == -1) {
+ if (StreamTcpPacketStateNone(tv, p, stt, ssn) == -1) {
goto error;
}
if (p->flags & PKT_PSEUDO_STREAM_END) {
if (PKT_IS_TOCLIENT(p)) {
ssn->client.last_ack = TCP_GET_ACK(p);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p);
} else {
ssn->server.last_ack = TCP_GET_ACK(p);
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, p, pq);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p);
}
/* straight to 'skip' as we already handled reassembly */
goto skip;
}
/* handle the per 'state' logic */
- if (StreamTcpStateDispatch(tv, p, stt, ssn, &stt->pseudo_queue, ssn->state) < 0)
+ if (StreamTcpStateDispatch(tv, p, stt, ssn, ssn->state) < 0)
goto error;
skip:
/* process the opposing direction of the original packet */
if (PKT_IS_TOSERVER(np)) {
SCLogDebug("pseudo packet is to server");
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->client, np, NULL);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, np);
} else {
SCLogDebug("pseudo packet is to client");
- StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn,
- &ssn->server, np, NULL);
+ StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, np);
}
/* enqueue this packet so we inspect it in detect etc */