From 00f21f34e8ec6e9ba1330cbadcd12f316652348e Mon Sep 17 00:00:00 2001 From: Gurvinder Singh Date: Mon, 11 Oct 2010 00:37:10 +0200 Subject: [PATCH] support for pseudo packet creation from reassembled stream segments --- src/stream-tcp-private.h | 3 + src/stream-tcp-reassemble.c | 902 ++++++++++++++++++++++++++++++------ src/stream-tcp-reassemble.h | 25 +- src/stream-tcp.c | 437 +++++++++-------- src/util-unittest-helper.c | 36 +- src/util-unittest-helper.h | 3 +- 6 files changed, 1068 insertions(+), 338 deletions(-) diff --git a/src/stream-tcp-private.h b/src/stream-tcp-private.h index b758579f89..aea2245267 100644 --- a/src/stream-tcp-private.h +++ b/src/stream-tcp-private.h @@ -61,6 +61,8 @@ typedef struct TcpStream_ { TcpSegment *seg_list_tail; /**< Last segment in the reassembled stream seg list*/ uint32_t reassembly_depth; /**< The depth value of a stream until when, we will reassemble the stream */ + uint32_t pseudo_ra_base_seq; /**< Base sequence until when we have + reassembled the psuedo packet */ } TcpStream; /* from /usr/include/netinet/tcp.h */ @@ -152,6 +154,7 @@ enum (stream)->ra_raw_base_seq = (seq); \ (stream)->ra_app_base_seq = (seq); \ (stream)->tmp_ra_app_base_seq = (seq); \ + (stream)->pseudo_ra_base_seq = (seq); \ } while(0); \ } diff --git a/src/stream-tcp-reassemble.c b/src/stream-tcp-reassemble.c index 35726fc65d..7c76f3dec1 100644 --- a/src/stream-tcp-reassemble.c +++ b/src/stream-tcp-reassemble.c @@ -27,6 +27,8 @@ * \todo segment insert fasttrack: most pkts are in order */ +#include + #include "suricata-common.h" #include "suricata.h" #include "debug.h" @@ -43,6 +45,7 @@ #include "util-unittest.h" #include "util-print.h" #include "util-host-os-info.h" +#include "util-unittest-helper.h" #include "stream-tcp.h" #include "stream-tcp-private.h" @@ -54,6 +57,8 @@ #include "app-layer-protos.h" #include "app-layer.h" +#define PSEUDO_PACKET_PAYLOAD_SIZE 65416 /* 64 Kb minus max IP and TCP header */ + #ifdef DEBUG static SCMutex segment_pool_memuse_mutex; static uint64_t segment_pool_memuse = 0; @@ -102,6 +107,7 @@ void StreamTcpSegmentDataCopy(TcpSegment *, TcpSegment *); TcpSegment* StreamTcpGetSegment(ThreadVars *tv, TcpReassemblyThreadCtx *, uint16_t); void StreamTcpSegmentReturntoPool(TcpSegment *); void StreamTcpCreateTestPacket(uint8_t *, uint8_t, uint8_t, uint8_t); +void StreamTcpReassemblePseudoPacketCreate(TcpStream *, Packet *, PacketQueue *); /** * \brief Function to Increment the memory usage counter for the TCP reassembly @@ -2381,7 +2387,7 @@ int StreamTcpReassembleProcessAppLayer(TcpReassemblyThreadCtx *ra_ctx) int StreamTcpReassembleHandleSegment(ThreadVars *tv, TcpReassemblyThreadCtx *ra_ctx, TcpSession *ssn, TcpStream *stream, - Packet *p) + Packet *p, PacketQueue *pq) { SCEnter(); SCLogDebug("ssn %p, stream %p, p %p, p->payload_len %"PRIu16"", @@ -2396,6 +2402,9 @@ int StreamTcpReassembleHandleSegment(ThreadVars *tv, TcpReassemblyThreadCtx *ra_ opposing_stream = &ssn->client; } + /* Create the pseudo packet from the reassembled stream to detect the attack */ + StreamTcpReassemblePseudoPacketCreate(opposing_stream, p, pq); + /* handle ack received */ if (StreamTcpReassembleHandleSegmentUpdateACK(ra_ctx, ssn, opposing_stream, p) != 0) { @@ -2419,6 +2428,323 @@ int StreamTcpReassembleHandleSegment(ThreadVars *tv, TcpReassemblyThreadCtx *ra_ SCReturnInt(0); } +/** + * \brief Function to fetch a packet from the packet allocation queue for + * creation of the pseudo packet from the reassembled stream. + * + * @param parent Pointer to the parent of the pseudo packet + * @param pkt pointer to the raw packet of the parent + * @param len length of the packet + * @return upon success returns the pointer to the new pseudo packet + * otherwise NULL + */ +Packet *StreamTcpReassemblePseudoSetup(Packet *parent, uint8_t *pkt, uint32_t len) +{ + Packet *p = PacketGetFromQueueOrAlloc(); + if (p == NULL || len == 0) { + return NULL; + } + + /* set the root ptr to the lowest layer */ + if (parent->root != NULL) + p->root = parent->root; + else + p->root = parent; + + /* copy packet and set lenght, proto */ + p->tunnel_proto = parent->proto; + p->pktlen = len; + memcpy(&p->pkt, pkt, (len - parent->payload_len)); + p->recursion_level = parent->recursion_level + 1; + p->ts.tv_sec = parent->ts.tv_sec; + p->ts.tv_usec = parent->ts.tv_usec; + + /* set tunnel flags */ + + /* tell new packet it's part of a tunnel */ + SET_TUNNEL_PKT(p); + /* tell parent packet it's part of a tunnel */ + SET_TUNNEL_PKT(parent); + + /* increment tunnel packet refcnt in the root packet */ + TUNNEL_INCR_PKT_TPR(p); + + return p; +} + +/** + * \brief Function to setup the IP and TCP header of the pseudo packet from + * the newly copied raw packet contents of the parent. + * + * @param np pointer to the pseudo packet + * @param p pointer to the original packet + */ +void StreamTcpReassemblePseudoPacketSetupHeader(Packet *np, Packet *p) +{ + /* Setup the IP header */ + if (PKT_IS_IPV4(p)) { + np->ip4h = (IPV4Hdr *)(np->pkt + (np->pktlen - IPV4_GET_IPLEN(p))); + PSUEDO_PKT_SET_IPV4HDR(np->ip4h, p->ip4h); + + /* Similarly setup the TCP header with ports in opposite direction */ + np->tcph = (TCPHdr *)(np->ip4h + IPV4_GET_HLEN(p)); + PSUEDO_PKT_SET_TCPHDR(np->tcph, p->tcph); + + /* Setup the adress and port details */ + SET_IPV4_SRC_ADDR(np, &np->src); + SET_IPV4_DST_ADDR(np, &np->dst); + SET_TCP_SRC_PORT(np, &np->sp); + SET_TCP_DST_PORT(np, &np->dp); + + } else if (PKT_IS_IPV6(p)) { + np->ip6h = (IPV6Hdr *)(np->pkt + (np->pktlen - IPV6_GET_PLEN(p) - IPV6_HEADER_LEN)); + PSUEDO_PKT_SET_IPV6HDR(np->ip6h, p->ip6h); + + /* Similarly setup the TCP header with ports in opposite direction */ + np->tcph = (TCPHdr *)(np->ip6h + IPV6_HEADER_LEN); + PSUEDO_PKT_SET_TCPHDR(np->tcph, p->tcph); + + /* Setup the adress and port details */ + SET_IPV6_SRC_ADDR(np, &np->src); + SET_IPV6_DST_ADDR(np, &np->dst); + SET_TCP_SRC_PORT(np, &np->sp); + SET_TCP_DST_PORT(np, &np->dp); + } + + /* Setup the payload pointer to the starting of payload location as in the + original packet, so that we don't overwrite the protocols headers */ + np->payload = np->pkt + (np->pktlen - p->payload_len); + np->payload_len = 0; +} + +/** + * \brief Function to copy the reassembled stream segments in to the pseudo + * packet payload. + * + * @param stream pointer to the stream of which segments are to be copied + * @param p pointer to the original received packet + * @param pq pointer to the packet queue where pseudo packet will be + * enqueued + */ +void StreamTcpReassemblePseudoPacketCreate(TcpStream *stream, Packet *p, + PacketQueue *pq) +{ + SCEnter(); + if (stream->seg_list == NULL) { + SCLogDebug("there is no segments in the stream, so return"); + SCReturn; + } + + Packet *np = StreamTcpReassemblePseudoSetup(p, p->pkt, p->pktlen); + if (np == NULL) { + SCLogDebug("The packet received from packet allocation is NULL"); + SCReturn; + } + + /* Setup the IP and TCP headers */ + StreamTcpReassemblePseudoPacketSetupHeader(np,p); + + /* Start the reassembling of received reassembled segments in to the + pseudo packet to scan and detect the unwanted attacks. Resistance is + FUTILE ;) */ + uint16_t pseudo_offset = 0; + uint16_t payload_offset = 0; + uint16_t payload_len = 0; + TcpSegment *seg = stream->seg_list; + uint32_t next_seq = stream->pseudo_ra_base_seq + 1; + + /* loop through the segments and fill one or more msgs */ + for (; seg != NULL && SEQ_LT(seg->seq, stream->last_ack);) { + SCLogDebug("seg %p", seg); + + /* If packets are fully before ra_base_seq, skip them. We do this + * because we've reassembled up to the ra_base_seq point already, + * so we won't do anything with segments before it anyway. */ + SCLogDebug("checking for pre pseudo_ra_base_seq %"PRIu32" seg %p seq %"PRIu32"" + " len %"PRIu16", combined %"PRIu32" and stream->last_ack " + "%"PRIu32"", stream->pseudo_ra_base_seq, seg, seg->seq, + seg->payload_len, seg->seq+seg->payload_len, stream->last_ack); + + if (SEQ_LEQ((seg->seq + seg->payload_len), (stream->pseudo_ra_base_seq+1)) || + SEQ_LEQ(stream->last_ack, (stream->pseudo_ra_base_seq + + (stream->pseudo_ra_base_seq - seg->seq)))) + { + SCLogDebug("continue to next segment, as pre ra_base_seq %"PRIu32"" + " seg %p seq %"PRIu32" len %"PRIu16"", stream->pseudo_ra_base_seq, seg, + seg->seq, seg->payload_len); + seg = seg->next; + continue; + } + + /* we've run into a sequence gap */ + if (SEQ_GT(seg->seq, next_seq)) { + SCLogDebug("expected next_seq %" PRIu32 ", got %" PRIu32 " , " + "stream->last_ack %" PRIu32 ".", next_seq, seg->seq, + stream->last_ack); + next_seq = seg->seq; + /* We have missed the packet and end host has ack'd it, so + * IDS should advance it's ra_base_seq and should not consider this + * packet any longer, even if it is retransmitted, as end host will + * drop it anyway */ + stream->pseudo_ra_base_seq = seg->seq - 1; + /* As we have a gap in the next payload, so if we have some data in + the current pseudo packet then fetch another packet, under new + packet as the parent */ + if (np->payload_len > 0) { + /* Set the correct payload length in the IP header */ + if (PKT_IS_IPV4(np)) { + np->ip4h->ip_len = (IPV4_GET_HLEN(np)) + (TCP_GET_HLEN(np)) + + np->payload_len; + } else if (PKT_IS_IPV6(np)) { + np->ip6h->s_ip6_plen = (TCP_GET_HLEN(np)) + np->payload_len; + } + PacketEnqueue(pq, np); + Packet *gap = StreamTcpReassemblePseudoSetup(p, p->pkt, p->pktlen); + if (gap == NULL) { + SCLogDebug("The packet received from packet allocation is NULL"); + SCReturn; + } + np = gap; + StreamTcpReassemblePseudoPacketSetupHeader(np,p); + } + } + + /* if the segment ends beyond ra_base_seq we need to consider it */ + if (SEQ_GT((seg->seq + seg->payload_len), stream->pseudo_ra_base_seq)) { + SCLogDebug("seg->seq %" PRIu32 ", seg->payload_len %" PRIu32 ", " + "stream->pseudo_ra_base_seq %" PRIu32 "", seg->seq, + seg->payload_len, stream->pseudo_ra_base_seq); + + /* handle segments partly before ra_base_seq */ + if (SEQ_GT(stream->pseudo_ra_base_seq, seg->seq)) { + payload_offset = stream->pseudo_ra_base_seq - seg->seq; + + if (SEQ_LT(stream->last_ack, (seg->seq + seg->payload_len))) { + + if (SEQ_LT(stream->last_ack, stream->pseudo_ra_base_seq)) { + payload_len = (stream->last_ack - seg->seq); + } else { + payload_len = (stream->last_ack - seg->seq) - + payload_offset; + } + } else { + payload_len = seg->payload_len - payload_offset; + } + + if (SCLogDebugEnabled()) { + BUG_ON(payload_offset > seg->payload_len); + BUG_ON((payload_len + payload_offset) > seg->payload_len); + } + } else { + payload_offset = 0; + + if (SEQ_LT(stream->last_ack, (seg->seq + seg->payload_len))) { + payload_len = stream->last_ack - seg->seq; + } else { + payload_len = seg->payload_len; + } + } + SCLogDebug("payload_offset is %"PRIu16", payload_len is %"PRIu16"" + " and stream->last_ack is %"PRIu32"", payload_offset, + payload_len, stream->last_ack); + /* copy the data into the pseudo packet payload */ + uint16_t copy_size = PSEUDO_PACKET_PAYLOAD_SIZE - np->payload_len - pseudo_offset; + if (copy_size > payload_len) { + copy_size = payload_len; + } + + if (SCLogDebugEnabled()) { + BUG_ON(copy_size > PSEUDO_PACKET_PAYLOAD_SIZE); + } + SCLogDebug("copy_size is %"PRIu16"", copy_size); + + memcpy(np->payload + pseudo_offset, seg->payload + payload_offset, + copy_size); + pseudo_offset += copy_size; + stream->pseudo_ra_base_seq += copy_size; + SCLogDebug("stream->pseudo_ra_base_seq %"PRIu32"", stream->pseudo_ra_base_seq); + + np->payload_len += copy_size; + + if (np->payload_len == PSEUDO_PACKET_PAYLOAD_SIZE) { + /* Set the correct payload length in the IP header */ + if (PKT_IS_IPV4(np)) { + np->ip4h->ip_len = (IPV4_GET_HLEN(np)) + (TCP_GET_HLEN(np)) + + np->payload_len; + } else if (PKT_IS_IPV6(np)) { + np->ip6h->s_ip6_plen = (TCP_GET_HLEN(np)) + np->payload_len; + } + PacketEnqueue(pq, np); + Packet *newp = StreamTcpReassemblePseudoSetup(p, p->pkt, p->pktlen); + if (newp == NULL) { + SCLogDebug("The packet received from Allocation queue is NULL"); + SCReturn; + } + np = newp; + StreamTcpReassemblePseudoPacketSetupHeader(np,p); + } + + /* if the payload len is bigger than what we copied, we handle the + * rest of the payload next... */ + if (copy_size < payload_len) { + SCLogDebug("copy_size %" PRIu32 " < %" PRIu32 "", copy_size, + payload_len); + + payload_offset += copy_size; + payload_len -= copy_size; + SCLogDebug("payload_offset is %"PRIu16", seg->payload_len is " + "%"PRIu16" and stream->last_ack is %"PRIu32"", + payload_offset, seg->payload_len, stream->last_ack); + if (SCLogDebugEnabled()) { + BUG_ON(payload_offset > seg->payload_len); + } + + copy_size = PSEUDO_PACKET_PAYLOAD_SIZE - np->payload_len - pseudo_offset; + if (copy_size > (seg->payload_len - payload_offset)) { + copy_size = (seg->payload_len - payload_offset); + } + + if (SCLogDebugEnabled()) { + BUG_ON(copy_size > PSEUDO_PACKET_PAYLOAD_SIZE); + } + SCLogDebug("copy_size is %"PRIu16"", copy_size); + + memcpy(np->payload + pseudo_offset, seg->payload + payload_offset, + copy_size); + pseudo_offset += copy_size; + stream->pseudo_ra_base_seq += copy_size; + SCLogDebug("stream->pseudo_ra_base_seq %"PRIu32"", stream->pseudo_ra_base_seq); + + np->payload_len += copy_size; + SCLogDebug("copied payload_offset %" PRIu32 ", " + "pseudo_offset %" PRIu32 ", copy_size %" PRIu32 "", + payload_offset, pseudo_offset, copy_size); + } else { + payload_offset = 0; + } + } + + /* done with this segment, switch to the next if any */ + next_seq = seg->seq + seg->payload_len; + seg = seg->next; + } + + /* XXX VJ can you check how to set the TCP header length properly. As in IPv4 + * case, after running the following if the contents are changing in the unit + * test */ + //PrintRawDataFp(stdout, np->payload, np->payload_len); + /* Set the correct payload length in the IP header */ + if (PKT_IS_IPV4(np)) { + np->ip4h->ip_len = (IPV4_GET_HLEN(np)) + (TCP_GET_HLEN(np)) + + np->payload_len; + } else if (PKT_IS_IPV6(np)) { + np->ip6h->s_ip6_plen = (TCP_GET_HLEN(np)) + np->payload_len; + } + //PrintRawDataFp(stdout, np->payload, np->payload_len); + PacketEnqueue(pq, np); + SCReturn; +} + /** * \brief Function to replace the data from a specific point up to given length. * @@ -2588,6 +2914,8 @@ static int StreamTcpReassembleStreamTest(TcpStream *stream) { StreamMsgQueueSetMinInitChunkLen(FLOW_PKT_TOCLIENT, 4096); StreamMsgQueueSetMinChunkLen(FLOW_PKT_TOSERVER, 4096); StreamMsgQueueSetMinChunkLen(FLOW_PKT_TOCLIENT, 4096); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&ssn, 0, sizeof (TcpSession)); memset(p, 0, SIZE_OF_PACKET); @@ -2606,167 +2934,185 @@ static int StreamTcpReassembleStreamTest(TcpStream *stream) { tcph.th_flags = TH_PUSH | TH_ACK; p->tcph = &tcph; p->flowflags = FLOW_PKT_TOSERVER; + StreamTcpCreateTestPacket(payload, 0x41, 3, 4); /*AAA*/ p->tcph->th_seq = htonl(12); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 3; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { - SCFree(p); - return 0; + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { + SCFree(p); + return 0; } + StreamTcpCreateTestPacket(payload, 0x42, 2, 4); /*BB*/ p->tcph->th_seq = htonl(16); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 2; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { - SCFree(p); - return 0; + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { + SCFree(p); + return 0; } + StreamTcpCreateTestPacket(payload, 0x43, 3, 4); /*CCC*/ p->tcph->th_seq = htonl(18); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 3; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { - SCFree(p); - return 0; + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { + SCFree(p); + return 0; } + StreamTcpCreateTestPacket(payload, 0x44, 1, 4); /*D*/ p->tcph->th_seq = htonl(22); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 1; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { - SCFree(p); - return 0; + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { + SCFree(p); + return 0; } + StreamTcpCreateTestPacket(payload, 0x45, 2, 4); /*EE*/ p->tcph->th_seq = htonl(25); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 2; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { - SCFree(p); - return 0; + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { + SCFree(p); + return 0; } + StreamTcpCreateTestPacket(payload, 0x46, 3, 4); /*FFF*/ p->tcph->th_seq = htonl(27); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 3; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { - SCFree(p); - return 0; + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { + SCFree(p); + return 0; } + StreamTcpCreateTestPacket(payload, 0x47, 2, 4); /*GG*/ p->tcph->th_seq = htonl(30); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 2; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { - SCFree(p); - return 0; + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { + SCFree(p); + return 0; } + StreamTcpCreateTestPacket(payload, 0x48, 2, 4); /*HH*/ p->tcph->th_seq = htonl(32); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 2; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { - SCFree(p); - return 0; + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { + SCFree(p); + return 0; } + StreamTcpCreateTestPacket(payload, 0x49, 1, 4); /*I*/ p->tcph->th_seq = htonl(34); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 1; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { - SCFree(p); - return 0; + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { + SCFree(p); + return 0; } + StreamTcpCreateTestPacket(payload, 0x4a, 4, 4); /*JJJJ*/ p->tcph->th_seq = htonl(13); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 4; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { - SCFree(p); - return 0; + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { + SCFree(p); + return 0; } + StreamTcpCreateTestPacket(payload, 0x4b, 3, 4); /*KKK*/ p->tcph->th_seq = htonl(18); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 3; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { - SCFree(p); - return 0; + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { + SCFree(p); + return 0; } + StreamTcpCreateTestPacket(payload, 0x4c, 3, 4); /*LLL*/ p->tcph->th_seq = htonl(21); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 3; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { - SCFree(p); - return 0; + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { + SCFree(p); + return 0; } + StreamTcpCreateTestPacket(payload, 0x4d, 3, 4); /*MMM*/ p->tcph->th_seq = htonl(24); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 3; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { - SCFree(p); - return 0; + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { + SCFree(p); + return 0; } + StreamTcpCreateTestPacket(payload, 0x4e, 1, 4); /*N*/ p->tcph->th_seq = htonl(28); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 1; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { - SCFree(p); - return 0; + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { + SCFree(p); + return 0; } + StreamTcpCreateTestPacket(payload, 0x4f, 1, 4); /*O*/ p->tcph->th_seq = htonl(31); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 1; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { - SCFree(p); - return 0; + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { + SCFree(p); + return 0; } + StreamTcpCreateTestPacket(payload, 0x50, 1, 4); /*P*/ p->tcph->th_seq = htonl(32); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 1; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { - SCFree(p); - return 0; + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { + SCFree(p); + return 0; } + StreamTcpCreateTestPacket(payload, 0x51, 2, 4); /*QQ*/ p->tcph->th_seq = htonl(34); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 2; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { - SCFree(p); - return 0; + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { + SCFree(p); + return 0; } + StreamTcpCreateTestPacket(payload, 0x30, 1, 4); /*0*/ p->tcph->th_seq = htonl(11); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 1; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { - SCFree(p); - return 0; + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { + SCFree(p); + return 0; } StreamTcpReassembleFreeThreadCtx(ra_ctx); @@ -2930,6 +3276,8 @@ static int StreamTcpTestStartsBeforeListSegment(TcpStream *stream) { StreamMsgQueueSetMinInitChunkLen(FLOW_PKT_TOCLIENT, 4096); StreamMsgQueueSetMinChunkLen(FLOW_PKT_TOSERVER, 4096); StreamMsgQueueSetMinChunkLen(FLOW_PKT_TOCLIENT, 4096); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&ssn, 0, sizeof (TcpSession)); memset(p, 0, SIZE_OF_PACKET); @@ -2955,61 +3303,67 @@ static int StreamTcpTestStartsBeforeListSegment(TcpStream *stream) { p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 1; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } + StreamTcpCreateTestPacket(payload, 0x44, 1, 4); /*D*/ p->tcph->th_seq = htonl(22); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 1; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } + StreamTcpCreateTestPacket(payload, 0x45, 2, 4); /*EE*/ p->tcph->th_seq = htonl(25); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 2; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } + StreamTcpCreateTestPacket(payload, 0x41, 2, 4); /*AA*/ p->tcph->th_seq = htonl(15); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 2; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } + StreamTcpCreateTestPacket(payload, 0x4a, 4, 4); /*JJJJ*/ p->tcph->th_seq = htonl(14); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 4; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } + StreamTcpCreateTestPacket(payload, 0x4c, 3, 4); /*LLL*/ p->tcph->th_seq = htonl(21); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 3; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } + StreamTcpCreateTestPacket(payload, 0x4d, 3, 4); /*MMM*/ p->tcph->th_seq = htonl(24); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 3; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } @@ -3034,6 +3388,8 @@ static int StreamTcpTestStartsAtSameListSegment(TcpStream *stream) { uint8_t payload[4]; TCPHdr tcph; TcpReassemblyThreadCtx *ra_ctx = StreamTcpReassembleInitThreadCtx(); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); /* prevent L7 from kicking in */ StreamMsgQueueSetMinInitChunkLen(FLOW_PKT_TOSERVER, 4096); @@ -3064,61 +3420,67 @@ static int StreamTcpTestStartsAtSameListSegment(TcpStream *stream) { p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 3; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } + StreamTcpCreateTestPacket(payload, 0x48, 2, 4); /*HH*/ p->tcph->th_seq = htonl(32); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 2; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } + StreamTcpCreateTestPacket(payload, 0x49, 1, 4); /*I*/ p->tcph->th_seq = htonl(34); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 1; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } + StreamTcpCreateTestPacket(payload, 0x4b, 3, 4); /*KKK*/ p->tcph->th_seq = htonl(18); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 3; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } + StreamTcpCreateTestPacket(payload, 0x4c, 4, 4); /*LLLL*/ p->tcph->th_seq = htonl(18); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 4; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } + StreamTcpCreateTestPacket(payload, 0x50, 1, 4); /*P*/ p->tcph->th_seq = htonl(32); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 1; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } + StreamTcpCreateTestPacket(payload, 0x51, 2, 4); /*QQ*/ p->tcph->th_seq = htonl(34); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 2; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } @@ -3144,6 +3506,8 @@ static int StreamTcpTestStartsAfterListSegment(TcpStream *stream) { uint8_t payload[4]; TCPHdr tcph; TcpReassemblyThreadCtx *ra_ctx = StreamTcpReassembleInitThreadCtx(); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); /* prevent L7 from kicking in */ StreamMsgQueueSetMinInitChunkLen(FLOW_PKT_TOSERVER, 4096); @@ -3174,52 +3538,57 @@ static int StreamTcpTestStartsAfterListSegment(TcpStream *stream) { p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 2; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } + StreamTcpCreateTestPacket(payload, 0x46, 3, 4); /*FFF*/ p->tcph->th_seq = htonl(27); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 3; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } + StreamTcpCreateTestPacket(payload, 0x47, 2, 4); /*GG*/ p->tcph->th_seq = htonl(30); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 2; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } + StreamTcpCreateTestPacket(payload, 0x4a, 2, 4); /*JJ*/ p->tcph->th_seq = htonl(13); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 2; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } + StreamTcpCreateTestPacket(payload, 0x4f, 1, 4); /*O*/ p->tcph->th_seq = htonl(31); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 1; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } + StreamTcpCreateTestPacket(payload, 0x4e, 1, 4); /*N*/ p->tcph->th_seq = htonl(28); p->tcph->th_ack = htonl(31); p->payload = payload; p->payload_len = 1; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, stream, p, &pq) == -1) { SCFree(p); return 0; } @@ -3861,6 +4230,8 @@ static int StreamTcpTestMissedPacket (TcpReassemblyThreadCtx *ra_ctx, Address src; Address dst; struct in_addr in; + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); @@ -3907,7 +4278,7 @@ static int StreamTcpTestMissedPacket (TcpReassemblyThreadCtx *ra_ctx, s = &ssn->client; } - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, ssn, s, p, &pq) == -1) { SCFree(p); return -1; } @@ -4122,6 +4493,7 @@ static int StreamTcpReassembleTest28 (void) { ssn.server.last_ack = 22; ssn.server.ra_raw_base_seq = ssn.server.ra_app_base_seq = 6; + ssn.server.pseudo_ra_base_seq = 6; ssn.server.isn = 6; StreamTcpCreateTestPacket(payload, 0x41, 2, 4); /*AA*/ @@ -4294,7 +4666,8 @@ static int StreamTcpReassembleTest30 (void) { th_flags = TH_ACK; ssn.server.last_ack = 22; - ssn.server.ra_raw_base_seq = 9; + ssn.server.ra_raw_base_seq = ssn.server.ra_app_base_seq = 9; + ssn.server.pseudo_ra_base_seq = 9; ssn.server.isn = 9; StreamTcpInitConfig(TRUE); @@ -4483,6 +4856,8 @@ static int StreamTcpReassembleTest32(void) { StreamMsgQueueSetMinChunkLen(FLOW_PKT_TOSERVER, 4096); StreamMsgQueueSetMinChunkLen(FLOW_PKT_TOCLIENT, 4096); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&ssn, 0, sizeof (TcpSession)); memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); @@ -4506,7 +4881,7 @@ static int StreamTcpReassembleTest32(void) { p->payload_len = 10; StreamTcpCreateTestPacket(payload, 0x41, 10, 20); /*AA*/ p->payload = payload; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p) == -1) + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p, &pq) == -1) goto end; p->tcph->th_seq = htonl(20); @@ -4514,7 +4889,7 @@ static int StreamTcpReassembleTest32(void) { p->payload_len = 10; StreamTcpCreateTestPacket(payload, 0x42, 10, 20); /*BB*/ p->payload = payload; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p) == -1) + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p, &pq) == -1) goto end; p->tcph->th_seq = htonl(40); @@ -4522,7 +4897,7 @@ static int StreamTcpReassembleTest32(void) { p->payload_len = 10; StreamTcpCreateTestPacket(payload, 0x43, 10, 20); /*CC*/ p->payload = payload; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p) == -1) + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p, &pq) == -1) goto end; p->tcph->th_seq = htonl(5); @@ -4530,7 +4905,7 @@ static int StreamTcpReassembleTest32(void) { p->payload_len = 20; StreamTcpCreateTestPacket(payload, 0x41, 20, 20); /*AA*/ p->payload = payload; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p) == -1) + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p, &pq) == -1) goto end; if (StreamTcpCheckStreamContents(check_contents, 35, &stream) != 0) { @@ -4567,6 +4942,8 @@ static int StreamTcpReassembleTest33(void) { StreamMsgQueueSetMinChunkLen(FLOW_PKT_TOSERVER, 4096); StreamMsgQueueSetMinChunkLen(FLOW_PKT_TOCLIENT, 4096); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&ssn, 0, sizeof (TcpSession)); memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); @@ -4590,7 +4967,7 @@ static int StreamTcpReassembleTest33(void) { p->tcph->th_ack = htonl(31); p->payload_len = 10; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p, &pq) == -1) { SCFree(p); return 0; } @@ -4599,7 +4976,7 @@ static int StreamTcpReassembleTest33(void) { p->tcph->th_ack = htonl(31); p->payload_len = 10; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p, &pq) == -1) { SCFree(p); return 0; } @@ -4608,7 +4985,7 @@ static int StreamTcpReassembleTest33(void) { p->tcph->th_ack = htonl(31); p->payload_len = 10; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p, &pq) == -1) { SCFree(p); return 0; } @@ -4617,7 +4994,7 @@ static int StreamTcpReassembleTest33(void) { p->tcph->th_ack = htonl(31); p->payload_len = 30; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p, &pq) == -1) { SCFree(p); return 0; } @@ -4648,6 +5025,8 @@ static int StreamTcpReassembleTest34(void) { StreamMsgQueueSetMinChunkLen(FLOW_PKT_TOSERVER, 4096); StreamMsgQueueSetMinChunkLen(FLOW_PKT_TOCLIENT, 4096); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&ssn, 0, sizeof (TcpSession)); memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); @@ -4671,7 +5050,7 @@ static int StreamTcpReassembleTest34(void) { p->tcph->th_ack = htonl(31); p->payload_len = 304; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p, &pq) == -1) { SCFree(p); return 0; } @@ -4680,7 +5059,7 @@ static int StreamTcpReassembleTest34(void) { p->tcph->th_ack = htonl(31); p->payload_len = 1460; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p, &pq) == -1) { SCFree(p); return 0; } @@ -4689,7 +5068,7 @@ static int StreamTcpReassembleTest34(void) { p->tcph->th_ack = htonl(31); p->payload_len = 1460; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p, &pq) == -1) { SCFree(p); return 0; } @@ -4698,7 +5077,7 @@ static int StreamTcpReassembleTest34(void) { p->tcph->th_ack = htonl(31); p->payload_len = 1460; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p, &pq) == -1) { SCFree(p); return 0; } @@ -4730,6 +5109,8 @@ static int StreamTcpReassembleTest35(void) { StreamMsgQueueSetMinChunkLen(FLOW_PKT_TOSERVER, 10); StreamMsgQueueSetMinChunkLen(FLOW_PKT_TOCLIENT, 10); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&ssn, 0, sizeof (TcpSession)); memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); @@ -4755,7 +5136,7 @@ static int StreamTcpReassembleTest35(void) { stream.last_ack = 2257022285UL; stream.ra_raw_base_seq = 2257022172UL; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p, &pq) == -1) { SCFree(p); return 0; } @@ -4766,7 +5147,7 @@ static int StreamTcpReassembleTest35(void) { stream.last_ack = 2257022285UL; stream.ra_raw_base_seq = 2257022172UL; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p, &pq) == -1) { SCFree(p); return 0; } @@ -4798,6 +5179,8 @@ static int StreamTcpReassembleTest36(void) { StreamMsgQueueSetMinChunkLen(FLOW_PKT_TOSERVER, 10); StreamMsgQueueSetMinChunkLen(FLOW_PKT_TOCLIENT, 10); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&ssn, 0, sizeof (TcpSession)); memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); @@ -4823,7 +5206,7 @@ static int StreamTcpReassembleTest36(void) { stream.last_ack = 1549589007; stream.ra_raw_base_seq = 1549589101; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p, &pq) == -1) { SCFree(p); return 0; } @@ -4834,7 +5217,7 @@ static int StreamTcpReassembleTest36(void) { stream.last_ack = 1549589007; stream.ra_raw_base_seq = 1549589101; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p, &pq) == -1) { SCFree(p); return 0; } @@ -4866,6 +5249,8 @@ static int StreamTcpReassembleTest37(void) { StreamMsgQueueSetMinChunkLen(FLOW_PKT_TOSERVER, 10); StreamMsgQueueSetMinChunkLen(FLOW_PKT_TOCLIENT, 10); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&ssn, 0, sizeof (TcpSession)); memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); @@ -4891,7 +5276,7 @@ static int StreamTcpReassembleTest37(void) { stream.last_ack = 3061091137UL; stream.ra_raw_base_seq = 3061091309UL; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p, &pq) == -1) { SCFree(p); return 0; } @@ -4902,7 +5287,7 @@ static int StreamTcpReassembleTest37(void) { stream.last_ack = 3061091137UL; stream.ra_raw_base_seq = 3061091309UL; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p, &pq) == -1) { SCFree(p); return 0; } @@ -4913,7 +5298,7 @@ static int StreamTcpReassembleTest37(void) { stream.last_ack = 3061091137UL; stream.ra_raw_base_seq = 3061091309UL; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &stream, p, &pq) == -1) { SCFree(p); return 0; } @@ -4947,6 +5332,8 @@ static int StreamTcpReassembleTest38 (void) { memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&f, 0, sizeof (Flow)); memset(&tcph, 0, sizeof (TCPHdr)); memset(&src, 0, sizeof(Address)); @@ -5010,7 +5397,7 @@ static int StreamTcpReassembleTest38 (void) { TcpStream *s = NULL; s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet\n"); goto end; } @@ -5028,7 +5415,7 @@ static int StreamTcpReassembleTest38 (void) { tcph.th_ack = htonl(55); s = &ssn.client; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet\n"); goto end; } @@ -5046,7 +5433,7 @@ static int StreamTcpReassembleTest38 (void) { tcph.th_seq = htonl(55); tcph.th_ack = htonl(53); s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet\n"); goto end; } @@ -5067,7 +5454,7 @@ static int StreamTcpReassembleTest38 (void) { tcph.th_seq = htonl(53); tcph.th_ack = htonl(100); s = &ssn.client; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet\n"); goto end; } @@ -5079,7 +5466,7 @@ static int StreamTcpReassembleTest38 (void) { tcph.th_ack = htonl(53); s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet\n"); goto end; } @@ -5130,6 +5517,8 @@ static int StreamTcpReassembleTest39 (void) { memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&f, 0, sizeof (Flow)); memset(&tcph, 0, sizeof (TCPHdr)); memset(&src, 0, sizeof(Address)); @@ -5190,7 +5579,7 @@ static int StreamTcpReassembleTest39 (void) { TcpStream *s = NULL; s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (1): "); goto end; } @@ -5209,7 +5598,7 @@ static int StreamTcpReassembleTest39 (void) { tcph.th_ack = htonl(55); s = &ssn.client; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (3): "); goto end; } @@ -5230,7 +5619,7 @@ static int StreamTcpReassembleTest39 (void) { tcph.th_ack = htonl(53); s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (5): "); goto end; } @@ -5271,7 +5660,8 @@ static int StreamTcpReassembleTest39 (void) { tcph.th_seq = htonl(53); tcph.th_ack = htonl(100); s = &ssn.client; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (9): "); goto end; } @@ -5296,7 +5686,7 @@ static int StreamTcpReassembleTest39 (void) { tcph.th_ack = htonl(96); s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (12): "); goto end; } @@ -5342,6 +5732,8 @@ static int StreamTcpReassembleTest40 (void) { memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&f, 0, sizeof (Flow)); memset(&tcph, 0, sizeof (TCPHdr)); memset(&src, 0, sizeof(Address)); @@ -5405,7 +5797,7 @@ static int StreamTcpReassembleTest40 (void) { TcpStream *s = NULL; s = &ssn.client; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (1): "); goto end; } @@ -5425,7 +5817,7 @@ static int StreamTcpReassembleTest40 (void) { s = &ssn.server; ssn.server.last_ack = 11; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (3): "); goto end; } @@ -5444,7 +5836,7 @@ static int StreamTcpReassembleTest40 (void) { s = &ssn.client; ssn.client.last_ack = 55; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (5): "); goto end; } @@ -5457,7 +5849,7 @@ static int StreamTcpReassembleTest40 (void) { s = &ssn.server; ssn.server.last_ack = 12; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (6): "); goto end; } @@ -5491,7 +5883,7 @@ static int StreamTcpReassembleTest40 (void) { s = &ssn.client; ssn.client.last_ack = 100; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (10): "); goto end; } @@ -5504,7 +5896,7 @@ static int StreamTcpReassembleTest40 (void) { s = &ssn.server; ssn.server.last_ack = 13; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (11): "); goto end; } @@ -5530,7 +5922,7 @@ static int StreamTcpReassembleTest40 (void) { s = &ssn.client; ssn.client.last_ack = 145; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (14): "); goto end; } @@ -5543,7 +5935,7 @@ static int StreamTcpReassembleTest40 (void) { s = &ssn.server; ssn.server.last_ack = 16; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (15): "); goto end; } @@ -5598,6 +5990,8 @@ static int StreamTcpReassembleTest41 (void) { memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&f, 0, sizeof (Flow)); memset(&tcph, 0, sizeof (TCPHdr)); memset(&src, 0, sizeof(Address)); @@ -5677,7 +6071,7 @@ static int StreamTcpReassembleTest41 (void) { TcpStream *s = NULL; s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet: "); goto end; } @@ -5695,7 +6089,7 @@ static int StreamTcpReassembleTest41 (void) { tcph.th_ack = htonl(55); s = &ssn.client; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet: "); goto end; } @@ -5707,7 +6101,7 @@ static int StreamTcpReassembleTest41 (void) { tcph.th_ack = htonl(100); s = &ssn.client; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet: "); goto end; } @@ -5726,7 +6120,7 @@ static int StreamTcpReassembleTest41 (void) { tcph.th_ack = htonl(522); s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet: "); goto end; } @@ -5751,7 +6145,7 @@ static int StreamTcpReassembleTest41 (void) { tcph.th_ack = htonl(522); s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet: "); goto end; } @@ -5791,6 +6185,8 @@ static int StreamTcpReassembleTest42 (void) { memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&f, 0, sizeof (Flow)); memset(&tcph, 0, sizeof (TCPHdr)); memset(&src, 0, sizeof(Address)); @@ -5848,7 +6244,7 @@ static int StreamTcpReassembleTest42 (void) { TcpStream *s = NULL; s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (1): "); goto end; } @@ -5866,7 +6262,7 @@ static int StreamTcpReassembleTest42 (void) { tcph.th_ack = htonl(55); s = &ssn.client; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (3): "); goto end; } @@ -5888,7 +6284,7 @@ static int StreamTcpReassembleTest42 (void) { tcph.th_ack = htonl(53); s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (5): "); goto end; } @@ -5910,7 +6306,7 @@ static int StreamTcpReassembleTest42 (void) { tcph.th_ack = htonl(53); s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (7): "); goto end; } @@ -5956,6 +6352,8 @@ static int StreamTcpReassembleTest43 (void) { memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&f, 0, sizeof (Flow)); memset(&tcph, 0, sizeof (TCPHdr)); memset(&src, 0, sizeof(Address)); @@ -6042,7 +6440,7 @@ static int StreamTcpReassembleTest43 (void) { TcpStream *s = NULL; s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (1): "); goto end; } @@ -6060,7 +6458,7 @@ static int StreamTcpReassembleTest43 (void) { tcph.th_ack = htonl(55); s = &ssn.client; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (3): "); goto end; } @@ -6079,7 +6477,7 @@ static int StreamTcpReassembleTest43 (void) { tcph.th_ack = htonl(44); s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (5): "); goto end; } @@ -6113,7 +6511,7 @@ static int StreamTcpReassembleTest43 (void) { tcph.th_ack = htonl(100); s = &ssn.client; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (9): "); goto end; } @@ -6132,7 +6530,7 @@ static int StreamTcpReassembleTest43 (void) { tcph.th_ack = htonl(53); s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet (11): "); goto end; } @@ -6228,6 +6626,8 @@ static int StreamTcpReassembleTest45 (void) { memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&f, 0, sizeof (Flow)); memset(&tcph, 0, sizeof (TCPHdr)); memset(&src, 0, sizeof(Address)); @@ -6285,7 +6685,7 @@ static int StreamTcpReassembleTest45 (void) { TcpStream *s = NULL; s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toclient packet\n"); goto end; } @@ -6301,7 +6701,7 @@ static int StreamTcpReassembleTest45 (void) { p->payload_len = httplen1; s = &ssn.client; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet\n"); goto end; } @@ -6317,7 +6717,7 @@ static int StreamTcpReassembleTest45 (void) { p->payload_len = httplen1; s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet\n"); goto end; } @@ -6365,6 +6765,8 @@ static int StreamTcpReassembleTest46 (void) { memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&f, 0, sizeof (Flow)); memset(&tcph, 0, sizeof (TCPHdr)); memset(&src, 0, sizeof(Address)); @@ -6420,7 +6822,7 @@ static int StreamTcpReassembleTest46 (void) { TcpStream *s = NULL; s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toclient packet\n"); goto end; } @@ -6436,7 +6838,7 @@ static int StreamTcpReassembleTest46 (void) { p->payload_len = httplen1; s = &ssn.client; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet\n"); goto end; } @@ -6452,7 +6854,7 @@ static int StreamTcpReassembleTest46 (void) { p->payload_len = httplen1; s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver packet\n"); goto end; } @@ -6499,6 +6901,8 @@ static int StreamTcpReassembleTest47 (void) { memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&f, 0, sizeof (Flow)); memset(&tcph, 0, sizeof (TCPHdr)); memset(&src, 0, sizeof(Address)); @@ -6558,7 +6962,7 @@ static int StreamTcpReassembleTest47 (void) { p->payload_len = 1; s = &ssn.client; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver " "packet\n"); goto end; @@ -6573,7 +6977,7 @@ static int StreamTcpReassembleTest47 (void) { p->tcph = &tcph; s = &ssn.server; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { printf("failed in segments reassembly, while processing toserver " "packet\n"); goto end; @@ -6598,6 +7002,230 @@ end: SCFree(p); return ret; } + +/** + * \test Test to make sure we setup the ipv4 pseudo packet properly + * + * \retval On success it returns 1 and on failure 0. + */ + +static int StreamTcpReassembleTest48 (void) { + int ret = 0; + Flow f; + TcpSession ssn; + char srcip[] = "1.2.3.4"; + char dstip[] = "1.2.3.5"; + + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); + memset(&f, 0, sizeof (Flow)); + memset(&ssn, 0, sizeof(TcpSession)); + ThreadVars tv; + memset(&tv, 0, sizeof (ThreadVars)); + + FLOW_INITIALIZE(&f); + StreamTcpInitConfig(TRUE); + TcpReassemblyThreadCtx *ra_ctx = StreamTcpReassembleInitThreadCtx(); + AppLayerDetectProtoThreadInit(); + + uint8_t httpbuf1[] = "GET /EVILSTUFF HTTP/1.1\r\n\r\n"; + uint32_t httplen1 = sizeof(httpbuf1) - 1; /* minus the \0 */ + + Packet *p = UTHBuildPacketReal(httpbuf1, httplen1, IPPROTO_TCP, srcip, + dstip, 80, 2345); + STREAMTCP_SET_RA_BASE_SEQ(&ssn.server, 572799781UL); + ssn.server.isn = 572799781UL; + ssn.server.last_ack = 572799782UL; + STREAMTCP_SET_RA_BASE_SEQ(&ssn.client, 4294967289UL); + ssn.client.isn = 4294967289UL; + ssn.client.last_ack = 21; + f.alproto = ALPROTO_UNKNOWN; + + SET_IPV4_SRC_ADDR(p,&f.src); + SET_IPV4_DST_ADDR(p,&f.dst); + f.src.family = AF_INET; + f.dst.family = AF_INET; + f.sp = p->sp; + f.dp = p->dp; + f.protoctx = &ssn; + p->flow = &f; + p->tcph->th_win = htons(5480); + ssn.state = TCP_ESTABLISHED; + TcpStream *s = NULL; + uint8_t cnt = 0; + + p->tcph->th_seq = htonl(ssn.client.isn + 1 + cnt); + p->tcph->th_ack = htonl(572799782UL); + p->tcph->th_flags = TH_ACK|TH_PUSH; + p->flowflags = FLOW_PKT_TOSERVER; + s = &ssn.client; + + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { + printf("failed in segments reassembly, while processing toserver " + "packet\n"); + goto end; + } + + p->flowflags = FLOW_PKT_TOCLIENT; + p->payload = NULL; + p->payload_len = 0; + p->tcph->th_seq = htonl(572799782UL); + p->tcph->th_ack = htonl(ssn.client.isn + 1 + cnt); + p->tcph->th_flags = TH_ACK; + s = &ssn.server; + + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { + printf("failed in segments reassembly, while processing toserver " + "packet\n"); + goto end; + } + + /* Process stream smsgs we may have in queue */ + if (StreamTcpReassembleProcessAppLayer(ra_ctx) < 0) { + printf("failed in processing stream smsgs\n"); + goto end; + } + + if (f.alproto != ALPROTO_HTTP) { + printf("App layer protocol (HTTP) should have been detected\n"); + goto end; + } + + Packet *pp = PacketDequeue(&pq); + char srcip1[16], dstip1[16]; + inet_ntop(AF_INET, (const void *)GET_IPV4_SRC_ADDR_PTR(pp), srcip1, sizeof(srcip1)); + inet_ntop(AF_INET, (const void *)GET_IPV4_DST_ADDR_PTR(pp), dstip1, sizeof(dstip1)); + if ((strcmp(srcip1, dstip) != 0) || (strcmp(dstip1, srcip) != 0)) { + printf("failed in setting ip address properly srcip1 %s dstip1 %s srcip %s dstip %s\n", + srcip1, dstip1, srcip, dstip); + goto end; + } + + if (memcmp(httpbuf1, pp->payload, pp->payload_len) != 0) { + PrintRawDataFp(stdout, pp->payload, pp->payload_len); + PrintRawDataFp(stdout, httpbuf1, pp->payload_len); + goto end; + } + + ret = 1; +end: + StreamTcpFreeConfig(TRUE); + StreamTcpReassembleFreeThreadCtx(ra_ctx); + return ret; +} + +/** + * \test Test to make sure we setup the ipv6 pseudo packet properly + * + * \retval On success it returns 1 and on failure 0. + */ + +static int StreamTcpReassembleTest49 (void) { + int ret = 0; + Flow f; + TcpSession ssn; + char srcip[] = "::1"; + char dstip[] = "::1"; + + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); + memset(&f, 0, sizeof (Flow)); + memset(&ssn, 0, sizeof(TcpSession)); + ThreadVars tv; + + memset(&tv, 0, sizeof (ThreadVars)); + + FLOW_INITIALIZE(&f); + StreamTcpInitConfig(TRUE); + TcpReassemblyThreadCtx *ra_ctx = StreamTcpReassembleInitThreadCtx(); + AppLayerDetectProtoThreadInit(); + + uint8_t httpbuf1[] = "GET /EVILSTUFF HTTP/1.1\r\n\r\n"; + uint32_t httplen1 = sizeof(httpbuf1) - 1; /* minus the \0 */ + + Packet *p = UTHBuildPacketIPV6Real(httpbuf1, httplen1, IPPROTO_TCP, srcip, + dstip, 80, 2345); + + STREAMTCP_SET_RA_BASE_SEQ(&ssn.server, 572799781UL); + ssn.server.isn = 572799781UL; + ssn.server.last_ack = 572799782UL; + STREAMTCP_SET_RA_BASE_SEQ(&ssn.client, 4294967289UL); + ssn.client.isn = 4294967289UL; + ssn.client.last_ack = 21; + f.alproto = ALPROTO_UNKNOWN; + + SET_IPV6_SRC_ADDR(p,&f.src); + SET_IPV6_DST_ADDR(p,&f.dst); + f.src.family = AF_INET6; + f.dst.family = AF_INET6; + f.sp = p->sp; + f.dp = p->dp; + f.protoctx = &ssn; + p->flow = &f; + p->tcph->th_win = htons(5480); + ssn.state = TCP_ESTABLISHED; + TcpStream *s = NULL; + uint8_t cnt = 0; + + p->tcph->th_seq = htonl(ssn.client.isn + 1 + cnt); + p->tcph->th_ack = htonl(572799782UL); + p->tcph->th_flags = TH_ACK|TH_PUSH; + p->flowflags = FLOW_PKT_TOSERVER; + s = &ssn.client; + + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { + printf("failed in segments reassembly, while processing toserver " + "packet\n"); + goto end; + } + + p->flowflags = FLOW_PKT_TOCLIENT; + p->payload = NULL; + p->payload_len = 0; + p->tcph->th_seq = htonl(572799782UL); + p->tcph->th_ack = htonl(ssn.client.isn + 1 + cnt); + p->tcph->th_flags = TH_ACK; + s = &ssn.server; + + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx, &ssn, s, p, &pq) == -1) { + printf("failed in segments reassembly, while processing toserver " + "packet\n"); + goto end; + } + + /* Process stream smsgs we may have in queue */ + if (StreamTcpReassembleProcessAppLayer(ra_ctx) < 0) { + printf("failed in processing stream smsgs\n"); + goto end; + } + + if (f.alproto != ALPROTO_HTTP) { + printf("App layer protocol (HTTP) should have been detected\n"); + goto end; + } + + Packet *pp = PacketDequeue(&pq); + char srcip1[46], dstip1[46]; + inet_ntop(AF_INET6, (const void *)GET_IPV6_SRC_ADDR(pp), srcip1, sizeof(srcip1)); + inet_ntop(AF_INET6, (const void *)GET_IPV6_DST_ADDR(pp), dstip1, sizeof(dstip1)); + if ((strcmp(srcip1, dstip) != 0) || (strcmp(dstip1, srcip) != 0)) { + printf("failed in setting ip address properly srcip1 %s dstip1 %s srcip %s dstip %s\n", + srcip1, dstip1, srcip, dstip); + goto end; + } + + if (memcmp(httpbuf1, pp->payload, pp->payload_len) != 0) { + PrintRawDataFp(stdout, pp->payload, pp->payload_len); + PrintRawDataFp(stdout, httpbuf1, pp->payload_len); + goto end; + } + + ret = 1; +end: + StreamTcpFreeConfig(TRUE); + StreamTcpReassembleFreeThreadCtx(ra_ctx); + return ret; +} #endif /* UNITTESTS */ /** \brief The Function Register the Unit tests to test the reassembly engine @@ -6653,5 +7281,7 @@ void StreamTcpReassembleRegisterTests(void) { UtRegisterTest("StreamTcpReassembleTest45 -- Depth Test", StreamTcpReassembleTest45, 1); UtRegisterTest("StreamTcpReassembleTest46 -- Depth Test", StreamTcpReassembleTest46, 1); UtRegisterTest("StreamTcpReassembleTest47 -- TCP Sequence Wraparound Test", StreamTcpReassembleTest47, 1); + UtRegisterTest("StreamTcpReassembleTest48 -- Pseudo IPv4 Packet Test", StreamTcpReassembleTest48, 1); + UtRegisterTest("StreamTcpReassembleTest49 -- Pseudo IPv6 Packet Test", StreamTcpReassembleTest49, 1); #endif /* UNITTESTS */ } diff --git a/src/stream-tcp-reassemble.h b/src/stream-tcp-reassemble.h index 2eac108db6..4be6ce4a8b 100644 --- a/src/stream-tcp-reassemble.h +++ b/src/stream-tcp-reassemble.h @@ -30,6 +30,29 @@ #include "app-layer-detect-proto.h" #include "stream-tcp-private.h" +#define PSUEDO_PKT_SET_IPV4HDR(nipv4h,ipv4h) do { \ + (nipv4h)->ip_src = IPV4_GET_RAW_IPDST(ipv4h); \ + (nipv4h)->ip_dst = IPV4_GET_RAW_IPSRC(ipv4h); \ + } while (0) + +#define PSUEDO_PKT_SET_IPV6HDR(nipv6h,ipv6h) do { \ + (nipv6h)->ip6_src[0] = (ipv6h)->ip6_dst[0]; \ + (nipv6h)->ip6_src[1] = (ipv6h)->ip6_dst[1]; \ + (nipv6h)->ip6_src[2] = (ipv6h)->ip6_dst[2]; \ + (nipv6h)->ip6_src[3] = (ipv6h)->ip6_dst[3]; \ + (nipv6h)->ip6_dst[0] = (ipv6h)->ip6_src[0]; \ + (nipv6h)->ip6_dst[1] = (ipv6h)->ip6_src[1]; \ + (nipv6h)->ip6_dst[2] = (ipv6h)->ip6_src[2]; \ + (nipv6h)->ip6_dst[3] = (ipv6h)->ip6_src[3]; \ + } while (0) + +#define PSUEDO_PKT_SET_TCPHDR(ntcph,tcph) do { \ + COPY_PORT((tcph)->th_dport, (ntcph)->th_sport); \ + COPY_PORT((tcph)->th_sport, (ntcph)->th_dport); \ + (ntcph)->th_seq = (tcph)->th_ack; \ + (ntcph)->th_ack = (tcph)->th_seq; \ + } while (0) + /** Supported OS list and default OS policy is BSD */ enum { @@ -60,7 +83,7 @@ typedef struct TcpReassemblyThreadCtx_ { #define OS_POLICY_DEFAULT OS_POLICY_BSD -int StreamTcpReassembleHandleSegment(ThreadVars *, TcpReassemblyThreadCtx *, TcpSession *, TcpStream *, Packet *); +int StreamTcpReassembleHandleSegment(ThreadVars *, TcpReassemblyThreadCtx *, TcpSession *, TcpStream *, Packet *, PacketQueue *); int StreamTcpReassembleInit(char); void StreamTcpReassembleFree(char); void StreamTcpReassembleRegisterTests(void); diff --git a/src/stream-tcp.c b/src/stream-tcp.c index 4507f11687..b5745ab489 100644 --- a/src/stream-tcp.c +++ b/src/stream-tcp.c @@ -86,7 +86,7 @@ TmEcode StreamTcpThreadInit(ThreadVars *, void *, void **); TmEcode StreamTcpThreadDeinit(ThreadVars *, void *); void StreamTcpExitPrintStats(ThreadVars *, void *); static int ValidReset(TcpSession * , Packet *); -static int StreamTcpHandleFin(ThreadVars *tv, StreamTcpThread *, TcpSession *, Packet *); +static int StreamTcpHandleFin(ThreadVars *tv, StreamTcpThread *, TcpSession *, Packet *, PacketQueue *); void StreamTcpRegisterTests (void); void StreamTcpReturnStreamSegments (TcpStream *); void StreamTcpInitConfig(char); @@ -582,7 +582,7 @@ void StreamTcpSetOSPolicy(TcpStream *stream, Packet *p) * \param stt Strean Thread module registered to handle the stream handling */ static int StreamTcpPacketStateNone(ThreadVars *tv, Packet *p, - StreamTcpThread *stt, TcpSession *ssn) + StreamTcpThread *stt, TcpSession *ssn, PacketQueue *pq) { switch (p->tcph->th_flags) { /* The following cases will allow us to create the tcp sessions in congestion @@ -797,7 +797,7 @@ static int StreamTcpPacketStateNone(ThreadVars *tv, Packet *p, ssn->client.last_ts = 0; } - StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p); + StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p, pq); break; case TH_RST: @@ -835,7 +835,7 @@ static int StreamTcpPacketStateNone(ThreadVars *tv, Packet *p, */ static int StreamTcpPacketStateSynSent(ThreadVars *tv, Packet *p, - StreamTcpThread *stt, TcpSession *ssn) + StreamTcpThread *stt, TcpSession *ssn, PacketQueue *pq) { if (ssn == NULL) return -1; @@ -1180,7 +1180,7 @@ static int StreamTcpPacketStateSynSent(ThreadVars *tv, Packet *p, */ static int StreamTcpPacketStateSynRecv(ThreadVars *tv, Packet *p, - StreamTcpThread *stt, TcpSession *ssn) + StreamTcpThread *stt, TcpSession *ssn, PacketQueue *pq) { if (ssn == NULL) return -1; @@ -1228,7 +1228,7 @@ static int StreamTcpPacketStateSynRecv(ThreadVars *tv, Packet *p, ssn->client.window; StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->server, p); + &ssn->server, p, pq); } else { SCLogDebug("ssn %p: 4WHS wrong seq nr on packet", ssn); return -1; @@ -1291,7 +1291,7 @@ static int StreamTcpPacketStateSynRecv(ThreadVars *tv, Packet *p, } StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->client, p); + &ssn->client, p, pq); /* If asynchronous stream handling is allowed then set the session, if packet's seq number is equal the expected seq no.*/ @@ -1324,7 +1324,7 @@ static int StreamTcpPacketStateSynRecv(ThreadVars *tv, Packet *p, + p->payload_len, ssn->server.next_seq); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->server, p); + &ssn->server, p, pq); /* 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 @@ -1404,7 +1404,7 @@ http://www.packetstan.com/2010/06/recently-ive-been-on-campaign-to-make.html */ return -1; } - if((StreamTcpHandleFin(tv, stt, ssn, p)) == -1) + if((StreamTcpHandleFin(tv, stt, ssn, p, pq)) == -1) return -1; break; default: @@ -1427,7 +1427,7 @@ http://www.packetstan.com/2010/06/recently-ive-been-on-campaign-to-make.html */ * \param stt Strean Thread module registered to handle the stream handling */ static int HandleEstablishedPacketToServer(ThreadVars *tv, TcpSession *ssn, Packet *p, - StreamTcpThread *stt) + StreamTcpThread *stt, PacketQueue *pq) { SCLogDebug("ssn %p: =+ pkt (%" PRIu32 ") is to server: SEQ %" PRIu32 "," "ACK %" PRIu32 ", WIN %"PRIu16"", ssn, p->payload_len, @@ -1522,7 +1522,7 @@ static int HandleEstablishedPacketToServer(ThreadVars *tv, TcpSession *ssn, Pack ssn->server.next_win, ssn->server.window); } - StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p); + StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p, pq); } else { SCLogDebug("ssn %p: toserver => SEQ out of window, packet SEQ " "%" PRIu32 ", payload size %" PRIu32 " (%" PRIu32 ")," @@ -1547,7 +1547,7 @@ static int HandleEstablishedPacketToServer(ThreadVars *tv, TcpSession *ssn, Pack * \param stt Strean Thread module registered to handle the stream handling */ static int HandleEstablishedPacketToClient(ThreadVars *tv, TcpSession *ssn, Packet *p, - StreamTcpThread *stt) + StreamTcpThread *stt, PacketQueue *pq) { SCLogDebug("ssn %p: =+ pkt (%" PRIu32 ") is to client: SEQ %" PRIu32 "," " ACK %" PRIu32 ", WIN %"PRIu16"", ssn, p->payload_len, @@ -1614,7 +1614,7 @@ static int HandleEstablishedPacketToClient(ThreadVars *tv, TcpSession *ssn, Pack TCP_GET_SEQ(p),ssn->client.next_win, ssn->client.window); } - StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p); + StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p, pq); } else { SCLogDebug("ssn %p: client => SEQ out of window, packet SEQ" "%" PRIu32 ", payload size %" PRIu32 " (%" PRIu32 ")," @@ -1639,8 +1639,7 @@ static int HandleEstablishedPacketToClient(ThreadVars *tv, TcpSession *ssn, Pack */ static int StreamTcpPacketStateEstablished(ThreadVars *tv, Packet *p, - StreamTcpThread *stt, - TcpSession *ssn) + StreamTcpThread *stt, TcpSession *ssn, PacketQueue *pq) { if (ssn == NULL) return -1; @@ -1681,7 +1680,7 @@ static int StreamTcpPacketStateEstablished(ThreadVars *tv, Packet *p, if (PKT_IS_TOSERVER(p)) { /* Process the received packet to server */ - HandleEstablishedPacketToServer(tv, ssn, p, stt); + HandleEstablishedPacketToServer(tv, ssn, p, stt, pq); SCLogDebug("ssn %p: next SEQ %" PRIu32 ", last ACK %" PRIu32 "," " next win %" PRIu32 ", win %" PRIu32 "", ssn, @@ -1691,7 +1690,7 @@ static int StreamTcpPacketStateEstablished(ThreadVars *tv, Packet *p, } else { /* implied to client */ /* Process the received packet to client */ - HandleEstablishedPacketToClient(tv, ssn, p, stt); + HandleEstablishedPacketToClient(tv, ssn, p, stt, pq); SCLogDebug("ssn %p: next SEQ %" PRIu32 ", last ACK %" PRIu32 "," " next win %" PRIu32 ", win %" PRIu32 "", ssn, @@ -1718,7 +1717,7 @@ static int StreamTcpPacketStateEstablished(ThreadVars *tv, Packet *p, ssn->client.last_ack, ssn->server.next_win, ssn->server.window); - if((StreamTcpHandleFin(tv, stt, ssn, p)) == -1) + if((StreamTcpHandleFin(tv, stt, ssn, p, pq)) == -1) return -1; break; case TH_RST: @@ -1742,7 +1741,7 @@ static int StreamTcpPacketStateEstablished(ThreadVars *tv, Packet *p, ssn->server.last_ack = TCP_GET_ACK(p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->client, p); + &ssn->client, p, pq); SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " "%" PRIu32 "", ssn, ssn->client.next_seq, ssn->server.last_ack); @@ -1763,7 +1762,7 @@ static int StreamTcpPacketStateEstablished(ThreadVars *tv, Packet *p, ssn->client.last_ack = TCP_GET_ACK(p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->server, p); + &ssn->server, p, pq); SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " "%" PRIu32 "", ssn, ssn->server.next_seq, ssn->client.last_ack); @@ -1789,7 +1788,8 @@ static int StreamTcpPacketStateEstablished(ThreadVars *tv, Packet *p, * \param stt Strean Thread module registered to handle the stream handling */ -static int StreamTcpHandleFin(ThreadVars *tv, StreamTcpThread *stt, TcpSession *ssn, Packet *p) +static int StreamTcpHandleFin(ThreadVars *tv, StreamTcpThread *stt, + TcpSession *ssn, Packet *p, PacketQueue *pq) { if (PKT_IS_TOSERVER(p)) { @@ -1819,7 +1819,7 @@ static int StreamTcpHandleFin(ThreadVars *tv, StreamTcpThread *stt, TcpSession * if (SEQ_GT(TCP_GET_ACK(p),ssn->server.last_ack)) ssn->server.last_ack = TCP_GET_ACK(p); - StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p); + StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->client, p, pq); SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK %" PRIu32 "", ssn, ssn->client.next_seq, ssn->server.last_ack); @@ -1850,7 +1850,7 @@ static int StreamTcpHandleFin(ThreadVars *tv, StreamTcpThread *stt, TcpSession * if (SEQ_GT(TCP_GET_ACK(p),ssn->client.last_ack)) ssn->client.last_ack = TCP_GET_ACK(p); - StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p); + StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, &ssn->server, p, pq); SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK %" PRIu32 "", ssn, ssn->server.next_seq, ssn->client.last_ack); @@ -1869,7 +1869,7 @@ static int StreamTcpHandleFin(ThreadVars *tv, StreamTcpThread *stt, TcpSession * */ static int StreamTcpPacketStateFinWait1(ThreadVars *tv, Packet *p, - StreamTcpThread *stt, TcpSession *ssn) + StreamTcpThread *stt, TcpSession *ssn, PacketQueue *pq) { if (ssn == NULL) return -1; @@ -1905,7 +1905,7 @@ static int StreamTcpPacketStateFinWait1(ThreadVars *tv, Packet *p, ssn->server.last_ack = TCP_GET_ACK(p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->client, p); + &ssn->client, p, pq); if (SEQ_EQ(ssn->client.next_seq, TCP_GET_SEQ(p))) { ssn->client.next_seq += p->payload_len; @@ -1935,7 +1935,7 @@ static int StreamTcpPacketStateFinWait1(ThreadVars *tv, Packet *p, ssn->client.last_ack = TCP_GET_ACK(p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->server, p); + &ssn->server, p, pq); if (SEQ_EQ(ssn->server.next_seq, TCP_GET_SEQ(p))) { ssn->server.next_seq += p->payload_len; @@ -1985,7 +1985,7 @@ static int StreamTcpPacketStateFinWait1(ThreadVars *tv, Packet *p, ssn->server.last_ack = TCP_GET_ACK(p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->client, p); + &ssn->client, p, pq); if (SEQ_EQ(ssn->client.next_seq, TCP_GET_SEQ(p))) { ssn->client.next_seq += p->payload_len; @@ -2020,7 +2020,7 @@ static int StreamTcpPacketStateFinWait1(ThreadVars *tv, Packet *p, ssn->client.last_ack = TCP_GET_ACK(p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->server, p); + &ssn->server, p, pq); if (SEQ_EQ(ssn->server.next_seq, TCP_GET_SEQ(p))) { ssn->server.next_seq += p->payload_len; @@ -2067,7 +2067,7 @@ static int StreamTcpPacketStateFinWait1(ThreadVars *tv, Packet *p, */ static int StreamTcpPacketStateFinWait2(ThreadVars *tv, Packet *p, - StreamTcpThread *stt, TcpSession *ssn) + StreamTcpThread *stt, TcpSession *ssn, PacketQueue *pq) { if (ssn == NULL) return -1; @@ -2103,7 +2103,7 @@ static int StreamTcpPacketStateFinWait2(ThreadVars *tv, Packet *p, ssn->server.last_ack = TCP_GET_ACK(p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->client, p); + &ssn->client, p, pq); if (SEQ_EQ(ssn->client.next_seq, TCP_GET_SEQ(p))) { ssn->client.next_seq += p->payload_len; @@ -2134,7 +2134,7 @@ static int StreamTcpPacketStateFinWait2(ThreadVars *tv, Packet *p, ssn->client.last_ack = TCP_GET_ACK(p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->server, p); + &ssn->server, p, pq); if (SEQ_EQ(ssn->server.next_seq, TCP_GET_SEQ(p))) { ssn->server.next_seq += p->payload_len; @@ -2192,7 +2192,7 @@ static int StreamTcpPacketStateFinWait2(ThreadVars *tv, Packet *p, ssn->server.last_ack = TCP_GET_ACK(p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->client, p); + &ssn->client, p, pq); SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " "%" PRIu32 "", ssn, ssn->client.next_seq, @@ -2220,7 +2220,7 @@ static int StreamTcpPacketStateFinWait2(ThreadVars *tv, Packet *p, ssn->client.last_ack = TCP_GET_ACK(p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->server, p); + &ssn->server, p, pq); SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " "%" PRIu32 "", ssn, ssn->server.next_seq, ssn->client.last_ack); @@ -2245,7 +2245,7 @@ static int StreamTcpPacketStateFinWait2(ThreadVars *tv, Packet *p, */ static int StreamTcpPacketStateClosing(ThreadVars *tv, Packet *p, - StreamTcpThread *stt, TcpSession *ssn) + StreamTcpThread *stt, TcpSession *ssn, PacketQueue *pq) { if (ssn == NULL) return -1; @@ -2281,7 +2281,7 @@ static int StreamTcpPacketStateClosing(ThreadVars *tv, Packet *p, ssn->server.last_ack = TCP_GET_ACK(p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->client, p); + &ssn->client, p, pq); SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " "%" PRIu32 "", ssn, ssn->client.next_seq, ssn->server.last_ack); @@ -2305,7 +2305,7 @@ static int StreamTcpPacketStateClosing(ThreadVars *tv, Packet *p, ssn->client.last_ack = TCP_GET_ACK(p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->server, p); + &ssn->server, p, pq); SCLogDebug("StreamTcpPacketStateClosing (%p): =+ next SEQ " "%" PRIu32 ", last ACK %" PRIu32 "", ssn, ssn->server.next_seq, ssn->client.last_ack); @@ -2329,7 +2329,7 @@ static int StreamTcpPacketStateClosing(ThreadVars *tv, Packet *p, */ static int StreamTcpPacketStateCloseWait(ThreadVars *tv, Packet *p, - StreamTcpThread *stt, TcpSession *ssn) + StreamTcpThread *stt, TcpSession *ssn, PacketQueue *pq) { SCEnter(); if (ssn == NULL) @@ -2378,7 +2378,7 @@ static int StreamTcpPacketStateCloseWait(ThreadVars *tv, Packet *p, ssn->client.last_ack = TCP_GET_ACK(p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->server, p); + &ssn->server, p, pq); SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " "%" PRIu32 "", ssn, ssn->server.next_seq, ssn->client.last_ack); @@ -2405,7 +2405,7 @@ static int StreamTcpPacketStateCloseWait(ThreadVars *tv, Packet *p, ssn->server.last_ack = TCP_GET_ACK(p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->client, p); + &ssn->client, p, pq); SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " "%" PRIu32 "", ssn, ssn->client.next_seq, ssn->server.last_ack); @@ -2443,7 +2443,7 @@ static int StreamTcpPacketStateCloseWait(ThreadVars *tv, Packet *p, ssn->server.next_seq += p->payload_len; StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->server, p); + &ssn->server, p, pq); SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " "%" PRIu32 "", ssn, ssn->server.next_seq, ssn->client.last_ack); @@ -2470,7 +2470,7 @@ static int StreamTcpPacketStateCloseWait(ThreadVars *tv, Packet *p, ssn->client.next_seq += p->payload_len; StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->client, p); + &ssn->client, p, pq); SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " "%" PRIu32 "", ssn, ssn->client.next_seq, ssn->server.last_ack); @@ -2494,7 +2494,7 @@ static int StreamTcpPacketStateCloseWait(ThreadVars *tv, Packet *p, */ static int StreamTcpPakcetStateLastAck(ThreadVars *tv, Packet *p, - StreamTcpThread *stt, TcpSession *ssn) + StreamTcpThread *stt, TcpSession *ssn, PacketQueue *pq) { if (ssn == NULL) return -1; @@ -2530,7 +2530,7 @@ static int StreamTcpPakcetStateLastAck(ThreadVars *tv, Packet *p, ssn->server.last_ack = TCP_GET_ACK(p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->client, p); + &ssn->client, p, pq); SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " "%" PRIu32 "", ssn, ssn->client.next_seq, ssn->server.last_ack); @@ -2556,7 +2556,7 @@ static int StreamTcpPakcetStateLastAck(ThreadVars *tv, Packet *p, */ static int StreamTcpPacketStateTimeWait(ThreadVars *tv, Packet *p, - StreamTcpThread *stt, TcpSession *ssn) + StreamTcpThread *stt, TcpSession *ssn, PacketQueue *pq) { if (ssn == NULL) return -1; @@ -2592,7 +2592,7 @@ static int StreamTcpPacketStateTimeWait(ThreadVars *tv, Packet *p, ssn->server.last_ack = TCP_GET_ACK(p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->client, p); + &ssn->client, p, pq); SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " "%" PRIu32 "", ssn, ssn->client.next_seq, ssn->server.last_ack); @@ -2618,7 +2618,7 @@ static int StreamTcpPacketStateTimeWait(ThreadVars *tv, Packet *p, ssn->client.last_ack = TCP_GET_ACK(p); StreamTcpReassembleHandleSegment(tv, stt->ra_ctx, ssn, - &ssn->server, p); + &ssn->server, p, pq); SCLogDebug("ssn %p: =+ next SEQ %" PRIu32 ", last ACK " "%" PRIu32 "", ssn, ssn->server.next_seq, ssn->client.last_ack); @@ -2635,7 +2635,8 @@ static int StreamTcpPacketStateTimeWait(ThreadVars *tv, Packet *p, } /* flow is and stays locked */ -static int StreamTcpPacket (ThreadVars *tv, Packet *p, StreamTcpThread *stt) +static int StreamTcpPacket (ThreadVars *tv, Packet *p, StreamTcpThread *stt, + PacketQueue *pq) { SCEnter(); TcpSession *ssn = (TcpSession *)p->flow->protoctx; @@ -2656,7 +2657,7 @@ static int StreamTcpPacket (ThreadVars *tv, Packet *p, StreamTcpThread *stt) } if (ssn == NULL || ssn->state == TCP_NONE) { - if (StreamTcpPacketStateNone(tv, p, stt, ssn) == -1) + if (StreamTcpPacketStateNone(tv, p, stt, ssn, pq) == -1) SCReturnInt(-1); if (ssn != NULL) @@ -2669,39 +2670,39 @@ static int StreamTcpPacket (ThreadVars *tv, Packet *p, StreamTcpThread *stt) switch (ssn->state) { case TCP_SYN_SENT: - if(StreamTcpPacketStateSynSent(tv, p, stt, ssn)) + if(StreamTcpPacketStateSynSent(tv, p, stt, ssn, pq)) SCReturnInt(-1); break; case TCP_SYN_RECV: - if(StreamTcpPacketStateSynRecv(tv, p, stt, ssn)) + if(StreamTcpPacketStateSynRecv(tv, p, stt, ssn, pq)) SCReturnInt(-1); break; case TCP_ESTABLISHED: - if(StreamTcpPacketStateEstablished(tv, p, stt, ssn)) + if(StreamTcpPacketStateEstablished(tv, p, stt, ssn, pq)) SCReturnInt(-1); break; case TCP_FIN_WAIT1: - if(StreamTcpPacketStateFinWait1(tv, p, stt, ssn)) + if(StreamTcpPacketStateFinWait1(tv, p, stt, ssn, pq)) SCReturnInt(-1); break; case TCP_FIN_WAIT2: - if(StreamTcpPacketStateFinWait2(tv, p, stt, ssn)) + if(StreamTcpPacketStateFinWait2(tv, p, stt, ssn, pq)) SCReturnInt(-1); break; case TCP_CLOSING: - if(StreamTcpPacketStateClosing(tv, p, stt, ssn)) + if(StreamTcpPacketStateClosing(tv, p, stt, ssn, pq)) SCReturnInt(-1); break; case TCP_CLOSE_WAIT: - if(StreamTcpPacketStateCloseWait(tv, p, stt, ssn)) + if(StreamTcpPacketStateCloseWait(tv, p, stt, ssn, pq)) SCReturnInt(-1); break; case TCP_LAST_ACK: - if(StreamTcpPakcetStateLastAck(tv, p, stt, ssn)) + if(StreamTcpPakcetStateLastAck(tv, p, stt, ssn, pq)) SCReturnInt(-1); break; case TCP_TIME_WAIT: - if(StreamTcpPacketStateTimeWait(tv, p, stt, ssn)) + if(StreamTcpPacketStateTimeWait(tv, p, stt, ssn, pq)) SCReturnInt(-1); break; case TCP_CLOSED: @@ -2796,7 +2797,7 @@ TmEcode StreamTcp (ThreadVars *tv, Packet *p, void *data, PacketQueue *pq, Packe } SCMutexLock(&p->flow->m); - ret = StreamTcpPacket(tv, p, stt); + ret = StreamTcpPacket(tv, p, stt, pq); SCMutexUnlock(&p->flow->m); //if (ret) @@ -3275,6 +3276,8 @@ static int StreamTcpTest02 (void) { TCPHdr tcph; TcpReassemblyThreadCtx ra_ctx; StreamMsgQueue stream_q; + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&stream_q, 0, sizeof(StreamMsgQueue)); memset(&ra_ctx, 0, sizeof(TcpReassemblyThreadCtx)); memset(p, 0, SIZE_OF_PACKET); @@ -3294,14 +3297,14 @@ static int StreamTcpTest02 (void) { StreamTcpInitConfig(TRUE); - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_ack = htonl(1); p->tcph->th_flags = TH_SYN | TH_ACK; p->flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_ack = htonl(1); @@ -3309,7 +3312,7 @@ static int StreamTcpTest02 (void) { p->tcph->th_flags = TH_ACK; p->flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_ack = htonl(1); @@ -3321,11 +3324,11 @@ static int StreamTcpTest02 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_ack = htonl(1); @@ -3337,11 +3340,11 @@ static int StreamTcpTest02 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; StreamTcpSessionClear(p->flow->protoctx); @@ -3371,6 +3374,8 @@ static int StreamTcpTest03 (void) { TCPHdr tcph; memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset (&f, 0, sizeof(Flow)); memset(&tv, 0, sizeof (ThreadVars)); memset(&stt, 0, sizeof (StreamTcpThread)); @@ -3386,7 +3391,7 @@ static int StreamTcpTest03 (void) { p->tcph = &tcph; int ret = 0; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(20); @@ -3394,7 +3399,7 @@ static int StreamTcpTest03 (void) { p->tcph->th_flags = TH_ACK; p->flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(19); @@ -3402,7 +3407,7 @@ static int StreamTcpTest03 (void) { p->tcph->th_flags = TH_ACK|TH_PUSH; p->flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if (stream_config.midstream != TRUE) { @@ -3443,6 +3448,8 @@ static int StreamTcpTest04 (void) { TCPHdr tcph; memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset (&f, 0, sizeof(Flow)); memset(&tv, 0, sizeof (ThreadVars)); memset(&stt, 0, sizeof (StreamTcpThread)); @@ -3459,7 +3466,7 @@ static int StreamTcpTest04 (void) { int ret = 0; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(9); @@ -3467,7 +3474,7 @@ static int StreamTcpTest04 (void) { p->tcph->th_flags = TH_ACK|TH_PUSH; p->flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if (stream_config.midstream != TRUE) { @@ -3509,6 +3516,8 @@ static int StreamTcpTest05 (void) { uint8_t payload[4]; memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset (&f, 0, sizeof(Flow)); memset(&tv, 0, sizeof (ThreadVars)); memset(&stt, 0, sizeof (StreamTcpThread)); @@ -3534,7 +3543,7 @@ static int StreamTcpTest05 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(20); @@ -3546,7 +3555,7 @@ static int StreamTcpTest05 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(13); @@ -3558,7 +3567,7 @@ static int StreamTcpTest05 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(19); @@ -3570,7 +3579,7 @@ static int StreamTcpTest05 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if (stream_config.midstream != TRUE) { @@ -3612,6 +3621,8 @@ static int StreamTcpTest06 (void) { TCPHdr tcph; memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset (&f, 0, sizeof(Flow)); memset(&ssn, 0, sizeof (TcpSession)); memset(&tv, 0, sizeof (ThreadVars)); @@ -3625,14 +3636,14 @@ static int StreamTcpTest06 (void) { tcph.th_flags = TH_FIN; p->tcph = &tcph; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if (((TcpSession *)(p->flow->protoctx)) != NULL) goto end; p->tcph->th_flags = TH_RST; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if (((TcpSession *)(p->flow->protoctx)) != NULL) @@ -3664,9 +3675,11 @@ static int StreamTcpTest07 (void) { TCPVars tcpvars; TCPOpt ts; uint32_t data[2]; + PacketQueue pq; memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + memset(&pq,0,sizeof(PacketQueue)); memset (&f, 0, sizeof(Flow)); memset(&tv, 0, sizeof (ThreadVars)); memset(&stt, 0, sizeof(StreamTcpThread)); @@ -3704,7 +3717,7 @@ static int StreamTcpTest07 (void) { p->payload = payload; p->payload_len = 1; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(11); @@ -3717,7 +3730,7 @@ static int StreamTcpTest07 (void) { p->tcpc.ts2 = 0; p->tcpvars.ts->data = (uint8_t *)data; - if (StreamTcpPacket(&tv, p, &stt) == -1) { + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) { if (((TcpSession *) (p->flow->protoctx))->client.next_seq != 11) { printf("the timestamp values are client %"PRIu32" server %" PRIu32"" " seq %" PRIu32 "\n", TCP_GET_TSVAL(p), TCP_GET_TSECR(p), @@ -3757,6 +3770,8 @@ static int StreamTcpTest08 (void) { memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset (&f, 0, sizeof(Flow)); memset(&tv, 0, sizeof (ThreadVars)); memset(&stt, 0, sizeof(StreamTcpThread)); @@ -3794,7 +3809,7 @@ static int StreamTcpTest08 (void) { p->payload = payload; p->payload_len = 1; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(11); @@ -3807,7 +3822,7 @@ static int StreamTcpTest08 (void) { p->tcpc.ts2 = 0; p->tcpvars.ts->data = (uint8_t *)data; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if (((TcpSession *) (p->flow->protoctx))->client.next_seq != 12) { @@ -3846,6 +3861,8 @@ static int StreamTcpTest09 (void) { memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset (&f, 0, sizeof(Flow)); memset(&tv, 0, sizeof (ThreadVars)); memset(&stt, 0, sizeof(StreamTcpThread)); @@ -3872,7 +3889,7 @@ static int StreamTcpTest09 (void) { p->payload = payload; p->payload_len = 1; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(12); @@ -3882,7 +3899,7 @@ static int StreamTcpTest09 (void) { StreamTcpSetSessionNoReassemblyFlag(((TcpSession *)(p->flow->protoctx)), 0); - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(11); @@ -3890,7 +3907,7 @@ static int StreamTcpTest09 (void) { p->tcph->th_flags = TH_ACK|TH_PUSH; p->flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if (((TcpSession *) (p->flow->protoctx))->client.seg_list->next == NULL) @@ -3921,6 +3938,8 @@ static int StreamTcpTest10 (void) { uint8_t payload[4]; memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset (&f, 0, sizeof(Flow)); memset(&tv, 0, sizeof (ThreadVars)); memset(&stt, 0, sizeof (StreamTcpThread)); @@ -3936,7 +3955,7 @@ static int StreamTcpTest10 (void) { p->tcph = &tcph; int ret = 0; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(11); @@ -3944,7 +3963,7 @@ static int StreamTcpTest10 (void) { p->tcph->th_flags = TH_ACK; p->flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(11); @@ -3956,7 +3975,7 @@ static int StreamTcpTest10 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(6); @@ -3968,7 +3987,7 @@ static int StreamTcpTest10 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if (stream_config.async_oneside != TRUE) { @@ -4019,6 +4038,8 @@ static int StreamTcpTest11 (void) { uint8_t payload[4]; memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset (&f, 0, sizeof(Flow)); memset(&tv, 0, sizeof (ThreadVars)); memset(&stt, 0, sizeof (StreamTcpThread)); @@ -4034,7 +4055,7 @@ static int StreamTcpTest11 (void) { p->tcph = &tcph; int ret = 0; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(11); @@ -4042,7 +4063,7 @@ static int StreamTcpTest11 (void) { p->tcph->th_flags = TH_ACK; p->flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(11); @@ -4054,7 +4075,7 @@ static int StreamTcpTest11 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(2); @@ -4066,7 +4087,7 @@ static int StreamTcpTest11 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if (stream_config.async_oneside != TRUE) { @@ -4118,6 +4139,8 @@ static int StreamTcpTest12 (void) { uint8_t payload[4]; memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset (&f, 0, sizeof(Flow)); memset(&tv, 0, sizeof (ThreadVars)); memset(&stt, 0, sizeof (StreamTcpThread)); @@ -4133,7 +4156,7 @@ static int StreamTcpTest12 (void) { p->tcph = &tcph; int ret = 0; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(10); @@ -4145,7 +4168,7 @@ static int StreamTcpTest12 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(6); @@ -4157,7 +4180,7 @@ static int StreamTcpTest12 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if (stream_config.async_oneside != TRUE) { @@ -4210,6 +4233,8 @@ static int StreamTcpTest13 (void) { uint8_t payload[4]; memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset (&f, 0, sizeof(Flow)); memset(&tv, 0, sizeof (ThreadVars)); memset(&stt, 0, sizeof (StreamTcpThread)); @@ -4225,7 +4250,7 @@ static int StreamTcpTest13 (void) { p->tcph = &tcph; int ret = 0; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(10); @@ -4237,7 +4262,7 @@ static int StreamTcpTest13 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(6); @@ -4249,7 +4274,7 @@ static int StreamTcpTest13 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if (stream_config.async_oneside != TRUE) { @@ -4276,7 +4301,7 @@ static int StreamTcpTest13 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if (((TcpSession *)(p->flow->protoctx))->client.last_ack != 9 && @@ -4408,6 +4433,8 @@ static int StreamTcpTest14 (void) { IPV4Hdr ipv4h; char os_policy_name[10] = "windows"; char *ip_addr; + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); @@ -4454,7 +4481,7 @@ static int StreamTcpTest14 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(20); @@ -4466,7 +4493,7 @@ static int StreamTcpTest14 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(15); @@ -4478,7 +4505,7 @@ static int StreamTcpTest14 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(14); @@ -4490,7 +4517,7 @@ static int StreamTcpTest14 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; addr.s_addr = inet_addr("192.168.0.2"); @@ -4504,7 +4531,7 @@ static int StreamTcpTest14 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(24); @@ -4516,7 +4543,7 @@ static int StreamTcpTest14 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if (stream_config.midstream != TRUE) { @@ -4576,6 +4603,8 @@ static int StreamTcp4WHSTest01 (void) { TCPHdr tcph; memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset (&f, 0, sizeof(Flow)); memset(&tv, 0, sizeof (ThreadVars)); memset(&stt, 0, sizeof (StreamTcpThread)); @@ -4590,7 +4619,7 @@ static int StreamTcp4WHSTest01 (void) { tcph.th_flags = TH_SYN; p->tcph = &tcph; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(20); @@ -4598,7 +4627,7 @@ static int StreamTcp4WHSTest01 (void) { p->tcph->th_flags = TH_SYN; p->flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if ((!(((TcpSession *)(p->flow->protoctx))->flags & STREAMTCP_FLAG_4WHS))) { @@ -4611,7 +4640,7 @@ static int StreamTcp4WHSTest01 (void) { p->tcph->th_flags = TH_SYN|TH_ACK; p->flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(21); @@ -4619,7 +4648,7 @@ static int StreamTcp4WHSTest01 (void) { p->tcph->th_flags = TH_ACK; p->flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if (((TcpSession *)(p->flow->protoctx))->state != TCP_ESTABLISHED) { @@ -4654,6 +4683,8 @@ static int StreamTcp4WHSTest02 (void) { TCPHdr tcph; memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset (&f, 0, sizeof(Flow)); memset(&tv, 0, sizeof (ThreadVars)); memset(&stt, 0, sizeof (StreamTcpThread)); @@ -4668,7 +4699,7 @@ static int StreamTcp4WHSTest02 (void) { tcph.th_flags = TH_SYN; p->tcph = &tcph; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(20); @@ -4676,7 +4707,7 @@ static int StreamTcp4WHSTest02 (void) { p->tcph->th_flags = TH_SYN; p->flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if ((!(((TcpSession *)(p->flow->protoctx))->flags & STREAMTCP_FLAG_4WHS))) { @@ -4689,7 +4720,7 @@ static int StreamTcp4WHSTest02 (void) { p->tcph->th_flags = TH_SYN|TH_ACK; p->flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, p, &stt) != -1) { + if (StreamTcpPacket(&tv, p, &stt, &pq) != -1) { printf("SYN/ACK pkt not rejected but it should have: "); goto end; } @@ -4721,6 +4752,8 @@ static int StreamTcp4WHSTest03 (void) { TCPHdr tcph; memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset (&f, 0, sizeof(Flow)); memset(&tv, 0, sizeof (ThreadVars)); memset(&stt, 0, sizeof (StreamTcpThread)); @@ -4735,7 +4768,7 @@ static int StreamTcp4WHSTest03 (void) { tcph.th_flags = TH_SYN; p->tcph = &tcph; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(20); @@ -4743,7 +4776,7 @@ static int StreamTcp4WHSTest03 (void) { p->tcph->th_flags = TH_SYN; p->flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if ((!(((TcpSession *)(p->flow->protoctx))->flags & STREAMTCP_FLAG_4WHS))) { @@ -4756,7 +4789,7 @@ static int StreamTcp4WHSTest03 (void) { p->tcph->th_flags = TH_SYN|TH_ACK; p->flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(11); @@ -4764,7 +4797,7 @@ static int StreamTcp4WHSTest03 (void) { p->tcph->th_flags = TH_ACK; p->flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if (((TcpSession *)(p->flow->protoctx))->state != TCP_ESTABLISHED) { @@ -4800,6 +4833,8 @@ static int StreamTcpTest15 (void) { IPV4Hdr ipv4h; char os_policy_name[10] = "windows"; char *ip_addr; + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); @@ -4846,7 +4881,7 @@ static int StreamTcpTest15 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(20); @@ -4858,7 +4893,7 @@ static int StreamTcpTest15 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(15); @@ -4870,7 +4905,7 @@ static int StreamTcpTest15 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(14); @@ -4882,7 +4917,7 @@ static int StreamTcpTest15 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; addr.s_addr = inet_addr("192.168.1.20"); @@ -4896,7 +4931,7 @@ static int StreamTcpTest15 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(24); @@ -4908,7 +4943,7 @@ static int StreamTcpTest15 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if (stream_config.midstream != TRUE) { @@ -4970,6 +5005,8 @@ static int StreamTcpTest16 (void) { IPV4Hdr ipv4h; char os_policy_name[10] = "windows"; char *ip_addr; + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); @@ -5016,7 +5053,7 @@ static int StreamTcpTest16 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(20); @@ -5028,7 +5065,7 @@ static int StreamTcpTest16 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(15); @@ -5040,7 +5077,7 @@ static int StreamTcpTest16 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(14); @@ -5052,7 +5089,7 @@ static int StreamTcpTest16 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; addr.s_addr = inet_addr("192.168.1.1"); @@ -5066,7 +5103,7 @@ static int StreamTcpTest16 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(24); @@ -5078,7 +5115,7 @@ static int StreamTcpTest16 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if (stream_config.midstream != TRUE) { @@ -5141,6 +5178,8 @@ static int StreamTcpTest17 (void) { IPV4Hdr ipv4h; char os_policy_name[10] = "windows"; char *ip_addr; + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); @@ -5187,7 +5226,7 @@ static int StreamTcpTest17 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(20); @@ -5199,7 +5238,7 @@ static int StreamTcpTest17 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(15); @@ -5211,7 +5250,7 @@ static int StreamTcpTest17 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(14); @@ -5223,7 +5262,7 @@ static int StreamTcpTest17 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; addr.s_addr = inet_addr("10.1.1.1"); @@ -5237,7 +5276,7 @@ static int StreamTcpTest17 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_seq = htonl(24); @@ -5249,7 +5288,7 @@ static int StreamTcpTest17 (void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; if (stream_config.midstream != TRUE) { @@ -5562,6 +5601,8 @@ static int StreamTcpTest23(void) uint8_t packet[1460] = ""; ThreadVars tv; int result = 1; + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); StreamTcpInitConfig(TRUE); @@ -5593,7 +5634,7 @@ static int StreamTcpTest23(void) p->tcph->th_ack = htonl(3373419609UL); p->payload_len = 2; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p, &pq) == -1) { printf("failed in segment reassmebling\n"); result &= 0; goto end; @@ -5603,7 +5644,7 @@ static int StreamTcpTest23(void) p->tcph->th_ack = htonl(3373419621UL); p->payload_len = 2; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p, &pq) == -1) { printf("failed in segment reassmebling\n"); result &= 0; goto end; @@ -5613,7 +5654,7 @@ static int StreamTcpTest23(void) p->tcph->th_ack = htonl(3373419621UL); p->payload_len = 6; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p, &pq) == -1) { printf("failed in segment reassmebling\n"); result &= 0; goto end; @@ -5649,6 +5690,8 @@ static int StreamTcpTest24(void) uint8_t packet[1460] = ""; ThreadVars tv; int result = 1; + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); StreamTcpInitConfig(TRUE); @@ -5680,7 +5723,7 @@ static int StreamTcpTest24(void) p->tcph->th_ack = htonl(3373419621UL); p->payload_len = 4; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p, &pq) == -1) { printf("failed in segment reassmebling\n"); result &= 0; goto end; @@ -5690,7 +5733,7 @@ static int StreamTcpTest24(void) p->tcph->th_ack = htonl(3373419633UL); p->payload_len = 2; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p, &pq) == -1) { printf("failed in segment reassmebling\n"); result &= 0; goto end; @@ -5700,7 +5743,7 @@ static int StreamTcpTest24(void) p->tcph->th_ack = htonl(3373419657UL); p->payload_len = 4; - if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p) == -1) { + if (StreamTcpReassembleHandleSegment(&tv, ra_ctx,&ssn, &ssn.client, p, &pq) == -1) { printf("failed in segment reassmebling\n"); result &= 0; goto end; @@ -5739,6 +5782,8 @@ static int StreamTcpTest25(void) { TCPHdr tcph; TcpReassemblyThreadCtx *ra_ctx = StreamTcpReassembleInitThreadCtx(); int ret = 0; + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); @@ -5762,14 +5807,14 @@ static int StreamTcpTest25(void) { StreamTcpInitConfig(TRUE); - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_ack = htonl(1); p->tcph->th_flags = TH_SYN | TH_ACK; p->flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) goto end; p->tcph->th_ack = htonl(1); @@ -5777,7 +5822,7 @@ static int StreamTcpTest25(void) { p->tcph->th_flags = TH_ACK; p->flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) goto end; p->tcph->th_ack = htonl(1); @@ -5789,11 +5834,11 @@ static int StreamTcpTest25(void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) goto end; p->flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) goto end; p->tcph->th_ack = htonl(1); @@ -5805,11 +5850,11 @@ static int StreamTcpTest25(void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) goto end; p->flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) goto end; StreamTcpSessionClear(p->flow->protoctx); @@ -5837,6 +5882,8 @@ static int StreamTcpTest26(void) { TCPHdr tcph; TcpReassemblyThreadCtx *ra_ctx = StreamTcpReassembleInitThreadCtx(); int ret = 0; + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); @@ -5854,14 +5901,14 @@ static int StreamTcpTest26(void) { StreamTcpInitConfig(TRUE); - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_ack = htonl(1); p->tcph->th_flags = TH_SYN | TH_ACK; p->flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) goto end; p->tcph->th_ack = htonl(1); @@ -5869,7 +5916,7 @@ static int StreamTcpTest26(void) { p->tcph->th_flags = TH_ACK; p->flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) goto end; p->tcph->th_ack = htonl(1); @@ -5881,11 +5928,11 @@ static int StreamTcpTest26(void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) goto end; p->flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) goto end; p->tcph->th_ack = htonl(1); @@ -5897,11 +5944,11 @@ static int StreamTcpTest26(void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) goto end; p->flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) goto end; StreamTcpSessionClear(p->flow->protoctx); @@ -5929,6 +5976,8 @@ static int StreamTcpTest27(void) { TCPHdr tcph; TcpReassemblyThreadCtx *ra_ctx = StreamTcpReassembleInitThreadCtx(); int ret = 0; + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); @@ -5946,14 +5995,14 @@ static int StreamTcpTest27(void) { StreamTcpInitConfig(TRUE); - if (StreamTcpPacket(&tv, p, &stt) == -1) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) goto end; p->tcph->th_ack = htonl(1); p->tcph->th_flags = TH_SYN | TH_ACK; p->flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) goto end; p->tcph->th_ack = htonl(1); @@ -5961,7 +6010,7 @@ static int StreamTcpTest27(void) { p->tcph->th_flags = TH_ACK; p->flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) goto end; p->tcph->th_ack = htonl(1); @@ -5973,11 +6022,11 @@ static int StreamTcpTest27(void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) goto end; p->flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) goto end; p->tcph->th_ack = htonl(1); @@ -5989,11 +6038,11 @@ static int StreamTcpTest27(void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) goto end; p->flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) goto end; StreamTcpSessionClear(p->flow->protoctx); @@ -6510,6 +6559,8 @@ static int StreamTcpTest32(void) { TCPHdr tcph; TcpReassemblyThreadCtx *ra_ctx = StreamTcpReassembleInitThreadCtx(); int ret = 0; + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset (&p, 0, SIZE_OF_PACKET); memset (&f, 0, sizeof(Flow)); @@ -6526,14 +6577,14 @@ static int StreamTcpTest32(void) { StreamTcpInitConfig(TRUE); - if (StreamTcpPacket(&tv, &p, &stt) == -1) + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1) goto end; p.tcph->th_ack = htonl(1); p.tcph->th_flags = TH_SYN | TH_ACK | TH_ECN; p.flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, &p, &stt) == -1 || (TcpSession *)p.flow->protoctx == NULL) { + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1 || (TcpSession *)p.flow->protoctx == NULL) { printf("failed in processing packet\n"); goto end; } @@ -6543,7 +6594,7 @@ static int StreamTcpTest32(void) { p.tcph->th_flags = TH_ACK | TH_ECN | TH_CWR; p.flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, &p, &stt) == -1 || (TcpSession *)p.flow->protoctx == NULL) { + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1 || (TcpSession *)p.flow->protoctx == NULL) { printf("failed in processing packet\n"); goto end; } @@ -6557,14 +6608,14 @@ static int StreamTcpTest32(void) { p.payload = payload; p.payload_len = 3; - if (StreamTcpPacket(&tv, &p, &stt) == -1 || (TcpSession *)p.flow->protoctx == NULL) { + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1 || (TcpSession *)p.flow->protoctx == NULL) { printf("failed in processing packet\n"); goto end; } p.flowflags = FLOW_PKT_TOCLIENT; p.tcph->th_flags = TH_ACK; - if (StreamTcpPacket(&tv, &p, &stt) == -1 || (TcpSession *)p.flow->protoctx == NULL) { + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1 || (TcpSession *)p.flow->protoctx == NULL) { printf("failed in processing packet\n"); goto end; } @@ -6597,6 +6648,8 @@ static int StreamTcpTest33 (void) { TCPHdr tcph; TcpReassemblyThreadCtx ra_ctx; StreamMsgQueue stream_q; + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&stream_q, 0, sizeof(StreamMsgQueue)); memset(&ra_ctx, 0, sizeof(TcpReassemblyThreadCtx)); memset (&p, 0, SIZE_OF_PACKET); @@ -6615,14 +6668,14 @@ static int StreamTcpTest33 (void) { StreamTcpInitConfig(TRUE); - if (StreamTcpPacket(&tv, &p, &stt) == -1) + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1) goto end; p.tcph->th_ack = htonl(1); p.tcph->th_flags = TH_SYN | TH_ACK; p.flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, &p, &stt) == -1) + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1) goto end; p.tcph->th_ack = htonl(1); @@ -6630,7 +6683,7 @@ static int StreamTcpTest33 (void) { p.tcph->th_flags = TH_ACK; p.flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, &p, &stt) == -1) + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1) goto end; p.tcph->th_ack = htonl(1); @@ -6638,7 +6691,7 @@ static int StreamTcpTest33 (void) { p.tcph->th_flags = TH_RST | TH_ACK; p.flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, &p, &stt) == -1) + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1) goto end; if (((TcpSession *)(p.flow->protoctx))->state != TCP_CLOSED) { @@ -6650,7 +6703,7 @@ static int StreamTcpTest33 (void) { p.tcph->th_flags = TH_SYN; p.flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, &p, &stt) == -1) + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1) goto end; p.tcph->th_seq = htonl(1); @@ -6658,7 +6711,7 @@ static int StreamTcpTest33 (void) { p.tcph->th_flags = TH_SYN | TH_ACK; p.flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, &p, &stt) == -1) + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1) goto end; p.tcph->th_ack = htonl(2); @@ -6666,7 +6719,7 @@ static int StreamTcpTest33 (void) { p.tcph->th_flags = TH_ACK; p.flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, &p, &stt) == -1) + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1) goto end; if (((TcpSession *)(p.flow->protoctx))->state != TCP_ESTABLISHED) { @@ -6696,6 +6749,8 @@ static int StreamTcpTest34 (void) { TCPHdr tcph; TcpReassemblyThreadCtx ra_ctx; StreamMsgQueue stream_q; + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&stream_q, 0, sizeof(StreamMsgQueue)); memset(&ra_ctx, 0, sizeof(TcpReassemblyThreadCtx)); memset (&p, 0, SIZE_OF_PACKET); @@ -6714,14 +6769,14 @@ static int StreamTcpTest34 (void) { StreamTcpInitConfig(TRUE); - if (StreamTcpPacket(&tv, &p, &stt) == -1) + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1) goto end; p.tcph->th_ack = htonl(1); p.tcph->th_flags = TH_SYN | TH_ACK; p.flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, &p, &stt) == -1) + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1) goto end; p.tcph->th_ack = htonl(1); @@ -6729,7 +6784,7 @@ static int StreamTcpTest34 (void) { p.tcph->th_flags = TH_ACK; p.flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, &p, &stt) == -1) + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1) goto end; if (((TcpSession *)(p.flow->protoctx))->state != TCP_ESTABLISHED) { @@ -6759,6 +6814,8 @@ static int StreamTcpTest35 (void) { TCPHdr tcph; TcpReassemblyThreadCtx ra_ctx; StreamMsgQueue stream_q; + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(&stream_q, 0, sizeof(StreamMsgQueue)); memset(&ra_ctx, 0, sizeof(TcpReassemblyThreadCtx)); memset (&p, 0, SIZE_OF_PACKET); @@ -6777,14 +6834,14 @@ static int StreamTcpTest35 (void) { StreamTcpInitConfig(TRUE); - if (StreamTcpPacket(&tv, &p, &stt) == -1) + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1) goto end; p.tcph->th_ack = htonl(1); p.tcph->th_flags = TH_SYN | TH_ACK; p.flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, &p, &stt) == -1) + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1) goto end; p.tcph->th_ack = htonl(1); @@ -6792,7 +6849,7 @@ static int StreamTcpTest35 (void) { p.tcph->th_flags = TH_ACK; p.flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, &p, &stt) == -1) + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1) goto end; if (((TcpSession *)(p.flow->protoctx))->state != TCP_ESTABLISHED) { @@ -6821,6 +6878,8 @@ static int StreamTcpTest36(void) { TCPHdr tcph; TcpReassemblyThreadCtx *ra_ctx = StreamTcpReassembleInitThreadCtx(); int ret = 0; + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset (&p, 0, SIZE_OF_PACKET); memset (&f, 0, sizeof(Flow)); @@ -6837,7 +6896,7 @@ static int StreamTcpTest36(void) { StreamTcpInitConfig(TRUE); - if (StreamTcpPacket(&tv, &p, &stt) == -1) { + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1) { printf("failed in processing packet\n"); goto end; } @@ -6846,7 +6905,7 @@ static int StreamTcpTest36(void) { p.tcph->th_flags = TH_SYN | TH_ACK; p.flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, &p, &stt) == -1 || (TcpSession *)p.flow->protoctx == NULL) { + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1 || (TcpSession *)p.flow->protoctx == NULL) { printf("failed in processing packet\n"); goto end; } @@ -6856,7 +6915,7 @@ static int StreamTcpTest36(void) { p.tcph->th_flags = TH_ACK; p.flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, &p, &stt) == -1 || (TcpSession *)p.flow->protoctx == NULL) { + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1 || (TcpSession *)p.flow->protoctx == NULL) { printf("failed in processing packet\n"); goto end; } @@ -6875,7 +6934,7 @@ static int StreamTcpTest36(void) { p.payload = payload; p.payload_len = 3; - if (StreamTcpPacket(&tv, &p, &stt) == -1 || (TcpSession *)p.flow->protoctx == NULL) { + if (StreamTcpPacket(&tv, &p, &stt, &pq) == -1 || (TcpSession *)p.flow->protoctx == NULL) { printf("failed in processing packet\n"); goto end; } @@ -6911,6 +6970,8 @@ static int StreamTcpTest37(void) { TCPHdr tcph; TcpReassemblyThreadCtx *ra_ctx = StreamTcpReassembleInitThreadCtx(); int ret = 0; + PacketQueue pq; + memset(&pq,0,sizeof(PacketQueue)); memset(p, 0, SIZE_OF_PACKET); p->pkt = (uint8_t *)(p + 1); @@ -6930,7 +6991,7 @@ static int StreamTcpTest37(void) { StreamTcpInitConfig(TRUE); - if (StreamTcpPacket(&tv, p, &stt) == -1) { + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1) { printf("failed in processing packet\n"); goto end; } @@ -6939,7 +7000,7 @@ static int StreamTcpTest37(void) { p->tcph->th_flags = TH_SYN | TH_ACK; p->flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) { + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) { printf("failed in processing packet\n"); goto end; } @@ -6949,7 +7010,7 @@ static int StreamTcpTest37(void) { p->tcph->th_flags = TH_ACK; p->flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) { + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) { printf("failed in processing packet\n"); goto end; } @@ -6964,7 +7025,7 @@ static int StreamTcpTest37(void) { p->tcph->th_flags = TH_ACK|TH_FIN; p->flowflags = FLOW_PKT_TOSERVER; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) { + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) { printf("failed in processing packet\n"); goto end; } @@ -6983,7 +7044,7 @@ static int StreamTcpTest37(void) { p->payload = payload; p->payload_len = 3; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) { + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) { printf("failed in processing packet\n"); goto end; } @@ -6994,7 +7055,7 @@ static int StreamTcpTest37(void) { p->payload_len = 0; p->flowflags = FLOW_PKT_TOCLIENT; - if (StreamTcpPacket(&tv, p, &stt) == -1 || (TcpSession *)p->flow->protoctx == NULL) { + if (StreamTcpPacket(&tv, p, &stt, &pq) == -1 || (TcpSession *)p->flow->protoctx == NULL) { printf("failed in processing packet\n"); goto end; } diff --git a/src/util-unittest-helper.c b/src/util-unittest-helper.c index 74a5a5474f..5324a70831 100644 --- a/src/util-unittest-helper.c +++ b/src/util-unittest-helper.c @@ -24,6 +24,8 @@ * when constructing unittests */ +#include + #include "suricata-common.h" #include "decode.h" @@ -73,12 +75,23 @@ Packet *UTHBuildPacketIPV6Real(uint8_t *payload, uint16_t payload_len, p->payload_len = payload_len; p->proto = ipproto; + p->ip6h = SCMalloc(sizeof(IPV6Hdr)); + if (p->ip6h == NULL) + return NULL; + memset(p->ip6h, 0, sizeof(IPV6Hdr)); + p->ip6h->s_ip6_nxt = ipproto; + p->ip6h->s_ip6_plen = htons(payload_len + sizeof(TCPHdr)); + inet_pton(AF_INET6, src, &in); p->src.addr_data32[0] = in[0]; p->src.addr_data32[1] = in[1]; p->src.addr_data32[2] = in[2]; p->src.addr_data32[3] = in[3]; p->sp = sport; + p->ip6h->ip6_src[0] = in[0]; + p->ip6h->ip6_src[1] = in[1]; + p->ip6h->ip6_src[2] = in[2]; + p->ip6h->ip6_src[3] = in[3]; inet_pton(AF_INET6, dst, &in); p->dst.addr_data32[0] = in[0]; @@ -86,19 +99,17 @@ Packet *UTHBuildPacketIPV6Real(uint8_t *payload, uint16_t payload_len, p->dst.addr_data32[2] = in[2]; p->dst.addr_data32[3] = in[3]; p->dp = dport; - - p->ip6h = SCMalloc(sizeof(IPV6Hdr)); - if (p->ip6h == NULL) - return NULL; - memset(p->ip6h, 0, sizeof(IPV6Hdr)); - p->ip6h->s_ip6_nxt = ipproto; + p->ip6h->ip6_dst[0] = in[0]; + p->ip6h->ip6_dst[1] = in[1]; + p->ip6h->ip6_dst[2] = in[2]; + p->ip6h->ip6_dst[3] = in[3]; p->tcph = SCMalloc(sizeof(TCPHdr)); if (p->tcph == NULL) return NULL; memset(p->tcph, 0, sizeof(TCPHdr)); - p->tcph->th_sport = sport; - p->tcph->th_dport = dport; + p->tcph->th_sport = htons(sport); + p->tcph->th_dport = htons(dport); SET_PKT_LEN(p, sizeof(IPV6Hdr) + sizeof(TCPHdr) + payload_len); return p; @@ -155,6 +166,7 @@ Packet *UTHBuildPacketReal(uint8_t *payload, uint16_t payload_len, p->ip4h->ip_src.s_addr = p->src.addr_data32[0]; p->ip4h->ip_dst.s_addr = p->dst.addr_data32[0]; p->ip4h->ip_proto = ipproto; + p->ip4h->ip_verhl = sizeof(IPV4Hdr); p->proto = ipproto; switch (ipproto) { @@ -172,8 +184,8 @@ Packet *UTHBuildPacketReal(uint8_t *payload, uint16_t payload_len, if (p->tcph == NULL) return NULL; memset(p->tcph, 0, sizeof(TCPHdr)); - p->tcph->th_sport = sport; - p->tcph->th_dport = dport; + p->tcph->th_sport = htons(sport); + p->tcph->th_dport = htons(dport); SET_PKT_LEN(p, sizeof(IPV4Hdr) + sizeof(TCPHdr) + payload_len); break; case IPPROTO_ICMP: @@ -773,9 +785,9 @@ int CheckUTHTestPacket(Packet *p, uint16_t ipproto) { case IPPROTO_TCP: if (p->tcph == NULL) return 0; - if (p->tcph->th_sport != sport) + if (ntohs(p->tcph->th_sport) != sport) return 0; - if (p->tcph->th_dport != dport) + if (ntohs(p->tcph->th_dport) != dport) return 0; break; } diff --git a/src/util-unittest-helper.h b/src/util-unittest-helper.h index 12edb31132..1dfb6b7a59 100644 --- a/src/util-unittest-helper.h +++ b/src/util-unittest-helper.h @@ -48,7 +48,8 @@ int UTHMatchPacketsWithResults(DetectEngineCtx *, Packet **, int, uint32_t *, ui int UTHGenericTest(Packet **, int, char **, uint32_t *, uint32_t *, int); uint32_t UTHBuildPacketOfFlows(uint32_t, uint32_t, uint8_t); - +Packet *UTHBuildPacketIPV6Real(uint8_t *, uint16_t , uint16_t , char *, char *, + uint16_t , uint16_t ); void UTHRegisterTests(void); #endif /* __UTIL_UNITTEST_HELPER__ */