diff options
Diffstat (limited to 'framework/src/suricata/src/stream-tcp-sack.c')
-rw-r--r-- | framework/src/suricata/src/stream-tcp-sack.c | 960 |
1 files changed, 0 insertions, 960 deletions
diff --git a/framework/src/suricata/src/stream-tcp-sack.c b/framework/src/suricata/src/stream-tcp-sack.c deleted file mode 100644 index 9e5503f7..00000000 --- a/framework/src/suricata/src/stream-tcp-sack.c +++ /dev/null @@ -1,960 +0,0 @@ -/* Copyright (C) 2007-2011 Open Information Security Foundation - * - * You can copy, redistribute or modify this Program under the terms of - * the GNU General Public License version 2 as published by the Free - * Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * version 2 along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - * 02110-1301, USA. - */ - -/** - * \file - * - * \author Victor Julien <victor@inliniac.net> - * - * Stream engine TCP SACK handling. - */ - -#include "suricata-common.h" -#include "stream-tcp.h" -#include "stream-tcp-private.h" -#include "stream-tcp-sack.h" -#include "util-unittest.h" - -#ifdef DEBUG -void StreamTcpSackPrintList(TcpStream *stream) -{ - StreamTcpSackRecord *rec = stream->sack_head; - for (; rec != NULL; rec = rec->next) { - SCLogDebug("record %8u - %8u", rec->le, rec->re); - } -} -#endif /* DEBUG */ - -static StreamTcpSackRecord *StreamTcpSackRecordAlloc(void) -{ - if (StreamTcpCheckMemcap((uint32_t)sizeof(StreamTcpSackRecord)) == 0) - return NULL; - - StreamTcpSackRecord *rec = SCMalloc(sizeof(*rec)); - if (unlikely(rec == NULL)) - return NULL; - - StreamTcpIncrMemuse((uint64_t)sizeof(*rec)); - return rec; -} - -static void StreamTcpSackRecordFree(StreamTcpSackRecord *rec) -{ - SCFree(rec); - StreamTcpDecrMemuse((uint64_t)sizeof(*rec)); -} - -/** - * \brief insert a SACK range - * - * \param le left edge in host order - * \param re right edge in host order - * - * \retval 0 all is good - * \retval -1 error - */ -static int StreamTcpSackInsertRange(TcpStream *stream, uint32_t le, uint32_t re) -{ - SCLogDebug("le %u, re %u", le, re); -#ifdef DEBUG - StreamTcpSackPrintList(stream); -#endif - - /* if to the left of last_ack then ignore */ - if (SEQ_LT(re, stream->last_ack)) { - SCLogDebug("too far left. discarding"); - goto end; - } - /* if to the right of the tcp window then ignore */ - if (SEQ_GT(le, (stream->last_ack + stream->window))) { - SCLogDebug("too far right. discarding"); - goto end; - } - if (stream->sack_head != NULL) { - StreamTcpSackRecord *rec; - - for (rec = stream->sack_head; rec != NULL; rec = rec->next) { - SCLogDebug("rec %p, le %u, re %u", rec, rec->le, rec->re); - - if (SEQ_LT(le, rec->le)) { - SCLogDebug("SEQ_LT(le, rec->le)"); - if (SEQ_LT(re, rec->le)) { - SCLogDebug("SEQ_LT(re, rec->le)"); - // entirely before, prepend - StreamTcpSackRecord *stsr = StreamTcpSackRecordAlloc(); - if (unlikely(stsr == NULL)) { - SCReturnInt(-1); - } - stsr->le = le; - stsr->re = re; - - stsr->next = stream->sack_head; - stream->sack_head = stsr; - goto end; - } else if (SEQ_EQ(re, rec->le)) { - SCLogDebug("SEQ_EQ(re, rec->le)"); - // starts before, ends on rec->le, expand - rec->le = le; - } else if (SEQ_GT(re, rec->le)) { - SCLogDebug("SEQ_GT(re, rec->le)"); - // starts before, ends beyond rec->le - if (SEQ_LEQ(re, rec->re)) { - SCLogDebug("SEQ_LEQ(re, rec->re)"); - // ends before rec->re, expand - rec->le = le; - } else { // implied if (re > rec->re) - SCLogDebug("implied if (re > rec->re), le set to %u", rec->re); - le = rec->re; - continue; - } - } - } else if (SEQ_EQ(le, rec->le)) { - SCLogDebug("SEQ_EQ(le, rec->le)"); - if (SEQ_LEQ(re, rec->re)) { - SCLogDebug("SEQ_LEQ(re, rec->re)"); - // new record fully overlapped - SCReturnInt(0); - } else { // implied re > rec->re - SCLogDebug("implied re > rec->re"); - if (rec->next != NULL) { - if (SEQ_LEQ(re, rec->next->le)) { - rec->re = re; - goto end; - } else { - rec->re = rec->next->le; - le = rec->next->le; - SCLogDebug("le is now %u", le); - continue; - } - } else { - rec->re = re; - goto end; - } - } - } else { // implied (le > rec->le) - SCLogDebug("implied (le > rec->le)"); - if (SEQ_LT(le, rec->re)) { - SCLogDebug("SEQ_LT(le, rec->re))"); - // new record fully overlapped - if (SEQ_GT(re, rec->re)) { - SCLogDebug("SEQ_GT(re, rec->re)"); - - if (rec->next != NULL) { - if (SEQ_LEQ(re, rec->next->le)) { - rec->re = re; - goto end; - } else { - rec->re = rec->next->le; - le = rec->next->le; - continue; - } - } else { - rec->re = re; - goto end; - } - } - - SCLogDebug("new range fully overlapped"); - SCReturnInt(0); - } else if (SEQ_EQ(le, rec->re)) { - SCLogDebug("here"); - // new record fully overlapped - //int r = StreamTcpSackInsertRange(stream, rec->re+1, re); - //SCReturnInt(r); - le = rec->re; - continue; - } else { /* implied le > rec->re */ - SCLogDebug("implied le > rec->re"); - if (rec->next == NULL) { - SCLogDebug("rec->next == NULL"); - StreamTcpSackRecord *stsr = StreamTcpSackRecordAlloc(); - if (unlikely(stsr == NULL)) { - SCReturnInt(-1); - } - stsr->le = le; - stsr->re = re; - stsr->next = NULL; - - stream->sack_tail->next = stsr; - stream->sack_tail = stsr; - goto end; - } else { - SCLogDebug("implied rec->next != NULL"); - if (SEQ_LT(le, rec->next->le) && SEQ_LT(re, rec->next->le)) { - SCLogDebug("SEQ_LT(le, rec->next->le) && SEQ_LT(re, rec->next->le)"); - StreamTcpSackRecord *stsr = StreamTcpSackRecordAlloc(); - if (unlikely(stsr == NULL)) { - SCReturnInt(-1); - } - stsr->le = le; - stsr->re = re; - stsr->next = rec->next; - rec->next = stsr; - - } else if (SEQ_LT(le, rec->next->le) && SEQ_GEQ(re, rec->next->le)) { - SCLogDebug("SEQ_LT(le, rec->next->le) && SEQ_GEQ(re, rec->next->le)"); - StreamTcpSackRecord *stsr = StreamTcpSackRecordAlloc(); - if (unlikely(stsr == NULL)) { - SCReturnInt(-1); - } - stsr->le = le; - stsr->re = rec->next->le; - stsr->next = rec->next; - rec->next = stsr; - - le = rec->next->le; - } - } - } - } - } - } else { - SCLogDebug("implied empty list"); - StreamTcpSackRecord *stsr = StreamTcpSackRecordAlloc(); - if (unlikely(stsr == NULL)) { - SCReturnInt(-1); - } - stsr->le = le; - stsr->re = re; - stsr->next = NULL; - - stream->sack_head = stsr; - stream->sack_tail = stsr; - } - - StreamTcpSackPruneList(stream); -end: - SCReturnInt(0); -} - -/** - * \brief Update stream with SACK records from a TCP packet. - * - * \param stream The stream to update. - * \param p packet to get the SACK records from - * - * \retval -1 error - * \retval 0 ok - */ -int StreamTcpSackUpdatePacket(TcpStream *stream, Packet *p) -{ - int records = TCP_GET_SACK_CNT(p); - int record = 0; - - TCPOptSackRecord *sack_rec = (TCPOptSackRecord *)(TCP_GET_SACK_PTR(p)); - - for (record = 0; record < records; record++) { - SCLogDebug("%p last_ack %u, left edge %u, right edge %u", sack_rec, - stream->last_ack, ntohl(sack_rec->le), ntohl(sack_rec->re)); - - if (SEQ_LEQ(ntohl(sack_rec->re), stream->last_ack)) { - SCLogDebug("record before last_ack"); - goto next; - } - - /** \todo need a metric to a check for a right edge limit */ -/* - if (SEQ_GT(ntohl(sack_rec->re), stream->next_seq)) { - SCLogDebug("record beyond next_seq %u", stream->next_seq); - goto next; - } -*/ - if (SEQ_GEQ(ntohl(sack_rec->le), ntohl(sack_rec->re))) { - SCLogDebug("invalid record: le >= re"); - goto next; - } - - if (StreamTcpSackInsertRange(stream, ntohl(sack_rec->le), - ntohl(sack_rec->re)) == -1) - { - SCReturnInt(-1); - } - - next: - sack_rec++; - } -#ifdef DEBUG - StreamTcpSackPrintList(stream); -#endif - SCReturnInt(0); -} - -void StreamTcpSackPruneList(TcpStream *stream) -{ - SCEnter(); - - StreamTcpSackRecord *rec = stream->sack_head; - - while (rec != NULL) { - if (SEQ_LT(rec->re, stream->last_ack)) { - SCLogDebug("removing le %u re %u", rec->le, rec->re); - - if (rec->next != NULL) { - stream->sack_head = rec->next; - StreamTcpSackRecordFree(rec); - rec = stream->sack_head; - continue; - } else { - stream->sack_head = NULL; - stream->sack_tail = NULL; - StreamTcpSackRecordFree(rec); - break; - } - } else if (SEQ_LT(rec->le, stream->last_ack)) { - SCLogDebug("adjusting record to le %u re %u", rec->le, rec->re); - /* last ack inside this record, update */ - rec->le = stream->last_ack; - break; - } else { - SCLogDebug("record beyond last_ack, nothing to do. Bailing out."); - break; - } - } -#ifdef DEBUG - StreamTcpSackPrintList(stream); -#endif - SCReturn; -} - -/** - * \brief Free SACK list from a stream - * - * \param stream Stream to cleanup - */ -void StreamTcpSackFreeList(TcpStream *stream) -{ - SCEnter(); - - StreamTcpSackRecord *rec = stream->sack_head; - StreamTcpSackRecord *next = NULL; - - while (rec != NULL) { - next = rec->next; - StreamTcpSackRecordFree(rec); - rec = next; - } - - stream->sack_head = NULL; - stream->sack_tail = NULL; - SCReturn; -} - - -#ifdef UNITTESTS - -/** - * \test Test the insertion of SACK ranges. - * - * \retval On success it returns 1 and on failure 0. - */ - -static int StreamTcpSackTest01 (void) -{ - TcpStream stream; - int retval = 0; - - memset(&stream, 0, sizeof(stream)); - stream.window = 100; - - StreamTcpSackInsertRange(&stream, 1, 10); - StreamTcpSackInsertRange(&stream, 10, 20); - StreamTcpSackInsertRange(&stream, 10, 20); - StreamTcpSackInsertRange(&stream, 1, 20); -#ifdef DEBUG - StreamTcpSackPrintList(&stream); -#endif /* DEBUG */ - - if (stream.sack_head->le != 1 || stream.sack_head->re != 20) { - printf("list in weird state, head le %u, re %u: ", - stream.sack_head->le, stream.sack_head->re); - goto end; - } - - if (StreamTcpSackedSize(&stream) != 19) { - printf("size should be 19, is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - retval = 1; -end: - SCReturnInt(retval); -} - -/** - * \test Test the insertion of SACK ranges. - * - * \retval On success it returns 1 and on failure 0. - */ - -static int StreamTcpSackTest02 (void) -{ - TcpStream stream; - int retval = 0; - - memset(&stream, 0, sizeof(stream)); - stream.window = 100; - - StreamTcpSackInsertRange(&stream, 10, 20); - StreamTcpSackInsertRange(&stream, 1, 20); -#ifdef DEBUG - StreamTcpSackPrintList(&stream); -#endif /* DEBUG */ - - if (stream.sack_head->le != 1 || stream.sack_head->re != 20) { - printf("list in weird state, head le %u, re %u: ", - stream.sack_head->le, stream.sack_head->re); - goto end; - } - - if (StreamTcpSackedSize(&stream) != 19) { - printf("size should be 19, is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - retval = 1; -end: - SCReturnInt(retval); -} - -/** - * \test Test the insertion of SACK ranges. - * - * \retval On success it returns 1 and on failure 0. - */ - -static int StreamTcpSackTest03 (void) -{ - TcpStream stream; - int retval = 0; - - memset(&stream, 0, sizeof(stream)); - stream.window = 100; - - StreamTcpSackInsertRange(&stream, 10, 20); - StreamTcpSackInsertRange(&stream, 5, 15); -#ifdef DEBUG - StreamTcpSackPrintList(&stream); -#endif /* DEBUG */ - StreamTcpSackInsertRange(&stream, 15, 25); -#ifdef DEBUG - StreamTcpSackPrintList(&stream); -#endif /* DEBUG */ - - if (stream.sack_head->le != 5) { - goto end; - } - - if (StreamTcpSackedSize(&stream) != 20) { - printf("size should be 20, is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - retval = 1; -end: - SCReturnInt(retval); -} - -/** - * \test Test the insertion of SACK ranges. - * - * \retval On success it returns 1 and on failure 0. - */ - -static int StreamTcpSackTest04 (void) -{ - TcpStream stream; - int retval = 0; - - memset(&stream, 0, sizeof(stream)); - stream.window = 100; - - StreamTcpSackInsertRange(&stream, 0, 20); - StreamTcpSackInsertRange(&stream, 30, 50); - StreamTcpSackInsertRange(&stream, 10, 25); -#ifdef DEBUG - StreamTcpSackPrintList(&stream); -#endif /* DEBUG */ - - if (stream.sack_head->le != 0) { - goto end; - } - - if (StreamTcpSackedSize(&stream) != 45) { - printf("size should be 45, is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - retval = 1; -end: - SCReturnInt(retval); -} - -/** - * \test Test the insertion of SACK ranges. - * - * \retval On success it returns 1 and on failure 0. - */ - -static int StreamTcpSackTest05 (void) -{ - TcpStream stream; - int retval = 0; - - memset(&stream, 0, sizeof(stream)); - stream.window = 100; - - StreamTcpSackInsertRange(&stream, 0, 20); - StreamTcpSackInsertRange(&stream, 30, 50); - StreamTcpSackInsertRange(&stream, 10, 35); -#ifdef DEBUG - StreamTcpSackPrintList(&stream); -#endif /* DEBUG */ - - if (stream.sack_head->le != 0) { - goto end; - } - - if (StreamTcpSackedSize(&stream) != 50) { - printf("size should be 50, is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - retval = 1; -end: - SCReturnInt(retval); -} - -/** - * \test Test the insertion of SACK ranges. - * - * \retval On success it returns 1 and on failure 0. - */ - -static int StreamTcpSackTest06 (void) -{ - TcpStream stream; - int retval = 0; - - memset(&stream, 0, sizeof(stream)); - stream.window = 100; - - StreamTcpSackInsertRange(&stream, 0, 9); - StreamTcpSackInsertRange(&stream, 11, 19); - StreamTcpSackInsertRange(&stream, 21, 29); - StreamTcpSackInsertRange(&stream, 31, 39); - StreamTcpSackInsertRange(&stream, 0, 40); -#ifdef DEBUG - StreamTcpSackPrintList(&stream); -#endif /* DEBUG */ - - if (stream.sack_head->le != 0) { - goto end; - } - - if (StreamTcpSackedSize(&stream) != 40) { - printf("size should be 40, is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - retval = 1; -end: - SCReturnInt(retval); -} - -/** - * \test Test the pruning of SACK ranges. - * - * \retval On success it returns 1 and on failure 0. - */ - -static int StreamTcpSackTest07 (void) -{ - TcpStream stream; - int retval = 0; - - memset(&stream, 0, sizeof(stream)); - stream.window = 100; - - StreamTcpSackInsertRange(&stream, 0, 9); - StreamTcpSackInsertRange(&stream, 11, 19); - StreamTcpSackInsertRange(&stream, 21, 29); - StreamTcpSackInsertRange(&stream, 31, 39); - StreamTcpSackInsertRange(&stream, 0, 40); -#ifdef DEBUG - StreamTcpSackPrintList(&stream); -#endif /* DEBUG */ - - if (stream.sack_head->le != 0) { - goto end; - } - - if (StreamTcpSackedSize(&stream) != 40) { - printf("size should be 40, is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - stream.last_ack = 10; - - StreamTcpSackPruneList(&stream); - - if (StreamTcpSackedSize(&stream) != 30) { - printf("size should be 30, is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - retval = 1; -end: - SCReturnInt(retval); -} - -/** - * \test Test the pruning of SACK ranges. - * - * \retval On success it returns 1 and on failure 0. - */ - -static int StreamTcpSackTest08 (void) -{ - TcpStream stream; - int retval = 0; - - memset(&stream, 0, sizeof(stream)); - stream.window = 100; - - StreamTcpSackInsertRange(&stream, 0, 9); - StreamTcpSackInsertRange(&stream, 11, 19); - StreamTcpSackInsertRange(&stream, 21, 29); - StreamTcpSackInsertRange(&stream, 31, 39); - StreamTcpSackInsertRange(&stream, 0, 40); -#ifdef DEBUG - StreamTcpSackPrintList(&stream); -#endif /* DEBUG */ - - if (stream.sack_head->le != 0) { - goto end; - } - - if (StreamTcpSackedSize(&stream) != 40) { - printf("size should be 40, is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - stream.last_ack = 41; - - StreamTcpSackPruneList(&stream); - - if (StreamTcpSackedSize(&stream) != 0) { - printf("size should be 0, is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - retval = 1; -end: - SCReturnInt(retval); -} - -/** - * \test Test the pruning of SACK ranges. - * - * \retval On success it returns 1 and on failure 0. - */ - -static int StreamTcpSackTest09 (void) -{ - TcpStream stream; - int retval = 0; - - memset(&stream, 0, sizeof(stream)); - stream.window = 100; - - StreamTcpSackInsertRange(&stream, 0, 9); - StreamTcpSackInsertRange(&stream, 11, 19); - StreamTcpSackInsertRange(&stream, 21, 29); - StreamTcpSackInsertRange(&stream, 31, 39); - StreamTcpSackInsertRange(&stream, 0, 40); - -#ifdef DEBUG - StreamTcpSackPrintList(&stream); -#endif /* DEBUG */ - - if (stream.sack_head->le != 0) { - goto end; - } - - if (StreamTcpSackedSize(&stream) != 40) { - printf("size should be 40, is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - stream.last_ack = 39; - - StreamTcpSackPruneList(&stream); - - if (StreamTcpSackedSize(&stream) != 1) { - printf("size should be 1, is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - retval = 1; -end: - SCReturnInt(retval); -} - -/** - * \test Test the pruning of SACK ranges. - * - * \retval On success it returns 1 and on failure 0. - */ - -static int StreamTcpSackTest10 (void) -{ - TcpStream stream; - int retval = 0; - - memset(&stream, 0, sizeof(stream)); - stream.window = 1000; - - StreamTcpSackInsertRange(&stream, 100, 119); - StreamTcpSackInsertRange(&stream, 111, 119); - StreamTcpSackInsertRange(&stream, 121, 129); - StreamTcpSackInsertRange(&stream, 131, 139); - StreamTcpSackInsertRange(&stream, 100, 140); -#ifdef DEBUG - StreamTcpSackPrintList(&stream); -#endif /* DEBUG */ - - if (stream.sack_head->le != 100) { - goto end; - } - - if (StreamTcpSackedSize(&stream) != 40) { - printf("size should be 40, is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - stream.last_ack = 99; - - StreamTcpSackPruneList(&stream); - - if (StreamTcpSackedSize(&stream) != 40) { - printf("size should be 40, is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - retval = 1; -end: - SCReturnInt(retval); -} - -/** - * \test Test the pruning of SACK ranges. - * - * \retval On success it returns 1 and on failure 0. - */ - -static int StreamTcpSackTest11 (void) -{ - TcpStream stream; - int retval = 0; - - memset(&stream, 0, sizeof(stream)); - stream.window = 1000; - - StreamTcpSackInsertRange(&stream, 100, 119); - StreamTcpSackInsertRange(&stream, 111, 119); - StreamTcpSackInsertRange(&stream, 121, 129); - StreamTcpSackInsertRange(&stream, 131, 139); - StreamTcpSackInsertRange(&stream, 101, 140); -#ifdef DEBUG - StreamTcpSackPrintList(&stream); -#endif /* DEBUG */ - - if (stream.sack_head->le != 100) { - goto end; - } - - if (StreamTcpSackedSize(&stream) != 40) { - printf("size should be 40, is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - stream.last_ack = 99; - - StreamTcpSackPruneList(&stream); - - if (StreamTcpSackedSize(&stream) != 40) { - printf("size should be 40, is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - retval = 1; -end: - SCReturnInt(retval); -} - -/** - * \test Test the pruning of SACK ranges. - * - * \retval On success it returns 1 and on failure 0. - */ - -static int StreamTcpSackTest12 (void) -{ - TcpStream stream; - int retval = 0; - - memset(&stream, 0, sizeof(stream)); - stream.window = 2000; - - StreamTcpSackInsertRange(&stream, 800, 1000); - StreamTcpSackInsertRange(&stream, 700, 900); - StreamTcpSackInsertRange(&stream, 600, 800); - StreamTcpSackInsertRange(&stream, 500, 700); - StreamTcpSackInsertRange(&stream, 100, 600); -#ifdef DEBUG - StreamTcpSackPrintList(&stream); -#endif /* DEBUG */ - - if (stream.sack_head->le != 100) { - goto end; - } - - if (StreamTcpSackedSize(&stream) != 900) { - printf("size should be 900, is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - StreamTcpSackInsertRange(&stream, 0, 1000); - - if (StreamTcpSackedSize(&stream) != 1000) { - printf("size should be 1000, is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - stream.last_ack = 500; - - StreamTcpSackPruneList(&stream); - - if (StreamTcpSackedSize(&stream) != 500) { - printf("size should be 500, is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - retval = 1; -end: - SCReturnInt(retval); -} - -/** - * \test Test the insertion on out of window condition. - * - * \retval On success it returns 1 and on failure 0. - */ - -static int StreamTcpSackTest13 (void) { - TcpStream stream; - int retval = 0; - int i; - - memset(&stream, 0, sizeof(stream)); - stream.last_ack = 10000; - stream.window = 2000; - - for (i = 0; i < 10; i++) { - StreamTcpSackInsertRange(&stream, 100+(20*i), 110+(20*i)); - } -#ifdef DEBUG - StreamTcpSackPrintList(&stream); -#endif /* DEBUG */ - - if (StreamTcpSackedSize(&stream) != 0) { - printf("Sacked size is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - retval = 1; -end: - SCReturnInt(retval); -} - -/** - * \test Test the insertion of out of window condition. - * - * \retval On success it returns 1 and on failure 0. - */ - -static int StreamTcpSackTest14 (void) { - TcpStream stream; - int retval = 0; - int i; - - memset(&stream, 0, sizeof(stream)); - stream.last_ack = 1000; - stream.window = 2000; - - for (i = 0; i < 10; i++) { - StreamTcpSackInsertRange(&stream, 4000+(20*i), 4010+(20*i)); - } -#ifdef DEBUG - StreamTcpSackPrintList(&stream); -#endif /* DEBUG */ - - if (StreamTcpSackedSize(&stream) != 0) { - printf("Sacked size is %u: ", StreamTcpSackedSize(&stream)); - goto end; - } - - retval = 1; -end: - SCReturnInt(retval); -} - -#endif /* UNITTESTS */ - -void StreamTcpSackRegisterTests (void) -{ -#ifdef UNITTESTS - UtRegisterTest("StreamTcpSackTest01 -- Insertion", - StreamTcpSackTest01, 1); - UtRegisterTest("StreamTcpSackTest02 -- Insertion", - StreamTcpSackTest02, 1); - UtRegisterTest("StreamTcpSackTest03 -- Insertion", - StreamTcpSackTest03, 1); - UtRegisterTest("StreamTcpSackTest04 -- Insertion", - StreamTcpSackTest04, 1); - UtRegisterTest("StreamTcpSackTest05 -- Insertion", - StreamTcpSackTest05, 1); - UtRegisterTest("StreamTcpSackTest06 -- Insertion", - StreamTcpSackTest06, 1); - UtRegisterTest("StreamTcpSackTest07 -- Pruning", - StreamTcpSackTest07, 1); - UtRegisterTest("StreamTcpSackTest08 -- Pruning", - StreamTcpSackTest08, 1); - UtRegisterTest("StreamTcpSackTest09 -- Pruning", - StreamTcpSackTest09, 1); - UtRegisterTest("StreamTcpSackTest10 -- Pruning", - StreamTcpSackTest10, 1); - UtRegisterTest("StreamTcpSackTest11 -- Insertion && Pruning", - StreamTcpSackTest11, 1); - UtRegisterTest("StreamTcpSackTest12 -- Insertion && Pruning", - StreamTcpSackTest12, 1); - UtRegisterTest("StreamTcpSackTest13 -- Insertion out of window", - StreamTcpSackTest13, 1); - UtRegisterTest("StreamTcpSackTest14 -- Insertion out of window", - StreamTcpSackTest14, 1); -#endif -} |