/* * Run this after adding a new attribute to the nf_conntrack object */ #include #include #include #include #include #include #include #include #include /* * this file contains a test to check the set/get/copy/cmp APIs. */ static void eval_sigterm(int status) { switch(WTERMSIG(status)) { case SIGSEGV: printf("received SIGSEV\n"); break; case 0: printf("OK\n"); break; default: printf("exited with signal: %d\n", WTERMSIG(status)); break; } } static void test_nfct_bitmask(void) { struct nfct_bitmask *a, *b; unsigned short int maxb, i; printf("== test nfct_bitmask_* API ==\n"); 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); printf("OK\n"); } static void test_nfct_cmp_api(struct nf_conntrack *ct1, struct nf_conntrack *ct2) { int i; printf("== test cmp API ==\n"); assert(nfct_cmp(ct1, ct2, NFCT_CMP_ALL) == 1); assert(nfct_cmp(ct1, ct2, NFCT_CMP_ALL|NFCT_CMP_STRICT) == 0); nfct_copy(ct1, ct2, NFCT_CP_OVERRIDE); assert(nfct_cmp(ct1, ct2, NFCT_CMP_ALL) == 1); assert(nfct_cmp(ct1, ct2, NFCT_CMP_ALL|NFCT_CMP_STRICT) == 1); for (i=0; i < ATTR_MAX ; i++) { nfct_attr_unset(ct1, i); assert(nfct_cmp(ct1, ct2, NFCT_CMP_ALL) == 1); assert(nfct_cmp(ct1, ct2, NFCT_CMP_ALL|NFCT_CMP_STRICT) == 0); assert(nfct_cmp(ct1, ct2, NFCT_CMP_ALL|NFCT_CMP_MASK) == 1); } nfct_copy(ct1, ct2, NFCT_CP_OVERRIDE); for (i=0; i < ATTR_MAX ; i++) { nfct_attr_unset(ct2, i); assert(nfct_cmp(ct1, ct2, NFCT_CMP_ALL) == 1); assert(nfct_cmp(ct1, ct2, NFCT_CMP_ALL|NFCT_CMP_STRICT) == 0); assert(nfct_cmp(ct1, ct2, NFCT_CMP_ALL|NFCT_CMP_MASK) == 0); } nfct_copy(ct2, ct1, NFCT_CP_OVERRIDE); for (i=0; i < ATTR_MAX ; i++) { nfct_attr_unset(ct1, i); nfct_attr_unset(ct2, i); assert(nfct_cmp(ct1, ct2, NFCT_CMP_ALL) == 1); assert(nfct_cmp(ct1, ct2, NFCT_CMP_ALL|NFCT_CMP_STRICT) == 1); assert(nfct_cmp(ct1, ct2, NFCT_CMP_ALL|NFCT_CMP_MASK) == 1); } nfct_destroy(ct1); nfct_destroy(ct2); } static void test_nfexp_cmp_api(struct nf_expect *ex1, struct nf_expect *ex2) { int i; printf("== test expect cmp API ==\n"); /* XXX: missing nfexp_copy API. */ memcpy(ex1, ex2, nfexp_maxsize()); assert(nfexp_cmp(ex1, ex2, 0) == 1); assert(nfexp_cmp(ex1, ex2, NFCT_CMP_STRICT) == 1); assert(nfexp_attr_is_set(ex1, 0) == 1); nfexp_attr_unset(ex1, 0); assert(nfexp_attr_is_set(ex1, 0) == 0); memcpy(ex1, ex2, nfexp_maxsize()); for (i=0; i < ATTR_EXP_MAX; i++) { nfexp_attr_unset(ex1, i); assert(nfexp_cmp(ex1, ex2, 0) == 1); assert(nfexp_cmp(ex1, ex2, NFCT_CMP_STRICT) == 0); assert(nfexp_cmp(ex1, ex2, NFCT_CMP_MASK) == 1); } memcpy(ex1, ex2, nfexp_maxsize()); for (i=0; i < ATTR_EXP_MAX; i++) { nfexp_attr_unset(ex2, i); assert(nfexp_cmp(ex1, ex2, 0) == 1); assert(nfexp_cmp(ex1, ex2, NFCT_CMP_MASK) == 0); } memcpy(ex1, ex2, nfexp_maxsize()); for (i=0; i < ATTR_EXP_MAX; i++) { nfexp_attr_unset(ex1, i); nfexp_attr_unset(ex2, i); assert(nfexp_cmp(ex1, ex2, 0) == 1); assert(nfexp_cmp(ex1, ex2, NFCT_CMP_STRICT) == 1); assert(nfexp_cmp(ex1, ex2, NFCT_CMP_MASK) == 1); } nfexp_destroy(ex1); nfexp_destroy(ex2); } int main(void) { int ret, i; struct nf_conntrack *ct, *ct2, *tmp; struct nf_expect *exp, *tmp_exp; char data[256]; const char *val; int status; struct nfct_bitmask *b, *b2; srand(time(NULL)); /* initialize fake data for testing purposes */ for (i=0; i