Annotation of embedaddon/strongswan/src/libstrongswan/tests/suites/test_traffic_selector.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2015 Tobias Brunner
                      3:  * HSR Hochschule fuer Technik Rapperswil
                      4:  *
                      5:  * Copyright (C) 2015 Martin Willi
                      6:  * Copyright (C) 2015 revosec AG
                      7:  *
                      8:  * This program is free software; you can redistribute it and/or modify it
                      9:  * under the terms of the GNU General Public License as published by the
                     10:  * Free Software Foundation; either version 2 of the License, or (at your
                     11:  * option) any later version.  See <http://www.fsf.org/copyleft/gpl.txt>.
                     12:  *
                     13:  * This program is distributed in the hope that it will be useful, but
                     14:  * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
                     15:  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
                     16:  * for more details.
                     17:  */
                     18: 
                     19: #include "test_suite.h"
                     20: 
                     21: #include <selectors/traffic_selector.h>
                     22: 
                     23: 
                     24: static void verify(const char *str, const char *alt, traffic_selector_t *ts)
                     25: {
                     26:        char buf[512];
                     27: 
                     28:        if (!str)
                     29:        {
                     30:                ck_assert_msg(!ts, "traffic selector not null: %R", ts);
                     31:                return;
                     32:        }
                     33:        snprintf(buf, sizeof(buf), "%R", ts);
                     34:        DESTROY_IF(ts);
                     35:        if (!streq(buf, str) && (!alt || !streq(buf, alt)))
                     36:        {
                     37:                fail("%s != %s or %s", buf, str, alt);
                     38:        }
                     39: }
                     40: 
                     41: START_TEST(test_create_from_string)
                     42: {
                     43:        verify("10.1.0.0/16[tcp/http]", "10.1.0.0/16[6/80]",
                     44:                traffic_selector_create_from_string(IPPROTO_TCP, TS_IPV4_ADDR_RANGE,
                     45:                                                        "10.1.0.0", 80, "10.1.255.255", 80));
                     46:        verify("10.1.0.1..10.1.0.99[udp/1234-1235]",
                     47:                   "10.1.0.1..10.1.0.99[17/1234-1235]",
                     48:                traffic_selector_create_from_string(IPPROTO_UDP, TS_IPV4_ADDR_RANGE,
                     49:                                                        "10.1.0.1", 1234, "10.1.0.99", 1235));
                     50:        verify("fec1::/64", NULL,
                     51:                traffic_selector_create_from_string(0, TS_IPV6_ADDR_RANGE,
                     52:                                                        "fec1::", 0, "fec1::ffff:ffff:ffff:ffff", 65535));
                     53:        verify("fec1::1..fec1::ffff:ffff:ffff:ffff", NULL,
                     54:                traffic_selector_create_from_string(0, TS_IPV6_ADDR_RANGE,
                     55:                                                        "fec1::1", 0, "fec1::ffff:ffff:ffff:ffff", 65535));
                     56:        verify(NULL, NULL,
                     57:                traffic_selector_create_from_string(IPPROTO_TCP, 0,
                     58:                                                        "10.1.0.0", 80, "10.1.255.255", 80));
                     59:        verify(NULL, NULL,
                     60:                traffic_selector_create_from_string(IPPROTO_TCP, TS_IPV4_ADDR_RANGE,
                     61:                                                        "a.b.c.d", 80, "10.1.255.255", 80));
                     62:        verify(NULL, NULL,
                     63:                traffic_selector_create_from_string(IPPROTO_TCP, TS_IPV4_ADDR_RANGE,
                     64:                                                        "10.1.0.0", 80, "a.b.c.d", 80));
                     65: }
                     66: END_TEST
                     67: 
                     68: START_TEST(test_create_from_cidr)
                     69: {
                     70:        verify("10.1.0.0/16", NULL,
                     71:                traffic_selector_create_from_cidr("10.1.0.0/16", 0, 0, 65535));
                     72:        verify("10.1.0.1/32[udp]", "10.1.0.1/32[17]",
                     73:                traffic_selector_create_from_cidr("10.1.0.1/32", IPPROTO_UDP,
                     74:                                                                                  0, 65535));
                     75:        verify("10.1.0.1/32[0/domain]", "10.1.0.1/32[0/53]",
                     76:                traffic_selector_create_from_cidr("10.1.0.1/32", 0,
                     77:                                                                                  53, 53));
                     78:        verify("10.1.0.1/32[udp/1234-1235]", "10.1.0.1/32[17/1234-1235]",
                     79:                traffic_selector_create_from_cidr("10.1.0.1/32", IPPROTO_UDP,
                     80:                                                                                  1234, 1235));
                     81:        verify("10.1.0.0/16[0/OPAQUE]", NULL,
                     82:                traffic_selector_create_from_cidr("10.1.0.0/16", 0, 65535, 0));
                     83: 
                     84:        verify(NULL, NULL,
                     85:                traffic_selector_create_from_cidr("a.b.c.d/16", 0, 0, 65535));
                     86: }
                     87: END_TEST
                     88: 
                     89: START_TEST(test_create_from_bytes)
                     90: {
                     91:        verify("10.1.0.0/16", NULL,
                     92:                traffic_selector_create_from_bytes(0, TS_IPV4_ADDR_RANGE,
                     93:                        chunk_from_chars(0x0a,0x01,0x00,0x00), 0,
                     94:                        chunk_from_chars(0x0a,0x01,0xff,0xff), 65535));
                     95:        verify(NULL, NULL,
                     96:                traffic_selector_create_from_bytes(0, TS_IPV4_ADDR_RANGE,
                     97:                        chunk_from_chars(0x0a,0x01,0x00,0x00), 0,
                     98:                        chunk_from_chars(0x0a,0x01,0xff,0xff,0xff), 65535));
                     99:        verify(NULL, NULL,
                    100:                traffic_selector_create_from_bytes(0, TS_IPV4_ADDR_RANGE,
                    101:                        chunk_empty, 0,
                    102:                        chunk_empty, 65535));
                    103:        verify(NULL, NULL,
                    104:                traffic_selector_create_from_bytes(0, TS_IPV6_ADDR_RANGE,
                    105:                        chunk_from_chars(0x0a,0x01,0x00,0x00), 0,
                    106:                        chunk_from_chars(0x0a,0x01,0xff,0xff), 65535));
                    107:        verify(NULL, NULL,
                    108:                traffic_selector_create_from_bytes(0, 0,
                    109:                        chunk_from_chars(0x0a,0x01,0x00,0x00), 0,
                    110:                        chunk_from_chars(0x0a,0x01,0xff,0xff), 65535));
                    111: }
                    112: END_TEST
                    113: 
                    114: START_TEST(test_create_from_subnet)
                    115: {
                    116:        verify("10.1.0.0/16", NULL,
                    117:                traffic_selector_create_from_subnet(
                    118:                                        host_create_from_string("10.1.0.0", 0), 16, 0, 0, 65535));
                    119: }
                    120: END_TEST
                    121: 
                    122: struct {
                    123:        char *net;
                    124:        ts_type_t type;
                    125:        chunk_t enc;
                    126: } rfc3779_prefix_tests[] = {
                    127:        /* some examples from RFC 3779, for addressPrefix elements we pass the same
                    128:         * value twice to the constructor */
                    129:        { "10.0.0.0/8",         TS_IPV4_ADDR_RANGE,     chunk_from_chars(0x00,0x0a),                            },
                    130:        { "10.0.32.0/20",       TS_IPV4_ADDR_RANGE,     chunk_from_chars(0x04,0x0a,0x00,0x20),          },
                    131:        { "10.0.64.0/24",       TS_IPV4_ADDR_RANGE,     chunk_from_chars(0x00,0x0a,0x00,0x40),          },
                    132:        { "10.1.0.0/16",        TS_IPV4_ADDR_RANGE,     chunk_from_chars(0x00,0x0a,0x01),                       },
                    133:        { "10.5.0.1/32",        TS_IPV4_ADDR_RANGE,     chunk_from_chars(0x00,0x0a,0x05,0x00,0x01),     },
                    134:        { "10.5.0.0/23",        TS_IPV4_ADDR_RANGE,     chunk_from_chars(0x01,0x0a,0x05,0x00),          },
                    135:        { "10.64.0.0/12",       TS_IPV4_ADDR_RANGE,     chunk_from_chars(0x04,0x0a,0x40),                       },
                    136:        { "10.64.0.0/20",       TS_IPV4_ADDR_RANGE,     chunk_from_chars(0x04,0x0a,0x40,0x00),          },
                    137:        { "128.0.0.0/4",        TS_IPV4_ADDR_RANGE,     chunk_from_chars(0x04,0x80),                            },
                    138:        { "172.16.0.0/12",      TS_IPV4_ADDR_RANGE,     chunk_from_chars(0x04,0xac,0x10),                       },
                    139:        { "0.0.0.0/0",          TS_IPV4_ADDR_RANGE,     chunk_from_chars(0x00),                                         },
                    140:        { NULL,                         0,                                      chunk_from_chars(0x00),                                         },
                    141:        /* FIXME: not a correct encoding, so we might want to fail here */
                    142:        { "0.0.0.0/0",          TS_IPV4_ADDR_RANGE,     {NULL, 0},                                                                      },
                    143:        { "2001:0:2::/48",      TS_IPV6_ADDR_RANGE,     chunk_from_chars(0x00,0x20,0x01,0x00,0x00,0x00,0x02),},
                    144:        { "2001:0:200::/39",TS_IPV6_ADDR_RANGE, chunk_from_chars(0x01,0x20,0x01,0x00,0x00,0x02),},
                    145:        { "::/0",                       TS_IPV6_ADDR_RANGE,     chunk_from_chars(0x00),                                         },
                    146:        /* FIXME: not a correct encoding, so we might want to fail here */
                    147:        { "::/0",                       TS_IPV6_ADDR_RANGE,     {NULL, 0},                                                                      },
                    148: };
                    149: 
                    150: START_TEST(test_create_from_rfc3779_format_prefix)
                    151: {
                    152:        verify(rfc3779_prefix_tests[_i].net, NULL,
                    153:                traffic_selector_create_from_rfc3779_format(rfc3779_prefix_tests[_i].type,
                    154:                                        rfc3779_prefix_tests[_i].enc, rfc3779_prefix_tests[_i].enc));
                    155: }
                    156: END_TEST
                    157: 
                    158: START_TEST(test_create_from_rfc3779_format_range)
                    159: {
                    160:        /* addressRange elements encode a from and to address, which may still
                    161:         * represent prefixes */
                    162:        verify("10.5.0.0/23", NULL,
                    163:                traffic_selector_create_from_rfc3779_format(TS_IPV4_ADDR_RANGE,
                    164:                                        chunk_from_chars(0x00,0x0a,0x05),
                    165:                                        chunk_from_chars(0x01,0x0a,0x05,0x00)));
                    166:        verify("2001:0:200::/39", NULL,
                    167:                traffic_selector_create_from_rfc3779_format(TS_IPV6_ADDR_RANGE,
                    168:                                        chunk_from_chars(0x01,0x20,0x01,0x00,0x00,0x02),
                    169:                                        chunk_from_chars(0x02,0x20,0x01,0x00,0x00,0x00)));
                    170:        verify("10.2.48.0..10.2.64.255", NULL,
                    171:                traffic_selector_create_from_rfc3779_format(TS_IPV4_ADDR_RANGE,
                    172:                                        chunk_from_chars(0x04,0x0a,0x02,0x30),
                    173:                                        chunk_from_chars(0x00,0x0a,0x02,0x40)));
                    174:        verify("129.64.0.0..143.255.255.255", NULL,
                    175:                traffic_selector_create_from_rfc3779_format(TS_IPV4_ADDR_RANGE,
                    176:                                        chunk_from_chars(0x06,0x81,0x40),
                    177:                                        chunk_from_chars(0x04,0x80)));
                    178: }
                    179: END_TEST
                    180: 
                    181: 
                    182: static void verify_address(char *addr_from, char *addr_to, traffic_selector_t *ts)
                    183: {
                    184:        host_t *from, *to;
                    185: 
                    186:        from = host_create_from_string(addr_from, 0);
                    187:        to = host_create_from_string(addr_to, 0);
                    188: 
                    189:        ck_assert_chunk_eq(from->get_address(from), ts->get_from_address(ts));
                    190:        ck_assert_chunk_eq(to->get_address(to), ts->get_to_address(ts));
                    191:        from->destroy(from);
                    192:        to->destroy(to);
                    193:        ts->destroy(ts);
                    194: }
                    195: 
                    196: START_TEST(test_get_address_range)
                    197: {
                    198:        verify_address("10.1.0.1", "10.1.0.10",
                    199:                                   traffic_selector_create_from_string(0, TS_IPV4_ADDR_RANGE,
                    200:                                                                                        "10.1.0.1", 0, "10.1.0.10", 65535));
                    201:        /* currently not reordered */
                    202:        verify_address("10.1.0.10", "10.1.0.1",
                    203:                                   traffic_selector_create_from_string(0, TS_IPV4_ADDR_RANGE,
                    204:                                                                                        "10.1.0.10", 0, "10.1.0.1", 65535));
                    205: }
                    206: END_TEST
                    207: 
                    208: START_TEST(test_get_address_cidr)
                    209: {
                    210:        verify_address("10.1.0.0", "10.1.255.255",
                    211:                                   traffic_selector_create_from_cidr("10.1.0.0/16", 0, 0, 65535));
                    212:        verify_address("fec1::", "fec1::ffff:ffff:ffff:ffff",
                    213:                                   traffic_selector_create_from_cidr("fec1::/64", 0, 0, 65535));
                    214: }
                    215: END_TEST
                    216: 
                    217: struct {
                    218:        ts_type_t type;
                    219:        char *from;
                    220:        char *to;
                    221:        char *net;
                    222:        uint8_t mask;
                    223:        bool exact;
                    224: } to_subnet_tests[] = {
                    225:        { TS_IPV4_ADDR_RANGE,   "10.0.0.1",     "10.0.0.1",                     "10.0.0.1",     32,     TRUE    },
                    226:        { TS_IPV4_ADDR_RANGE,   "10.0.0.0",     "10.255.255.255",       "10.0.0.0",     8,      TRUE    },
                    227:        { TS_IPV4_ADDR_RANGE,   "10.0.0.1",     "10.0.0.255",           "10.0.0.0",     24,     FALSE   },
                    228:        { TS_IPV4_ADDR_RANGE,   "10.0.0.0",     "10.0.0.15",            "10.0.0.0",     28,     TRUE    },
                    229:        { TS_IPV4_ADDR_RANGE,   "10.0.0.1",     "10.0.0.15",            "10.0.0.0",     28,     FALSE   },
                    230:        { TS_IPV4_ADDR_RANGE,   "10.0.0.1",     "10.0.0.16",            "10.0.0.0",     27,     FALSE   },
                    231:        { TS_IPV6_ADDR_RANGE,   "fec1::1",      "fec1::1",                                              "fec1::1",      128,    TRUE    },
                    232:        { TS_IPV6_ADDR_RANGE,   "fec1::0",      "fec1::ffff:ffff:ffff:ffff",    "fec1::",       64,             TRUE    },
                    233:        { TS_IPV6_ADDR_RANGE,   "fec1::1",      "fec1::ffff:ffff:ffff:ffff",    "fec1::",       64,             FALSE   },
                    234:        { TS_IPV6_ADDR_RANGE,   "fec1::1",      "fec1::7fff",                                   "fec1::",       113,    FALSE   },
                    235:        { TS_IPV6_ADDR_RANGE,   "fec1::1",      "fec1::efff",                                   "fec1::",       112,    FALSE   },
                    236: };
                    237: 
                    238: START_TEST(test_to_subnet)
                    239: {
                    240:        traffic_selector_t *ts;
                    241:        host_t *net, *exp_net;
                    242:        uint8_t mask;
                    243: 
                    244:        ts = traffic_selector_create_from_string(0, to_subnet_tests[_i].type,
                    245:                                        to_subnet_tests[_i].from, 0, to_subnet_tests[_i].to, 0);
                    246:        ck_assert(ts->to_subnet(ts, &net, &mask) == to_subnet_tests[_i].exact);
                    247:        exp_net = host_create_from_string(to_subnet_tests[_i].net, 0);
                    248:        ck_assert(exp_net->ip_equals(exp_net, net));
                    249:        ck_assert_int_eq(to_subnet_tests[_i].mask, mask);
                    250:        exp_net->destroy(exp_net);
                    251:        net->destroy(net);
                    252:        ts->destroy(ts);
                    253: }
                    254: END_TEST
                    255: 
                    256: struct {
                    257:        char *cidr;
                    258:        uint16_t from_port;
                    259:        uint16_t to_port;
                    260:        uint16_t port;
                    261: } to_subnet_port_tests[] = {
                    262:        { "10.0.0.0/8",         0,              0,              0       },
                    263:        { "10.0.0.1/32",        80,             80,             80      },
                    264:        { "10.0.0.1/32",        123,    465,    0       },
                    265:        { "0.0.0.0/0",          0,              65535,  0       },
                    266:        { "fec1::/64",          0,              0,              0       },
                    267:        { "fec1::1/128",        80,             80,             80      },
                    268:        { "fec1::1/128",        123,    465,    0       },
                    269:        { "::/0",                       0,              65535,  0       },
                    270: };
                    271: 
                    272: START_TEST(test_to_subnet_port)
                    273: {
                    274:        traffic_selector_t *ts;
                    275:        host_t *net, *exp_net;
                    276:        uint8_t mask;
                    277:        int exp_mask;
                    278: 
                    279:        ts = traffic_selector_create_from_cidr(to_subnet_port_tests[_i].cidr, 0,
                    280:                                                                                   to_subnet_port_tests[_i].from_port,
                    281:                                                                                   to_subnet_port_tests[_i].to_port);
                    282:        ck_assert(ts->to_subnet(ts, &net, &mask));
                    283:        exp_net = host_create_from_subnet(to_subnet_port_tests[_i].cidr, &exp_mask);
                    284:        ck_assert(exp_net->ip_equals(exp_net, net));
                    285:        ck_assert_int_eq(exp_mask, mask);
                    286:        ck_assert_int_eq(to_subnet_port_tests[_i].port, net->get_port(net));
                    287:        exp_net->destroy(exp_net);
                    288:        net->destroy(net);
                    289:        ts->destroy(ts);
                    290: }
                    291: END_TEST
                    292: 
                    293: START_TEST(test_subset)
                    294: {
                    295:        traffic_selector_t *a, *b;
                    296: 
                    297:        a = traffic_selector_create_from_cidr("10.1.0.0/16", 0, 0, 65535);
                    298:        b = traffic_selector_create_from_cidr("10.1.5.0/24", 0, 0, 65535);
                    299:        verify("10.1.5.0/24", NULL, a->get_subset(a, b));
                    300:        verify("10.1.5.0/24", NULL, b->get_subset(b, a));
                    301:        a->destroy(a);
                    302:        b->destroy(b);
                    303: 
                    304:        a = traffic_selector_create_from_cidr("fec1::/64", 0, 0, 65535);
                    305:        b = traffic_selector_create_from_cidr("fec1::1/128", 0, 0, 65535);
                    306:        verify("fec1::1/128", NULL, a->get_subset(a, b));
                    307:        verify("fec1::1/128", NULL, b->get_subset(b, a));
                    308:        a->destroy(a);
                    309:        b->destroy(b);
                    310: }
                    311: END_TEST
                    312: 
                    313: START_TEST(test_subset_port)
                    314: {
                    315:        traffic_selector_t *a, *b;
                    316: 
                    317:        a = traffic_selector_create_from_cidr("10.0.0.0/8", IPPROTO_TCP, 55, 60);
                    318:        b = traffic_selector_create_from_cidr("10.2.7.16/30", 0, 0, 65535);
                    319:        verify("10.2.7.16/30[tcp/55-60]", "10.2.7.16/30[6/55-60]",
                    320:                a->get_subset(a, b));
                    321:        a->destroy(a);
                    322:        b->destroy(b);
                    323: }
                    324: END_TEST
                    325: 
                    326: START_TEST(test_subset_equal)
                    327: {
                    328:        traffic_selector_t *a, *b;
                    329: 
                    330:        a = traffic_selector_create_from_cidr("10.1.0.0/16", IPPROTO_TCP, 80, 80);
                    331:        b = traffic_selector_create_from_cidr("10.1.0.0/16", IPPROTO_TCP, 80, 80);
                    332:        verify("10.1.0.0/16[tcp/http]", "10.1.0.0/16[6/80]", a->get_subset(a, b));
                    333:        a->destroy(a);
                    334:        b->destroy(b);
                    335: }
                    336: END_TEST
                    337: 
                    338: START_TEST(test_subset_nonet)
                    339: {
                    340:        traffic_selector_t *a, *b;
                    341: 
                    342:        a = traffic_selector_create_from_cidr("10.1.0.0/16", 0, 0, 65535);
                    343:        b = traffic_selector_create_from_cidr("10.2.0.0/16", 0, 0, 65535);
                    344:        ck_assert(!a->get_subset(a, b));
                    345:        a->destroy(a);
                    346:        b->destroy(b);
                    347: }
                    348: END_TEST
                    349: 
                    350: START_TEST(test_subset_noport)
                    351: {
                    352:        traffic_selector_t *a, *b;
                    353: 
                    354:        a = traffic_selector_create_from_cidr("10.1.0.0/16", 0, 0, 9999);
                    355:        b = traffic_selector_create_from_cidr("10.1.0.0/16", 0, 10000, 65535);
                    356:        ck_assert(!a->get_subset(a, b));
                    357:        a->destroy(a);
                    358:        b->destroy(b);
                    359: }
                    360: END_TEST
                    361: 
                    362: START_TEST(test_subset_noproto)
                    363: {
                    364:        traffic_selector_t *a, *b;
                    365: 
                    366:        a = traffic_selector_create_from_cidr("10.1.0.0/16", IPPROTO_TCP, 0, 65535);
                    367:        b = traffic_selector_create_from_cidr("10.1.0.0/16", IPPROTO_UDP, 0, 65535);
                    368:        ck_assert(!a->get_subset(a, b));
                    369:        a->destroy(a);
                    370:        b->destroy(b);
                    371: }
                    372: END_TEST
                    373: 
                    374: START_TEST(test_subset_nofamily)
                    375: {
                    376:        traffic_selector_t *a, *b;
                    377: 
                    378:        a = traffic_selector_create_from_cidr("0.0.0.0/0", 0, 0, 65535);
                    379:        b = traffic_selector_create_from_cidr("::/0", 0, 0, 65535);
                    380:        ck_assert(!a->get_subset(a, b));
                    381:        a->destroy(a);
                    382:        b->destroy(b);
                    383: }
                    384: END_TEST
                    385: 
                    386: START_TEST(test_subset_dynamic)
                    387: {
                    388:        traffic_selector_t *a, *b;
                    389: 
                    390:        a = traffic_selector_create_dynamic(0, 0, 65535);
                    391:        b = traffic_selector_create_from_cidr("10.1.0.0/16", 0, 0, 65535);
                    392:        ck_assert(!a->get_subset(a, b));
                    393:        ck_assert(!b->get_subset(b, a));
                    394:        a->destroy(a);
                    395:        b->destroy(b);
                    396: }
                    397: END_TEST
                    398: 
                    399: START_TEST(test_subset_opaque)
                    400: {
                    401:        traffic_selector_t *a, *b;
                    402: 
                    403:        a = traffic_selector_create_from_cidr("10.0.0.0/8", 0, 65535, 0);
                    404:        b = traffic_selector_create_from_cidr("10.2.7.16/30", IPPROTO_TCP, 80, 80);
                    405:        ck_assert(!a->get_subset(a, b));
                    406:        ck_assert(!b->get_subset(b, a));
                    407:        b->destroy(b);
                    408: 
                    409:        b = traffic_selector_create_from_cidr("10.2.7.16/30", IPPROTO_TCP, 65535, 0);
                    410:        verify("10.2.7.16/30[tcp/OPAQUE]", "10.2.7.16/30[6/OPAQUE]", a->get_subset(a, b));
                    411:        verify("10.2.7.16/30[tcp/OPAQUE]", "10.2.7.16/30[6/OPAQUE]", b->get_subset(b, a));
                    412:        b->destroy(b);
                    413: 
                    414:        b = traffic_selector_create_from_cidr("10.2.7.16/30", IPPROTO_TCP, 0, 65535);
                    415:        verify("10.2.7.16/30[tcp/OPAQUE]", "10.2.7.16/30[6/OPAQUE]", a->get_subset(a, b));
                    416:        verify("10.2.7.16/30[tcp/OPAQUE]", "10.2.7.16/30[6/OPAQUE]", b->get_subset(b, a));
                    417:        a->destroy(a);
                    418:        b->destroy(b);
                    419: }
                    420: END_TEST
                    421: 
                    422: struct {
                    423:        char *net;
                    424:        char *host;
                    425:        bool inc;
                    426: } include_tests[] = {
                    427:        { "0.0.0.0/0",          "192.168.1.2",                  TRUE },
                    428:        { "::/0",                       "fec2::1",                              TRUE },
                    429:        { "fec2::/64",          "fec2::afaf",                   TRUE },
                    430:        { "10.1.0.0/16",        "10.1.0.1",                             TRUE },
                    431:        { "10.5.6.7/32",        "10.5.6.7",                             TRUE },
                    432:        { "0.0.0.0/0",          "fec2::1",                              FALSE },
                    433:        { "::/0",                       "1.2.3.4",                              FALSE },
                    434:        { "10.0.0.0/16",        "10.1.0.0",                             FALSE },
                    435:        { "10.1.0.0/16",        "10.0.255.255",                 FALSE },
                    436:        { "fec2::/64",          "fec2:0:0:1::afaf",             FALSE },
                    437: };
                    438: 
                    439: START_TEST(test_includes)
                    440: {
                    441:        traffic_selector_t *ts;
                    442:        host_t *h;
                    443: 
                    444:        ts = traffic_selector_create_from_cidr(include_tests[_i].net, 0, 0, 65535);
                    445:        h = host_create_from_string(include_tests[_i].host, 0);
                    446:        ck_assert(ts->includes(ts, h) == include_tests[_i].inc);
                    447:        ts->destroy(ts);
                    448:        h->destroy(h);
                    449: }
                    450: END_TEST
                    451: 
                    452: struct {
                    453:        bool contained;
                    454:        struct {
                    455:                char *net;
                    456:                uint8_t proto;
                    457:                uint16_t from_port;
                    458:                uint16_t to_port;
                    459:        } a, b;
                    460: } is_contained_in_tests[] = {
                    461:        {  TRUE,  { "10.0.0.0/16", 0, 0, 65535 },       { "10.0.0.0/16", 0, 0, 65535 }, },
                    462:        {  TRUE,  { "10.0.1.0/24", 0, 0, 65535 },       { "10.0.0.0/16", 0, 0, 65535 }, },
                    463:        {  TRUE,  { "10.0.1.0/24", 17, 123, 456 },      { "10.0.0.0/16", 0, 0, 65535 }, },
                    464:        {  TRUE,  { "10.0.1.0/24", 17, 123, 456 },      { "10.0.0.0/16", 17, 123, 456 },},
                    465:        {  FALSE, { "10.0.0.0/8", 0, 0, 65535 },        { "10.0.0.0/16", 0, 0, 65535 }, },
                    466:        {  FALSE, { "10.0.1.0/24", 17, 0, 65535 },      { "10.0.0.0/16", 17, 123, 456 },},
                    467:        {  FALSE, { "fec2::/64", 0, 0, 65535 },         { "10.0.0.0/16", 17, 123, 456 },},
                    468: };
                    469: 
                    470: START_TEST(test_is_contained_in)
                    471: {
                    472:        traffic_selector_t *a, *b;
                    473: 
                    474:        a = traffic_selector_create_from_cidr(
                    475:                        is_contained_in_tests[_i].a.net, is_contained_in_tests[_i].a.proto,
                    476:                        is_contained_in_tests[_i].a.from_port, is_contained_in_tests[_i].a.to_port);
                    477:        b = traffic_selector_create_from_cidr(
                    478:                        is_contained_in_tests[_i].b.net, is_contained_in_tests[_i].b.proto,
                    479:                        is_contained_in_tests[_i].b.from_port, is_contained_in_tests[_i].b.to_port);
                    480:        ck_assert(a->is_contained_in(a, b) == is_contained_in_tests[_i].contained);
                    481:        a->destroy(a);
                    482:        b->destroy(b);
                    483: }
                    484: END_TEST
                    485: 
                    486: struct {
                    487:        char *net;
                    488:        char *host;
                    489:        bool is_host;
                    490:        bool when_null;
                    491: } is_host_tests[] = {
                    492:        { "0.0.0.0/0",          "192.168.1.2",  FALSE, FALSE },
                    493:        { "::/0",                       "fec2::1",              FALSE, FALSE },
                    494:        { "192.168.1.0/24",     "192.168.1.0",  FALSE, FALSE },
                    495:        { "192.168.1.2/32",     "192.168.1.2",  TRUE,  TRUE },
                    496:        { "192.168.1.2/32",     "192.168.1.1",  FALSE, TRUE },
                    497:        { "192.168.1.2/32",     "fec2::1",              FALSE, TRUE },
                    498:        { "fec2::1/128",        "fec2::1",              TRUE,  TRUE },
                    499:        { "fec2::1/128",        "fec2::2",              FALSE, TRUE },
                    500:        { "fec2::1/128",        "192.168.1.2",  FALSE, TRUE },
                    501: };
                    502: 
                    503: START_TEST(test_is_host)
                    504: {
                    505:        traffic_selector_t *ts;
                    506:        host_t *h;
                    507: 
                    508:        ts = traffic_selector_create_from_cidr(is_host_tests[_i].net, 0, 0, 65535);
                    509:        h = host_create_from_string(is_host_tests[_i].host, 0);
                    510:        ck_assert(ts->is_host(ts, h) == is_host_tests[_i].is_host);
                    511:        ck_assert(ts->is_host(ts, NULL) == is_host_tests[_i].when_null);
                    512:        ts->destroy(ts);
                    513:        h->destroy(h);
                    514: }
                    515: END_TEST
                    516: 
                    517: START_TEST(test_is_host_dynamic)
                    518: {
                    519:        traffic_selector_t *ts;
                    520:        host_t *h;
                    521: 
                    522:        ts = traffic_selector_create_dynamic(0, 0, 65535);
                    523:        h = host_create_from_string(is_host_tests[_i].host, 0);
                    524:        ck_assert(!ts->is_host(ts, h));
                    525:        ck_assert(ts->is_host(ts, NULL));
                    526:        ts->destroy(ts);
                    527:        h->destroy(h);
                    528: }
                    529: END_TEST
                    530: 
                    531: 
                    532: struct {
                    533:        char *orig;
                    534:        char *host;
                    535:        char *after;
                    536: } set_address_tests[] = {
                    537:        { "0.0.0.0/0",          "192.168.1.2",  "192.168.1.2/32" },
                    538:        { "::/0",                       "fec2::1",              "fec2::1/128" },
                    539:        { "192.168.1.2/32",     "192.168.1.1",  "192.168.1.1/32" },
                    540:        { "192.168.1.0/24",     "192.168.1.1",  "192.168.1.1/32" },
                    541:        { "192.168.1.2/32",     "fec2::1",              "fec2::1/128" },
                    542:        { "192.168.1.0/24",     "fec2::1",              "fec2::1/128" },
                    543:        { "192.168.1.2/32",     "%any",                 "0.0.0.0/0" },
                    544:        { "192.168.1.0/24",     "%any",                 "0.0.0.0/0" },
                    545:        { "192.168.1.2/32",     "%any6",                "::/0" },
                    546:        { "192.168.1.0/24",     "%any6",                "::/0" },
                    547:        { "fec2::1/128",        "192.168.1.1",  "192.168.1.1/32" },
                    548:        { "fec2::/64",          "192.168.1.1",  "192.168.1.1/32" },
                    549:        { "fec2::1/128",        "fec2::2",              "fec2::2/128" },
                    550:        { "fec2::/64",          "fec2::2",              "fec2::2/128" },
                    551:        { "fec2::1/128",        "%any",                 "0.0.0.0/0" },
                    552:        { "fec2::/64",          "%any",                 "0.0.0.0/0" },
                    553:        { "fec2::1/128",        "%any6",                "::/0" },
                    554:        { "fec2::/64",          "%any6",                "::/0" },
                    555:        { NULL,                         "192.168.1.1",  "192.168.1.1/32" },
                    556:        { NULL,                         "fec2::1",              "fec2::1/128" },
                    557:        { NULL,                         "%any",                 "0.0.0.0/0" },
                    558:        { NULL,                         "%any6",                "::/0" },
                    559: };
                    560: 
                    561: START_TEST(test_set_address)
                    562: {
                    563:        traffic_selector_t *ts;
                    564:        host_t *h;
                    565: 
                    566:        if (set_address_tests[_i].orig)
                    567:        {
                    568:                ts = traffic_selector_create_from_cidr(set_address_tests[_i].orig, 0, 0, 65535);
                    569:                ck_assert(!ts->is_dynamic(ts));
                    570:        }
                    571:        else
                    572:        {
                    573:                ts = traffic_selector_create_dynamic(0, 0, 65535);
                    574:                ck_assert(ts->is_dynamic(ts));
                    575:        }
                    576:        h = host_create_from_string(set_address_tests[_i].host, 0);
                    577:        ts->set_address(ts, h);
                    578:        ck_assert(!ts->is_dynamic(ts));
                    579:        verify(set_address_tests[_i].after, NULL, ts);
                    580:        h->destroy(h);
                    581: }
                    582: END_TEST
                    583: 
                    584: 
                    585: struct {
                    586:        int res;
                    587:        struct {
                    588:                char *net;
                    589:                uint8_t proto;
                    590:                uint16_t from_port;
                    591:                uint16_t to_port;
                    592:        } a, b;
                    593: } cmp_tests[] = {
                    594:        {  0, { "10.0.0.0/8", 0, 0, 65535 },    { "10.0.0.0/8", 0, 0, 65535 },  },
                    595:        {  0, { "10.0.0.0/8", 17, 123, 456 },   { "10.0.0.0/8", 17, 123, 456 }, },
                    596:        {  0, { "fec2::/64", 0, 0, 65535 },             { "fec2::/64", 0, 0, 65535 },   },
                    597:        {  0, { "fec2::/64", 4, 0, 65535 },             { "fec2::/64", 4, 0, 65535 },   },
                    598: 
                    599:        { -1, { "1.0.0.0/8", 0, 0, 65535 },             { "2.0.0.0/8", 0, 0, 65535 },   },
                    600:        {  1, { "2.0.0.0/8", 0, 0, 65535 },             { "1.0.0.0/8", 0, 0, 65535 },   },
                    601:        { -1, { "1.0.0.0/8", 0, 0, 65535 },             { "1.0.0.0/16", 0, 0, 65535 },  },
                    602:        {  1, { "1.0.0.0/16", 0, 0, 65535 },    { "1.0.0.0/8", 0, 0, 65535 },   },
                    603:        { -1, { "fec1::/64", 0, 0, 65535 },             { "fec2::/64", 0, 0, 65535 },   },
                    604:        {  1, { "fec2::/64", 0, 0, 65535 },             { "fec1::/64", 0, 0, 65535 },   },
                    605:        { -1, { "fec1::/48", 0, 0, 65535 },             { "fec1::/64", 0, 0, 65535 },   },
                    606:        {  1, { "fec1::/64", 0, 0, 65535 },             { "fec1::/48", 0, 0, 65535 },   },
                    607: 
                    608:        { -1, { "10.0.0.0/8", 0, 0, 65535 },    { "fec2::/64", 0, 0, 65535 },   },
                    609:        {  1, { "fec2::/64", 0, 0, 65535 },             { "10.0.0.0/8", 0, 0, 65535 },  },
                    610: 
                    611:        { -1, { "10.0.0.0/8", 16, 123, 456 },   { "10.0.0.0/8", 17, 123, 456 }, },
                    612:        {  1, { "fec2::/64", 5, 0, 65535 },             { "fec2::/64", 4, 0, 65535 },   },
                    613: 
                    614:        { -1, { "10.0.0.0/8", 17, 111, 456 },   { "10.0.0.0/8", 17, 222, 456 }, },
                    615:        {  1, { "fec2::/64", 17, 555, 65535 },  { "fec2::/64", 17, 444, 65535 },},
                    616: 
                    617:        { -1, { "10.0.0.0/8", 17, 55, 65535 },  { "10.0.0.0/8", 17, 55, 666 },  },
                    618:        {  1, { "fec2::/64", 17, 55, 111 },             { "fec2::/64", 17, 55, 4567 },  },
                    619: 
                    620: };
                    621: 
                    622: START_TEST(test_cmp)
                    623: {
                    624:        traffic_selector_t *a, *b;
                    625: 
                    626:        a = traffic_selector_create_from_cidr(
                    627:                                                cmp_tests[_i].a.net, cmp_tests[_i].a.proto,
                    628:                                                cmp_tests[_i].a.from_port, cmp_tests[_i].a.to_port);
                    629:        b = traffic_selector_create_from_cidr(
                    630:                                                cmp_tests[_i].b.net, cmp_tests[_i].b.proto,
                    631:                                                cmp_tests[_i].b.from_port, cmp_tests[_i].b.to_port);
                    632:        switch (cmp_tests[_i].res)
                    633:        {
                    634:                case 0:
                    635:                        ck_assert(traffic_selector_cmp(a, b, NULL) == 0);
                    636:                        ck_assert(a->equals(a, b));
                    637:                        break;
                    638:                case 1:
                    639:                        ck_assert(traffic_selector_cmp(a, b, NULL) > 0);
                    640:                        ck_assert(!a->equals(a, b));
                    641:                        break;
                    642:                case -1:
                    643:                        ck_assert(traffic_selector_cmp(a, b, NULL) < 0);
                    644:                        ck_assert(!a->equals(a, b));
                    645:                        break;
                    646:        }
                    647:        a->destroy(a);
                    648:        b->destroy(b);
                    649: }
                    650: END_TEST
                    651: 
                    652: static void verify_clone(traffic_selector_t *ts)
                    653: {
                    654:        traffic_selector_t *clone;
                    655: 
                    656:        clone = ts->clone(ts);
                    657:        if (!ts->equals(ts, clone))
                    658:        {
                    659:                fail("%R != %R", ts, clone);
                    660:        }
                    661:        /* equals() already compares most of these but not all */
                    662:        ck_assert(ts->get_type(ts) == clone->get_type(clone));
                    663:        ck_assert(ts->get_protocol(ts) == clone->get_protocol(clone));
                    664:        ck_assert(ts->get_from_port(ts) == clone->get_from_port(clone));
                    665:        ck_assert(ts->get_to_port(ts) == clone->get_to_port(clone));
                    666:        ck_assert_chunk_eq(ts->get_from_address(ts), clone->get_from_address(clone));
                    667:        ck_assert_chunk_eq(ts->get_to_address(ts), clone->get_to_address(clone));
                    668:        ck_assert(ts->is_host(ts, NULL) == clone->is_host(clone, NULL));
                    669:        ck_assert(ts->is_dynamic(ts) == clone->is_dynamic(clone));
                    670:        clone->destroy(clone);
                    671:        ts->destroy(ts);
                    672: }
                    673: 
                    674: START_TEST(test_clone)
                    675: {
                    676:        traffic_selector_t *ts;
                    677:        host_t *h;
                    678: 
                    679:        ts = traffic_selector_create_dynamic(0, 0, 0);
                    680:        verify_clone(ts);
                    681:        ts = traffic_selector_create_dynamic(IPPROTO_UDP, 123, 456);
                    682:        verify_clone(ts);
                    683:        ts = traffic_selector_create_dynamic(IPPROTO_UDP, 0, 65535);
                    684:        verify_clone(ts);
                    685: 
                    686:        h = host_create_from_string("192.168.1.1", 0);
                    687:        ts = traffic_selector_create_dynamic(0, 0, 0);
                    688:        ts->set_address(ts, h);
                    689:        verify_clone(ts);
                    690:        ts = traffic_selector_create_dynamic(IPPROTO_UDP, 123, 456);
                    691:        ts->set_address(ts, h);
                    692:        verify_clone(ts);
                    693:        h->destroy(h);
                    694: 
                    695:        ts = traffic_selector_create_from_string(0, TS_IPV4_ADDR_RANGE, "10.0.0.1", 0, "10.0.0.16", 65535);
                    696:        verify_clone(ts);
                    697:        ts = traffic_selector_create_from_string(IPPROTO_TCP, TS_IPV6_ADDR_RANGE, "fec1::1", 80, "fec1::1:0000", 80);
                    698:        verify_clone(ts);
                    699:        ts = traffic_selector_create_from_cidr("10.0.0.0/8", 0, 0, 65535);
                    700:        verify_clone(ts);
                    701:        ts = traffic_selector_create_from_cidr("fec1::/64", 0, 0, 65535);
                    702:        verify_clone(ts);
                    703: }
                    704: END_TEST
                    705: 
                    706: START_TEST(test_hash)
                    707: {
                    708:        traffic_selector_t *a, *b;
                    709:        host_t *h;
                    710: 
                    711:        a = traffic_selector_create_dynamic(0, 0, 0);
                    712:        b = traffic_selector_create_from_cidr("0.0.0.0/0", 0, 0, 0);
                    713:        ck_assert(a->hash(a, 0) != a->hash(a, 1));
                    714:        ck_assert_int_eq(a->hash(a, 0), b->hash(b, 0));
                    715:        ck_assert_int_eq(a->hash(a, 1), b->hash(b, 1));
                    716: 
                    717:        h = host_create_from_string("192.168.1.1", 0);
                    718:        a->set_address(a, h);
                    719:        ck_assert(a->hash(a, 0) != b->hash(b, 0));
                    720:        h->destroy(h);
                    721: 
                    722:        a->destroy(a);
                    723:        a = traffic_selector_create_from_string(0, TS_IPV4_ADDR_RANGE, "192.168.0.0", 0, "192.168.0.255", 65535);
                    724:        ck_assert(a->hash(a, 0) != b->hash(b, 0));
                    725:        b->destroy(b);
                    726:        b = traffic_selector_create_from_cidr("192.168.0.0/24", 0, 0, 65535);
                    727:        ck_assert_int_eq(a->hash(a, 0), b->hash(b, 0));
                    728:        b->destroy(b);
                    729:        b = traffic_selector_create_from_cidr("192.168.0.0/24", IPPROTO_TCP, 0, 65535);
                    730:        ck_assert(a->hash(a, 0) != b->hash(b, 0));
                    731:        b->destroy(b);
                    732:        b = traffic_selector_create_from_cidr("192.168.0.0/24", 0, 123, 456);
                    733:        ck_assert(a->hash(a, 0) != b->hash(b, 0));
                    734:        b->destroy(b);
                    735:        a->destroy(a);
                    736: }
                    737: END_TEST
                    738: 
                    739: struct {
                    740:        uint8_t proto;
                    741:        uint16_t from_port;
                    742:        uint16_t to_port;
                    743:        uint8_t from_type;
                    744:        uint8_t from_code;
                    745:        uint8_t to_type;
                    746:        uint8_t to_code;
                    747:        char *str;
                    748:        char *str_alt;
                    749: } icmp_tests[] = {
                    750:        { IPPROTO_ICMP, 0, 0, 0, 0, 0, 0, "dynamic[icmp/0]", "dynamic[1/0]" },
                    751:        { IPPROTO_ICMP, 3, 3, 3, 0, 3, 0, "dynamic[icmp/3]", "dynamic[1/3]" },
                    752:        { IPPROTO_ICMP, 0x0307, 0x0307, 3, 7, 3, 7, "dynamic[icmp/3(7)]", "dynamic[1/3(7)]" },
                    753:        { IPPROTO_ICMP, 0x0300, 0x040f, 3, 0, 4, 15, "dynamic[icmp/3-4(15)]", "dynamic[1/3-4(15)]" },
                    754:        { IPPROTO_ICMP, 0x0301, 0x040f, 3, 1, 4, 15, "dynamic[icmp/3(1)-4(15)]", "dynamic[1/3(1)-4(15)]" },
                    755:        { IPPROTO_ICMPV6, 0, 0, 0, 0, 0, 0, "dynamic[ipv6-icmp/0]", "dynamic[58/0]" },
                    756:        { IPPROTO_ICMPV6, 1, 1, 1, 0, 1, 0, "dynamic[ipv6-icmp/1]", "dynamic[58/1]" },
                    757:        { IPPROTO_ICMPV6, 0x0104, 0x0104, 1, 4, 1, 4, "dynamic[ipv6-icmp/1(4)]", "dynamic[58/1(4)]" },
                    758:        { IPPROTO_ICMPV6, 0x0100, 0x040f, 1, 0, 4, 15, "dynamic[ipv6-icmp/1-4(15)]", "dynamic[58/1-4(15)]" },
                    759:        { IPPROTO_ICMPV6, 0x0101, 0x040f, 1, 1, 4, 15, "dynamic[ipv6-icmp/1(1)-4(15)]", "dynamic[58/1(1)-4(15)]" },
                    760: };
                    761: 
                    762: START_TEST(test_icmp)
                    763: {
                    764:        traffic_selector_t *ts;
                    765:        uint16_t from, to;
                    766: 
                    767:        ts = traffic_selector_create_dynamic(icmp_tests[_i].proto,
                    768:                                                        icmp_tests[_i].from_port, icmp_tests[_i].to_port);
                    769:        from = ts->get_from_port(ts);
                    770:        to = ts->get_to_port(ts);
                    771:        ck_assert_int_eq(icmp_tests[_i].from_type, traffic_selector_icmp_type(from));
                    772:        ck_assert_int_eq(icmp_tests[_i].from_code, traffic_selector_icmp_code(from));
                    773:        ck_assert_int_eq(icmp_tests[_i].to_type, traffic_selector_icmp_type(to));
                    774:        ck_assert_int_eq(icmp_tests[_i].to_code, traffic_selector_icmp_code(to));
                    775:        verify(icmp_tests[_i].str, icmp_tests[_i].str_alt, ts);
                    776: }
                    777: END_TEST
                    778: 
                    779: static void verify_list(const char *str, const char *alt, linked_list_t *list)
                    780: {
                    781:        char buf[512];
                    782: 
                    783:        snprintf(buf, sizeof(buf), "%#R", list);
                    784:        list->destroy_offset(list, offsetof(traffic_selector_t, destroy));
                    785:        if (!streq(buf, str) && !streq(buf, alt))
                    786:        {
                    787:                fail("%s != %s or %s", buf, str, alt);
                    788:        }
                    789: }
                    790: 
                    791: START_TEST(test_printf_hook_null)
                    792: {
                    793:        verify("(null)", NULL, NULL);
                    794: }
                    795: END_TEST
                    796: 
                    797: START_TEST(test_printf_hook_hash)
                    798: {
                    799:        linked_list_t *list;
                    800: 
                    801:        list = linked_list_create_with_items(
                    802:                                traffic_selector_create_from_cidr("10.1.0.0/16", 0, 0, 65535),
                    803:                                NULL);
                    804:        verify_list("10.1.0.0/16", NULL, list);
                    805:        list = linked_list_create_with_items(
                    806:                                traffic_selector_create_from_cidr("10.1.0.0/16", 0, 0, 65535),
                    807:                                traffic_selector_create_from_cidr("10.1.0.1/32", IPPROTO_UDP, 1234, 1235),
                    808:                                NULL);
                    809:        verify_list("10.1.0.0/16 10.1.0.1/32[udp/1234-1235]", "10.1.0.0/16 10.1.0.1/32[17/1234-1235]", list);
                    810:        list = linked_list_create_with_items(
                    811:                                traffic_selector_create_from_cidr("10.1.0.0/16", 0, 0, 65535),
                    812:                                traffic_selector_create_from_string(IPPROTO_UDP, TS_IPV4_ADDR_RANGE, "10.1.0.1", 1234, "10.1.0.99", 1235),
                    813:                                NULL);
                    814:        verify_list("10.1.0.0/16 10.1.0.1..10.1.0.99[udp/1234-1235]", "10.1.0.0/16 10.1.0.1..10.1.0.99[17/1234-1235]", list);
                    815: }
                    816: END_TEST
                    817: 
                    818: Suite *traffic_selector_suite_create()
                    819: {
                    820:        Suite *s;
                    821:        TCase *tc;
                    822: 
                    823:        s = suite_create("traffic selector");
                    824: 
                    825:        tc = tcase_create("create");
                    826:        tcase_add_test(tc, test_create_from_string);
                    827:        tcase_add_test(tc, test_create_from_cidr);
                    828:        tcase_add_test(tc, test_create_from_bytes);
                    829:        tcase_add_test(tc, test_create_from_subnet);
                    830:        tcase_add_loop_test(tc, test_create_from_rfc3779_format_prefix, 0, countof(rfc3779_prefix_tests));
                    831:        tcase_add_test(tc, test_create_from_rfc3779_format_range);
                    832:        suite_add_tcase(s, tc);
                    833: 
                    834:        tc = tcase_create("addresses");
                    835:        tcase_add_test(tc, test_get_address_range);
                    836:        tcase_add_test(tc, test_get_address_cidr);
                    837:        suite_add_tcase(s, tc);
                    838: 
                    839:        tc = tcase_create("to_subnet");
                    840:        tcase_add_loop_test(tc, test_to_subnet, 0, countof(to_subnet_tests));
                    841:        tcase_add_loop_test(tc, test_to_subnet_port, 0, countof(to_subnet_port_tests));
                    842:        suite_add_tcase(s, tc);
                    843: 
                    844:        tc = tcase_create("subset");
                    845:        tcase_add_test(tc, test_subset);
                    846:        tcase_add_test(tc, test_subset_port);
                    847:        tcase_add_test(tc, test_subset_equal);
                    848:        tcase_add_test(tc, test_subset_nonet);
                    849:        tcase_add_test(tc, test_subset_noport);
                    850:        tcase_add_test(tc, test_subset_noproto);
                    851:        tcase_add_test(tc, test_subset_nofamily);
                    852:        tcase_add_test(tc, test_subset_dynamic);
                    853:        tcase_add_test(tc, test_subset_opaque);
                    854:        suite_add_tcase(s, tc);
                    855: 
                    856:        tc = tcase_create("includes");
                    857:        tcase_add_loop_test(tc, test_includes, 0, countof(include_tests));
                    858:        suite_add_tcase(s, tc);
                    859: 
                    860:        tc = tcase_create("is_contained_in");
                    861:        tcase_add_loop_test(tc, test_is_contained_in, 0, countof(is_contained_in_tests));
                    862:        suite_add_tcase(s, tc);
                    863: 
                    864:        tc = tcase_create("is_host");
                    865:        tcase_add_loop_test(tc, test_is_host, 0, countof(is_host_tests));
                    866:        tcase_add_loop_test(tc, test_is_host_dynamic, 0, countof(is_host_tests));
                    867:        suite_add_tcase(s, tc);
                    868: 
                    869:        tc = tcase_create("set_address");
                    870:        tcase_add_loop_test(tc, test_set_address, 0, countof(is_host_tests));
                    871:        suite_add_tcase(s, tc);
                    872: 
                    873:        tc = tcase_create("cmp");
                    874:        tcase_add_loop_test(tc, test_cmp, 0, countof(cmp_tests));
                    875:        suite_add_tcase(s, tc);
                    876: 
                    877:        tc = tcase_create("clone");
                    878:        tcase_add_test(tc, test_clone);
                    879:        suite_add_tcase(s, tc);
                    880: 
                    881:        tc = tcase_create("hash");
                    882:        tcase_add_test(tc, test_hash);
                    883:        suite_add_tcase(s, tc);
                    884: 
                    885:        tc = tcase_create("icmp");
                    886:        tcase_add_loop_test(tc, test_icmp, 0, countof(icmp_tests));
                    887:        suite_add_tcase(s, tc);
                    888: 
                    889:        tc = tcase_create("printf hook");
                    890:        tcase_add_test(tc, test_printf_hook_null);
                    891:        tcase_add_test(tc, test_printf_hook_hash);
                    892:        suite_add_tcase(s, tc);
                    893: 
                    894:        return s;
                    895: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>