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