Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 50 additions & 6 deletions src/util-flow-rate.c
Original file line number Diff line number Diff line change
Expand Up @@ -181,7 +181,7 @@ static inline void FlowRateStoreUpdateCurrentRing(
static inline void FlowRateStoreFlushRing(
FlowRateStore *frs, SCTime_t p_ts, uint32_t pkt_len, int direction)
{
memset(frs->dir[direction].buf, 0, frs->dir[direction].size);
memset(frs->dir[direction].buf, 0, frs->dir[direction].size * sizeof(*frs->dir[direction].buf));
frs->dir[direction].last_idx = 0;
frs->dir[direction].start_ts = p_ts;
frs->dir[direction].buf[0] = pkt_len;
Expand Down Expand Up @@ -397,7 +397,8 @@ static int FlowRateTest03(void)
PASS;
}

/* Test to check update of buffer if new pkt comes out of the window */
/* Test to check update of buffer if new pkt comes out of the window, and that
* flushing clears the whole ring rather than only its first bytes. */
static int FlowRateTest04(void)
{
SC_ATOMIC_SET(flow_config.memcap, 10000);
Expand All @@ -418,16 +419,59 @@ static int FlowRateTest04(void)
FAIL_IF(frs->dir[0].start_ts.secs != p1->ts.secs);

Packet *p2 = UTHBuildPacket((uint8_t *)"DATA", 4, IPPROTO_TCP);
p2->ts.secs = p1->ts.secs + 60;
p2->ts.secs = p1->ts.secs + 1;
FlowRateStoreUpdate(frs, p2->ts, GET_PKT_LEN(p2), TOSERVER);

/* Total length of packet is 44 */
FAIL_IF(frs->dir[0].sum != 44);
FAIL_IF(frs->dir[0].sum != 92);
FAIL_IF(frs->dir[0].last_ts.secs != p2->ts.secs);
FAIL_IF(frs->dir[0].buf[0] != 44);
FAIL_IF(frs->dir[0].start_ts.secs != p2->ts.secs);
FAIL_IF(frs->dir[0].buf[1] != 44);
FAIL_IF(frs->dir[0].start_ts.secs != p1->ts.secs);

Packet *p3 = UTHBuildPacket((uint8_t *)"ABababa", 7, IPPROTO_TCP);
p3->ts.secs = p1->ts.secs + 2;
FlowRateStoreUpdate(frs, p3->ts, GET_PKT_LEN(p3), TOSERVER);

/* Total length of packet is 47 */
FAIL_IF(frs->dir[0].sum != 139);
FAIL_IF(frs->dir[0].last_ts.secs != p3->ts.secs);
FAIL_IF(frs->dir[0].buf[2] != 47);
FAIL_IF(frs->dir[0].start_ts.secs != p1->ts.secs);

/* Silence of a full interval, so this packet is out of the window and
* flushes the ring */
Packet *p4 = UTHBuildPacket((uint8_t *)"nmn", 3, IPPROTO_TCP);
p4->ts.secs = p3->ts.secs + 4;
FlowRateStoreUpdate(frs, p4->ts, GET_PKT_LEN(p4), TOSERVER);

/* Total length of packet is 43 */
FAIL_IF(frs->dir[0].sum != 43);
FAIL_IF(frs->dir[0].last_ts.secs != p4->ts.secs);
FAIL_IF(frs->dir[0].start_ts.secs != p4->ts.secs);
FAIL_IF(frs->dir[0].buf[0] != 43);

/* Every other slot must be cleared too, not just the first bytes */
FAIL_IF(frs->dir[0].buf[1] != 0);
FAIL_IF(frs->dir[0].buf[2] != 0);
FAIL_IF(frs->dir[0].buf[3] != 0);

Packet *p5 = UTHBuildPacket((uint8_t *)"yoohoo", 6, IPPROTO_TCP);
p5->ts.secs = p4->ts.secs + 2;
FlowRateStoreUpdate(frs, p5->ts, GET_PKT_LEN(p5), TOSERVER);

/* Total length of packet is 46 */
FAIL_IF(frs->dir[0].sum != 89);
FAIL_IF(frs->dir[0].last_ts.secs != p5->ts.secs);
FAIL_IF(frs->dir[0].start_ts.secs != p4->ts.secs);
FAIL_IF(frs->dir[0].buf[0] != 43);
FAIL_IF(frs->dir[0].buf[1] != 0);
FAIL_IF(frs->dir[0].buf[2] != 46);

UTHFreePacket(p1);
UTHFreePacket(p2);
UTHFreePacket(p3);
UTHFreePacket(p4);
UTHFreePacket(p5);
FlowRateStoreFree(frs);
PASS;
}
Expand Down
Loading