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