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