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