15#include <libnetfilter_conntrack/libnetfilter_conntrack.h>
21static void eval_sigterm(
int status)
23 switch(WTERMSIG(status)) {
25 printf(
"received SIGSEV\n");
31 printf(
"exited with signal: %d\n", WTERMSIG(status));
36static void test_nfct_bitmask(
void)
38 struct nfct_bitmask *a, *b;
39 unsigned short int maxb, i;
40 struct nf_conntrack *ct1, *ct2;
42 printf(
"== test nfct_bitmask_* API ==\n");
44 maxb = rand() & 0xffff;
46 a = nfct_bitmask_new(maxb);
48 assert(!nfct_bitmask_test_bit(a, maxb + 32));
49 nfct_bitmask_set_bit(a, maxb + 32);
50 assert(!nfct_bitmask_test_bit(a, maxb + 32));
52 for (i = 0; i <= maxb; i++)
53 assert(!nfct_bitmask_test_bit(a, i));
55 for (i = 0; i <= maxb; i++) {
57 assert(!nfct_bitmask_test_bit(a, i));
60 nfct_bitmask_set_bit(a, i);
61 assert(nfct_bitmask_test_bit(a, i));
64 b = nfct_bitmask_clone(a);
67 for (i = 0; i <= maxb; i++) {
68 if (nfct_bitmask_test_bit(a, i))
69 assert(nfct_bitmask_test_bit(b, i));
71 assert(!nfct_bitmask_test_bit(b, i));
74 nfct_bitmask_destroy(a);
76 for (i = 0; i <= maxb; i++) {
79 nfct_bitmask_unset_bit(b, i);
80 assert(!nfct_bitmask_test_bit(b, i));
84 for (i = 0; i < maxb; i++) {
85 nfct_bitmask_set_bit(b, i);
86 assert(nfct_bitmask_test_bit(b, i));
87 nfct_bitmask_clear(b);
88 assert(!nfct_bitmask_test_bit(b, i));
91 for (i = 0; i < maxb; i++)
92 nfct_bitmask_set_bit(b, i);
93 nfct_bitmask_clear(b);
94 for (i = 0; i < maxb; i++)
95 assert(!nfct_bitmask_test_bit(b, i));
98 for (i = 0; i < maxb / 32 * 32; i += 32) {
99 a = nfct_bitmask_new(i);
100 assert(!nfct_bitmask_equal(a, b));
101 nfct_bitmask_destroy(a);
104 a = nfct_bitmask_clone(b);
105 assert(nfct_bitmask_equal(a, b));
106 for (i = 0; i < maxb; i++) {
107 if (nfct_bitmask_test_bit(a, i)) {
108 nfct_bitmask_unset_bit(a, i);
109 assert(!nfct_bitmask_equal(a, b));
110 nfct_bitmask_set_bit(a, i);
112 nfct_bitmask_set_bit(a, i);
113 assert(!nfct_bitmask_equal(a, b));
114 nfct_bitmask_unset_bit(a, i);
116 assert(nfct_bitmask_equal(a, b));
119 nfct_bitmask_destroy(a);
120 nfct_bitmask_destroy(b);
125 maxb = rand() & 0xff;
128 a = nfct_bitmask_new(maxb * 2);
129 b = nfct_bitmask_new(maxb);
133 assert(
nfct_cmp(ct1, ct2, NFCT_CMP_ALL) == 1);
135 nfct_bitmask_set_bit(a, maxb);
136 nfct_bitmask_set_bit(b, maxb);
137 assert(
nfct_cmp(ct1, ct2, NFCT_CMP_ALL) == 1);
139 nfct_bitmask_set_bit(a, maxb * 2);
140 assert(
nfct_cmp(ct1, ct2, NFCT_CMP_ALL) == 0);
147static int attr_is_readonly(
int attr)
150 case ATTR_ORIG_COUNTER_PACKETS:
151 case ATTR_REPL_COUNTER_PACKETS:
152 case ATTR_ORIG_COUNTER_BYTES:
153 case ATTR_REPL_COUNTER_BYTES:
156 case ATTR_TIMESTAMP_START:
157 case ATTR_TIMESTAMP_STOP:
164static int test_nfct_cmp_api_single(
struct nf_conntrack *ct1,
165 struct nf_conntrack *ct2,
int attr)
168 struct nfct_bitmask *b;
171 if (attr_is_readonly(attr))
186 case ATTR_TCP_FLAGS_ORIG:
187 case ATTR_TCP_FLAGS_REPL:
188 case ATTR_TCP_MASK_ORIG:
189 case ATTR_TCP_MASK_REPL:
191 case ATTR_MASTER_IPV4_SRC:
192 case ATTR_MASTER_IPV4_DST:
193 case ATTR_MASTER_IPV6_SRC:
194 case ATTR_MASTER_IPV6_DST:
195 case ATTR_MASTER_PORT_SRC:
196 case ATTR_MASTER_PORT_DST:
197 case ATTR_MASTER_L3PROTO:
198 case ATTR_MASTER_L4PROTO:
200 case ATTR_ORIG_NAT_SEQ_CORRECTION_POS:
201 case ATTR_ORIG_NAT_SEQ_OFFSET_BEFORE:
202 case ATTR_ORIG_NAT_SEQ_OFFSET_AFTER:
203 case ATTR_REPL_NAT_SEQ_CORRECTION_POS:
204 case ATTR_REPL_NAT_SEQ_OFFSET_BEFORE:
205 case ATTR_REPL_NAT_SEQ_OFFSET_AFTER:
207 case ATTR_SCTP_VTAG_ORIG:
208 case ATTR_SCTP_VTAG_REPL:
210 case ATTR_HELPER_NAME:
213 case ATTR_DCCP_HANDSHAKE_SEQ:
215 case ATTR_TCP_WSCALE_ORIG:
216 case ATTR_TCP_WSCALE_REPL:
218 case ATTR_SYNPROXY_ISN:
219 case ATTR_SYNPROXY_ITS:
220 case ATTR_SYNPROXY_TSOFF:
222 case ATTR_HELPER_INFO:
229 if (attr >= ATTR_SCTP_STATE) {
232 }
else if (attr >= ATTR_TCP_FLAGS_ORIG) {
235 }
else if (attr >= ATTR_ICMP_CODE) {
238 }
else if (attr >= ATTR_ORIG_PORT_SRC) {
244 memset(data, 42,
sizeof(data));
250 case ATTR_CONNLABELS:
251 case ATTR_CONNLABELS_MASK:
254 b = nfct_bitmask_clone(b);
256 bit = nfct_bitmask_maxbit(b);
257 if (nfct_bitmask_test_bit(b, bit)) {
258 nfct_bitmask_unset_bit(b, bit);
259 assert(!nfct_bitmask_test_bit(b, bit));
261 nfct_bitmask_set_bit(b, bit);
262 assert(nfct_bitmask_test_bit(b, bit));
264 assert(
nfct_cmp(ct1, ct2, NFCT_CMP_ALL) == 1);
267 case ATTR_HELPER_INFO:
275 if (
nfct_cmp(ct1, ct2, NFCT_CMP_ALL) != 0) {
276 fprintf(stderr,
"nfct_cmp assert failure for attr %d\n", attr);
277 fprintf(stderr,
"%p, %p, %x, %x\n",
nfct_get_attr(ct1, attr),
282 if (
nfct_cmp(ct1, ct2, NFCT_CMP_ALL|NFCT_CMP_STRICT) != 0) {
283 fprintf(stderr,
"nfct_cmp strict assert failure for attr %d\n", attr);
289static int test_cmp_attr32(
int attr,
bool at1,
bool at2,
290 uint32_t v1, uint32_t v2,
unsigned int flags)
292 struct nf_conntrack *ct1 =
nfct_new();
293 struct nf_conntrack *ct2 =
nfct_new();
301 ret =
nfct_cmp(ct1, ct2, NFCT_CMP_ALL | flags);
309static void test_nfct_cmp_attr(
int attr)
311 unsigned int flags = 0;
315 assert(test_cmp_attr32(attr,
false,
false, 0, 0, flags) == 1);
316 assert(test_cmp_attr32(attr,
true,
false, 0, 0, flags) == 1);
317 assert(test_cmp_attr32(attr,
false,
true, 0, 0, flags) == 1);
318 assert(test_cmp_attr32(attr,
true,
true, 0, 0, flags) == 1);
319 assert(test_cmp_attr32(attr,
false,
false, 1, 0, flags) == 1);
320 assert(test_cmp_attr32(attr,
true,
false, 1, 0, flags) == 1);
321 assert(test_cmp_attr32(attr,
false,
true, 1, 0, flags) == 1);
322 assert(test_cmp_attr32(attr,
true,
true, 1, 0, flags) == 0);
323 assert(test_cmp_attr32(attr,
false,
false, 0, 1, flags) == 1);
324 assert(test_cmp_attr32(attr,
true,
false, 0, 1, flags) == 1);
325 assert(test_cmp_attr32(attr,
false,
true, 0, 1, flags) == 1);
326 assert(test_cmp_attr32(attr,
true,
true, 0, 1, flags) == 0);
327 assert(test_cmp_attr32(attr,
false,
false, 1, 1, flags) == 1);
328 assert(test_cmp_attr32(attr,
true,
false, 1, 1, flags) == 1);
329 assert(test_cmp_attr32(attr,
false,
true, 1, 1, flags) == 1);
330 assert(test_cmp_attr32(attr,
true,
true, 1, 1, flags) == 1);
332 flags = NFCT_CMP_STRICT;
333 assert(test_cmp_attr32(attr,
false,
false, 0, 0, flags) == 1);
334 assert(test_cmp_attr32(attr,
true,
false, 0, 0, flags) == 1);
335 assert(test_cmp_attr32(attr,
false,
true, 0, 0, flags) == 1);
336 assert(test_cmp_attr32(attr,
true,
true, 0, 0, flags) == 1);
337 assert(test_cmp_attr32(attr,
false,
false, 1, 0, flags) == 1);
338 assert(test_cmp_attr32(attr,
true,
false, 1, 0, flags) == 0);
339 assert(test_cmp_attr32(attr,
false,
true, 1, 0, flags) == 1);
340 assert(test_cmp_attr32(attr,
true,
true, 1, 0, flags) == 0);
341 assert(test_cmp_attr32(attr,
false,
false, 0, 1, flags) == 1);
342 assert(test_cmp_attr32(attr,
true,
false, 0, 1, flags) == 1);
343 assert(test_cmp_attr32(attr,
false,
true, 0, 1, flags) == 0);
344 assert(test_cmp_attr32(attr,
true,
true, 0, 1, flags) == 0);
345 assert(test_cmp_attr32(attr,
false,
false, 1, 1, flags) == 1);
346 assert(test_cmp_attr32(attr,
true,
false, 1, 1, flags) == 0);
347 assert(test_cmp_attr32(attr,
false,
true, 1, 1, flags) == 0);
348 assert(test_cmp_attr32(attr,
true,
true, 1, 1, flags) == 1);
350 flags = NFCT_CMP_MASK;
351 assert(test_cmp_attr32(attr,
false,
false, 0, 0, flags) == 1);
352 assert(test_cmp_attr32(attr,
true,
false, 0, 0, flags) == 1);
353 assert(test_cmp_attr32(attr,
false,
true, 0, 0, flags) == 1);
354 assert(test_cmp_attr32(attr,
true,
true, 0, 0, flags) == 1);
355 assert(test_cmp_attr32(attr,
false,
false, 1, 0, flags) == 1);
356 assert(test_cmp_attr32(attr,
true,
false, 1, 0, flags) == 0);
357 assert(test_cmp_attr32(attr,
false,
true, 1, 0, flags) == 1);
358 assert(test_cmp_attr32(attr,
true,
true, 1, 0, flags) == 0);
359 assert(test_cmp_attr32(attr,
false,
false, 0, 1, flags) == 1);
360 assert(test_cmp_attr32(attr,
true,
false, 0, 1, flags) == 1);
361 assert(test_cmp_attr32(attr,
false,
true, 0, 1, flags) == 1);
362 assert(test_cmp_attr32(attr,
true,
true, 0, 1, flags) == 0);
363 assert(test_cmp_attr32(attr,
false,
false, 1, 1, flags) == 1);
364 assert(test_cmp_attr32(attr,
true,
false, 1, 1, flags) == 0);
365 assert(test_cmp_attr32(attr,
false,
true, 1, 1, flags) == 1);
366 assert(test_cmp_attr32(attr,
true,
true, 1, 1, flags) == 1);
368 flags = NFCT_CMP_STRICT|NFCT_CMP_MASK;
369 assert(test_cmp_attr32(attr,
false,
false, 0, 0, flags) == 1);
370 assert(test_cmp_attr32(attr,
true,
false, 0, 0, flags) == 1);
371 assert(test_cmp_attr32(attr,
false,
true, 0, 0, flags) == 1);
372 assert(test_cmp_attr32(attr,
true,
true, 0, 0, flags) == 1);
373 assert(test_cmp_attr32(attr,
false,
false, 1, 0, flags) == 1);
374 assert(test_cmp_attr32(attr,
true,
false, 1, 0, flags) == 0);
375 assert(test_cmp_attr32(attr,
false,
true, 1, 0, flags) == 1);
376 assert(test_cmp_attr32(attr,
true,
true, 1, 0, flags) == 0);
377 assert(test_cmp_attr32(attr,
false,
false, 0, 1, flags) == 1);
378 assert(test_cmp_attr32(attr,
true,
false, 0, 1, flags) == 1);
379 assert(test_cmp_attr32(attr,
false,
true, 0, 1, flags) == 0);
380 assert(test_cmp_attr32(attr,
true,
true, 0, 1, flags) == 0);
381 assert(test_cmp_attr32(attr,
false,
false, 1, 1, flags) == 1);
382 assert(test_cmp_attr32(attr,
true,
false, 1, 1, flags) == 0);
383 assert(test_cmp_attr32(attr,
false,
true, 1, 1, flags) == 0);
384 assert(test_cmp_attr32(attr,
true,
true, 1, 1, flags) == 1);
387static void test_nfct_cmp_api(
struct nf_conntrack *ct1,
struct nf_conntrack *ct2)
391 printf(
"== test cmp API ==\n");
393 test_nfct_cmp_attr(ATTR_ZONE);
394 test_nfct_cmp_attr(ATTR_ORIG_ZONE);
395 test_nfct_cmp_attr(ATTR_REPL_ZONE);
396 test_nfct_cmp_attr(ATTR_MARK);
398 assert(
nfct_cmp(ct1, ct2, NFCT_CMP_ALL) == 1);
399 assert(
nfct_cmp(ct1, ct2, NFCT_CMP_ALL|NFCT_CMP_STRICT) == 0);
403 assert(
nfct_cmp(ct1, ct2, NFCT_CMP_ALL) == 1);
404 assert(
nfct_cmp(ct1, ct2, NFCT_CMP_ALL|NFCT_CMP_STRICT) == 1);
406 for (i=0; i < ATTR_MAX ; i++) {
409 assert(
nfct_cmp(ct1, ct2, NFCT_CMP_ALL) == 1);
410 assert(
nfct_cmp(ct1, ct2, NFCT_CMP_ALL|NFCT_CMP_STRICT) == 0);
411 assert(
nfct_cmp(ct1, ct2, NFCT_CMP_ALL|NFCT_CMP_MASK) == 1);
414 for (i=0; i < ATTR_MAX ; i++) {
417 assert(
nfct_cmp(ct1, ct2, NFCT_CMP_ALL) == 1);
418 assert(
nfct_cmp(ct1, ct2, NFCT_CMP_ALL|NFCT_CMP_STRICT) == 0);
419 assert(
nfct_cmp(ct1, ct2, NFCT_CMP_ALL|NFCT_CMP_MASK) == 0);
422 for (i=0; i < ATTR_MAX ; i++)
423 assert(test_nfct_cmp_api_single(ct1, ct2, i) == 0);
426 for (i=0; i < ATTR_MAX ; i++) {
430 assert(
nfct_cmp(ct1, ct2, NFCT_CMP_ALL) == 1);
431 assert(
nfct_cmp(ct1, ct2, NFCT_CMP_ALL|NFCT_CMP_STRICT) == 1);
432 assert(
nfct_cmp(ct1, ct2, NFCT_CMP_ALL|NFCT_CMP_MASK) == 1);
438static void test_nfexp_cmp_api(
struct nf_expect *ex1,
struct nf_expect *ex2)
442 printf(
"== test expect cmp API ==\n");
448 assert(
nfexp_cmp(ex1, ex2, NFCT_CMP_STRICT) == 1);
455 for (i=0; i < ATTR_EXP_MAX; i++) {
459 assert(
nfexp_cmp(ex1, ex2, NFCT_CMP_STRICT) == 0);
460 assert(
nfexp_cmp(ex1, ex2, NFCT_CMP_MASK) == 1);
463 for (i=0; i < ATTR_EXP_MAX; i++) {
467 assert(
nfexp_cmp(ex1, ex2, NFCT_CMP_MASK) == 0);
470 for (i=0; i < ATTR_EXP_MAX; i++) {
475 assert(
nfexp_cmp(ex1, ex2, NFCT_CMP_STRICT) == 1);
476 assert(
nfexp_cmp(ex1, ex2, NFCT_CMP_MASK) == 1);
485 struct nf_conntrack *ct, *ct2, *tmp;
486 struct nf_expect *exp, *tmp_exp;
490 struct nfct_bitmask *b, *b2;
495 for (i=0; i<
sizeof(data); i++)
509 printf(
"== test set API ==\n");
512 for (i=0; i<ATTR_MAX; i++)
517 eval_sigterm(status);
520 b = nfct_bitmask_new(rand() & 0xffff);
522 b2 = nfct_bitmask_new(rand() & 0xffff);
525 for (i=0; i<ATTR_MAX; i++) {
527 case ATTR_CONNLABELS:
530 case ATTR_CONNLABELS_MASK:
539 printf(
"== test get API ==\n");
542 for (i=0; i<ATTR_MAX; i++)
547 eval_sigterm(status);
550 printf(
"== validate set API ==\n");
553 for (i=0; i<ATTR_MAX; i++) {
554 if (attr_is_readonly(i))
558 case ATTR_HELPER_INFO:
561 case ATTR_CONNLABELS:
562 case ATTR_CONNLABELS_MASK:
566 data[0] = (uint8_t) i;
571 case ATTR_CONNLABELS:
572 assert((
void *) val == b);
574 case ATTR_CONNLABELS_MASK:
575 assert((
void *) val == b2);
579 if (val[0] != data[0]) {
580 printf(
"ERROR: set/get operations don't match "
581 "for attribute %d (%x != %x)\n",
588 eval_sigterm(status);
591 printf(
"== test copy API ==\n");
594 for (i=0; i<ATTR_MAX; i++)
599 eval_sigterm(status);
604 test_nfct_cmp_api(tmp, ct);
608 eval_sigterm(status);
622 printf(
"== test expect set API ==\n");
625 for (i=0; i<ATTR_EXP_MAX; i++)
630 eval_sigterm(status);
633 for (i=0; i<ATTR_EXP_MAX; i++)
636 printf(
"== test expect get API ==\n");
639 for (i=0; i<ATTR_EXP_MAX; i++)
644 eval_sigterm(status);
647 printf(
"== validate expect set API ==\n");
650 for (i=0; i<ATTR_EXP_MAX; i++) {
651 data[0] = (uint8_t) i;
654 if (val[0] != data[0]) {
655 printf(
"ERROR: set/get operations don't match "
656 "for attribute %d (%x != %x)\n",
663 eval_sigterm(status);
668 test_nfexp_cmp_api(tmp_exp, exp);
672 eval_sigterm(status);
681 printf(
"== test set grp API ==\n");
684 for (i=0; i<ATTR_GRP_MAX; i++)
689 eval_sigterm(status);
692 for (i=0; i<ATTR_GRP_MAX; i++)
695 printf(
"== test get grp API ==\n");
700 for (i=0; i<ATTR_GRP_MAX; i++)
705 eval_sigterm(status);
708 printf(
"== validate set grp API ==\n");
711 for (i=0; i<ATTR_GRP_MAX; i++) {
714 data[0] = (uint8_t) i;
719 case ATTR_GRP_ORIG_COUNTERS:
720 case ATTR_GRP_REPL_COUNTERS:
721 case ATTR_GRP_ORIG_ADDR_SRC:
722 case ATTR_GRP_ORIG_ADDR_DST:
723 case ATTR_GRP_REPL_ADDR_SRC:
724 case ATTR_GRP_REPL_ADDR_DST:
727 if (buf[0] != data[0]) {
728 printf(
"ERROR: set/get operations don't match "
729 "for attribute %d (%x != %x)\n",
736 eval_sigterm(status);
740 printf(
"== destroy cloned ct entry ==\n");
void nfct_set_attr_u32(struct nf_conntrack *ct, const enum nf_conntrack_attr type, uint32_t value)
void nfct_destroy(struct nf_conntrack *ct)
void nfct_copy_attr(struct nf_conntrack *ct1, const struct nf_conntrack *ct2, const enum nf_conntrack_attr type)
void nfct_set_attr(struct nf_conntrack *ct, const enum nf_conntrack_attr type, const void *value)
int nfct_get_attr_grp(const struct nf_conntrack *ct, const enum nf_conntrack_attr_grp type, void *data)
void nfct_set_attr_grp(struct nf_conntrack *ct, const enum nf_conntrack_attr_grp type, const void *value)
const void * nfct_get_attr(const struct nf_conntrack *ct, const enum nf_conntrack_attr type)
int nfct_attr_unset(struct nf_conntrack *ct, const enum nf_conntrack_attr type)
void nfct_copy(struct nf_conntrack *dest, const struct nf_conntrack *source, unsigned int flags)
int nfct_cmp(const struct nf_conntrack *ct1, const struct nf_conntrack *ct2, unsigned int flags)
uint32_t nfct_get_attr_u32(const struct nf_conntrack *ct, const enum nf_conntrack_attr type)
void nfct_set_attr_u8(struct nf_conntrack *ct, const enum nf_conntrack_attr type, uint8_t value)
void nfct_set_attr_l(struct nf_conntrack *ct, const enum nf_conntrack_attr type, const void *value, size_t len)
int nfct_attr_is_set(const struct nf_conntrack *ct, const enum nf_conntrack_attr type)
struct nf_conntrack * nfct_new(void)
struct nf_expect * nfexp_new(void)
const void * nfexp_get_attr(const struct nf_expect *exp, const enum nf_expect_attr type)
void nfexp_set_attr(struct nf_expect *exp, const enum nf_expect_attr type, const void *value)
int nfexp_cmp(const struct nf_expect *exp1, const struct nf_expect *exp2, unsigned int flags)
void nfexp_destroy(struct nf_expect *exp)
int nfexp_attr_unset(struct nf_expect *exp, const enum nf_expect_attr type)
int nfexp_attr_is_set(const struct nf_expect *exp, const enum nf_expect_attr type)
size_t nfexp_maxsize(void)