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