]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
stream/reassembly: optimize GetBlock 12041/head
authorNoah Liu <antsknows@gmail.com>
Mon, 23 Sep 2024 03:07:47 +0000 (11:07 +0800)
committerVictor Julien <victor@inliniac.net>
Sat, 26 Oct 2024 08:32:25 +0000 (10:32 +0200)
Current GetBlock degrees the sbb search from rb tree to
line, which costs much cpu time, and could be replaced by
SBB_RB_FIND_INCLUSIVE. It reduces time complexity from
O(nlogn) to O(logn).

Ticket: 7208.
(cherry picked from commit 951bcff9702f1f39c00293d68d286fd77008b037)

src/stream-tcp-reassemble.c

index a1f8b8ea683f18e61264bf859b2627d856aeafda..d6d05410fefe82b50f4ad10989d276352919210e 100644 (file)
@@ -1037,22 +1037,6 @@ static void GetSessionSize(TcpSession *ssn, Packet *p)
 }
 #endif
 
-static StreamingBufferBlock *GetBlock(const StreamingBuffer *sb, const uint64_t offset)
-{
-    StreamingBufferBlock *blk = sb->head;
-    if (blk == NULL)
-        return NULL;
-
-    for ( ; blk != NULL; blk = SBB_RB_NEXT(blk)) {
-        if (blk->offset >= offset)
-            return blk;
-        else if ((blk->offset + blk->len) > offset) {
-            return blk;
-        }
-    }
-    return NULL;
-}
-
 static inline bool GapAhead(const TcpStream *stream, StreamingBufferBlock *cur_blk)
 {
     StreamingBufferBlock *nblk = SBB_RB_NEXT(cur_blk);
@@ -1088,7 +1072,8 @@ static bool GetAppBuffer(const TcpStream *stream, const uint8_t **data, uint32_t
         *data_len = mydata_len;
     } else {
         SCLogDebug("block mode");
-        StreamingBufferBlock *blk = GetBlock(&stream->sb, offset);
+        StreamingBufferBlock key = { .offset = offset, .len = 0 };
+        StreamingBufferBlock *blk = SBB_RB_FIND_INCLUSIVE((struct SBB *)&stream->sb.sbb_tree, &key);
         if (blk == NULL) {
             *data = NULL;
             *data_len = 0;