Home | History | Annotate | Line # | Download | only in libnpftest
npf_table_test.c revision 1.4
      1 /*	$NetBSD: npf_table_test.c,v 1.4 2012/07/15 00:22:59 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 static const uint32_t ip6_list[][4] = {
     26 	{ 0x000080fe, 0x00000000, 0xffc0a002, 0x341210fe },
     27 	{ 0x000080fe, 0x00000000, 0xffc0a002, 0x00000000 },
     28 	{ 0x000080fe, 0x00000000, 0x00000000, 0x00000000 },
     29 	{ 0x000080fe, 0x00000000, 0xffc0a002, 0x301210fe },
     30 };
     31 
     32 #define	HASH_TID		1
     33 #define	TREE_TID		2
     34 
     35 bool
     36 npf_table_test(bool verbose)
     37 {
     38 	npf_addr_t addr_storage, *addr = &addr_storage;
     39 	const int nm = NPF_NO_NETMASK;
     40 	npf_tableset_t *tblset;
     41 	npf_table_t *t1, *t2;
     42 	int error, alen;
     43 	u_int i;
     44 
     45 	npf_tableset_sysinit();
     46 
     47 	tblset = npf_tableset_create();
     48 	assert(tblset != NULL);
     49 
     50 	/* Table ID 1, using hash table with 256 lists. */
     51 	t1 = npf_table_create(HASH_TID, NPF_TABLE_HASH, 256);
     52 	assert(t1 != NULL);
     53 	error = npf_tableset_insert(tblset, t1);
     54 	assert(error == 0);
     55 
     56 	/* Check for double-insert. */
     57 	error = npf_tableset_insert(tblset, t1);
     58 	assert(error != 0);
     59 
     60 	/* Table ID 2, using RB-tree. */
     61 	t2 = npf_table_create(TREE_TID, NPF_TABLE_TREE, 0);
     62 	assert(t2 != NULL);
     63 	error = npf_tableset_insert(tblset, t2);
     64 	assert(error == 0);
     65 
     66 	/* Attempt to match non-existing entries - should fail. */
     67 	addr->s6_addr32[0] = inet_addr(ip_list[0]);
     68 	alen = sizeof(struct in_addr);
     69 
     70 	error = npf_table_lookup(tblset, HASH_TID, alen, addr);
     71 	assert(error != 0);
     72 
     73 	error = npf_table_lookup(tblset, TREE_TID, alen, addr);
     74 	assert(error != 0);
     75 
     76 	/* Fill both tables with IP addresses. */
     77 	for (i = 0; i < __arraycount(ip_list); i++) {
     78 		addr->s6_addr32[0] = inet_addr(ip_list[i]);
     79 
     80 		error = npf_table_insert(tblset, HASH_TID, alen, addr, nm);
     81 		assert(error == 0);
     82 		error = npf_table_insert(tblset, HASH_TID, alen, addr, nm);
     83 		assert(error != 0);
     84 
     85 		error = npf_table_insert(tblset, TREE_TID, alen, addr, nm);
     86 		assert(error == 0);
     87 		error = npf_table_insert(tblset, TREE_TID, alen, addr, nm);
     88 		assert(error != 0);
     89 	}
     90 
     91 	/* Attempt to add duplicates - should fail. */
     92 	addr->s6_addr32[0] = inet_addr(ip_list[0]);
     93 	alen = sizeof(struct in_addr);
     94 
     95 	error = npf_table_insert(tblset, HASH_TID, alen, addr, nm);
     96 	assert(error != 0);
     97 
     98 	error = npf_table_insert(tblset, TREE_TID, alen, addr, nm);
     99 	assert(error != 0);
    100 
    101 	/* Reference checks. */
    102 	t1 = npf_table_get(tblset, HASH_TID);
    103 	assert(t1 != NULL);
    104 	npf_table_put(t1);
    105 
    106 	t2 = npf_table_get(tblset, TREE_TID);
    107 	assert(t2 != NULL);
    108 	npf_table_put(t2);
    109 
    110 	/* Match (validate) each IP entry. */
    111 	for (i = 0; i < __arraycount(ip_list); i++) {
    112 		addr->s6_addr32[0] = inet_addr(ip_list[i]);
    113 
    114 		error = npf_table_lookup(tblset, HASH_TID, alen, addr);
    115 		assert(error == 0);
    116 
    117 		error = npf_table_lookup(tblset, TREE_TID, alen, addr);
    118 		assert(error == 0);
    119 	}
    120 
    121 	/* IPv6 addresses. */
    122 	memcpy(addr, ip6_list[0], sizeof(ip6_list[0]));
    123 	alen = sizeof(struct in6_addr);
    124 
    125 	error = npf_table_insert(tblset, HASH_TID, alen, addr, nm);
    126 	assert(error == 0);
    127 	error = npf_table_lookup(tblset, HASH_TID, alen, addr);
    128 	assert(error == 0);
    129 	error = npf_table_remove(tblset, HASH_TID, alen, addr, nm);
    130 	assert(error == 0);
    131 
    132 	error = npf_table_insert(tblset, TREE_TID, alen, addr, nm);
    133 	assert(error == 0);
    134 	error = npf_table_lookup(tblset, TREE_TID, alen, addr);
    135 	assert(error == 0);
    136 	error = npf_table_remove(tblset, TREE_TID, alen, addr, nm);
    137 	assert(error == 0);
    138 
    139 	/*
    140 	 * Masking: 96, 32, 127.
    141 	 */
    142 
    143 	memcpy(addr, ip6_list[1], sizeof(ip6_list[1]));
    144 	error = npf_table_insert(tblset, TREE_TID, alen, addr, 96);
    145 	assert(error == 0);
    146 
    147 	memcpy(addr, ip6_list[0], sizeof(ip6_list[0]));
    148 	error = npf_table_lookup(tblset, TREE_TID, alen, addr);
    149 	assert(error == 0);
    150 
    151 	memcpy(addr, ip6_list[1], sizeof(ip6_list[1]));
    152 	error = npf_table_remove(tblset, TREE_TID, alen, addr, 96);
    153 	assert(error == 0);
    154 
    155 
    156 	memcpy(addr, ip6_list[2], sizeof(ip6_list[2]));
    157 	error = npf_table_insert(tblset, TREE_TID, alen, addr, 32);
    158 	assert(error == 0);
    159 
    160 	memcpy(addr, ip6_list[0], sizeof(ip6_list[0]));
    161 	error = npf_table_lookup(tblset, TREE_TID, alen, addr);
    162 	assert(error == 0);
    163 
    164 	memcpy(addr, ip6_list[2], sizeof(ip6_list[2]));
    165 	error = npf_table_remove(tblset, TREE_TID, alen, addr, 32);
    166 	assert(error == 0);
    167 
    168 
    169 	memcpy(addr, ip6_list[3], sizeof(ip6_list[3]));
    170 	error = npf_table_insert(tblset, TREE_TID, alen, addr, 126);
    171 	assert(error == 0);
    172 
    173 	memcpy(addr, ip6_list[0], sizeof(ip6_list[0]));
    174 	error = npf_table_lookup(tblset, TREE_TID, alen, addr);
    175 	assert(error != 0);
    176 
    177 	memcpy(addr, ip6_list[3], sizeof(ip6_list[3]));
    178 	error = npf_table_remove(tblset, TREE_TID, alen, addr, 126);
    179 	assert(error == 0);
    180 
    181 
    182 	alen = sizeof(struct in_addr);
    183 
    184 	/* Remove all IPv4 entries. */
    185 	for (i = 0; i < __arraycount(ip_list); i++) {
    186 		addr->s6_addr32[0] = inet_addr(ip_list[i]);
    187 
    188 		error = npf_table_remove(tblset, HASH_TID, alen, addr, nm);
    189 		assert(error == 0);
    190 
    191 		error = npf_table_remove(tblset, TREE_TID, alen, addr, nm);
    192 		assert(error == 0);
    193 	}
    194 
    195 	npf_tableset_destroy(tblset);
    196 	npf_tableset_sysfini();
    197 
    198 	return true;
    199 }
    200