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