Home | History | Annotate | Line # | Download | only in libnpftest
npf_table_test.c revision 1.1
      1 /*	$NetBSD: npf_table_test.c,v 1.1 2012/04/14 21:57:29 rmind Exp $	*/
      2 
      3 /*
      4  * NPF tableset test.
      5  *
      6  * Public Domain.
      7  */
      8 
      9 #include <sys/types.h>
     10 
     11 #include "npf_impl.h"
     12 #include "npf_test.h"
     13 
     14 static const char *ip_list[] = {
     15 	"192.168.1.1",
     16 	"10.0.0.1",
     17 	"192.168.2.1",
     18 	"10.1.0.1",
     19 	"192.168.100.253",
     20 	"10.0.5.1",
     21 	"192.168.128.127",
     22 	"10.0.0.2",
     23 };
     24 
     25 #define	HASH_TID		1
     26 #define	TREE_TID		2
     27 
     28 bool
     29 npf_table_test(bool verbose)
     30 {
     31 	npf_addr_t addr_storage, *addr = &addr_storage;
     32 	npf_tableset_t *tblset;
     33 	npf_table_t *t1, *t2;
     34 	int error;
     35 	u_int i;
     36 
     37 	npf_tableset_sysinit();
     38 
     39 	tblset = npf_tableset_create();
     40 	assert(tblset != NULL);
     41 
     42 	/* Table ID 1, using hash table with 256 lists. */
     43 	t1 = npf_table_create(HASH_TID, NPF_TABLE_HASH, 256);
     44 	assert(t1 != NULL);
     45 	error = npf_tableset_insert(tblset, t1);
     46 	assert(error == 0);
     47 
     48 	/* Check for double-insert. */
     49 	error = npf_tableset_insert(tblset, t1);
     50 	assert(error != 0);
     51 
     52 	/* Table ID 2, using RB-tree. */
     53 	t2 = npf_table_create(TREE_TID, NPF_TABLE_TREE, 0);
     54 	assert(t2 != NULL);
     55 	error = npf_tableset_insert(tblset, t2);
     56 	assert(error == 0);
     57 
     58 	/* Fill both tables with IP addresses. */
     59 	for (i = 0; i < __arraycount(ip_list); i++) {
     60 		addr->s6_addr32[0] = inet_addr(ip_list[i]);
     61 
     62 		error = npf_table_add_cidr(tblset, HASH_TID, addr, 32);
     63 		assert(error == 0);
     64 		error = npf_table_add_cidr(tblset, HASH_TID, addr, 32);
     65 		assert(error != 0);
     66 
     67 		error = npf_table_add_cidr(tblset, TREE_TID, addr, 32);
     68 		assert(error == 0);
     69 		error = npf_table_add_cidr(tblset, TREE_TID, addr, 32);
     70 		assert(error != 0);
     71 	}
     72 
     73 	/* Attempt to add duplicates - should fail. */
     74 	addr->s6_addr32[0] = inet_addr(ip_list[0]);
     75 
     76 	error = npf_table_add_cidr(tblset, HASH_TID, addr, 32);
     77 	assert(error != 0);
     78 
     79 	error = npf_table_add_cidr(tblset, TREE_TID, addr, 32);
     80 	assert(error != 0);
     81 
     82 	/* Reference checks. */
     83 	t1 = npf_table_get(tblset, HASH_TID);
     84 	assert(t1 != NULL);
     85 	npf_table_put(t1);
     86 
     87 	t2 = npf_table_get(tblset, TREE_TID);
     88 	assert(t2 != NULL);
     89 	npf_table_put(t2);
     90 
     91 	/* Match (validate) each IP entry. */
     92 	for (i = 0; i < __arraycount(ip_list); i++) {
     93 		addr->s6_addr32[0] = inet_addr(ip_list[i]);
     94 
     95 		error = npf_table_match_addr(tblset, HASH_TID, addr);
     96 		assert(error == 0);
     97 
     98 		error = npf_table_match_addr(tblset, TREE_TID, addr);
     99 		assert(error == 0);
    100 	}
    101 
    102 	/* Remove all entries. */
    103 	for (i = 0; i < __arraycount(ip_list); i++) {
    104 		addr->s6_addr32[0] = inet_addr(ip_list[i]);
    105 
    106 		error = npf_table_rem_cidr(tblset, HASH_TID, addr, 32);
    107 		assert(error == 0);
    108 
    109 		error = npf_table_rem_cidr(tblset, TREE_TID, addr, 32);
    110 		assert(error == 0);
    111 	}
    112 
    113 	npf_tableset_destroy(tblset);
    114 	npf_tableset_sysfini();
    115 
    116 	return true;
    117 }
    118