|
|
|
|
@ -52,8 +52,7 @@ struct MacSet_ {
|
|
|
|
|
MacSetState state[2];
|
|
|
|
|
/* buffer for multiple MACs per flow and direction */
|
|
|
|
|
MacAddr *buf[2];
|
|
|
|
|
int size,
|
|
|
|
|
last[2];
|
|
|
|
|
int size, last[2];
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
FlowStorageId g_macset_storage_id = { .id = -1 };
|
|
|
|
|
@ -65,14 +64,15 @@ void MacSetRegisterFlowStorage(void)
|
|
|
|
|
/* we only need to register if at least one enabled 'eve-log' output
|
|
|
|
|
has the ethernet setting enabled */
|
|
|
|
|
if (root != NULL) {
|
|
|
|
|
TAILQ_FOREACH(node, &root->head, next) {
|
|
|
|
|
TAILQ_FOREACH (node, &root->head, next) {
|
|
|
|
|
if (node->val && strcmp(node->val, "eve-log") == 0) {
|
|
|
|
|
const char *enabled = ConfNodeLookupChildValue(node->head.tqh_first, "enabled");
|
|
|
|
|
if (enabled != NULL && ConfValIsTrue(enabled)) {
|
|
|
|
|
const char *ethernet = ConfNodeLookupChildValue(node->head.tqh_first, "ethernet");
|
|
|
|
|
const char *ethernet =
|
|
|
|
|
ConfNodeLookupChildValue(node->head.tqh_first, "ethernet");
|
|
|
|
|
if (ethernet != NULL && ConfValIsTrue(ethernet)) {
|
|
|
|
|
g_macset_storage_id = FlowStorageRegister("macset", sizeof(void *),
|
|
|
|
|
NULL, (void(*)(void *)) MacSetFree);
|
|
|
|
|
g_macset_storage_id = FlowStorageRegister(
|
|
|
|
|
"macset", sizeof(void *), NULL, (void (*)(void *))MacSetFree);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
@ -86,7 +86,6 @@ bool MacSetFlowStorageEnabled(void)
|
|
|
|
|
return (g_macset_storage_id.id != -1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
MacSet *MacSetInit(int size)
|
|
|
|
|
{
|
|
|
|
|
MacSet *ms = NULL;
|
|
|
|
|
@ -98,7 +97,7 @@ MacSet *MacSetInit(int size)
|
|
|
|
|
SCLogError("Unable to allocate MacSet memory");
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
(void) SC_ATOMIC_ADD(flow_memuse, (sizeof(*ms)));
|
|
|
|
|
(void)SC_ATOMIC_ADD(flow_memuse, (sizeof(*ms)));
|
|
|
|
|
ms->state[MAC_SET_SRC] = ms->state[MAC_SET_DST] = EMPTY_SET;
|
|
|
|
|
if (size < 3) {
|
|
|
|
|
/* we want to make sure we have at space for at least 3 items to
|
|
|
|
|
@ -115,7 +114,8 @@ FlowStorageId MacSetGetFlowStorageID(void)
|
|
|
|
|
return g_macset_storage_id;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline void MacUpdateEntry(MacSet *ms, uint8_t *addr, int side, ThreadVars *tv, uint16_t ctr)
|
|
|
|
|
static inline void MacUpdateEntry(
|
|
|
|
|
MacSet *ms, const uint8_t *addr, int side, ThreadVars *tv, uint16_t ctr)
|
|
|
|
|
{
|
|
|
|
|
switch (ms->state[side]) {
|
|
|
|
|
case EMPTY_SET:
|
|
|
|
|
@ -137,7 +137,7 @@ static inline void MacUpdateEntry(MacSet *ms, uint8_t *addr, int side, ThreadVar
|
|
|
|
|
"MacSet memory");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
(void) SC_ATOMIC_ADD(flow_memuse, (ms->size * sizeof(MacAddr)));
|
|
|
|
|
(void)SC_ATOMIC_ADD(flow_memuse, (ms->size * sizeof(MacAddr)));
|
|
|
|
|
}
|
|
|
|
|
memcpy(ms->buf[side], ms->singles[side], sizeof(MacAddr));
|
|
|
|
|
memcpy(ms->buf[side] + 1, addr, sizeof(MacAddr));
|
|
|
|
|
@ -160,7 +160,7 @@ static inline void MacUpdateEntry(MacSet *ms, uint8_t *addr, int side, ThreadVar
|
|
|
|
|
since we expect the latest item to match more likely than
|
|
|
|
|
the first */
|
|
|
|
|
for (int i = ms->last[side] - 1; i >= 0; i--) {
|
|
|
|
|
uint8_t *addr2 = (uint8_t*) ((ms->buf[side]) + i);
|
|
|
|
|
uint8_t *addr2 = (uint8_t *)((ms->buf[side]) + i);
|
|
|
|
|
/* If we find a match, we return early with no action */
|
|
|
|
|
if (likely(memcmp(addr2, addr, sizeof(MacAddr)) == 0)) {
|
|
|
|
|
return;
|
|
|
|
|
@ -176,8 +176,8 @@ static inline void MacUpdateEntry(MacSet *ms, uint8_t *addr, int side, ThreadVar
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MacSetAddWithCtr(MacSet *ms, uint8_t *src_addr, uint8_t *dst_addr, ThreadVars *tv,
|
|
|
|
|
uint16_t ctr_src, uint16_t ctr_dst)
|
|
|
|
|
void MacSetAddWithCtr(MacSet *ms, const uint8_t *src_addr, const uint8_t *dst_addr, ThreadVars *tv,
|
|
|
|
|
uint16_t ctr_src, uint16_t ctr_dst)
|
|
|
|
|
{
|
|
|
|
|
if (ms == NULL)
|
|
|
|
|
return;
|
|
|
|
|
@ -185,27 +185,27 @@ void MacSetAddWithCtr(MacSet *ms, uint8_t *src_addr, uint8_t *dst_addr, ThreadVa
|
|
|
|
|
MacUpdateEntry(ms, dst_addr, MAC_SET_DST, tv, ctr_dst);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void MacSetAdd(MacSet *ms, uint8_t *src_addr, uint8_t *dst_addr)
|
|
|
|
|
void MacSetAdd(MacSet *ms, const uint8_t *src_addr, const uint8_t *dst_addr)
|
|
|
|
|
{
|
|
|
|
|
MacSetAddWithCtr(ms, src_addr, dst_addr, NULL, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static inline int MacSetIterateSide(const MacSet *ms, MacSetIteratorFunc IterFunc,
|
|
|
|
|
MacSetSide side, void *data)
|
|
|
|
|
static inline int MacSetIterateSide(
|
|
|
|
|
const MacSet *ms, MacSetIteratorFunc IterFunc, MacSetSide side, void *data)
|
|
|
|
|
{
|
|
|
|
|
int ret = 0;
|
|
|
|
|
switch (ms->state[side]) {
|
|
|
|
|
case EMPTY_SET:
|
|
|
|
|
return 0;
|
|
|
|
|
case SINGLE_MAC:
|
|
|
|
|
ret = IterFunc((uint8_t*) ms->singles[side], side, data);
|
|
|
|
|
ret = IterFunc((uint8_t *)ms->singles[side], side, data);
|
|
|
|
|
if (unlikely(ret != 0)) {
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case MULTI_MAC:
|
|
|
|
|
for (int i = 0; i < ms->last[side]; i++) {
|
|
|
|
|
ret = IterFunc((uint8_t*) ms->buf[side][i], side, data);
|
|
|
|
|
ret = IterFunc((uint8_t *)ms->buf[side][i], side, data);
|
|
|
|
|
if (unlikely(ret != 0)) {
|
|
|
|
|
return ret;
|
|
|
|
|
}
|
|
|
|
|
@ -234,7 +234,7 @@ int MacSetSize(const MacSet *ms)
|
|
|
|
|
if (ms == NULL)
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
|
|
switch(ms->state[MAC_SET_SRC]) {
|
|
|
|
|
switch (ms->state[MAC_SET_SRC]) {
|
|
|
|
|
case EMPTY_SET:
|
|
|
|
|
/* pass */
|
|
|
|
|
break;
|
|
|
|
|
@ -245,7 +245,7 @@ int MacSetSize(const MacSet *ms)
|
|
|
|
|
size += ms->last[MAC_SET_SRC];
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
switch(ms->state[MAC_SET_DST]) {
|
|
|
|
|
switch (ms->state[MAC_SET_DST]) {
|
|
|
|
|
case EMPTY_SET:
|
|
|
|
|
/* pass */
|
|
|
|
|
break;
|
|
|
|
|
@ -274,23 +274,26 @@ void MacSetFree(MacSet *ms)
|
|
|
|
|
}
|
|
|
|
|
SCFree(ms);
|
|
|
|
|
total_free += sizeof(*ms);
|
|
|
|
|
(void) SC_ATOMIC_SUB(flow_memuse, total_free);
|
|
|
|
|
(void)SC_ATOMIC_SUB(flow_memuse, total_free);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#ifdef UNITTESTS
|
|
|
|
|
|
|
|
|
|
static int CheckTest1Membership(uint8_t *addr, MacSetSide side, void *data)
|
|
|
|
|
{
|
|
|
|
|
int *i = (int*) data;
|
|
|
|
|
int *i = (int *)data;
|
|
|
|
|
switch (*i) {
|
|
|
|
|
case 0:
|
|
|
|
|
if (addr[5] != 1) return 1;
|
|
|
|
|
if (addr[5] != 1)
|
|
|
|
|
return 1;
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
if (addr[5] != 2) return 1;
|
|
|
|
|
if (addr[5] != 2)
|
|
|
|
|
return 1;
|
|
|
|
|
break;
|
|
|
|
|
case 2:
|
|
|
|
|
if (addr[5] != 3) return 1;
|
|
|
|
|
if (addr[5] != 3)
|
|
|
|
|
return 1;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
(*i)++;
|
|
|
|
|
@ -301,9 +304,8 @@ static int MacSetTest01(void)
|
|
|
|
|
{
|
|
|
|
|
MacSet *ms = NULL;
|
|
|
|
|
int ret = 0, i = 0;
|
|
|
|
|
MacAddr addr1 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x1},
|
|
|
|
|
addr2 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x2},
|
|
|
|
|
addr3 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x3};
|
|
|
|
|
MacAddr addr1 = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 }, addr2 = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x2 },
|
|
|
|
|
addr3 = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x3 };
|
|
|
|
|
SC_ATOMIC_SET(flow_config.memcap, 10000);
|
|
|
|
|
|
|
|
|
|
ms = MacSetInit(10);
|
|
|
|
|
@ -341,8 +343,7 @@ static int MacSetTest02(void)
|
|
|
|
|
FAIL_IF_NOT(MacSetSize(ms) == 0);
|
|
|
|
|
|
|
|
|
|
for (i = 1; i < 100; i++) {
|
|
|
|
|
MacAddr addr1 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x1},
|
|
|
|
|
addr2 = {0x1, 0x0, 0x0, 0x0, 0x0, 0x2};
|
|
|
|
|
MacAddr addr1 = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 }, addr2 = { 0x1, 0x0, 0x0, 0x0, 0x0, 0x2 };
|
|
|
|
|
MacSetAdd(ms, addr1, addr2);
|
|
|
|
|
}
|
|
|
|
|
FAIL_IF_NOT(MacSetSize(ms) == 2);
|
|
|
|
|
@ -364,8 +365,7 @@ static int MacSetTest03(void)
|
|
|
|
|
FAIL_IF_NOT(MacSetSize(ms) == 0);
|
|
|
|
|
|
|
|
|
|
for (uint8_t i = 1; i < 100; i++) {
|
|
|
|
|
MacAddr addr1 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x1},
|
|
|
|
|
addr2 = {0x1, 0x0, 0x0, 0x0, 0x0, 0x1};
|
|
|
|
|
MacAddr addr1 = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 }, addr2 = { 0x1, 0x0, 0x0, 0x0, 0x0, 0x1 };
|
|
|
|
|
addr1[5] = i;
|
|
|
|
|
addr2[5] = i;
|
|
|
|
|
MacSetAdd(ms, addr1, addr2);
|
|
|
|
|
@ -398,8 +398,7 @@ static int MacSetTest05(void)
|
|
|
|
|
FAIL_IF_NOT(MacSetSize(ms) == 0);
|
|
|
|
|
|
|
|
|
|
for (uint8_t i = 1; i < 100; i++) {
|
|
|
|
|
MacAddr addr1 = {0x0, 0x0, 0x0, 0x0, 0x0, 0x1},
|
|
|
|
|
addr2 = {0x1, 0x0, 0x0, 0x0, 0x0, 0x1};
|
|
|
|
|
MacAddr addr1 = { 0x0, 0x0, 0x0, 0x0, 0x0, 0x1 }, addr2 = { 0x1, 0x0, 0x0, 0x0, 0x0, 0x1 };
|
|
|
|
|
addr1[5] = i;
|
|
|
|
|
addr2[5] = i;
|
|
|
|
|
MacSetAdd(ms, addr1, addr2);
|
|
|
|
|
|