diff options
author | Florian Westphal <fw@strlen.de> | 2012-11-13 12:21:08 +0100 |
---|---|---|
committer | Florian Westphal <fw@strlen.de> | 2013-05-06 20:57:52 +0200 |
commit | 013a5284c901a6ce80320f499685b89d15eeed9e (patch) | |
tree | 003a0a7606823ecd6f2a97d782aca5263a2005a1 /qa | |
parent | 706064d8b9423df0d22e9ebba092ec2fb14b38aa (diff) |
api: add nfct_bitmask object
In order to use generic getter/setter API with upcoming
conntrack label extension, add helper functions to set/test/unset
bits in a vector of arbitrary size.
Conntrack labels will then be encoded via nfct_bitmask object.
Original idea from Pablo Neira Ayuso.
Signed-off-by: Florian Westphal <fw@strlen.de>
Diffstat (limited to 'qa')
-rw-r--r-- | qa/test_api.c | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/qa/test_api.c b/qa/test_api.c index e1f1750..911b160 100644 --- a/qa/test_api.c +++ b/qa/test_api.c @@ -8,6 +8,7 @@ #include <unistd.h> #include <string.h> #include <sys/wait.h> +#include <time.h> #include <errno.h> #include <libnetfilter_conntrack/libnetfilter_conntrack.h> @@ -31,6 +32,54 @@ static void eval_sigterm(int status) } } +static void test_nfct_bitmask(void) +{ + struct nfct_bitmask *a, *b; + unsigned short int maxb, i; + + maxb = rand() & 0xffff; + + a = nfct_bitmask_new(maxb); + + assert(!nfct_bitmask_test_bit(a, maxb + 32)); + nfct_bitmask_set_bit(a, maxb + 32); + assert(!nfct_bitmask_test_bit(a, maxb + 32)); + + for (i = 0; i <= maxb; i++) + assert(!nfct_bitmask_test_bit(a, i)); + + for (i = 0; i <= maxb; i++) { + if (rand() & 1) { + assert(!nfct_bitmask_test_bit(a, i)); + continue; + } + nfct_bitmask_set_bit(a, i); + assert(nfct_bitmask_test_bit(a, i)); + } + + b = nfct_bitmask_clone(a); + assert(b); + + for (i = 0; i <= maxb; i++) { + if (nfct_bitmask_test_bit(a, i)) + assert(nfct_bitmask_test_bit(b, i)); + else + assert(!nfct_bitmask_test_bit(b, i)); + } + + nfct_bitmask_destroy(a); + + for (i = 0; i <= maxb; i++) { + if (rand() & 1) + continue; + nfct_bitmask_unset_bit(b, i); + assert(!nfct_bitmask_test_bit(b, i)); + } + + nfct_bitmask_destroy(b); +} + + int main(void) { int ret, i; @@ -40,6 +89,8 @@ int main(void) const char *val; int status; + srand(time(NULL)); + /* initialize fake data for testing purposes */ for (i=0; i<sizeof(data); i++) data[i] = 0x01; @@ -281,6 +332,10 @@ int main(void) nfct_destroy(tmp); nfexp_destroy(exp); nfexp_destroy(tmp_exp); + + printf("== test nfct_bitmask_* API ==\n"); + test_nfct_bitmask(); + printf("OK\n"); return EXIT_SUCCESS; |