]> git.ipfire.org Git - thirdparty/nftables.git/commitdiff
segtree: add new segtree debugging option
authorPablo Neira Ayuso <pablo@netfilter.org>
Wed, 15 Jan 2014 12:14:25 +0000 (13:14 +0100)
committerPablo Neira Ayuso <pablo@netfilter.org>
Wed, 15 Jan 2014 13:38:32 +0000 (14:38 +0100)
Currently, nft displays the debugging information if it's compiled with
--enable-debug (which seems a good idea) and when intervals are used
in maps. Add a new option to enable debugging to segtree, so we only
get this information when explicitly requested.

Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
include/nftables.h
src/main.c
src/segtree.c

index 12f3c49232a924a82721603e395407338f0ca7c9..f9891619dae397f4549f50904a54a9895a314c80 100644 (file)
@@ -17,6 +17,7 @@ enum debug_level {
        DEBUG_PARSER            = 0x2,
        DEBUG_EVALUATION        = 0x4,
        DEBUG_NETLINK           = 0x8,
+       DEBUG_SEGTREE           = 0x10,
 };
 
 #define INCLUDE_PATHS_MAX      16
index e8be423dc4179f336b12d73172c0f2e9379b5496..d78eea79ba93a1040de21633b2a2b6d0ebeda79e 100644 (file)
@@ -111,7 +111,7 @@ static void show_help(const char *name)
 "  -a/--handle                 Output rule handle.\n"
 "  -I/--includepath <directory>        Add <directory> to the paths searched for include files.\n"
 #ifdef DEBUG
-"  --debug <level [,level...]> Specify debugging level (scanner, parser, eval, netlink, all)\n"
+"  --debug <level [,level...]> Specify debugging level (scanner, parser, eval, netlink, segtree, all)\n"
 #endif
 "\n",
        name);
@@ -138,6 +138,10 @@ static const struct {
                .name           = "netlink",
                .level          = DEBUG_NETLINK,
        },
+       {
+               .name           = "segtree",
+               .level          = DEBUG_SEGTREE,
+       },
        {
                .name           = "all",
                .level          = ~0,
index 356a8b7646f47f475ac20c0b9ef84e28f63975aa..5426e24f196a13bdcac5b6762b42bd2d3501a02c 100644 (file)
@@ -157,6 +157,15 @@ static void __ei_insert(struct seg_tree *tree, struct elementary_interval *new)
        rb_insert_color(&new->rb_node, &tree->root);
 }
 
+static bool segtree_debug(void)
+{
+#ifdef DEBUG
+       if (debug_level & DEBUG_SEGTREE)
+               return true;
+#endif
+       return false;
+}
+
 /**
  * ei_insert - insert an elementary interval into the tree
  *
@@ -180,7 +189,8 @@ static void ei_insert(struct seg_tree *tree, struct elementary_interval *new)
        lei = ei_lookup(tree, new->left);
        rei = ei_lookup(tree, new->right);
 
-       pr_debug("insert: [%Zx %Zx]\n", new->left, new->right);
+       if (segtree_debug())
+               pr_debug("insert: [%Zx %Zx]\n", new->left, new->right);
 
        if (lei != NULL && rei != NULL && lei == rei) {
                /*
@@ -189,7 +199,8 @@ static void ei_insert(struct seg_tree *tree, struct elementary_interval *new)
                 *
                 * [lei_left, new_left) and (new_right, rei_right]
                 */
-               pr_debug("split [%Zx %Zx]\n", lei->left, lei->right);
+               if (segtree_debug())
+                       pr_debug("split [%Zx %Zx]\n", lei->left, lei->right);
 
                ei_remove(tree, lei);
 
@@ -208,7 +219,10 @@ static void ei_insert(struct seg_tree *tree, struct elementary_interval *new)
                         *
                         * [lei_left, new_left)[new_left, new_right]
                         */
-                       pr_debug("adjust left [%Zx %Zx]\n", lei->left, lei->right);
+                       if (segtree_debug()) {
+                               pr_debug("adjust left [%Zx %Zx]\n",
+                                        lei->left, lei->right);
+                       }
 
                        mpz_sub_ui(lei->right, new->left, 1);
                        mpz_sub(lei->size, lei->right, lei->left);
@@ -223,7 +237,10 @@ static void ei_insert(struct seg_tree *tree, struct elementary_interval *new)
                         *
                         * [new_left, new_right](new_right, rei_right]
                         */
-                       pr_debug("adjust right [%Zx %Zx]\n", rei->left, rei->right);
+                       if (segtree_debug()) {
+                               pr_debug("adjust right [%Zx %Zx]\n",
+                                        rei->left, rei->right);
+                       }
 
                        mpz_add_ui(rei->left, new->right, 1);
                        mpz_sub(rei->size, rei->right, rei->left);
@@ -350,7 +367,7 @@ static void set_to_segtree(struct expr *set, struct seg_tree *tree)
        for (n = 0; n < set->size; n++) {
                if (n < set->size - 1 &&
                    interval_conflict(intervals[n], intervals[n+1]))
-                       printf("conflict\n");
+                       pr_debug("conflict\n");
                ei_insert(tree, intervals[n]);
        }
 
@@ -371,7 +388,8 @@ static void segtree_linearize(struct list_head *list, struct seg_tree *tree)
         * Convert the tree of open intervals to half-closed map expressions.
         */
        rb_for_each_entry_safe(ei, node, next, &tree->root, rb_node) {
-               pr_debug("iter: [%Zx %Zx]\n", ei->left, ei->right);
+               if (segtree_debug())
+                       pr_debug("iter: [%Zx %Zx]\n", ei->left, ei->right);
 
                if (prev == NULL) {
                        /*
@@ -454,14 +472,19 @@ void set_to_intervals(struct set *set)
        segtree_linearize(&list, &tree);
 
        list_for_each_entry_safe(ei, next, &list, list) {
-               pr_debug("list: [%.*Zx %.*Zx]\n",
-                        2 * tree.keylen / BITS_PER_BYTE, ei->left,
-                        2 * tree.keylen / BITS_PER_BYTE, ei->right);
+               if (segtree_debug()) {
+                       pr_debug("list: [%.*Zx %.*Zx]\n",
+                                2 * tree.keylen / BITS_PER_BYTE, ei->left,
+                                2 * tree.keylen / BITS_PER_BYTE, ei->right);
+               }
                set_insert_interval(set->init, &tree, ei);
                ei_destroy(ei);
        }
 
-       expr_print(set->init); printf("\n");
+       if (segtree_debug()) {
+               expr_print(set->init);
+               pr_debug("\n");
+       }
 }
 
 static bool range_is_prefix(const mpz_t range)