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