From fd0ca1166e3c3e98c1cec3d8f59693b8da328798 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Wed, 15 Jan 2014 13:14:25 +0100 Subject: segtree: add new segtree debugging option 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 --- src/main.c | 6 +++++- src/segtree.c | 43 +++++++++++++++++++++++++++++++++---------- 2 files changed, 38 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/main.c b/src/main.c index e8be423d..d78eea79 100644 --- a/src/main.c +++ b/src/main.c @@ -111,7 +111,7 @@ static void show_help(const char *name) " -a/--handle Output rule handle.\n" " -I/--includepath Add to the paths searched for include files.\n" #ifdef DEBUG -" --debug Specify debugging level (scanner, parser, eval, netlink, all)\n" +" --debug 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, diff --git a/src/segtree.c b/src/segtree.c index 356a8b76..5426e24f 100644 --- a/src/segtree.c +++ b/src/segtree.c @@ -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) -- cgit v1.2.3 From 7c6db39e019c3c7e973d9835c9b03341b0d63de9 Mon Sep 17 00:00:00 2001 From: Pablo Neira Ayuso Date: Wed, 15 Jan 2014 15:56:57 +0100 Subject: netlink: use stdout for debugging Suggested-by: Patrick McHardy Signed-off-by: Pablo Neira Ayuso --- src/netlink.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/netlink.c b/src/netlink.c index 59bd8e49..b776b3cc 100644 --- a/src/netlink.c +++ b/src/netlink.c @@ -378,7 +378,7 @@ void netlink_dump_rule(struct nft_rule *nlr) return; nft_rule_snprintf(buf, sizeof(buf), nlr, 0, 0); - fprintf(stderr, "%s\n", buf); + fprintf(stdout, "%s\n", buf); #endif } @@ -391,7 +391,7 @@ void netlink_dump_expr(struct nft_rule_expr *nle) return; nft_rule_expr_snprintf(buf, sizeof(buf), nle, 0, 0); - fprintf(stderr, "%s\n", buf); + fprintf(stdout, "%s\n", buf); #endif } @@ -446,7 +446,7 @@ void netlink_dump_chain(struct nft_chain *nlc) return; nft_chain_snprintf(buf, sizeof(buf), nlc, 0, 0); - fprintf(stderr, "%s\n", buf); + fprintf(stdout, "%s\n", buf); #endif } @@ -665,7 +665,7 @@ void netlink_dump_table(struct nft_table *nlt) return; nft_table_snprintf(buf, sizeof(buf), nlt, 0, 0); - fprintf(stderr, "%s\n", buf); + fprintf(stdout, "%s\n", buf); #endif } @@ -763,7 +763,7 @@ void netlink_dump_set(struct nft_set *nls) return; nft_set_snprintf(buf, sizeof(buf), nls, 0, 0); - fprintf(stderr, "%s\n", buf); + fprintf(stdout, "%s\n", buf); #endif } -- cgit v1.2.3 From c3d233b1e210922ac6f29afca796b66964e499de Mon Sep 17 00:00:00 2001 From: Patrick McHardy Date: Wed, 15 Jan 2014 15:39:10 +0000 Subject: expr: relational: don't surpress '==' for LHS binops in output This patch changes the output of relational expressions to not surpress the '==' when the LHS is a binop, f.i. ... meta mark & 0x00000003 0x00000001 becomes ... meta mark & 0x00000003 == 0x00000001 Signed-off-by: Patrick McHardy --- src/expression.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'src') diff --git a/src/expression.c b/src/expression.c index 71154cc6..518f71c8 100644 --- a/src/expression.c +++ b/src/expression.c @@ -356,7 +356,7 @@ const char *expr_op_symbols[] = { [OP_XOR] = "^", [OP_LSHIFT] = "<<", [OP_RSHIFT] = ">>", - [OP_EQ] = NULL, + [OP_EQ] = "==", [OP_NEQ] = "!=", [OP_LT] = "<", [OP_GT] = ">", @@ -407,7 +407,9 @@ struct expr *unary_expr_alloc(const struct location *loc, static void binop_expr_print(const struct expr *expr) { expr_print(expr->left); - if (expr_op_symbols[expr->op] != NULL) + if (expr_op_symbols[expr->op] && + (expr->op != OP_EQ || + expr->left->ops->type == EXPR_BINOP)) printf(" %s ", expr_op_symbols[expr->op]); else printf(" "); -- cgit v1.2.3