Home | History | Annotate | Line # | Download | only in libnpftest
npf_table_test.c revision 1.1.2.3
      1  1.1.2.3  yamt /*	$NetBSD: npf_table_test.c,v 1.1.2.3 2012/10/30 19:00:48 yamt Exp $	*/
      2  1.1.2.2  yamt 
      3  1.1.2.2  yamt /*
      4  1.1.2.2  yamt  * NPF tableset test.
      5  1.1.2.2  yamt  *
      6  1.1.2.2  yamt  * Public Domain.
      7  1.1.2.2  yamt  */
      8  1.1.2.2  yamt 
      9  1.1.2.2  yamt #include <sys/types.h>
     10  1.1.2.2  yamt 
     11  1.1.2.2  yamt #include "npf_impl.h"
     12  1.1.2.2  yamt #include "npf_test.h"
     13  1.1.2.2  yamt 
     14  1.1.2.2  yamt static const char *ip_list[] = {
     15  1.1.2.2  yamt 	"192.168.1.1",
     16  1.1.2.2  yamt 	"10.0.0.1",
     17  1.1.2.2  yamt 	"192.168.2.1",
     18  1.1.2.2  yamt 	"10.1.0.1",
     19  1.1.2.2  yamt 	"192.168.100.253",
     20  1.1.2.2  yamt 	"10.0.5.1",
     21  1.1.2.2  yamt 	"192.168.128.127",
     22  1.1.2.2  yamt 	"10.0.0.2",
     23  1.1.2.2  yamt };
     24  1.1.2.2  yamt 
     25  1.1.2.3  yamt static const uint16_t ip6_list[][8] = {
     26  1.1.2.3  yamt 	{
     27  1.1.2.3  yamt 	    htons(0xfe80), 0x0, 0x0, 0x0,
     28  1.1.2.3  yamt 	    htons(0x2a0), htons(0xc0ff), htons(0xfe10), htons(0x1234)
     29  1.1.2.3  yamt 	},
     30  1.1.2.3  yamt 	{
     31  1.1.2.3  yamt 	    htons(0xfe80), 0x0, 0x0, 0x0,
     32  1.1.2.3  yamt 	    htons(0x2a0), htons(0xc0ff), 0x00, 0x0
     33  1.1.2.3  yamt 	},
     34  1.1.2.3  yamt 	{
     35  1.1.2.3  yamt 	    htons(0xfe80), 0x0, 0x0, 0x0,
     36  1.1.2.3  yamt 	    0x0, 0x0, 0x0, 0x0
     37  1.1.2.3  yamt 	},
     38  1.1.2.3  yamt 	{
     39  1.1.2.3  yamt 	    htons(0xfe80), 0x0, 0x0, 0x0,
     40  1.1.2.3  yamt 	    htons(0x2a0), htons(0xc0ff), htons(0xfe10), htons(0x1230)
     41  1.1.2.3  yamt 	}
     42  1.1.2.3  yamt };
     43  1.1.2.3  yamt 
     44  1.1.2.2  yamt #define	HASH_TID		1
     45  1.1.2.2  yamt #define	TREE_TID		2
     46  1.1.2.2  yamt 
     47  1.1.2.3  yamt static bool
     48  1.1.2.3  yamt npf_table_test_fill4(npf_tableset_t *tblset, npf_addr_t *addr)
     49  1.1.2.3  yamt {
     50  1.1.2.3  yamt 	const int alen = sizeof(struct in_addr);
     51  1.1.2.3  yamt 	const int nm = NPF_NO_NETMASK;
     52  1.1.2.3  yamt 	bool fail = false;
     53  1.1.2.3  yamt 
     54  1.1.2.3  yamt 	/* Fill both tables with IP addresses. */
     55  1.1.2.3  yamt 	for (unsigned i = 0; i < __arraycount(ip_list); i++) {
     56  1.1.2.3  yamt 		int error;
     57  1.1.2.3  yamt 
     58  1.1.2.3  yamt 		addr->s6_addr32[0] = inet_addr(ip_list[i]);
     59  1.1.2.3  yamt 
     60  1.1.2.3  yamt 		error = npf_table_insert(tblset, HASH_TID, alen, addr, nm);
     61  1.1.2.3  yamt 		fail |= !(error == 0);
     62  1.1.2.3  yamt 		error = npf_table_insert(tblset, HASH_TID, alen, addr, nm);
     63  1.1.2.3  yamt 		fail |= !(error != 0);
     64  1.1.2.3  yamt 
     65  1.1.2.3  yamt 		error = npf_table_insert(tblset, TREE_TID, alen, addr, nm);
     66  1.1.2.3  yamt 		fail |= !(error == 0);
     67  1.1.2.3  yamt 		error = npf_table_insert(tblset, TREE_TID, alen, addr, nm);
     68  1.1.2.3  yamt 		fail |= !(error != 0);
     69  1.1.2.3  yamt 	}
     70  1.1.2.3  yamt 	return fail;
     71  1.1.2.3  yamt }
     72  1.1.2.3  yamt 
     73  1.1.2.2  yamt bool
     74  1.1.2.2  yamt npf_table_test(bool verbose)
     75  1.1.2.2  yamt {
     76  1.1.2.2  yamt 	npf_addr_t addr_storage, *addr = &addr_storage;
     77  1.1.2.3  yamt 	const int nm = NPF_NO_NETMASK;
     78  1.1.2.2  yamt 	npf_tableset_t *tblset;
     79  1.1.2.2  yamt 	npf_table_t *t1, *t2;
     80  1.1.2.3  yamt 	int error, alen;
     81  1.1.2.3  yamt 	bool fail = false;
     82  1.1.2.2  yamt 	u_int i;
     83  1.1.2.2  yamt 
     84  1.1.2.2  yamt 	tblset = npf_tableset_create();
     85  1.1.2.3  yamt 	fail |= !(tblset != NULL);
     86  1.1.2.2  yamt 
     87  1.1.2.2  yamt 	/* Table ID 1, using hash table with 256 lists. */
     88  1.1.2.2  yamt 	t1 = npf_table_create(HASH_TID, NPF_TABLE_HASH, 256);
     89  1.1.2.3  yamt 	fail |= !(t1 != NULL);
     90  1.1.2.2  yamt 	error = npf_tableset_insert(tblset, t1);
     91  1.1.2.3  yamt 	fail |= !(error == 0);
     92  1.1.2.2  yamt 
     93  1.1.2.2  yamt 	/* Check for double-insert. */
     94  1.1.2.2  yamt 	error = npf_tableset_insert(tblset, t1);
     95  1.1.2.3  yamt 	fail |= !(error != 0);
     96  1.1.2.2  yamt 
     97  1.1.2.2  yamt 	/* Table ID 2, using RB-tree. */
     98  1.1.2.2  yamt 	t2 = npf_table_create(TREE_TID, NPF_TABLE_TREE, 0);
     99  1.1.2.3  yamt 	fail |= !(t2 != NULL);
    100  1.1.2.2  yamt 	error = npf_tableset_insert(tblset, t2);
    101  1.1.2.3  yamt 	fail |= !(error == 0);
    102  1.1.2.2  yamt 
    103  1.1.2.3  yamt 	/* Attempt to match non-existing entries - should fail. */
    104  1.1.2.3  yamt 	addr->s6_addr32[0] = inet_addr(ip_list[0]);
    105  1.1.2.3  yamt 	alen = sizeof(struct in_addr);
    106  1.1.2.2  yamt 
    107  1.1.2.3  yamt 	error = npf_table_lookup(tblset, HASH_TID, alen, addr);
    108  1.1.2.3  yamt 	fail |= !(error != 0);
    109  1.1.2.3  yamt 
    110  1.1.2.3  yamt 	error = npf_table_lookup(tblset, TREE_TID, alen, addr);
    111  1.1.2.3  yamt 	fail |= !(error != 0);
    112  1.1.2.3  yamt 
    113  1.1.2.3  yamt 	/* Fill both tables with IP addresses. */
    114  1.1.2.3  yamt 	fail |= npf_table_test_fill4(tblset, addr);
    115  1.1.2.2  yamt 
    116  1.1.2.2  yamt 	/* Attempt to add duplicates - should fail. */
    117  1.1.2.2  yamt 	addr->s6_addr32[0] = inet_addr(ip_list[0]);
    118  1.1.2.3  yamt 	alen = sizeof(struct in_addr);
    119  1.1.2.2  yamt 
    120  1.1.2.3  yamt 	error = npf_table_insert(tblset, HASH_TID, alen, addr, nm);
    121  1.1.2.3  yamt 	fail |= !(error != 0);
    122  1.1.2.2  yamt 
    123  1.1.2.3  yamt 	error = npf_table_insert(tblset, TREE_TID, alen, addr, nm);
    124  1.1.2.3  yamt 	fail |= !(error != 0);
    125  1.1.2.2  yamt 
    126  1.1.2.2  yamt 	/* Match (validate) each IP entry. */
    127  1.1.2.2  yamt 	for (i = 0; i < __arraycount(ip_list); i++) {
    128  1.1.2.2  yamt 		addr->s6_addr32[0] = inet_addr(ip_list[i]);
    129  1.1.2.2  yamt 
    130  1.1.2.3  yamt 		error = npf_table_lookup(tblset, HASH_TID, alen, addr);
    131  1.1.2.3  yamt 		fail |= !(error == 0);
    132  1.1.2.2  yamt 
    133  1.1.2.3  yamt 		error = npf_table_lookup(tblset, TREE_TID, alen, addr);
    134  1.1.2.3  yamt 		fail |= !(error == 0);
    135  1.1.2.2  yamt 	}
    136  1.1.2.2  yamt 
    137  1.1.2.3  yamt 	/* IPv6 addresses. */
    138  1.1.2.3  yamt 	memcpy(addr, ip6_list[0], sizeof(ip6_list[0]));
    139  1.1.2.3  yamt 	alen = sizeof(struct in6_addr);
    140  1.1.2.3  yamt 
    141  1.1.2.3  yamt 	error = npf_table_insert(tblset, HASH_TID, alen, addr, nm);
    142  1.1.2.3  yamt 	fail |= !(error == 0);
    143  1.1.2.3  yamt 	error = npf_table_lookup(tblset, HASH_TID, alen, addr);
    144  1.1.2.3  yamt 	fail |= !(error == 0);
    145  1.1.2.3  yamt 	error = npf_table_remove(tblset, HASH_TID, alen, addr, nm);
    146  1.1.2.3  yamt 	fail |= !(error == 0);
    147  1.1.2.3  yamt 
    148  1.1.2.3  yamt 	error = npf_table_insert(tblset, TREE_TID, alen, addr, nm);
    149  1.1.2.3  yamt 	fail |= !(error == 0);
    150  1.1.2.3  yamt 	error = npf_table_lookup(tblset, TREE_TID, alen, addr);
    151  1.1.2.3  yamt 	fail |= !(error == 0);
    152  1.1.2.3  yamt 	error = npf_table_remove(tblset, TREE_TID, alen, addr, nm);
    153  1.1.2.3  yamt 	fail |= !(error == 0);
    154  1.1.2.3  yamt 
    155  1.1.2.3  yamt 	/*
    156  1.1.2.3  yamt 	 * Masking: 96, 32, 127.
    157  1.1.2.3  yamt 	 */
    158  1.1.2.3  yamt 
    159  1.1.2.3  yamt 	memcpy(addr, ip6_list[1], sizeof(ip6_list[1]));
    160  1.1.2.3  yamt 	error = npf_table_insert(tblset, TREE_TID, alen, addr, 96);
    161  1.1.2.3  yamt 	fail |= !(error == 0);
    162  1.1.2.3  yamt 
    163  1.1.2.3  yamt 	memcpy(addr, ip6_list[0], sizeof(ip6_list[0]));
    164  1.1.2.3  yamt 	error = npf_table_lookup(tblset, TREE_TID, alen, addr);
    165  1.1.2.3  yamt 	fail |= !(error == 0);
    166  1.1.2.3  yamt 
    167  1.1.2.3  yamt 	memcpy(addr, ip6_list[1], sizeof(ip6_list[1]));
    168  1.1.2.3  yamt 	error = npf_table_remove(tblset, TREE_TID, alen, addr, 96);
    169  1.1.2.3  yamt 	fail |= !(error == 0);
    170  1.1.2.3  yamt 
    171  1.1.2.3  yamt 
    172  1.1.2.3  yamt 	memcpy(addr, ip6_list[2], sizeof(ip6_list[2]));
    173  1.1.2.3  yamt 	error = npf_table_insert(tblset, TREE_TID, alen, addr, 32);
    174  1.1.2.3  yamt 	fail |= !(error == 0);
    175  1.1.2.3  yamt 
    176  1.1.2.3  yamt 	memcpy(addr, ip6_list[0], sizeof(ip6_list[0]));
    177  1.1.2.3  yamt 	error = npf_table_lookup(tblset, TREE_TID, alen, addr);
    178  1.1.2.3  yamt 	fail |= !(error == 0);
    179  1.1.2.3  yamt 
    180  1.1.2.3  yamt 	memcpy(addr, ip6_list[2], sizeof(ip6_list[2]));
    181  1.1.2.3  yamt 	error = npf_table_remove(tblset, TREE_TID, alen, addr, 32);
    182  1.1.2.3  yamt 	fail |= !(error == 0);
    183  1.1.2.3  yamt 
    184  1.1.2.3  yamt 
    185  1.1.2.3  yamt 	memcpy(addr, ip6_list[3], sizeof(ip6_list[3]));
    186  1.1.2.3  yamt 	error = npf_table_insert(tblset, TREE_TID, alen, addr, 126);
    187  1.1.2.3  yamt 	fail |= !(error == 0);
    188  1.1.2.3  yamt 
    189  1.1.2.3  yamt 	memcpy(addr, ip6_list[0], sizeof(ip6_list[0]));
    190  1.1.2.3  yamt 	error = npf_table_lookup(tblset, TREE_TID, alen, addr);
    191  1.1.2.3  yamt 	fail |= !(error != 0);
    192  1.1.2.3  yamt 
    193  1.1.2.3  yamt 	memcpy(addr, ip6_list[3], sizeof(ip6_list[3]));
    194  1.1.2.3  yamt 	error = npf_table_remove(tblset, TREE_TID, alen, addr, 126);
    195  1.1.2.3  yamt 	fail |= !(error == 0);
    196  1.1.2.3  yamt 
    197  1.1.2.3  yamt 
    198  1.1.2.3  yamt 	alen = sizeof(struct in_addr);
    199  1.1.2.3  yamt 
    200  1.1.2.3  yamt 	/* Remove all IPv4 entries. */
    201  1.1.2.2  yamt 	for (i = 0; i < __arraycount(ip_list); i++) {
    202  1.1.2.2  yamt 		addr->s6_addr32[0] = inet_addr(ip_list[i]);
    203  1.1.2.2  yamt 
    204  1.1.2.3  yamt 		error = npf_table_remove(tblset, HASH_TID, alen, addr, nm);
    205  1.1.2.3  yamt 		fail |= !(error == 0);
    206  1.1.2.2  yamt 
    207  1.1.2.3  yamt 		error = npf_table_remove(tblset, TREE_TID, alen, addr, nm);
    208  1.1.2.3  yamt 		fail |= !(error == 0);
    209  1.1.2.2  yamt 	}
    210  1.1.2.2  yamt 
    211  1.1.2.2  yamt 	npf_tableset_destroy(tblset);
    212  1.1.2.2  yamt 
    213  1.1.2.3  yamt 	return !fail;
    214  1.1.2.2  yamt }
    215