36 #define ADDRESS_BYTES (uint8_t)4
37 #define NETMASK_MAX (uint8_t)32
39 #define RADIX_TREE_TYPE SCRadix4Tree
40 #define RADIX_NODE_TYPE SCRadix4Node
41 #define RADIX_CONFIG_TYPE SCRadix4Config
42 #define RADIX_TREE_COMPARE_CALLBACK SCRadix4TreeCompareFunc
44 static void PrintUserdata(
SCRadix4Node *node,
int level,
void (*PrintData)(
void *));
67 static inline bool NetmasksEmpty(
const SCRadix4Node *node)
69 return (node->
masks == 0);
84 const int differ_bit = inter_node->
bit;
96 inter_node->
masks &= ~rem;
106 static void PrintNodeInfo(
SCRadix4Node *node,
int level,
void (*PrintData)(
void *))
111 for (
int i = 0; i < level; i++)
114 printf(
"%d [", node->
bit);
116 if (node->
masks == 0) {
119 for (
int i = 0, x = 0; i <= 32; i++) {
121 printf(
"%s%d", (x && x < 32) ?
", " :
"", i);
131 printf(
"%s - user_data %p)\n", addr, node->
user_data);
132 PrintUserdata(node, level + 1, PrintData);
134 printf(
"no prefix)\n");
142 const SCRadix4Tree *tree,
const uint8_t *key,
void **user_data)
144 return FindExactMatch(tree, key, user_data);
150 return FindNetblock(tree, key,
netmask, user_data);
154 const SCRadix4Tree *tree,
const uint8_t *key,
void **user_data)
156 return FindBestMatch(tree, key, user_data);
160 const SCRadix4Tree *tree,
const uint8_t *key,
void **user_data, uint8_t *out_netmask)
162 return FindBestMatch2(tree, key, user_data, out_netmask);
173 TreeRelease(tree, config);
190 return AddKey(tree, config, key_stream, 32,
user,
false);
206 const uint8_t *key_stream, uint8_t
netmask,
void *
user)
208 return AddKey(tree, config, key_stream,
netmask,
user,
false);
232 char *mask_str = NULL;
237 *(ip_str + (
sizeof(ip_str) - 1)) =
'\0';
240 if (NULL != (mask_str = strchr(ip_str,
'/'))) {
241 *(mask_str++) =
'\0';
244 if (strchr(mask_str,
'.') != NULL) {
254 netmask = (uint8_t)cidr;
258 if (inet_pton(AF_INET, ip_str, &addr) <= 0) {
264 if (AddKey(tree, config, (uint8_t *)&ip, netmask, user,
true) == NULL) {
284 RemoveKey(tree, config, key_stream, 32);
296 const uint8_t *key_stream, uint8_t netmask)
299 RemoveKey(tree, config, key_stream, netmask);
304 PrintTree(tree, config);
307 static void PrintUserdata(
SCRadix4Node *node,
int level,
void (*PrintData)(
void *))
309 if (PrintData != NULL) {
312 for (
int i = 0; i < level; i++)
321 for (
int i = 0; i < level; i++)
323 printf(
" [%d], ", ud->
netmask);
329 static int SCRadix4ForEachNodeSub(
336 if (Callback(node, ud->
user, ud->
netmask, data) < 0)
341 if (SCRadix4ForEachNodeSub(node->
left, Callback, data) < 0)
345 if (SCRadix4ForEachNodeSub(node->
right, Callback, data) < 0)
353 if (tree->
head == NULL)
355 return SCRadix4ForEachNodeSub(tree->
head, Callback, data);
361 return CompareTrees(t1, t2, Callback);
367 static void SCRadix4UtFree(
void *ptr)
372 static const SCRadix4Config ut_ip_radix4_config = { SCRadix4UtFree, NULL };
374 #define GET_IPV4(str) \
375 SCLogDebug("setting up %s", (str)); \
376 memset(&(sa), 0, sizeof((sa))); \
377 FAIL_IF(inet_pton(AF_INET, (str), &(sa).sin_addr) <= 0);
379 #define ADD_IPV4(str) \
381 SCRadix4AddKeyIPV4(&tree, &ut_ip_radix4_config, (uint8_t *)&(sa).sin_addr, NULL);
383 #define REM_IPV4(str) \
385 SCRadix4RemoveKeyIPV4(&tree, &ut_ip_radix4_config, (uint8_t *)&(sa).sin_addr);
387 #define ADD_IPV4_MASK(str, cidr) \
389 SCRadix4AddKeyIPV4Netblock( \
390 &tree, &ut_ip_radix4_config, (uint8_t *)&(sa).sin_addr, (cidr), NULL);
392 #define REM_IPV4_MASK(str, cidr) \
394 SCRadix4RemoveKeyIPV4Netblock(&tree, &ut_ip_radix4_config, (uint8_t *)&(sa).sin_addr, (cidr));
396 static int SCRadix4TestIPV4Insertion03(
void)
398 struct sockaddr_in sa;
447 static int SCRadix4TestIPV4Removal04(
void)
449 struct sockaddr_in sa;
490 static int SCRadix4TestIPV4NetblockInsertion09(
void)
492 struct sockaddr_in sa;
531 static int SCRadix4TestIPV4NetblockInsertion10(
void)
534 struct sockaddr_in sa;
548 &tree, &ut_ip_radix4_config, (uint8_t *)&sa.sin_addr, 24, NULL);
551 node[1] =
SCRadix4AddKeyIPV4(&tree, &ut_ip_radix4_config, (uint8_t *)&sa.sin_addr, NULL);
581 static int SCRadix4TestIPV4NetblockInsertion11(
void)
583 struct sockaddr_in sa;
601 &tree, &ut_ip_radix4_config, (uint8_t *)&sa.sin_addr, 0, NULL);
663 static int SCRadix4TestIPV4NetblockInsertion12(
void)
665 struct sockaddr_in sa;
680 &tree, &ut_ip_radix4_config, (uint8_t *)&sa.sin_addr, 24, NULL);
684 node[1] =
SCRadix4AddKeyIPV4(&tree, &ut_ip_radix4_config, (uint8_t *)&sa.sin_addr, NULL);
724 static int SCRadix4TestIPV4NetBlocksAndBestSearch16(
void)
726 struct sockaddr_in sa;
731 for (uint32_t i = 0; i <= 32; i++) {
732 uint32_t *user =
SCMalloc(
sizeof(uint32_t));
736 void *user_data = NULL;
740 FAIL_IF(*((uint32_t *)user_data) != i);
751 static int SCRadix4TestIPV4NetBlocksAndBestSearch19(
void)
753 struct sockaddr_in sa;
754 void *user_data = NULL;
758 uint32_t *user =
SCMalloc(
sizeof(uint32_t));
767 FAIL_IF(*((uint32_t *)user_data) != 100);
780 FAIL_IF(*((uint32_t *)user_data) != 200);
787 FAIL_IF(*((uint32_t *)user_data) != 100);
800 FAIL_IF(*((uint32_t *)user_data) != 300);
807 FAIL_IF(*((uint32_t *)user_data) != 300);
814 FAIL_IF(*((uint32_t *)user_data) != 200);
821 FAIL_IF(*((uint32_t *)user_data) != 100);
833 static int SCRadix4TestIPV4NetblockInsertion25(
void)
835 struct sockaddr_in sa;
849 static int SCRadix4TestIPV4NetblockInsertion26(
void)
852 struct sockaddr_in sa;
871 FAIL_IF_NOT(strcmp((
char *)retptr,
"Hello3") == 0);
876 static int SCRadix4TestIPV4InsertRemove01(
void)
878 struct sockaddr_in sa;
928 UtRegisterTest(
"SCRadix4TestIPV4Insertion03", SCRadix4TestIPV4Insertion03);
929 UtRegisterTest(
"SCRadix4TestIPV4Removal04", SCRadix4TestIPV4Removal04);
930 UtRegisterTest(
"SCRadix4TestIPV4NetblockInsertion09", SCRadix4TestIPV4NetblockInsertion09);
931 UtRegisterTest(
"SCRadix4TestIPV4NetblockInsertion10", SCRadix4TestIPV4NetblockInsertion10);
932 UtRegisterTest(
"SCRadix4TestIPV4NetblockInsertion11", SCRadix4TestIPV4NetblockInsertion11);
933 UtRegisterTest(
"SCRadix4TestIPV4NetblockInsertion12", SCRadix4TestIPV4NetblockInsertion12);
935 "SCRadix4TestIPV4NetBlocksAndBestSearch16", SCRadix4TestIPV4NetBlocksAndBestSearch16);
937 "SCRadix4TestIPV4NetBlocksAndBestSearch19", SCRadix4TestIPV4NetBlocksAndBestSearch19);
938 UtRegisterTest(
"SCRadix4TestIPV4NetblockInsertion25", SCRadix4TestIPV4NetblockInsertion25);
939 UtRegisterTest(
"SCRadix4TestIPV4NetblockInsertion26", SCRadix4TestIPV4NetblockInsertion26);
940 UtRegisterTest(
"SCRadix4TestIPV4InsertRemove01", SCRadix4TestIPV4InsertRemove01);