50 static void StreamTcpSackPrintList(
TcpStream *stream)
96 SCLogDebug(
"-> (fwd) tr %p %u/%u REMOVED ECLIPSED2", tr, tr->
le, tr->
re);
97 TCPSACK_RB_REMOVE(tree, tr);
98 StreamTcpSackRecordFree(tr);
108 SCLogDebug(
"-> (fwd) tr %p %u/%u REMOVED ECLIPSED", tr, tr->
le, tr->
re);
110 TCPSACK_RB_REMOVE(tree, tr);
111 StreamTcpSackRecordFree(tr);
126 SCLogDebug(
"-> (fwd) tr %p %u/%u REMOVED MERGED", tr, tr->
le, tr->
re);
127 TCPSACK_RB_REMOVE(tree, tr);
128 StreamTcpSackRecordFree(tr);
133 static inline void ConsolidateBackward(
TcpStream *stream,
150 SCLogDebug(
"-> (bwd) tr %p %u/%u REMOVED ECLIPSED2", tr, tr->
le, tr->
re);
151 TCPSACK_RB_REMOVE(tree, tr);
152 StreamTcpSackRecordFree(tr);
162 SCLogDebug(
"-> (bwd) tr %p %u/%u REMOVED ECLIPSED", tr, tr->
le, tr->
re);
164 TCPSACK_RB_REMOVE(tree, tr);
165 StreamTcpSackRecordFree(tr);
178 SCLogDebug(
"-> (bwd) tr %p %u/%u REMOVED MERGED", tr, tr->
le, tr->
re);
179 TCPSACK_RB_REMOVE(tree, tr);
180 StreamTcpSackRecordFree(tr);
185 static int Insert(
TcpStream *stream,
struct TCPSACK *tree, uint32_t
le, uint32_t
re)
197 SCLogDebug(
"* insert failed: exact match in tree with %p %u/%u", res, res->
le, res->
re);
198 StreamTcpSackRecordFree(sa);
202 ConsolidateBackward(stream, tree, sa);
203 ConsolidateFwd(stream, tree, sa);
216 static int StreamTcpSackInsertRange(
TcpStream *stream, uint32_t
le, uint32_t
re)
220 StreamTcpSackPrintList(stream);
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) {
360 if (records > 0 && data != NULL) {
361 int sack_outdated = 0;
364 for (
int record = 0; record < records; record++) {
374 if (
le >= res->
le && re <= res->
re) {
375 SCLogDebug(
"SACK rec le:%u re:%u eclipsed by in tree le:%u re:%u",
le,
re,
379 SCLogDebug(
"SACK rec le:%u re:%u SACKs new DATA vs in tree le:%u re:%u",
le,
re,
383 SCLogDebug(
"SACK rec le:%u re:%u SACKs new DATA. No match in tree",
le,
re);
388 StreamTcpSackPrintList(stream);
390 if (records != sack_outdated) {
410 TCPSACK_RB_REMOVE(&stream->
sack_tree, rec);
411 StreamTcpSackRecordFree(rec);
421 SCLogDebug(
"record beyond last_ack, nothing to do. Bailing out.");
426 StreamTcpSackPrintList(stream);
443 TCPSACK_RB_REMOVE(&stream->
sack_tree, rec);
444 StreamTcpSackRecordFree(rec);
459 static int StreamTcpSackTest01 (
void)
462 memset(&stream, 0,
sizeof(stream));
465 StreamTcpSackInsertRange(&stream, 1, 10);
467 StreamTcpSackInsertRange(&stream, 10, 20);
469 StreamTcpSackInsertRange(&stream, 10, 20);
471 StreamTcpSackInsertRange(&stream, 1, 20);
474 StreamTcpSackPrintList(&stream);
483 FAIL_IF(StreamTcpSackedSize(&stream) != 19);
494 static int StreamTcpSackTest02 (
void)
497 memset(&stream, 0,
sizeof(stream));
500 StreamTcpSackInsertRange(&stream, 10, 20);
501 StreamTcpSackInsertRange(&stream, 1, 20);
503 StreamTcpSackPrintList(&stream);
512 FAIL_IF(StreamTcpSackedSize(&stream) != 19);
523 static int StreamTcpSackTest03 (
void)
526 memset(&stream, 0,
sizeof(stream));
529 StreamTcpSackInsertRange(&stream, 10, 20);
530 StreamTcpSackInsertRange(&stream, 5, 15);
532 StreamTcpSackPrintList(&stream);
534 StreamTcpSackInsertRange(&stream, 15, 25);
536 StreamTcpSackPrintList(&stream);
545 FAIL_IF(StreamTcpSackedSize(&stream) != 20);
556 static int StreamTcpSackTest04 (
void)
559 memset(&stream, 0,
sizeof(stream));
562 StreamTcpSackInsertRange(&stream, 0, 20);
563 StreamTcpSackInsertRange(&stream, 30, 50);
564 StreamTcpSackInsertRange(&stream, 10, 25);
566 StreamTcpSackPrintList(&stream);
575 FAIL_IF(StreamTcpSackedSize(&stream) != 45);
586 static int StreamTcpSackTest05 (
void)
589 memset(&stream, 0,
sizeof(stream));
592 StreamTcpSackInsertRange(&stream, 0, 20);
593 StreamTcpSackInsertRange(&stream, 30, 50);
594 StreamTcpSackInsertRange(&stream, 10, 35);
596 StreamTcpSackPrintList(&stream);
605 FAIL_IF(StreamTcpSackedSize(&stream) != 50);
616 static int StreamTcpSackTest06 (
void)
619 memset(&stream, 0,
sizeof(stream));
622 StreamTcpSackInsertRange(&stream, 0, 9);
623 StreamTcpSackInsertRange(&stream, 11, 19);
624 StreamTcpSackInsertRange(&stream, 21, 29);
625 StreamTcpSackInsertRange(&stream, 31, 39);
626 StreamTcpSackInsertRange(&stream, 0, 40);
628 StreamTcpSackPrintList(&stream);
637 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
648 static int StreamTcpSackTest07 (
void)
651 memset(&stream, 0,
sizeof(stream));
654 StreamTcpSackInsertRange(&stream, 0, 9);
655 StreamTcpSackInsertRange(&stream, 11, 19);
656 StreamTcpSackInsertRange(&stream, 21, 29);
657 StreamTcpSackInsertRange(&stream, 31, 39);
658 StreamTcpSackInsertRange(&stream, 0, 40);
660 StreamTcpSackPrintList(&stream);
667 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
671 FAIL_IF(StreamTcpSackedSize(&stream) != 30);
683 static int StreamTcpSackTest08 (
void)
686 memset(&stream, 0,
sizeof(stream));
689 StreamTcpSackInsertRange(&stream, 0, 9);
690 StreamTcpSackInsertRange(&stream, 11, 19);
691 StreamTcpSackInsertRange(&stream, 21, 29);
692 StreamTcpSackInsertRange(&stream, 31, 39);
693 StreamTcpSackInsertRange(&stream, 0, 40);
695 StreamTcpSackPrintList(&stream);
702 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
706 FAIL_IF(StreamTcpSackedSize(&stream) != 0);
718 static int StreamTcpSackTest09 (
void)
721 memset(&stream, 0,
sizeof(stream));
724 StreamTcpSackInsertRange(&stream, 0, 9);
725 StreamTcpSackInsertRange(&stream, 11, 19);
726 StreamTcpSackInsertRange(&stream, 21, 29);
727 StreamTcpSackInsertRange(&stream, 31, 39);
728 StreamTcpSackInsertRange(&stream, 0, 40);
731 StreamTcpSackPrintList(&stream);
738 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
742 FAIL_IF(StreamTcpSackedSize(&stream) != 1);
754 static int StreamTcpSackTest10 (
void)
757 memset(&stream, 0,
sizeof(stream));
760 StreamTcpSackInsertRange(&stream, 100, 119);
761 StreamTcpSackInsertRange(&stream, 111, 119);
762 StreamTcpSackInsertRange(&stream, 121, 129);
763 StreamTcpSackInsertRange(&stream, 131, 139);
764 StreamTcpSackInsertRange(&stream, 100, 140);
766 StreamTcpSackPrintList(&stream);
773 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
777 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
789 static int StreamTcpSackTest11 (
void)
792 memset(&stream, 0,
sizeof(stream));
795 StreamTcpSackInsertRange(&stream, 100, 119);
796 StreamTcpSackInsertRange(&stream, 111, 119);
797 StreamTcpSackInsertRange(&stream, 121, 129);
798 StreamTcpSackInsertRange(&stream, 131, 139);
799 StreamTcpSackInsertRange(&stream, 101, 140);
801 StreamTcpSackPrintList(&stream);
808 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
812 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
824 static int StreamTcpSackTest12 (
void)
827 memset(&stream, 0,
sizeof(stream));
830 StreamTcpSackInsertRange(&stream, 800, 1000);
831 StreamTcpSackInsertRange(&stream, 700, 900);
832 StreamTcpSackInsertRange(&stream, 600, 800);
833 StreamTcpSackInsertRange(&stream, 500, 700);
834 StreamTcpSackInsertRange(&stream, 100, 600);
836 StreamTcpSackPrintList(&stream);
843 FAIL_IF(StreamTcpSackedSize(&stream) != 900);
845 StreamTcpSackInsertRange(&stream, 0, 1000);
846 FAIL_IF(StreamTcpSackedSize(&stream) != 1000);
850 FAIL_IF(StreamTcpSackedSize(&stream) != 500);
862 static int StreamTcpSackTest13 (
void) {
864 memset(&stream, 0,
sizeof(stream));
868 for (
int i = 0; i < 10; i++) {
869 StreamTcpSackInsertRange(&stream, 100+(20*i), 110+(20*i));
872 StreamTcpSackPrintList(&stream);
875 FAIL_IF(StreamTcpSackedSize(&stream) != 0);
887 static int StreamTcpSackTest14 (
void) {
889 memset(&stream, 0,
sizeof(stream));
893 for (
int i = 0; i < 10; i++) {
894 StreamTcpSackInsertRange(&stream, 4000+(20*i), 4010+(20*i));
897 StreamTcpSackPrintList(&stream);
900 FAIL_IF(StreamTcpSackedSize(&stream) != 0);
911 UtRegisterTest(
"StreamTcpSackTest01 -- Insertion", StreamTcpSackTest01);
912 UtRegisterTest(
"StreamTcpSackTest02 -- Insertion", StreamTcpSackTest02);
913 UtRegisterTest(
"StreamTcpSackTest03 -- Insertion", StreamTcpSackTest03);
914 UtRegisterTest(
"StreamTcpSackTest04 -- Insertion", StreamTcpSackTest04);
915 UtRegisterTest(
"StreamTcpSackTest05 -- Insertion", StreamTcpSackTest05);
916 UtRegisterTest(
"StreamTcpSackTest06 -- Insertion", StreamTcpSackTest06);
917 UtRegisterTest(
"StreamTcpSackTest07 -- Pruning", StreamTcpSackTest07);
918 UtRegisterTest(
"StreamTcpSackTest08 -- Pruning", StreamTcpSackTest08);
919 UtRegisterTest(
"StreamTcpSackTest09 -- Pruning", StreamTcpSackTest09);
920 UtRegisterTest(
"StreamTcpSackTest10 -- Pruning", StreamTcpSackTest10);
922 StreamTcpSackTest11);
924 StreamTcpSackTest12);
926 StreamTcpSackTest13);
928 StreamTcpSackTest14);