]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
defrag/config: switch to radix4/6
authorVictor Julien <vjulien@oisf.net>
Wed, 18 May 2022 20:09:56 +0000 (22:09 +0200)
committerVictor Julien <victor@inliniac.net>
Thu, 28 Nov 2024 13:59:20 +0000 (14:59 +0100)
Splits the unified tree into a ipv4 specific and ipv6 specific tree.

src/defrag-config.c
src/defrag-config.h

index 23725dea3963a36ceae671fa59081e17d3d81acc..d22ac44a0b733b96add55f136886fbb5a0c53de3 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2013 Open Information Security Foundation
+/* Copyright (C) 2007-2022 Open Information Security Foundation
  *
  * You can copy, redistribute or modify this Program under the terms of
  * the GNU General Public License version 2 as published by the Free
 #include "suricata-common.h"
 #include "defrag-config.h"
 #include "util-misc.h"
-#include "util-radix-tree.h"
 #include "conf.h"
-
-static SCRadixTree *defrag_tree = NULL;
-
-static int default_timeout = 0;
+#include "util-radix4-tree.h"
+#include "util-radix6-tree.h"
 
 static void DefragPolicyFreeUserData(void *data)
 {
@@ -38,7 +35,14 @@ static void DefragPolicyFreeUserData(void *data)
         SCFree(data);
 }
 
-static void DefragPolicyAddHostInfo(char *host_ip_range, uint64_t timeout)
+static SCRadix4Tree defrag4_tree = SC_RADIX4_TREE_INITIALIZER;
+static SCRadix6Tree defrag6_tree = SC_RADIX6_TREE_INITIALIZER;
+static SCRadix4Config defrag4_config = { DefragPolicyFreeUserData, NULL };
+static SCRadix6Config defrag6_config = { DefragPolicyFreeUserData, NULL };
+
+static int default_timeout = 0;
+
+static void DefragPolicyAddHostInfo(const char *host_ip_range, uint64_t timeout)
 {
     uint64_t *user_data = NULL;
 
@@ -50,7 +54,8 @@ static void DefragPolicyAddHostInfo(char *host_ip_range, uint64_t timeout)
 
     if (strchr(host_ip_range, ':') != NULL) {
         SCLogDebug("adding ipv6 host %s", host_ip_range);
-        if (!SCRadixAddKeyIPV6String(host_ip_range, defrag_tree, (void *)user_data)) {
+        if (!SCRadix6AddKeyIPV6String(
+                    &defrag6_tree, &defrag6_config, host_ip_range, (void *)user_data)) {
             SCFree(user_data);
             if (sc_errno != SC_EEXIST) {
                 SCLogWarning("failed to add ipv6 host %s", host_ip_range);
@@ -58,8 +63,8 @@ static void DefragPolicyAddHostInfo(char *host_ip_range, uint64_t timeout)
         }
     } else {
         SCLogDebug("adding ipv4 host %s", host_ip_range);
-        if (!SCRadixAddKeyIPV4String(host_ip_range, defrag_tree, (void *)user_data)) {
-            SCFree(user_data);
+        if (!SCRadix4AddKeyIPV4String(
+                    &defrag4_tree, &defrag4_config, host_ip_range, (void *)user_data)) {
             if (sc_errno != SC_EEXIST) {
                 SCLogWarning("failed to add ipv4 host %s", host_ip_range);
             }
@@ -67,20 +72,20 @@ static void DefragPolicyAddHostInfo(char *host_ip_range, uint64_t timeout)
     }
 }
 
-static int DefragPolicyGetIPv4HostTimeout(uint8_t *ipv4_addr)
+static int DefragPolicyGetIPv4HostTimeout(const uint8_t *ipv4_addr)
 {
     void *user_data = NULL;
-    (void)SCRadixFindKeyIPV4BestMatch(ipv4_addr, defrag_tree, &user_data);
+    (void)SCRadix4TreeFindBestMatch(&defrag4_tree, ipv4_addr, &user_data);
     if (user_data == NULL)
         return -1;
 
     return *((int *)user_data);
 }
 
-static int DefragPolicyGetIPv6HostTimeout(uint8_t *ipv6_addr)
+static int DefragPolicyGetIPv6HostTimeout(const uint8_t *ipv6_addr)
 {
     void *user_data = NULL;
-    (void)SCRadixFindKeyIPV6BestMatch(ipv6_addr, defrag_tree, &user_data);
+    (void)SCRadix6TreeFindBestMatch(&defrag6_tree, ipv6_addr, &user_data);
     if (user_data == NULL)
         return -1;
 
@@ -92,9 +97,9 @@ int DefragPolicyGetHostTimeout(Packet *p)
     int timeout = 0;
 
     if (PacketIsIPv4(p))
-        timeout = DefragPolicyGetIPv4HostTimeout((uint8_t *)GET_IPV4_DST_ADDR_PTR(p));
+        timeout = DefragPolicyGetIPv4HostTimeout((const uint8_t *)GET_IPV4_DST_ADDR_PTR(p));
     else if (PacketIsIPv6(p))
-        timeout = DefragPolicyGetIPv6HostTimeout((uint8_t *)GET_IPV6_DST_ADDR(p));
+        timeout = DefragPolicyGetIPv6HostTimeout((const uint8_t *)GET_IPV6_DST_ADDR(p));
 
     if (timeout <= 0)
         timeout = default_timeout;
@@ -134,11 +139,6 @@ void DefragPolicyLoadFromConfig(void)
 {
     SCEnter();
 
-    defrag_tree = SCRadixCreateRadixTree(DefragPolicyFreeUserData, NULL);
-    if (defrag_tree == NULL) {
-        FatalError("Can't alloc memory for the defrag config tree.");
-    }
-
     ConfNode *server_config = ConfGetNode("defrag.host-config");
     if (server_config == NULL) {
         SCLogDebug("failed to read host config");
@@ -160,8 +160,6 @@ void DefragPolicyLoadFromConfig(void)
 
 void DefragTreeDestroy(void)
 {
-    if (defrag_tree != NULL) {
-        SCRadixReleaseRadixTree(defrag_tree);
-    }
-    defrag_tree = NULL;
+    SCRadix4TreeRelease(&defrag4_tree, &defrag4_config);
+    SCRadix6TreeRelease(&defrag6_tree, &defrag6_config);
 }
index e2b15dbb3167320123fb8a24df67ea8940f2122d..3696c908bcf74c9e07cce40e11484c5f71995ac5 100644 (file)
@@ -1,4 +1,4 @@
-/* Copyright (C) 2007-2013 Open Information Security Foundation
+/* Copyright (C) 2007-2022 Open Information Security Foundation
  *
  * You can copy, redistribute or modify this Program under the terms of
  * the GNU General Public License version 2 as published by the Free