summaryrefslogtreecommitdiffstats
path: root/tests/nft-expr_bitwise-test.c
diff options
context:
space:
mode:
authorAna Rey <anarey@gmail.com>2013-11-20 12:23:12 +0100
committerPablo Neira Ayuso <pablo@netfilter.org>2013-11-20 23:55:11 +0100
commit47d11ab2153447d7291a5c325cf0cf7bc124b05d (patch)
tree5226c7511943e7973a4178d104470f9d5760fcfc /tests/nft-expr_bitwise-test.c
parent2fad0c845c6dee51d8756a4f558783d8a2344784 (diff)
tests: add unit tests for libnftables
These tests create an initial object 'a' whose attributes are set to arbitrary values. Then, that object is converted to a Netlink message which is parsed to obtain the object 'b'. If things go well, the original object 'a' and the transformed object 'b' should be equivalent. Thus, we make sure that object transformations through the main library APIs are correct. These tests have helped to catch the following bugs in this library: (3cf788a72 expr: fix leak in target and match expressions) (4182e574f expr: match: fix wrong flag setting in nft_rule_expr_match_parse) (0bec6bc5e expr: log: release prefix) (2b690deea expr: log: fix missing \0 when sending log prefix to kernel) (e55c7afcf expr: target: fix wrong info length in nft_rule_expr_target_parse) (8fc4d4bd2 expr: log: fix wrong attribute type in nft_rule_expr_log_parse) Signed-off-by: Ana Rey <anarey@gmail.com> Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
Diffstat (limited to 'tests/nft-expr_bitwise-test.c')
-rw-r--r--tests/nft-expr_bitwise-test.c115
1 files changed, 115 insertions, 0 deletions
diff --git a/tests/nft-expr_bitwise-test.c b/tests/nft-expr_bitwise-test.c
new file mode 100644
index 0000000..d755c75
--- /dev/null
+++ b/tests/nft-expr_bitwise-test.c
@@ -0,0 +1,115 @@
+/*
+ * (C) 2013 by Ana Rey Botello <anarey@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include <netinet/in.h>
+#include <netinet/ip.h>
+#include <linux/netfilter/nf_tables.h>
+#include <libmnl/libmnl.h>
+#include <libnftables/rule.h>
+#include <libnftables/expr.h>
+
+static int test_ok = 1;
+
+static void print_err(const char *msg)
+{
+ test_ok = 0;
+ printf("\033[31mERROR:\e[0m %s\n", msg);
+}
+
+static void cmp_nft_rule_expr(struct nft_rule_expr *rule_a,
+ struct nft_rule_expr *rule_b)
+{
+ uint32_t maska, maskb;
+ uint32_t xora, xorb;
+
+ if (nft_rule_expr_get_u32(rule_a, NFT_EXPR_BITWISE_DREG) !=
+ nft_rule_expr_get_u32(rule_b, NFT_EXPR_BITWISE_DREG))
+ print_err("Expr BITWISE_DREG mismatches");
+ if (nft_rule_expr_get_u32(rule_a, NFT_EXPR_BITWISE_SREG) !=
+ nft_rule_expr_get_u32(rule_b, NFT_EXPR_BITWISE_SREG))
+ print_err("Expr BITWISE_SREG mismatches");
+ if (nft_rule_expr_get_u16(rule_a, NFT_EXPR_BITWISE_LEN) !=
+ nft_rule_expr_get_u16(rule_b, NFT_EXPR_BITWISE_LEN))
+ print_err("Expr BITWISE_DREG mismatches");
+ nft_rule_expr_get(rule_a, NFT_EXPR_BITWISE_MASK, &maska);
+ nft_rule_expr_get(rule_b, NFT_EXPR_BITWISE_MASK, &maskb);
+ if (maska != maskb)
+ print_err("Size of BITWISE_MASK mismatches");
+ nft_rule_expr_get(rule_a, NFT_EXPR_BITWISE_XOR, &xora);
+ nft_rule_expr_get(rule_b, NFT_EXPR_BITWISE_XOR, &xorb);
+ if (xora != xorb)
+ print_err("Size of BITWISE_XOR mismatches");
+
+}
+int main(int argc, char *argv[])
+{
+ struct nft_rule *a, *b = NULL;
+ struct nft_rule_expr *ex = NULL;
+ struct nlmsghdr *nlh;
+ char buf[4096];
+ struct nft_rule_expr_iter *iter_a, *iter_b = NULL;
+ struct nft_rule_expr *rule_a, *rule_b = NULL;
+ uint32_t mask = 0x01010101;
+ uint32_t xor = 0x12345678;
+
+ a = nft_rule_alloc();
+ b = nft_rule_alloc();
+ if (a == NULL || b == NULL)
+ print_err("OOM");
+ ex = nft_rule_expr_alloc("bitwise");
+ if (ex == NULL)
+ print_err("OOM");
+
+ nft_rule_expr_set_u32(ex, NFT_EXPR_BITWISE_SREG, 0x12345678);
+ nft_rule_expr_set_u32(ex, NFT_EXPR_BITWISE_DREG, 0x12345678);
+ nft_rule_expr_set_u32(ex, NFT_EXPR_BITWISE_LEN, 0x12345678);
+ nft_rule_expr_set(ex, NFT_EXPR_BITWISE_MASK, &mask, sizeof(mask));
+ nft_rule_expr_set(ex, NFT_EXPR_BITWISE_XOR, &xor, sizeof(xor));
+
+ nft_rule_add_expr(a, ex);
+
+ nlh = nft_rule_nlmsg_build_hdr(buf, NFT_MSG_NEWRULE, AF_INET, 0, 1234);
+ nft_rule_nlmsg_build_payload(nlh, a);
+
+ if (nft_rule_nlmsg_parse(nlh, b) < 0)
+ print_err("parsing problems");
+
+ iter_a = nft_rule_expr_iter_create(a);
+ iter_b = nft_rule_expr_iter_create(b);
+ if (iter_a == NULL || iter_b == NULL)
+ print_err("OOM");
+
+ rule_a = nft_rule_expr_iter_next(iter_a);
+ rule_b = nft_rule_expr_iter_next(iter_b);
+ if (rule_a == NULL || rule_b == NULL)
+ print_err("OOM");
+
+ if (nft_rule_expr_iter_next(iter_a) != NULL ||
+ nft_rule_expr_iter_next(iter_b) != NULL)
+ print_err("More 1 expr.");
+
+ nft_rule_expr_iter_destroy(iter_a);
+ nft_rule_expr_iter_destroy(iter_b);
+
+ cmp_nft_rule_expr(rule_a,rule_b);
+
+ nft_rule_free(a);
+ nft_rule_free(b);
+
+ if (!test_ok)
+ exit(EXIT_FAILURE);
+
+ printf("%s: \033[32mOK\e[0m\n", argv[0]);
+ return EXIT_SUCCESS;
+}