49 static void StreamTcpSackPrintList(
TcpStream *stream)
95 SCLogDebug(
"-> (fwd) tr %p %u/%u REMOVED ECLIPSED2", tr, tr->
le, tr->
re);
96 TCPSACK_RB_REMOVE(tree, tr);
97 StreamTcpSackRecordFree(tr);
107 SCLogDebug(
"-> (fwd) tr %p %u/%u REMOVED ECLIPSED", tr, tr->
le, tr->
re);
109 TCPSACK_RB_REMOVE(tree, tr);
110 StreamTcpSackRecordFree(tr);
125 SCLogDebug(
"-> (fwd) tr %p %u/%u REMOVED MERGED", tr, tr->
le, tr->
re);
126 TCPSACK_RB_REMOVE(tree, tr);
127 StreamTcpSackRecordFree(tr);
132 static inline void ConsolidateBackward(
TcpStream *stream,
149 SCLogDebug(
"-> (bwd) tr %p %u/%u REMOVED ECLIPSED2", tr, tr->
le, tr->
re);
150 TCPSACK_RB_REMOVE(tree, tr);
151 StreamTcpSackRecordFree(tr);
161 SCLogDebug(
"-> (bwd) tr %p %u/%u REMOVED ECLIPSED", tr, tr->
le, tr->
re);
163 TCPSACK_RB_REMOVE(tree, tr);
164 StreamTcpSackRecordFree(tr);
177 SCLogDebug(
"-> (bwd) tr %p %u/%u REMOVED MERGED", tr, tr->
le, tr->
re);
178 TCPSACK_RB_REMOVE(tree, tr);
179 StreamTcpSackRecordFree(tr);
184 static int Insert(
TcpStream *stream,
struct TCPSACK *tree, uint32_t
le, uint32_t
re)
196 SCLogDebug(
"* insert failed: exact match in tree with %p %u/%u", res, res->
le, res->
re);
197 StreamTcpSackRecordFree(sa);
201 ConsolidateBackward(stream, tree, sa);
202 ConsolidateFwd(stream, tree, sa);
215 static int StreamTcpSackInsertRange(
TcpStream *stream, uint32_t
le, uint32_t
re)
219 StreamTcpSackPrintList(stream);
252 const TCPHdr *tcph = PacketGetTCP(
p);
256 if (records == 0 || data == NULL)
262 uint32_t first_le = 0;
263 uint32_t first_re = 0;
265 for (
int record = 0; record < records; record++) {
274 SCLogDebug(
"%p last_ack %u, left edge %u, right edge %u pkt ACK %u", sack_rec,
283 }
else if (record == 1) {
285 SCLogDebug(
"packet: %" PRIu64
": D-SACK? %u-%u inside 2nd range %u-%u ACK %u",
308 if (StreamTcpSackInsertRange(stream,
le,
re) == -1) {
317 StreamTcpSackPrintList(stream);
322 static inline int CompareOverlap(
325 if (lookup->
re <= intree->
le)
327 else if (lookup->
re >= intree->
le && lookup->
le < intree->
re)
342 const int comp = CompareOverlap(elm, tmp);
347 }
else if (comp > 0) {
358 const TCPHdr *tcph = PacketGetTCP(
p);
361 if (records > 0 && data != NULL) {
362 int sack_outdated = 0;
365 for (
int record = 0; record < records; record++) {
375 if (
le >= res->
le && re <= res->
re) {
376 SCLogDebug(
"SACK rec le:%u re:%u eclipsed by in tree le:%u re:%u",
le,
re,
380 SCLogDebug(
"SACK rec le:%u re:%u SACKs new DATA vs in tree le:%u re:%u",
le,
re,
384 SCLogDebug(
"SACK rec le:%u re:%u SACKs new DATA. No match in tree",
le,
re);
389 StreamTcpSackPrintList(stream);
391 if (records != sack_outdated) {
411 TCPSACK_RB_REMOVE(&stream->
sack_tree, rec);
412 StreamTcpSackRecordFree(rec);
422 SCLogDebug(
"record beyond last_ack, nothing to do. Bailing out.");
427 StreamTcpSackPrintList(stream);
444 TCPSACK_RB_REMOVE(&stream->
sack_tree, rec);
445 StreamTcpSackRecordFree(rec);
460 static int StreamTcpSackTest01 (
void)
463 memset(&stream, 0,
sizeof(stream));
466 StreamTcpSackInsertRange(&stream, 1, 10);
468 StreamTcpSackInsertRange(&stream, 10, 20);
470 StreamTcpSackInsertRange(&stream, 10, 20);
472 StreamTcpSackInsertRange(&stream, 1, 20);
475 StreamTcpSackPrintList(&stream);
484 FAIL_IF(StreamTcpSackedSize(&stream) != 19);
495 static int StreamTcpSackTest02 (
void)
498 memset(&stream, 0,
sizeof(stream));
501 StreamTcpSackInsertRange(&stream, 10, 20);
502 StreamTcpSackInsertRange(&stream, 1, 20);
504 StreamTcpSackPrintList(&stream);
513 FAIL_IF(StreamTcpSackedSize(&stream) != 19);
524 static int StreamTcpSackTest03 (
void)
527 memset(&stream, 0,
sizeof(stream));
530 StreamTcpSackInsertRange(&stream, 10, 20);
531 StreamTcpSackInsertRange(&stream, 5, 15);
533 StreamTcpSackPrintList(&stream);
535 StreamTcpSackInsertRange(&stream, 15, 25);
537 StreamTcpSackPrintList(&stream);
546 FAIL_IF(StreamTcpSackedSize(&stream) != 20);
557 static int StreamTcpSackTest04 (
void)
560 memset(&stream, 0,
sizeof(stream));
563 StreamTcpSackInsertRange(&stream, 0, 20);
564 StreamTcpSackInsertRange(&stream, 30, 50);
565 StreamTcpSackInsertRange(&stream, 10, 25);
567 StreamTcpSackPrintList(&stream);
576 FAIL_IF(StreamTcpSackedSize(&stream) != 45);
587 static int StreamTcpSackTest05 (
void)
590 memset(&stream, 0,
sizeof(stream));
593 StreamTcpSackInsertRange(&stream, 0, 20);
594 StreamTcpSackInsertRange(&stream, 30, 50);
595 StreamTcpSackInsertRange(&stream, 10, 35);
597 StreamTcpSackPrintList(&stream);
606 FAIL_IF(StreamTcpSackedSize(&stream) != 50);
617 static int StreamTcpSackTest06 (
void)
620 memset(&stream, 0,
sizeof(stream));
623 StreamTcpSackInsertRange(&stream, 0, 9);
624 StreamTcpSackInsertRange(&stream, 11, 19);
625 StreamTcpSackInsertRange(&stream, 21, 29);
626 StreamTcpSackInsertRange(&stream, 31, 39);
627 StreamTcpSackInsertRange(&stream, 0, 40);
629 StreamTcpSackPrintList(&stream);
638 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
649 static int StreamTcpSackTest07 (
void)
652 memset(&stream, 0,
sizeof(stream));
655 StreamTcpSackInsertRange(&stream, 0, 9);
656 StreamTcpSackInsertRange(&stream, 11, 19);
657 StreamTcpSackInsertRange(&stream, 21, 29);
658 StreamTcpSackInsertRange(&stream, 31, 39);
659 StreamTcpSackInsertRange(&stream, 0, 40);
661 StreamTcpSackPrintList(&stream);
668 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
672 FAIL_IF(StreamTcpSackedSize(&stream) != 30);
684 static int StreamTcpSackTest08 (
void)
687 memset(&stream, 0,
sizeof(stream));
690 StreamTcpSackInsertRange(&stream, 0, 9);
691 StreamTcpSackInsertRange(&stream, 11, 19);
692 StreamTcpSackInsertRange(&stream, 21, 29);
693 StreamTcpSackInsertRange(&stream, 31, 39);
694 StreamTcpSackInsertRange(&stream, 0, 40);
696 StreamTcpSackPrintList(&stream);
703 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
707 FAIL_IF(StreamTcpSackedSize(&stream) != 0);
719 static int StreamTcpSackTest09 (
void)
722 memset(&stream, 0,
sizeof(stream));
725 StreamTcpSackInsertRange(&stream, 0, 9);
726 StreamTcpSackInsertRange(&stream, 11, 19);
727 StreamTcpSackInsertRange(&stream, 21, 29);
728 StreamTcpSackInsertRange(&stream, 31, 39);
729 StreamTcpSackInsertRange(&stream, 0, 40);
732 StreamTcpSackPrintList(&stream);
739 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
743 FAIL_IF(StreamTcpSackedSize(&stream) != 1);
755 static int StreamTcpSackTest10 (
void)
758 memset(&stream, 0,
sizeof(stream));
761 StreamTcpSackInsertRange(&stream, 100, 119);
762 StreamTcpSackInsertRange(&stream, 111, 119);
763 StreamTcpSackInsertRange(&stream, 121, 129);
764 StreamTcpSackInsertRange(&stream, 131, 139);
765 StreamTcpSackInsertRange(&stream, 100, 140);
767 StreamTcpSackPrintList(&stream);
774 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
778 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
790 static int StreamTcpSackTest11 (
void)
793 memset(&stream, 0,
sizeof(stream));
796 StreamTcpSackInsertRange(&stream, 100, 119);
797 StreamTcpSackInsertRange(&stream, 111, 119);
798 StreamTcpSackInsertRange(&stream, 121, 129);
799 StreamTcpSackInsertRange(&stream, 131, 139);
800 StreamTcpSackInsertRange(&stream, 101, 140);
802 StreamTcpSackPrintList(&stream);
809 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
813 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
825 static int StreamTcpSackTest12 (
void)
828 memset(&stream, 0,
sizeof(stream));
831 StreamTcpSackInsertRange(&stream, 800, 1000);
832 StreamTcpSackInsertRange(&stream, 700, 900);
833 StreamTcpSackInsertRange(&stream, 600, 800);
834 StreamTcpSackInsertRange(&stream, 500, 700);
835 StreamTcpSackInsertRange(&stream, 100, 600);
837 StreamTcpSackPrintList(&stream);
844 FAIL_IF(StreamTcpSackedSize(&stream) != 900);
846 StreamTcpSackInsertRange(&stream, 0, 1000);
847 FAIL_IF(StreamTcpSackedSize(&stream) != 1000);
851 FAIL_IF(StreamTcpSackedSize(&stream) != 500);
863 static int StreamTcpSackTest13 (
void) {
865 memset(&stream, 0,
sizeof(stream));
869 for (
int i = 0; i < 10; i++) {
870 StreamTcpSackInsertRange(&stream, 100+(20*i), 110+(20*i));
873 StreamTcpSackPrintList(&stream);
876 FAIL_IF(StreamTcpSackedSize(&stream) != 0);
888 static int StreamTcpSackTest14 (
void) {
890 memset(&stream, 0,
sizeof(stream));
894 for (
int i = 0; i < 10; i++) {
895 StreamTcpSackInsertRange(&stream, 4000+(20*i), 4010+(20*i));
898 StreamTcpSackPrintList(&stream);
901 FAIL_IF(StreamTcpSackedSize(&stream) != 0);
912 UtRegisterTest(
"StreamTcpSackTest01 -- Insertion", StreamTcpSackTest01);
913 UtRegisterTest(
"StreamTcpSackTest02 -- Insertion", StreamTcpSackTest02);
914 UtRegisterTest(
"StreamTcpSackTest03 -- Insertion", StreamTcpSackTest03);
915 UtRegisterTest(
"StreamTcpSackTest04 -- Insertion", StreamTcpSackTest04);
916 UtRegisterTest(
"StreamTcpSackTest05 -- Insertion", StreamTcpSackTest05);
917 UtRegisterTest(
"StreamTcpSackTest06 -- Insertion", StreamTcpSackTest06);
918 UtRegisterTest(
"StreamTcpSackTest07 -- Pruning", StreamTcpSackTest07);
919 UtRegisterTest(
"StreamTcpSackTest08 -- Pruning", StreamTcpSackTest08);
920 UtRegisterTest(
"StreamTcpSackTest09 -- Pruning", StreamTcpSackTest09);
921 UtRegisterTest(
"StreamTcpSackTest10 -- Pruning", StreamTcpSackTest10);
923 StreamTcpSackTest11);
925 StreamTcpSackTest12);
927 StreamTcpSackTest13);
929 StreamTcpSackTest14);