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