|
|
|
|
@ -153,9 +153,9 @@ static inline bool RegionsIntersect(const StreamingBufferConfig *cfg,
|
|
|
|
|
/** \internal
|
|
|
|
|
* \brief find the first region for merging.
|
|
|
|
|
*/
|
|
|
|
|
static StreamingBufferRegion *FindFirstRegionForOffset(const StreamingBuffer *sb,
|
|
|
|
|
const StreamingBufferConfig *cfg, StreamingBufferRegion *r, const uint64_t offset,
|
|
|
|
|
const uint32_t len, StreamingBufferRegion **prev)
|
|
|
|
|
static StreamingBufferRegion *FindFirstRegionForOffset(const StreamingBufferConfig *cfg,
|
|
|
|
|
StreamingBufferRegion *r, const uint64_t offset, const uint32_t len,
|
|
|
|
|
StreamingBufferRegion **prev)
|
|
|
|
|
{
|
|
|
|
|
const uint64_t data_re = offset + len;
|
|
|
|
|
SCLogDebug("looking for first region matching %" PRIu64 "/%" PRIu64, offset, data_re);
|
|
|
|
|
@ -172,9 +172,8 @@ static StreamingBufferRegion *FindFirstRegionForOffset(const StreamingBuffer *sb
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static StreamingBufferRegion *FindLargestRegionForOffset(const StreamingBuffer *sb,
|
|
|
|
|
const StreamingBufferConfig *cfg, StreamingBufferRegion *r, const uint64_t offset,
|
|
|
|
|
const uint32_t len)
|
|
|
|
|
static StreamingBufferRegion *FindLargestRegionForOffset(const StreamingBufferConfig *cfg,
|
|
|
|
|
StreamingBufferRegion *r, const uint64_t offset, const uint32_t len)
|
|
|
|
|
{
|
|
|
|
|
const uint64_t data_re = offset + len;
|
|
|
|
|
SCLogDebug("starting at %p/%" PRIu64 ", offset %" PRIu64 ", data_re %" PRIu64, r,
|
|
|
|
|
@ -197,9 +196,8 @@ static StreamingBufferRegion *FindLargestRegionForOffset(const StreamingBuffer *
|
|
|
|
|
return candidate;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static StreamingBufferRegion *FindRightEdge(const StreamingBuffer *sb,
|
|
|
|
|
const StreamingBufferConfig *cfg, StreamingBufferRegion *r, const uint64_t offset,
|
|
|
|
|
const uint32_t len)
|
|
|
|
|
static StreamingBufferRegion *FindRightEdge(const StreamingBufferConfig *cfg,
|
|
|
|
|
StreamingBufferRegion *r, const uint64_t offset, const uint32_t len)
|
|
|
|
|
{
|
|
|
|
|
const uint64_t data_re = offset + len;
|
|
|
|
|
StreamingBufferRegion *candidate = r;
|
|
|
|
|
@ -368,8 +366,8 @@ static int WARN_UNUSED SBBInit(StreamingBuffer *sb, const StreamingBufferConfig
|
|
|
|
|
*
|
|
|
|
|
* [gap][block]
|
|
|
|
|
**/
|
|
|
|
|
static int WARN_UNUSED SBBInitLeadingGap(StreamingBuffer *sb, const StreamingBufferConfig *cfg,
|
|
|
|
|
StreamingBufferRegion *region, uint64_t offset, uint32_t data_len)
|
|
|
|
|
static int WARN_UNUSED SBBInitLeadingGap(
|
|
|
|
|
StreamingBuffer *sb, const StreamingBufferConfig *cfg, uint64_t offset, uint32_t data_len)
|
|
|
|
|
{
|
|
|
|
|
DEBUG_VALIDATE_BUG_ON(!RB_EMPTY(&sb->sbb_tree));
|
|
|
|
|
|
|
|
|
|
@ -1384,21 +1382,21 @@ static StreamingBufferRegion *BufferInsertAtRegionDo(StreamingBuffer *sb,
|
|
|
|
|
SCLogDebug("offset %" PRIu64 ", len %u", offset, len);
|
|
|
|
|
StreamingBufferRegion *start_prev = NULL;
|
|
|
|
|
StreamingBufferRegion *start =
|
|
|
|
|
FindFirstRegionForOffset(sb, cfg, &sb->region, offset, len, &start_prev);
|
|
|
|
|
FindFirstRegionForOffset(cfg, &sb->region, offset, len, &start_prev);
|
|
|
|
|
if (start) {
|
|
|
|
|
const uint64_t insert_re = offset + len;
|
|
|
|
|
const uint64_t insert_start_offset = MIN(start->stream_offset, offset);
|
|
|
|
|
uint64_t insert_adjusted_re = insert_re;
|
|
|
|
|
|
|
|
|
|
SCLogDebug("start region %p/%" PRIu64 "/%u", start, start->stream_offset, start->buf_size);
|
|
|
|
|
StreamingBufferRegion *big = FindLargestRegionForOffset(sb, cfg, start, offset, len);
|
|
|
|
|
StreamingBufferRegion *big = FindLargestRegionForOffset(cfg, start, offset, len);
|
|
|
|
|
DEBUG_VALIDATE_BUG_ON(big == NULL);
|
|
|
|
|
if (big == NULL) {
|
|
|
|
|
sc_errno = SC_EINVAL;
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
SCLogDebug("big region %p/%" PRIu64 "/%u", big, big->stream_offset, big->buf_size);
|
|
|
|
|
StreamingBufferRegion *end = FindRightEdge(sb, cfg, big, offset, len);
|
|
|
|
|
StreamingBufferRegion *end = FindRightEdge(cfg, big, offset, len);
|
|
|
|
|
DEBUG_VALIDATE_BUG_ON(end == NULL);
|
|
|
|
|
if (end == NULL) {
|
|
|
|
|
sc_errno = SC_EINVAL;
|
|
|
|
|
@ -1461,8 +1459,7 @@ static StreamingBufferRegion *BufferInsertAtRegionDo(StreamingBuffer *sb,
|
|
|
|
|
* \note sets sc_errno
|
|
|
|
|
*/
|
|
|
|
|
static StreamingBufferRegion *BufferInsertAtRegion(StreamingBuffer *sb,
|
|
|
|
|
const StreamingBufferConfig *cfg, const uint8_t *data, const uint32_t data_len,
|
|
|
|
|
const uint64_t data_offset)
|
|
|
|
|
const StreamingBufferConfig *cfg, const uint32_t data_len, const uint64_t data_offset)
|
|
|
|
|
{
|
|
|
|
|
SCLogDebug("data_offset %" PRIu64 ", data_len %u, re %" PRIu64, data_offset, data_len,
|
|
|
|
|
data_offset + data_len);
|
|
|
|
|
@ -1519,7 +1516,7 @@ int StreamingBufferInsertAt(StreamingBuffer *sb, const StreamingBufferConfig *cf
|
|
|
|
|
return SC_EINVAL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
StreamingBufferRegion *region = BufferInsertAtRegion(sb, cfg, data, data_len, offset);
|
|
|
|
|
StreamingBufferRegion *region = BufferInsertAtRegion(sb, cfg, data_len, offset);
|
|
|
|
|
if (region == NULL) {
|
|
|
|
|
return sc_errno;
|
|
|
|
|
}
|
|
|
|
|
@ -1590,7 +1587,7 @@ int StreamingBufferInsertAt(StreamingBuffer *sb, const StreamingBufferConfig *cf
|
|
|
|
|
} else {
|
|
|
|
|
/* gap before data in empty list */
|
|
|
|
|
SCLogDebug("empty sbb list: invoking SBBInitLeadingGap");
|
|
|
|
|
if ((r = SBBInitLeadingGap(sb, cfg, region, offset, data_len)) != SC_OK)
|
|
|
|
|
if ((r = SBBInitLeadingGap(sb, cfg, offset, data_len)) != SC_OK)
|
|
|
|
|
return r;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -1603,7 +1600,7 @@ int StreamingBufferInsertAt(StreamingBuffer *sb, const StreamingBufferConfig *cf
|
|
|
|
|
} else {
|
|
|
|
|
/* gap before data in empty list */
|
|
|
|
|
SCLogDebug("empty sbb list: invoking SBBInitLeadingGap");
|
|
|
|
|
if ((r = SBBInitLeadingGap(sb, cfg, region, offset, data_len)) != SC_OK)
|
|
|
|
|
if ((r = SBBInitLeadingGap(sb, cfg, offset, data_len)) != SC_OK)
|
|
|
|
|
return r;
|
|
|
|
|
}
|
|
|
|
|
if (rel_offset == region->buf_offset) {
|
|
|
|
|
|