xref: /netbsd-src/usr.sbin/npf/npftest/libnpftest/npf_table_test.c (revision 2e74a3b7d6d8cefa9e45f658c0ea757ea784d9fb)
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