Home | History | Annotate | Line # | Download | only in libnpftest
npf_table_test.c revision 1.2
      1 /*	$NetBSD: npf_table_test.c,v 1.2 2012/06/22 13:43:17 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 	/* Attempt to match non-existing entries - should fail. */
     59 	addr->s6_addr32[0] = inet_addr(ip_list[0]);
     60 
     61 	error = npf_table_match_addr(tblset, HASH_TID, addr);
     62 	assert(error != 0);
     63 
     64 	error = npf_table_match_addr(tblset, TREE_TID, addr);
     65 	assert(error != 0);
     66 
     67 	/* Fill both tables with IP addresses. */
     68 	for (i = 0; i < __arraycount(ip_list); i++) {
     69 		addr->s6_addr32[0] = inet_addr(ip_list[i]);
     70 
     71 		error = npf_table_add_cidr(tblset, HASH_TID, addr, 32);
     72 		assert(error == 0);
     73 		error = npf_table_add_cidr(tblset, HASH_TID, addr, 32);
     74 		assert(error != 0);
     75 
     76 		error = npf_table_add_cidr(tblset, TREE_TID, addr, 32);
     77 		assert(error == 0);
     78 		error = npf_table_add_cidr(tblset, TREE_TID, addr, 32);
     79 		assert(error != 0);
     80 	}
     81 
     82 	/* Attempt to add duplicates - should fail. */
     83 	addr->s6_addr32[0] = inet_addr(ip_list[0]);
     84 
     85 	error = npf_table_add_cidr(tblset, HASH_TID, addr, 32);
     86 	assert(error != 0);
     87 
     88 	error = npf_table_add_cidr(tblset, TREE_TID, addr, 32);
     89 	assert(error != 0);
     90 
     91 	/* Reference checks. */
     92 	t1 = npf_table_get(tblset, HASH_TID);
     93 	assert(t1 != NULL);
     94 	npf_table_put(t1);
     95 
     96 	t2 = npf_table_get(tblset, TREE_TID);
     97 	assert(t2 != NULL);
     98 	npf_table_put(t2);
     99 
    100 	/* Match (validate) each IP entry. */
    101 	for (i = 0; i < __arraycount(ip_list); i++) {
    102 		addr->s6_addr32[0] = inet_addr(ip_list[i]);
    103 
    104 		error = npf_table_match_addr(tblset, HASH_TID, addr);
    105 		assert(error == 0);
    106 
    107 		error = npf_table_match_addr(tblset, TREE_TID, addr);
    108 		assert(error == 0);
    109 	}
    110 
    111 	/* Remove all entries. */
    112 	for (i = 0; i < __arraycount(ip_list); i++) {
    113 		addr->s6_addr32[0] = inet_addr(ip_list[i]);
    114 
    115 		error = npf_table_rem_cidr(tblset, HASH_TID, addr, 32);
    116 		assert(error == 0);
    117 
    118 		error = npf_table_rem_cidr(tblset, TREE_TID, addr, 32);
    119 		assert(error == 0);
    120 	}
    121 
    122 	npf_tableset_destroy(tblset);
    123 	npf_tableset_sysfini();
    124 
    125 	return true;
    126 }
    127