npf_table_test.c revision 1.3 1 1.3 rmind /* $NetBSD: npf_table_test.c,v 1.3 2012/07/01 23:21:07 rmind Exp $ */
2 1.1 rmind
3 1.1 rmind /*
4 1.1 rmind * NPF tableset test.
5 1.1 rmind *
6 1.1 rmind * Public Domain.
7 1.1 rmind */
8 1.1 rmind
9 1.1 rmind #include <sys/types.h>
10 1.1 rmind
11 1.1 rmind #include "npf_impl.h"
12 1.1 rmind #include "npf_test.h"
13 1.1 rmind
14 1.1 rmind static const char *ip_list[] = {
15 1.1 rmind "192.168.1.1",
16 1.1 rmind "10.0.0.1",
17 1.1 rmind "192.168.2.1",
18 1.1 rmind "10.1.0.1",
19 1.1 rmind "192.168.100.253",
20 1.1 rmind "10.0.5.1",
21 1.1 rmind "192.168.128.127",
22 1.1 rmind "10.0.0.2",
23 1.1 rmind };
24 1.1 rmind
25 1.1 rmind #define HASH_TID 1
26 1.1 rmind #define TREE_TID 2
27 1.1 rmind
28 1.1 rmind bool
29 1.1 rmind npf_table_test(bool verbose)
30 1.1 rmind {
31 1.1 rmind npf_addr_t addr_storage, *addr = &addr_storage;
32 1.1 rmind npf_tableset_t *tblset;
33 1.1 rmind npf_table_t *t1, *t2;
34 1.1 rmind int error;
35 1.1 rmind u_int i;
36 1.1 rmind
37 1.1 rmind npf_tableset_sysinit();
38 1.1 rmind
39 1.1 rmind tblset = npf_tableset_create();
40 1.1 rmind assert(tblset != NULL);
41 1.1 rmind
42 1.1 rmind /* Table ID 1, using hash table with 256 lists. */
43 1.1 rmind t1 = npf_table_create(HASH_TID, NPF_TABLE_HASH, 256);
44 1.1 rmind assert(t1 != NULL);
45 1.1 rmind error = npf_tableset_insert(tblset, t1);
46 1.1 rmind assert(error == 0);
47 1.1 rmind
48 1.1 rmind /* Check for double-insert. */
49 1.1 rmind error = npf_tableset_insert(tblset, t1);
50 1.1 rmind assert(error != 0);
51 1.1 rmind
52 1.1 rmind /* Table ID 2, using RB-tree. */
53 1.1 rmind t2 = npf_table_create(TREE_TID, NPF_TABLE_TREE, 0);
54 1.1 rmind assert(t2 != NULL);
55 1.1 rmind error = npf_tableset_insert(tblset, t2);
56 1.1 rmind assert(error == 0);
57 1.1 rmind
58 1.2 rmind /* Attempt to match non-existing entries - should fail. */
59 1.3 rmind memset(addr, 0, sizeof(npf_addr_t));
60 1.2 rmind addr->s6_addr32[0] = inet_addr(ip_list[0]);
61 1.2 rmind
62 1.2 rmind error = npf_table_match_addr(tblset, HASH_TID, addr);
63 1.2 rmind assert(error != 0);
64 1.2 rmind
65 1.2 rmind error = npf_table_match_addr(tblset, TREE_TID, addr);
66 1.2 rmind assert(error != 0);
67 1.2 rmind
68 1.1 rmind /* Fill both tables with IP addresses. */
69 1.1 rmind for (i = 0; i < __arraycount(ip_list); i++) {
70 1.3 rmind memset(addr, 0, sizeof(npf_addr_t));
71 1.1 rmind addr->s6_addr32[0] = inet_addr(ip_list[i]);
72 1.1 rmind
73 1.1 rmind error = npf_table_add_cidr(tblset, HASH_TID, addr, 32);
74 1.1 rmind assert(error == 0);
75 1.1 rmind error = npf_table_add_cidr(tblset, HASH_TID, addr, 32);
76 1.1 rmind assert(error != 0);
77 1.1 rmind
78 1.1 rmind error = npf_table_add_cidr(tblset, TREE_TID, addr, 32);
79 1.1 rmind assert(error == 0);
80 1.1 rmind error = npf_table_add_cidr(tblset, TREE_TID, addr, 32);
81 1.1 rmind assert(error != 0);
82 1.1 rmind }
83 1.1 rmind
84 1.1 rmind /* Attempt to add duplicates - should fail. */
85 1.3 rmind memset(addr, 0, sizeof(npf_addr_t));
86 1.1 rmind addr->s6_addr32[0] = inet_addr(ip_list[0]);
87 1.1 rmind
88 1.1 rmind error = npf_table_add_cidr(tblset, HASH_TID, addr, 32);
89 1.1 rmind assert(error != 0);
90 1.1 rmind
91 1.1 rmind error = npf_table_add_cidr(tblset, TREE_TID, addr, 32);
92 1.1 rmind assert(error != 0);
93 1.1 rmind
94 1.1 rmind /* Reference checks. */
95 1.1 rmind t1 = npf_table_get(tblset, HASH_TID);
96 1.1 rmind assert(t1 != NULL);
97 1.1 rmind npf_table_put(t1);
98 1.1 rmind
99 1.1 rmind t2 = npf_table_get(tblset, TREE_TID);
100 1.1 rmind assert(t2 != NULL);
101 1.1 rmind npf_table_put(t2);
102 1.1 rmind
103 1.1 rmind /* Match (validate) each IP entry. */
104 1.1 rmind for (i = 0; i < __arraycount(ip_list); i++) {
105 1.3 rmind memset(addr, 0, sizeof(npf_addr_t));
106 1.1 rmind addr->s6_addr32[0] = inet_addr(ip_list[i]);
107 1.1 rmind
108 1.1 rmind error = npf_table_match_addr(tblset, HASH_TID, addr);
109 1.1 rmind assert(error == 0);
110 1.1 rmind
111 1.1 rmind error = npf_table_match_addr(tblset, TREE_TID, addr);
112 1.1 rmind assert(error == 0);
113 1.1 rmind }
114 1.1 rmind
115 1.1 rmind /* Remove all entries. */
116 1.1 rmind for (i = 0; i < __arraycount(ip_list); i++) {
117 1.3 rmind memset(addr, 0, sizeof(npf_addr_t));
118 1.1 rmind addr->s6_addr32[0] = inet_addr(ip_list[i]);
119 1.1 rmind
120 1.1 rmind error = npf_table_rem_cidr(tblset, HASH_TID, addr, 32);
121 1.1 rmind assert(error == 0);
122 1.1 rmind
123 1.1 rmind error = npf_table_rem_cidr(tblset, TREE_TID, addr, 32);
124 1.1 rmind assert(error == 0);
125 1.1 rmind }
126 1.1 rmind
127 1.1 rmind npf_tableset_destroy(tblset);
128 1.1 rmind npf_tableset_sysfini();
129 1.1 rmind
130 1.1 rmind return true;
131 1.1 rmind }
132