npf_table_test.c revision 1.1.2.4 1 1.1.2.4 yamt /* $NetBSD: npf_table_test.c,v 1.1.2.4 2014/05/22 11:43:07 yamt Exp $ */
2 1.1.2.2 yamt
3 1.1.2.2 yamt /*
4 1.1.2.2 yamt * NPF tableset test.
5 1.1.2.2 yamt *
6 1.1.2.2 yamt * Public Domain.
7 1.1.2.2 yamt */
8 1.1.2.2 yamt
9 1.1.2.2 yamt #include <sys/types.h>
10 1.1.2.4 yamt #include <sys/malloc.h>
11 1.1.2.2 yamt
12 1.1.2.2 yamt #include "npf_impl.h"
13 1.1.2.2 yamt #include "npf_test.h"
14 1.1.2.2 yamt
15 1.1.2.2 yamt static const char *ip_list[] = {
16 1.1.2.2 yamt "192.168.1.1",
17 1.1.2.2 yamt "10.0.0.1",
18 1.1.2.2 yamt "192.168.2.1",
19 1.1.2.2 yamt "10.1.0.1",
20 1.1.2.2 yamt "192.168.100.253",
21 1.1.2.2 yamt "10.0.5.1",
22 1.1.2.2 yamt "192.168.128.127",
23 1.1.2.2 yamt "10.0.0.2",
24 1.1.2.2 yamt };
25 1.1.2.2 yamt
26 1.1.2.3 yamt static const uint16_t ip6_list[][8] = {
27 1.1.2.3 yamt {
28 1.1.2.3 yamt htons(0xfe80), 0x0, 0x0, 0x0,
29 1.1.2.3 yamt htons(0x2a0), htons(0xc0ff), htons(0xfe10), htons(0x1234)
30 1.1.2.3 yamt },
31 1.1.2.3 yamt {
32 1.1.2.3 yamt htons(0xfe80), 0x0, 0x0, 0x0,
33 1.1.2.3 yamt htons(0x2a0), htons(0xc0ff), 0x00, 0x0
34 1.1.2.3 yamt },
35 1.1.2.3 yamt {
36 1.1.2.3 yamt htons(0xfe80), 0x0, 0x0, 0x0,
37 1.1.2.3 yamt 0x0, 0x0, 0x0, 0x0
38 1.1.2.3 yamt },
39 1.1.2.3 yamt {
40 1.1.2.3 yamt htons(0xfe80), 0x0, 0x0, 0x0,
41 1.1.2.3 yamt htons(0x2a0), htons(0xc0ff), htons(0xfe10), htons(0x1230)
42 1.1.2.3 yamt }
43 1.1.2.3 yamt };
44 1.1.2.3 yamt
45 1.1.2.4 yamt #define HASH_TID "hash-table"
46 1.1.2.4 yamt #define TREE_TID "tree-table"
47 1.1.2.4 yamt #define CDB_TID "cdb-table"
48 1.1.2.2 yamt
49 1.1.2.3 yamt static bool
50 1.1.2.3 yamt npf_table_test_fill4(npf_tableset_t *tblset, npf_addr_t *addr)
51 1.1.2.3 yamt {
52 1.1.2.3 yamt const int alen = sizeof(struct in_addr);
53 1.1.2.3 yamt const int nm = NPF_NO_NETMASK;
54 1.1.2.3 yamt bool fail = false;
55 1.1.2.3 yamt
56 1.1.2.3 yamt /* Fill both tables with IP addresses. */
57 1.1.2.3 yamt for (unsigned i = 0; i < __arraycount(ip_list); i++) {
58 1.1.2.4 yamt npf_table_t *t;
59 1.1.2.3 yamt int error;
60 1.1.2.3 yamt
61 1.1.2.3 yamt addr->s6_addr32[0] = inet_addr(ip_list[i]);
62 1.1.2.3 yamt
63 1.1.2.4 yamt t = npf_tableset_getbyname(tblset, HASH_TID);
64 1.1.2.4 yamt error = npf_table_insert(t, alen, addr, nm);
65 1.1.2.3 yamt fail |= !(error == 0);
66 1.1.2.4 yamt error = npf_table_insert(t, alen, addr, nm);
67 1.1.2.3 yamt fail |= !(error != 0);
68 1.1.2.3 yamt
69 1.1.2.4 yamt t = npf_tableset_getbyname(tblset, TREE_TID);
70 1.1.2.4 yamt error = npf_table_insert(t, alen, addr, nm);
71 1.1.2.3 yamt fail |= !(error == 0);
72 1.1.2.4 yamt error = npf_table_insert(t, alen, addr, nm);
73 1.1.2.3 yamt fail |= !(error != 0);
74 1.1.2.3 yamt }
75 1.1.2.3 yamt return fail;
76 1.1.2.3 yamt }
77 1.1.2.3 yamt
78 1.1.2.2 yamt bool
79 1.1.2.4 yamt npf_table_test(bool verbose, void *blob, size_t size)
80 1.1.2.2 yamt {
81 1.1.2.2 yamt npf_addr_t addr_storage, *addr = &addr_storage;
82 1.1.2.3 yamt const int nm = NPF_NO_NETMASK;
83 1.1.2.4 yamt npf_table_t *t, *t1, *t2, *t3;
84 1.1.2.2 yamt npf_tableset_t *tblset;
85 1.1.2.3 yamt int error, alen;
86 1.1.2.3 yamt bool fail = false;
87 1.1.2.4 yamt void *cdb;
88 1.1.2.2 yamt u_int i;
89 1.1.2.2 yamt
90 1.1.2.4 yamt tblset = npf_tableset_create(3);
91 1.1.2.3 yamt fail |= !(tblset != NULL);
92 1.1.2.2 yamt
93 1.1.2.2 yamt /* Table ID 1, using hash table with 256 lists. */
94 1.1.2.4 yamt t1 = npf_table_create(HASH_TID, 0, NPF_TABLE_HASH, NULL, 256);
95 1.1.2.3 yamt fail |= !(t1 != NULL);
96 1.1.2.2 yamt error = npf_tableset_insert(tblset, t1);
97 1.1.2.3 yamt fail |= !(error == 0);
98 1.1.2.2 yamt
99 1.1.2.2 yamt /* Check for double-insert. */
100 1.1.2.2 yamt error = npf_tableset_insert(tblset, t1);
101 1.1.2.3 yamt fail |= !(error != 0);
102 1.1.2.2 yamt
103 1.1.2.4 yamt /* Table ID 2, using a prefix tree. */
104 1.1.2.4 yamt t2 = npf_table_create(TREE_TID, 1, NPF_TABLE_TREE, NULL, 0);
105 1.1.2.3 yamt fail |= !(t2 != NULL);
106 1.1.2.2 yamt error = npf_tableset_insert(tblset, t2);
107 1.1.2.3 yamt fail |= !(error == 0);
108 1.1.2.2 yamt
109 1.1.2.4 yamt /* Table ID 3, using a CDB. */
110 1.1.2.4 yamt cdb = malloc(size, M_TEMP, M_WAITOK);
111 1.1.2.4 yamt memcpy(cdb, blob, size);
112 1.1.2.4 yamt
113 1.1.2.4 yamt t3 = npf_table_create(CDB_TID, 2, NPF_TABLE_CDB, cdb, size);
114 1.1.2.4 yamt fail |= !(t3 != NULL);
115 1.1.2.4 yamt error = npf_tableset_insert(tblset, t3);
116 1.1.2.4 yamt fail |= !(error == 0);
117 1.1.2.4 yamt
118 1.1.2.3 yamt /* Attempt to match non-existing entries - should fail. */
119 1.1.2.3 yamt addr->s6_addr32[0] = inet_addr(ip_list[0]);
120 1.1.2.3 yamt alen = sizeof(struct in_addr);
121 1.1.2.2 yamt
122 1.1.2.4 yamt t = npf_tableset_getbyname(tblset, HASH_TID);
123 1.1.2.4 yamt error = npf_table_lookup(t, alen, addr);
124 1.1.2.3 yamt fail |= !(error != 0);
125 1.1.2.3 yamt
126 1.1.2.4 yamt t = npf_tableset_getbyname(tblset, TREE_TID);
127 1.1.2.4 yamt error = npf_table_lookup(t, alen, addr);
128 1.1.2.3 yamt fail |= !(error != 0);
129 1.1.2.3 yamt
130 1.1.2.3 yamt /* Fill both tables with IP addresses. */
131 1.1.2.3 yamt fail |= npf_table_test_fill4(tblset, addr);
132 1.1.2.2 yamt
133 1.1.2.2 yamt /* Attempt to add duplicates - should fail. */
134 1.1.2.2 yamt addr->s6_addr32[0] = inet_addr(ip_list[0]);
135 1.1.2.3 yamt alen = sizeof(struct in_addr);
136 1.1.2.2 yamt
137 1.1.2.4 yamt t = npf_tableset_getbyname(tblset, HASH_TID);
138 1.1.2.4 yamt error = npf_table_insert(t, alen, addr, nm);
139 1.1.2.3 yamt fail |= !(error != 0);
140 1.1.2.2 yamt
141 1.1.2.4 yamt t = npf_tableset_getbyname(tblset, TREE_TID);
142 1.1.2.4 yamt error = npf_table_insert(t, alen, addr, nm);
143 1.1.2.3 yamt fail |= !(error != 0);
144 1.1.2.2 yamt
145 1.1.2.2 yamt /* Match (validate) each IP entry. */
146 1.1.2.2 yamt for (i = 0; i < __arraycount(ip_list); i++) {
147 1.1.2.2 yamt addr->s6_addr32[0] = inet_addr(ip_list[i]);
148 1.1.2.2 yamt
149 1.1.2.4 yamt t = npf_tableset_getbyname(tblset, HASH_TID);
150 1.1.2.4 yamt error = npf_table_lookup(t, alen, addr);
151 1.1.2.3 yamt fail |= !(error == 0);
152 1.1.2.2 yamt
153 1.1.2.4 yamt t = npf_tableset_getbyname(tblset, TREE_TID);
154 1.1.2.4 yamt error = npf_table_lookup(t, alen, addr);
155 1.1.2.3 yamt fail |= !(error == 0);
156 1.1.2.2 yamt }
157 1.1.2.2 yamt
158 1.1.2.3 yamt /* IPv6 addresses. */
159 1.1.2.3 yamt memcpy(addr, ip6_list[0], sizeof(ip6_list[0]));
160 1.1.2.3 yamt alen = sizeof(struct in6_addr);
161 1.1.2.3 yamt
162 1.1.2.4 yamt t = npf_tableset_getbyname(tblset, HASH_TID);
163 1.1.2.4 yamt error = npf_table_insert(t, alen, addr, nm);
164 1.1.2.3 yamt fail |= !(error == 0);
165 1.1.2.4 yamt error = npf_table_lookup(t, alen, addr);
166 1.1.2.3 yamt fail |= !(error == 0);
167 1.1.2.4 yamt error = npf_table_remove(t, alen, addr, nm);
168 1.1.2.3 yamt fail |= !(error == 0);
169 1.1.2.3 yamt
170 1.1.2.4 yamt t = npf_tableset_getbyname(tblset, TREE_TID);
171 1.1.2.4 yamt error = npf_table_insert(t, alen, addr, nm);
172 1.1.2.3 yamt fail |= !(error == 0);
173 1.1.2.4 yamt error = npf_table_lookup(t, alen, addr);
174 1.1.2.3 yamt fail |= !(error == 0);
175 1.1.2.4 yamt error = npf_table_remove(t, alen, addr, nm);
176 1.1.2.3 yamt fail |= !(error == 0);
177 1.1.2.3 yamt
178 1.1.2.3 yamt /*
179 1.1.2.3 yamt * Masking: 96, 32, 127.
180 1.1.2.3 yamt */
181 1.1.2.3 yamt
182 1.1.2.3 yamt memcpy(addr, ip6_list[1], sizeof(ip6_list[1]));
183 1.1.2.4 yamt error = npf_table_insert(t, alen, addr, 96);
184 1.1.2.3 yamt fail |= !(error == 0);
185 1.1.2.3 yamt
186 1.1.2.3 yamt memcpy(addr, ip6_list[0], sizeof(ip6_list[0]));
187 1.1.2.4 yamt error = npf_table_lookup(t, alen, addr);
188 1.1.2.3 yamt fail |= !(error == 0);
189 1.1.2.3 yamt
190 1.1.2.3 yamt memcpy(addr, ip6_list[1], sizeof(ip6_list[1]));
191 1.1.2.4 yamt error = npf_table_remove(t, alen, addr, 96);
192 1.1.2.3 yamt fail |= !(error == 0);
193 1.1.2.3 yamt
194 1.1.2.3 yamt
195 1.1.2.3 yamt memcpy(addr, ip6_list[2], sizeof(ip6_list[2]));
196 1.1.2.4 yamt error = npf_table_insert(t, alen, addr, 32);
197 1.1.2.3 yamt fail |= !(error == 0);
198 1.1.2.3 yamt
199 1.1.2.3 yamt memcpy(addr, ip6_list[0], sizeof(ip6_list[0]));
200 1.1.2.4 yamt error = npf_table_lookup(t, alen, addr);
201 1.1.2.3 yamt fail |= !(error == 0);
202 1.1.2.3 yamt
203 1.1.2.3 yamt memcpy(addr, ip6_list[2], sizeof(ip6_list[2]));
204 1.1.2.4 yamt error = npf_table_remove(t, alen, addr, 32);
205 1.1.2.3 yamt fail |= !(error == 0);
206 1.1.2.3 yamt
207 1.1.2.3 yamt
208 1.1.2.3 yamt memcpy(addr, ip6_list[3], sizeof(ip6_list[3]));
209 1.1.2.4 yamt error = npf_table_insert(t, alen, addr, 126);
210 1.1.2.3 yamt fail |= !(error == 0);
211 1.1.2.3 yamt
212 1.1.2.3 yamt memcpy(addr, ip6_list[0], sizeof(ip6_list[0]));
213 1.1.2.4 yamt error = npf_table_lookup(t, alen, addr);
214 1.1.2.3 yamt fail |= !(error != 0);
215 1.1.2.3 yamt
216 1.1.2.3 yamt memcpy(addr, ip6_list[3], sizeof(ip6_list[3]));
217 1.1.2.4 yamt error = npf_table_remove(t, alen, addr, 126);
218 1.1.2.3 yamt fail |= !(error == 0);
219 1.1.2.3 yamt
220 1.1.2.3 yamt
221 1.1.2.3 yamt alen = sizeof(struct in_addr);
222 1.1.2.3 yamt
223 1.1.2.3 yamt /* Remove all IPv4 entries. */
224 1.1.2.2 yamt for (i = 0; i < __arraycount(ip_list); i++) {
225 1.1.2.2 yamt addr->s6_addr32[0] = inet_addr(ip_list[i]);
226 1.1.2.2 yamt
227 1.1.2.4 yamt t = npf_tableset_getbyname(tblset, HASH_TID);
228 1.1.2.4 yamt error = npf_table_remove(t, alen, addr, nm);
229 1.1.2.3 yamt fail |= !(error == 0);
230 1.1.2.2 yamt
231 1.1.2.4 yamt t = npf_tableset_getbyname(tblset, TREE_TID);
232 1.1.2.4 yamt error = npf_table_remove(t, alen, addr, nm);
233 1.1.2.3 yamt fail |= !(error == 0);
234 1.1.2.2 yamt }
235 1.1.2.2 yamt
236 1.1.2.4 yamt /* Test CDB. */
237 1.1.2.4 yamt addr->s6_addr32[0] = inet_addr(ip_list[0]);
238 1.1.2.4 yamt alen = sizeof(struct in_addr);
239 1.1.2.4 yamt error = npf_table_lookup(t3, alen, addr);
240 1.1.2.4 yamt fail |= !(error == 0);
241 1.1.2.4 yamt
242 1.1.2.4 yamt for (i = 1; i < __arraycount(ip_list) - 1; i++) {
243 1.1.2.4 yamt addr->s6_addr32[0] = inet_addr(ip_list[i]);
244 1.1.2.4 yamt alen = sizeof(struct in_addr);
245 1.1.2.4 yamt error = npf_table_lookup(t3, alen, addr);
246 1.1.2.4 yamt fail |= !(error != 0);
247 1.1.2.4 yamt }
248 1.1.2.4 yamt
249 1.1.2.2 yamt npf_tableset_destroy(tblset);
250 1.1.2.2 yamt
251 1.1.2.3 yamt return !fail;
252 1.1.2.2 yamt }
253