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