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 for (
int record = 0; record < records; record++) {
266 SCLogDebug(
"%p last_ack %u, left edge %u, right edge %u", sack_rec,
285 if (StreamTcpSackInsertRange(stream,
le,
re) == -1) {
294 StreamTcpSackPrintList(stream);
299 static inline int CompareOverlap(
302 if (lookup->
re <= intree->
le)
304 else if (lookup->
re >= intree->
le && lookup->
le < intree->
re)
319 const int comp = CompareOverlap(elm, tmp);
324 }
else if (comp > 0) {
337 if (records > 0 && data != NULL) {
338 int sack_outdated = 0;
341 for (
int record = 0; record < records; record++) {
351 if (
le >= res->
le && re <= res->
re) {
352 SCLogDebug(
"SACK rec le:%u re:%u eclipsed by in tree le:%u re:%u",
le,
re,
356 SCLogDebug(
"SACK rec le:%u re:%u SACKs new DATA vs in tree le:%u re:%u",
le,
re,
360 SCLogDebug(
"SACK rec le:%u re:%u SACKs new DATA. No match in tree",
le,
re);
365 StreamTcpSackPrintList(stream);
367 if (records != sack_outdated) {
387 TCPSACK_RB_REMOVE(&stream->
sack_tree, rec);
388 StreamTcpSackRecordFree(rec);
398 SCLogDebug(
"record beyond last_ack, nothing to do. Bailing out.");
403 StreamTcpSackPrintList(stream);
420 TCPSACK_RB_REMOVE(&stream->
sack_tree, rec);
421 StreamTcpSackRecordFree(rec);
436 static int StreamTcpSackTest01 (
void)
439 memset(&stream, 0,
sizeof(stream));
442 StreamTcpSackInsertRange(&stream, 1, 10);
444 StreamTcpSackInsertRange(&stream, 10, 20);
446 StreamTcpSackInsertRange(&stream, 10, 20);
448 StreamTcpSackInsertRange(&stream, 1, 20);
451 StreamTcpSackPrintList(&stream);
460 FAIL_IF(StreamTcpSackedSize(&stream) != 19);
471 static int StreamTcpSackTest02 (
void)
474 memset(&stream, 0,
sizeof(stream));
477 StreamTcpSackInsertRange(&stream, 10, 20);
478 StreamTcpSackInsertRange(&stream, 1, 20);
480 StreamTcpSackPrintList(&stream);
489 FAIL_IF(StreamTcpSackedSize(&stream) != 19);
500 static int StreamTcpSackTest03 (
void)
503 memset(&stream, 0,
sizeof(stream));
506 StreamTcpSackInsertRange(&stream, 10, 20);
507 StreamTcpSackInsertRange(&stream, 5, 15);
509 StreamTcpSackPrintList(&stream);
511 StreamTcpSackInsertRange(&stream, 15, 25);
513 StreamTcpSackPrintList(&stream);
522 FAIL_IF(StreamTcpSackedSize(&stream) != 20);
533 static int StreamTcpSackTest04 (
void)
536 memset(&stream, 0,
sizeof(stream));
539 StreamTcpSackInsertRange(&stream, 0, 20);
540 StreamTcpSackInsertRange(&stream, 30, 50);
541 StreamTcpSackInsertRange(&stream, 10, 25);
543 StreamTcpSackPrintList(&stream);
552 FAIL_IF(StreamTcpSackedSize(&stream) != 45);
563 static int StreamTcpSackTest05 (
void)
566 memset(&stream, 0,
sizeof(stream));
569 StreamTcpSackInsertRange(&stream, 0, 20);
570 StreamTcpSackInsertRange(&stream, 30, 50);
571 StreamTcpSackInsertRange(&stream, 10, 35);
573 StreamTcpSackPrintList(&stream);
582 FAIL_IF(StreamTcpSackedSize(&stream) != 50);
593 static int StreamTcpSackTest06 (
void)
596 memset(&stream, 0,
sizeof(stream));
599 StreamTcpSackInsertRange(&stream, 0, 9);
600 StreamTcpSackInsertRange(&stream, 11, 19);
601 StreamTcpSackInsertRange(&stream, 21, 29);
602 StreamTcpSackInsertRange(&stream, 31, 39);
603 StreamTcpSackInsertRange(&stream, 0, 40);
605 StreamTcpSackPrintList(&stream);
614 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
625 static int StreamTcpSackTest07 (
void)
628 memset(&stream, 0,
sizeof(stream));
631 StreamTcpSackInsertRange(&stream, 0, 9);
632 StreamTcpSackInsertRange(&stream, 11, 19);
633 StreamTcpSackInsertRange(&stream, 21, 29);
634 StreamTcpSackInsertRange(&stream, 31, 39);
635 StreamTcpSackInsertRange(&stream, 0, 40);
637 StreamTcpSackPrintList(&stream);
644 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
648 FAIL_IF(StreamTcpSackedSize(&stream) != 30);
660 static int StreamTcpSackTest08 (
void)
663 memset(&stream, 0,
sizeof(stream));
666 StreamTcpSackInsertRange(&stream, 0, 9);
667 StreamTcpSackInsertRange(&stream, 11, 19);
668 StreamTcpSackInsertRange(&stream, 21, 29);
669 StreamTcpSackInsertRange(&stream, 31, 39);
670 StreamTcpSackInsertRange(&stream, 0, 40);
672 StreamTcpSackPrintList(&stream);
679 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
683 FAIL_IF(StreamTcpSackedSize(&stream) != 0);
695 static int StreamTcpSackTest09 (
void)
698 memset(&stream, 0,
sizeof(stream));
701 StreamTcpSackInsertRange(&stream, 0, 9);
702 StreamTcpSackInsertRange(&stream, 11, 19);
703 StreamTcpSackInsertRange(&stream, 21, 29);
704 StreamTcpSackInsertRange(&stream, 31, 39);
705 StreamTcpSackInsertRange(&stream, 0, 40);
708 StreamTcpSackPrintList(&stream);
715 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
719 FAIL_IF(StreamTcpSackedSize(&stream) != 1);
731 static int StreamTcpSackTest10 (
void)
734 memset(&stream, 0,
sizeof(stream));
737 StreamTcpSackInsertRange(&stream, 100, 119);
738 StreamTcpSackInsertRange(&stream, 111, 119);
739 StreamTcpSackInsertRange(&stream, 121, 129);
740 StreamTcpSackInsertRange(&stream, 131, 139);
741 StreamTcpSackInsertRange(&stream, 100, 140);
743 StreamTcpSackPrintList(&stream);
750 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
754 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
766 static int StreamTcpSackTest11 (
void)
769 memset(&stream, 0,
sizeof(stream));
772 StreamTcpSackInsertRange(&stream, 100, 119);
773 StreamTcpSackInsertRange(&stream, 111, 119);
774 StreamTcpSackInsertRange(&stream, 121, 129);
775 StreamTcpSackInsertRange(&stream, 131, 139);
776 StreamTcpSackInsertRange(&stream, 101, 140);
778 StreamTcpSackPrintList(&stream);
785 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
789 FAIL_IF(StreamTcpSackedSize(&stream) != 40);
801 static int StreamTcpSackTest12 (
void)
804 memset(&stream, 0,
sizeof(stream));
807 StreamTcpSackInsertRange(&stream, 800, 1000);
808 StreamTcpSackInsertRange(&stream, 700, 900);
809 StreamTcpSackInsertRange(&stream, 600, 800);
810 StreamTcpSackInsertRange(&stream, 500, 700);
811 StreamTcpSackInsertRange(&stream, 100, 600);
813 StreamTcpSackPrintList(&stream);
820 FAIL_IF(StreamTcpSackedSize(&stream) != 900);
822 StreamTcpSackInsertRange(&stream, 0, 1000);
823 FAIL_IF(StreamTcpSackedSize(&stream) != 1000);
827 FAIL_IF(StreamTcpSackedSize(&stream) != 500);
839 static int StreamTcpSackTest13 (
void) {
841 memset(&stream, 0,
sizeof(stream));
845 for (
int i = 0; i < 10; i++) {
846 StreamTcpSackInsertRange(&stream, 100+(20*i), 110+(20*i));
849 StreamTcpSackPrintList(&stream);
852 FAIL_IF(StreamTcpSackedSize(&stream) != 0);
864 static int StreamTcpSackTest14 (
void) {
866 memset(&stream, 0,
sizeof(stream));
870 for (
int i = 0; i < 10; i++) {
871 StreamTcpSackInsertRange(&stream, 4000+(20*i), 4010+(20*i));
874 StreamTcpSackPrintList(&stream);
877 FAIL_IF(StreamTcpSackedSize(&stream) != 0);
888 UtRegisterTest(
"StreamTcpSackTest01 -- Insertion", StreamTcpSackTest01);
889 UtRegisterTest(
"StreamTcpSackTest02 -- Insertion", StreamTcpSackTest02);
890 UtRegisterTest(
"StreamTcpSackTest03 -- Insertion", StreamTcpSackTest03);
891 UtRegisterTest(
"StreamTcpSackTest04 -- Insertion", StreamTcpSackTest04);
892 UtRegisterTest(
"StreamTcpSackTest05 -- Insertion", StreamTcpSackTest05);
893 UtRegisterTest(
"StreamTcpSackTest06 -- Insertion", StreamTcpSackTest06);
894 UtRegisterTest(
"StreamTcpSackTest07 -- Pruning", StreamTcpSackTest07);
895 UtRegisterTest(
"StreamTcpSackTest08 -- Pruning", StreamTcpSackTest08);
896 UtRegisterTest(
"StreamTcpSackTest09 -- Pruning", StreamTcpSackTest09);
897 UtRegisterTest(
"StreamTcpSackTest10 -- Pruning", StreamTcpSackTest10);
899 StreamTcpSackTest11);
901 StreamTcpSackTest12);
903 StreamTcpSackTest13);
905 StreamTcpSackTest14);