Annotation of embedaddon/dhcp/server/tests/mdb6_unittest.c, revision 1.1.1.1

1.1       misho       1: /*
                      2:  * Copyright (C) 2007-2012 by Internet Systems Consortium, Inc. ("ISC")
                      3:  *
                      4:  * Permission to use, copy, modify, and distribute this software for any
                      5:  * purpose with or without fee is hereby granted, provided that the above
                      6:  * copyright notice and this permission notice appear in all copies.
                      7:  *
                      8:  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
                      9:  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
                     10:  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
                     11:  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
                     12:  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
                     13:  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
                     14:  * PERFORMANCE OF THIS SOFTWARE.
                     15:  */
                     16: 
                     17: #include "config.h"
                     18: 
                     19: #include <sys/types.h>
                     20: #include <time.h>
                     21: #include <netinet/in.h>
                     22: 
                     23: #include <stdarg.h>
                     24: #include "dhcpd.h"
                     25: #include "omapip/omapip.h"
                     26: #include "omapip/hash.h"
                     27: #include <dst/md5.h>
                     28: 
                     29: #include <atf-c.h>
                     30: 
                     31: #include <stdlib.h>
                     32: 
                     33: void build_prefix6(struct in6_addr *pref, const struct in6_addr *net_start_pref,
                     34:                    int pool_bits, int pref_bits,
                     35:                    const struct data_string *input);
                     36: 
                     37: /*
                     38:  * Basic iaaddr manipulation.
                     39:  * Verify construction and referencing of an iaaddr.
                     40:  */
                     41: 
                     42: ATF_TC(iaaddr_basic);
                     43: ATF_TC_HEAD(iaaddr_basic, tc)
                     44: {
                     45:     atf_tc_set_md_var(tc, "descr", "This test case checks that basic "
                     46:                       "IAADDR manipulation is possible.");
                     47: }
                     48: ATF_TC_BODY(iaaddr_basic, tc)
                     49: {
                     50:     struct iasubopt *iaaddr;
                     51:     struct iasubopt *iaaddr_copy;
                     52: 
                     53:     /* and other common arguments */
                     54:     iaaddr = NULL;
                     55:     iaaddr_copy = NULL;
                     56: 
                     57:     /* tests */
                     58:     if (iasubopt_allocate(&iaaddr, MDL) != ISC_R_SUCCESS) {
                     59:         atf_tc_fail("ERROR: iasubopt_allocate() %s:%d", MDL);
                     60:     }
                     61:     if (iaaddr->state != FTS_FREE) {
                     62:         atf_tc_fail("ERROR: bad state %s:%d", MDL);
                     63:     }
                     64:     if (iaaddr->heap_index != -1) {
                     65:         atf_tc_fail("ERROR: bad heap_index %s:%d", MDL);
                     66:     }
                     67:     if (iasubopt_reference(&iaaddr_copy, iaaddr, MDL) != ISC_R_SUCCESS) {
                     68:         atf_tc_fail("ERROR: iasubopt_reference() %s:%d", MDL);
                     69:     }
                     70:     if (iasubopt_dereference(&iaaddr, MDL) != ISC_R_SUCCESS) {
                     71:         atf_tc_fail("ERROR: iasubopt_reference() %s:%d", MDL);
                     72:     }
                     73:     if (iasubopt_dereference(&iaaddr_copy, MDL) != ISC_R_SUCCESS) {
                     74:         atf_tc_fail("ERROR: iasubopt_reference() %s:%d", MDL);
                     75:     }
                     76: }
                     77: 
                     78: /*
                     79:  * Basic iaaddr sanity checks.
                     80:  * Verify that the iaaddr code does some sanity checking.
                     81:  */
                     82: 
                     83: ATF_TC(iaaddr_negative);
                     84: ATF_TC_HEAD(iaaddr_negative, tc)
                     85: {
                     86:     atf_tc_set_md_var(tc, "descr", "This test case checks that IAADDR "
                     87:                       "option code can handle various negative scenarios.");
                     88: }
                     89: ATF_TC_BODY(iaaddr_negative, tc)
                     90: {
                     91:     struct iasubopt *iaaddr;
                     92:     struct iasubopt *iaaddr_copy;
                     93: 
                     94:     /* tests */
                     95:     /* bogus allocate arguments */
                     96:     if (iasubopt_allocate(NULL, MDL) != ISC_R_INVALIDARG) {
                     97:         atf_tc_fail("ERROR: iasubopt_allocate() %s:%d", MDL);
                     98:     }
                     99:     iaaddr = (struct iasubopt *)1;
                    100:     if (iasubopt_allocate(&iaaddr, MDL) != ISC_R_INVALIDARG) {
                    101:         atf_tc_fail("ERROR: iasubopt_allocate() %s:%d", MDL);
                    102:     }
                    103: 
                    104:     /* bogus reference arguments */
                    105:     iaaddr = NULL;
                    106:     if (iasubopt_allocate(&iaaddr, MDL) != ISC_R_SUCCESS) {
                    107:         atf_tc_fail("ERROR: iasubopt_allocate() %s:%d", MDL);
                    108:     }
                    109:     if (iasubopt_reference(NULL, iaaddr, MDL) != ISC_R_INVALIDARG) {
                    110:         atf_tc_fail("ERROR: iasubopt_reference() %s:%d", MDL);
                    111:     }
                    112:     iaaddr_copy = (struct iasubopt *)1;
                    113:     if (iasubopt_reference(&iaaddr_copy, iaaddr,
                    114:                            MDL) != ISC_R_INVALIDARG) {
                    115:         atf_tc_fail("ERROR: iasubopt_reference() %s:%d", MDL);
                    116:     }
                    117:     iaaddr_copy = NULL;
                    118:     if (iasubopt_reference(&iaaddr_copy, NULL, MDL) != ISC_R_INVALIDARG) {
                    119:         atf_tc_fail("ERROR: iasubopt_reference() %s:%d", MDL);
                    120:     }
                    121:     if (iasubopt_dereference(&iaaddr, MDL) != ISC_R_SUCCESS) {
                    122:         atf_tc_fail("ERROR: iasubopt_reference() %s:%d", MDL);
                    123:     }
                    124: 
                    125:     /* bogus dereference arguments */
                    126:     if (iasubopt_dereference(NULL, MDL) != ISC_R_INVALIDARG) {
                    127:         atf_tc_fail("ERROR: iasubopt_dereference() %s:%d", MDL);
                    128:     }
                    129:     iaaddr = NULL;
                    130:     if (iasubopt_dereference(&iaaddr, MDL) != ISC_R_INVALIDARG) {
                    131:         atf_tc_fail("ERROR: iasubopt_dereference() %s:%d", MDL);
                    132:     }
                    133: }
                    134: 
                    135: /*
                    136:  * Basic ia_na manipulation.
                    137:  */
                    138: 
                    139: ATF_TC(ia_na_basic);
                    140: ATF_TC_HEAD(ia_na_basic, tc)
                    141: {
                    142:     atf_tc_set_md_var(tc, "descr", "This test case checks that IA_NA code can "
                    143:                       "handle various basic scenarios.");
                    144: }
                    145: ATF_TC_BODY(ia_na_basic, tc)
                    146: {
                    147:     uint32_t iaid;
                    148:     struct ia_xx *ia_na;
                    149:     struct ia_xx *ia_na_copy;
                    150:     struct iasubopt *iaaddr;
                    151: 
                    152:     /* and other common arguments */
                    153:     iaid = 666;
                    154:     ia_na = NULL;
                    155:     ia_na_copy = NULL;
                    156:     iaaddr = NULL;
                    157: 
                    158:     /* tests */
                    159:     if (ia_allocate(&ia_na, iaid, "TestDUID", 8, MDL) != ISC_R_SUCCESS) {
                    160:         atf_tc_fail("ERROR: ia_allocate() %s:%d", MDL);
                    161:     }
                    162:     if (memcmp(ia_na->iaid_duid.data, &iaid, sizeof(iaid)) != 0) {
                    163:         atf_tc_fail("ERROR: bad IAID_DUID %s:%d", MDL);
                    164:     }
                    165:     if (memcmp(ia_na->iaid_duid.data+sizeof(iaid), "TestDUID", 8) != 0) {
                    166:         atf_tc_fail("ERROR: bad IAID_DUID %s:%d", MDL);
                    167:     }
                    168:     if (ia_na->num_iasubopt != 0) {
                    169:         atf_tc_fail("ERROR: bad num_iasubopt %s:%d", MDL);
                    170:     }
                    171:     if (ia_reference(&ia_na_copy, ia_na, MDL) != ISC_R_SUCCESS) {
                    172:         atf_tc_fail("ERROR: ia_reference() %s:%d", MDL);
                    173:     }
                    174:     if (iasubopt_allocate(&iaaddr, MDL) != ISC_R_SUCCESS) {
                    175:         atf_tc_fail("ERROR: iasubopt_allocate() %s:%d", MDL);
                    176:     }
                    177:     if (ia_add_iasubopt(ia_na, iaaddr, MDL) != ISC_R_SUCCESS) {
                    178:         atf_tc_fail("ERROR: ia_add_iasubopt() %s:%d", MDL);
                    179:     }
                    180:     ia_remove_iasubopt(ia_na, iaaddr, MDL);
                    181:     if (iasubopt_dereference(&iaaddr, MDL) != ISC_R_SUCCESS) {
                    182:         atf_tc_fail("ERROR: iasubopt_reference() %s:%d", MDL);
                    183:     }
                    184:     if (ia_dereference(&ia_na, MDL) != ISC_R_SUCCESS) {
                    185:         atf_tc_fail("ERROR: ia_dereference() %s:%d", MDL);
                    186:     }
                    187:     if (ia_dereference(&ia_na_copy, MDL) != ISC_R_SUCCESS) {
                    188:         atf_tc_fail("ERROR: ia_dereference() %s:%d", MDL);
                    189:     }
                    190: }
                    191: 
                    192: /*
                    193:  * Lots of iaaddr in our ia_na.
                    194:  * Create many iaaddrs and attach them to an ia_na
                    195:  * then clean up by removing them one at a time and
                    196:  * all at once by dereferencing the ia_na.
                    197:  */
                    198: 
                    199: ATF_TC(ia_na_manyaddrs);
                    200: ATF_TC_HEAD(ia_na_manyaddrs, tc)
                    201: {
                    202:     atf_tc_set_md_var(tc, "descr", "This test case checks that IA_NA can "
                    203:                       "handle lots of addresses.");
                    204: }
                    205: ATF_TC_BODY(ia_na_manyaddrs, tc)
                    206: {
                    207:     uint32_t iaid;
                    208:     struct ia_xx *ia_na;
                    209:     struct iasubopt *iaaddr;
                    210:     int i;
                    211: 
                    212:     /* tests */
                    213:     /* lots of iaaddr that we delete */
                    214:     iaid = 666;
                    215:     ia_na = NULL;
                    216:     if (ia_allocate(&ia_na, iaid, "TestDUID", 8, MDL) != ISC_R_SUCCESS) {
                    217:         atf_tc_fail("ERROR: ia_allocate() %s:%d", MDL);
                    218:     }
                    219:     for (i=0; i<100; i++) {
                    220:         iaaddr = NULL;
                    221:         if (iasubopt_allocate(&iaaddr, MDL) != ISC_R_SUCCESS) {
                    222:             atf_tc_fail("ERROR: iasubopt_allocate() %s:%d", MDL);
                    223:         }
                    224:         if (ia_add_iasubopt(ia_na, iaaddr, MDL) != ISC_R_SUCCESS) {
                    225:             atf_tc_fail("ERROR: ia_add_iasubopt() %s:%d", MDL);
                    226:         }
                    227:         if (iasubopt_dereference(&iaaddr, MDL) != ISC_R_SUCCESS) {
                    228:             atf_tc_fail("ERROR: iasubopt_reference() %s:%d", MDL);
                    229:         }
                    230:     }
                    231: 
                    232: #if 0
                    233:     for (i=0; i<100; i++) {
                    234:         iaaddr = ia_na->iasubopt[random() % ia_na->num_iasubopt];
                    235:         ia_remove_iasubopt(ia_na, iaaddr, MDL);
                    236:         /* TODO: valgrind reports problem here: Invalid read of size 8
                    237:          * Address 0x51e6258 is 56 bytes inside a block of size 88 free'd */
                    238:     }
                    239: #endif
                    240:     if (ia_dereference(&ia_na, MDL) != ISC_R_SUCCESS) {
                    241:         atf_tc_fail("ERROR: ia_dereference() %s:%d", MDL);
                    242:     }
                    243: 
                    244:     /* lots of iaaddr, let dereference cleanup */
                    245:     iaid = 666;
                    246:     ia_na = NULL;
                    247:     if (ia_allocate(&ia_na, iaid, "TestDUID", 8, MDL) != ISC_R_SUCCESS) {
                    248:         atf_tc_fail("ERROR: ia_allocate() %s:%d", MDL);
                    249:     }
                    250:     for (i=0; i<100; i++) {
                    251:         iaaddr = NULL;
                    252:         if (iasubopt_allocate(&iaaddr, MDL) != ISC_R_SUCCESS) {
                    253:             atf_tc_fail("ERROR: iasubopt_allocate() %s:%d", MDL);
                    254:         }
                    255:         if (ia_add_iasubopt(ia_na, iaaddr, MDL) != ISC_R_SUCCESS) {
                    256:             atf_tc_fail("ERROR: ia_add_iasubopt() %s:%d", MDL);
                    257:         }
                    258:         if (iasubopt_dereference(&iaaddr, MDL) != ISC_R_SUCCESS) {
                    259:             atf_tc_fail("ERROR: iasubopt_reference() %s:%d", MDL);
                    260:         }
                    261:     }
                    262:     if (ia_dereference(&ia_na, MDL) != ISC_R_SUCCESS) {
                    263:         atf_tc_fail("ERROR: ia_dereference() %s:%d", MDL);
                    264:     }
                    265: }
                    266: 
                    267: /*
                    268:  * Basic ia_na sanity checks.
                    269:  * Verify that the ia_na code does some sanity checking.
                    270:  */
                    271: 
                    272: ATF_TC(ia_na_negative);
                    273: ATF_TC_HEAD(ia_na_negative, tc)
                    274: {
                    275:     atf_tc_set_md_var(tc, "descr", "This test case checks that IA_NA option "
                    276:                       "code can handle various negative scenarios.");
                    277: }
                    278: ATF_TC_BODY(ia_na_negative, tc)
                    279: {
                    280:     uint32_t iaid;
                    281:     struct ia_xx *ia_na;
                    282:     struct ia_xx *ia_na_copy;
                    283: 
                    284:     /* tests */
                    285:     /* bogus allocate arguments */
                    286:     if (ia_allocate(NULL, 123, "", 0, MDL) != ISC_R_INVALIDARG) {
                    287:         atf_tc_fail("ERROR: ia_allocate() %s:%d", MDL);
                    288:     }
                    289:     ia_na = (struct ia_xx *)1;
                    290:     if (ia_allocate(&ia_na, 456, "", 0, MDL) != ISC_R_INVALIDARG) {
                    291:         atf_tc_fail("ERROR: ia_allocate() %s:%d", MDL);
                    292:     }
                    293: 
                    294:     /* bogus reference arguments */
                    295:     iaid = 666;
                    296:     ia_na = NULL;
                    297:     if (ia_allocate(&ia_na, iaid, "TestDUID", 8, MDL) != ISC_R_SUCCESS) {
                    298:         atf_tc_fail("ERROR: ia_allocate() %s:%d", MDL);
                    299:     }
                    300:     if (ia_reference(NULL, ia_na, MDL) != ISC_R_INVALIDARG) {
                    301:         atf_tc_fail("ERROR: ia_reference() %s:%d", MDL);
                    302:     }
                    303:     ia_na_copy = (struct ia_xx *)1;
                    304:     if (ia_reference(&ia_na_copy, ia_na, MDL) != ISC_R_INVALIDARG) {
                    305:         atf_tc_fail("ERROR: ia_reference() %s:%d", MDL);
                    306:     }
                    307:     ia_na_copy = NULL;
                    308:     if (ia_reference(&ia_na_copy, NULL, MDL) != ISC_R_INVALIDARG) {
                    309:         atf_tc_fail("ERROR: ia_reference() %s:%d", MDL);
                    310:     }
                    311:     if (ia_dereference(&ia_na, MDL) != ISC_R_SUCCESS) {
                    312:         atf_tc_fail("ERROR: ia_dereference() %s:%d", MDL);
                    313:     }
                    314: 
                    315:     /* bogus dereference arguments */
                    316:     if (ia_dereference(NULL, MDL) != ISC_R_INVALIDARG) {
                    317:         atf_tc_fail("ERROR: ia_dereference() %s:%d", MDL);
                    318:     }
                    319: 
                    320:     /* bogus remove */
                    321:     iaid = 666;
                    322:     ia_na = NULL;
                    323:     if (ia_allocate(&ia_na, iaid, "TestDUID", 8, MDL) != ISC_R_SUCCESS) {
                    324:         atf_tc_fail("ERROR: ia_allocate() %s:%d", MDL);
                    325:     }
                    326:     ia_remove_iasubopt(ia_na, NULL, MDL);
                    327:     if (ia_dereference(&ia_na, MDL) != ISC_R_SUCCESS) {
                    328:         atf_tc_fail("ERROR: ia_dereference() %s:%d", MDL);
                    329:     }
                    330: }
                    331: 
                    332: /*
                    333:  * Basic ipv6_pool manipulation.
                    334:  * Verify that basic pool operations work properly.
                    335:  * The operations include creating a pool and creating,
                    336:  * renewing, expiring, releasing and declining addresses.
                    337:  */
                    338: 
                    339: ATF_TC(ipv6_pool_basic);
                    340: ATF_TC_HEAD(ipv6_pool_basic, tc)
                    341: {
                    342:     atf_tc_set_md_var(tc, "descr", "This test case checks that IPv6 pool "
                    343:                       "manipulation is possible.");
                    344: }
                    345: ATF_TC_BODY(ipv6_pool_basic, tc)
                    346: {
                    347:     struct iasubopt *iaaddr;
                    348:     struct in6_addr addr;
                    349:     struct ipv6_pool *pool;
                    350:     struct ipv6_pool *pool_copy;
                    351:     char addr_buf[INET6_ADDRSTRLEN];
                    352:     char *uid;
                    353:     struct data_string ds;
                    354:     struct iasubopt *expired_iaaddr;
                    355:     unsigned int attempts;
                    356: 
                    357:     /* and other common arguments */
                    358:     inet_pton(AF_INET6, "1:2:3:4::", &addr);
                    359: 
                    360:     uid = "client0";
                    361:     memset(&ds, 0, sizeof(ds));
                    362:     ds.len = strlen(uid);
                    363:     if (!buffer_allocate(&ds.buffer, ds.len, MDL)) {
                    364:         atf_tc_fail("Out of memory");
                    365:     }
                    366:     ds.data = ds.buffer->data;
                    367:     memcpy((char *)ds.data, uid, ds.len);
                    368: 
                    369:     /* tests */
                    370:     /* allocate, reference */
                    371:     pool = NULL;
                    372:     if (ipv6_pool_allocate(&pool, D6O_IA_NA, &addr,
                    373:                            64, 128, MDL) != ISC_R_SUCCESS) {
                    374:         atf_tc_fail("ERROR: ipv6_pool_allocate() %s:%d", MDL);
                    375:     }
                    376:     if (pool->num_active != 0) {
                    377:         atf_tc_fail("ERROR: bad num_active %s:%d", MDL);
                    378:     }
                    379:     if (pool->bits != 64) {
                    380:         atf_tc_fail("ERROR: bad bits %s:%d", MDL);
                    381:     }
                    382:     inet_ntop(AF_INET6, &pool->start_addr, addr_buf, sizeof(addr_buf));
                    383:     if (strcmp(inet_ntop(AF_INET6, &pool->start_addr, addr_buf,
                    384:                          sizeof(addr_buf)), "1:2:3:4::") != 0) {
                    385:         atf_tc_fail("ERROR: bad start_addr %s:%d", MDL);
                    386:     }
                    387:     pool_copy = NULL;
                    388:     if (ipv6_pool_reference(&pool_copy, pool, MDL) != ISC_R_SUCCESS) {
                    389:         atf_tc_fail("ERROR: ipv6_pool_reference() %s:%d", MDL);
                    390:     }
                    391: 
                    392:     /* create_lease6, renew_lease6, expire_lease6 */
                    393:     iaaddr = NULL;
                    394:     if (create_lease6(pool, &iaaddr,
                    395:                       &attempts, &ds, 1) != ISC_R_SUCCESS) {
                    396:         atf_tc_fail("ERROR: create_lease6() %s:%d", MDL);
                    397:     }
                    398:     if (pool->num_inactive != 1) {
                    399:         atf_tc_fail("ERROR: bad num_inactive %s:%d", MDL);
                    400:     }
                    401:     if (renew_lease6(pool, iaaddr) != ISC_R_SUCCESS) {
                    402:         atf_tc_fail("ERROR: renew_lease6() %s:%d", MDL);
                    403:     }
                    404:     if (pool->num_active != 1) {
                    405:         atf_tc_fail("ERROR: bad num_active %s:%d", MDL);
                    406:     }
                    407:     expired_iaaddr = NULL;
                    408:     if (expire_lease6(&expired_iaaddr, pool, 0) != ISC_R_SUCCESS) {
                    409:         atf_tc_fail("ERROR: expire_lease6() %s:%d", MDL);
                    410:     }
                    411:     if (expired_iaaddr != NULL) {
                    412:         atf_tc_fail("ERROR: should not have expired a lease %s:%d", MDL);
                    413:     }
                    414:     if (pool->num_active != 1) {
                    415:         atf_tc_fail("ERROR: bad num_active %s:%d", MDL);
                    416:     }
                    417:     if (expire_lease6(&expired_iaaddr, pool, 1000) != ISC_R_SUCCESS) {
                    418:         atf_tc_fail("ERROR: expire_lease6() %s:%d", MDL);
                    419:     }
                    420:     if (expired_iaaddr == NULL) {
                    421:         atf_tc_fail("ERROR: should have expired a lease %s:%d", MDL);
                    422:     }
                    423:     if (iasubopt_dereference(&expired_iaaddr, MDL) != ISC_R_SUCCESS) {
                    424:         atf_tc_fail("ERROR: iasubopt_dereference() %s:%d", MDL);
                    425:     }
                    426:     if (pool->num_active != 0) {
                    427:         atf_tc_fail("ERROR: bad num_active %s:%d", MDL);
                    428:     }
                    429:     if (iasubopt_dereference(&iaaddr, MDL) != ISC_R_SUCCESS) {
                    430:         atf_tc_fail("ERROR: iasubopt_dereference() %s:%d", MDL);
                    431:     }
                    432: 
                    433:     /* release_lease6, decline_lease6 */
                    434:     if (create_lease6(pool, &iaaddr, &attempts,
                    435:               &ds, 1) != ISC_R_SUCCESS) {
                    436:         atf_tc_fail("ERROR: create_lease6() %s:%d", MDL);
                    437:     }
                    438:     if (renew_lease6(pool, iaaddr) != ISC_R_SUCCESS) {
                    439:         atf_tc_fail("ERROR: renew_lease6() %s:%d", MDL);
                    440:     }
                    441:     if (pool->num_active != 1) {
                    442:         atf_tc_fail("ERROR: bad num_active %s:%d", MDL);
                    443:     }
                    444:     if (release_lease6(pool, iaaddr) != ISC_R_SUCCESS) {
                    445:         atf_tc_fail("ERROR: decline_lease6() %s:%d", MDL);
                    446:     }
                    447:     if (pool->num_active != 0) {
                    448:         atf_tc_fail("ERROR: bad num_active %s:%d", MDL);
                    449:     }
                    450:     if (iasubopt_dereference(&iaaddr, MDL) != ISC_R_SUCCESS) {
                    451:         atf_tc_fail("ERROR: iasubopt_dereference() %s:%d", MDL);
                    452:     }
                    453:     if (create_lease6(pool, &iaaddr, &attempts,
                    454:               &ds, 1) != ISC_R_SUCCESS) {
                    455:         atf_tc_fail("ERROR: create_lease6() %s:%d", MDL);
                    456:     }
                    457:     if (renew_lease6(pool, iaaddr) != ISC_R_SUCCESS) {
                    458:         atf_tc_fail("ERROR: renew_lease6() %s:%d", MDL);
                    459:     }
                    460:     if (pool->num_active != 1) {
                    461:         atf_tc_fail("ERROR: bad num_active %s:%d", MDL);
                    462:     }
                    463:     if (decline_lease6(pool, iaaddr) != ISC_R_SUCCESS) {
                    464:         atf_tc_fail("ERROR: decline_lease6() %s:%d", MDL);
                    465:     }
                    466:     if (pool->num_active != 1) {
                    467:         atf_tc_fail("ERROR: bad num_active %s:%d", MDL);
                    468:     }
                    469:     if (iasubopt_dereference(&iaaddr, MDL) != ISC_R_SUCCESS) {
                    470:         atf_tc_fail("ERROR: iasubopt_dereference() %s:%d", MDL);
                    471:     }
                    472: 
                    473:     /* dereference */
                    474:     if (ipv6_pool_dereference(&pool, MDL) != ISC_R_SUCCESS) {
                    475:         atf_tc_fail("ERROR: ipv6_pool_reference() %s:%d", MDL);
                    476:     }
                    477:     if (ipv6_pool_dereference(&pool_copy, MDL) != ISC_R_SUCCESS) {
                    478:         atf_tc_fail("ERROR: ipv6_pool_reference() %s:%d", MDL);
                    479:     }
                    480: }
                    481: 
                    482: /*
                    483:  * Basic ipv6_pool sanity checks.
                    484:  * Verify that the ipv6_pool code does some sanity checking.
                    485:  */
                    486: 
                    487: ATF_TC(ipv6_pool_negative);
                    488: ATF_TC_HEAD(ipv6_pool_negative, tc)
                    489: {
                    490:     atf_tc_set_md_var(tc, "descr", "This test case checks that IPv6 pool "
                    491:                       "can handle negative cases.");
                    492: }
                    493: ATF_TC_BODY(ipv6_pool_negative, tc)
                    494: {
                    495:     struct in6_addr addr;
                    496:     struct ipv6_pool *pool;
                    497:     struct ipv6_pool *pool_copy;
                    498: 
                    499:     /* and other common arguments */
                    500:     inet_pton(AF_INET6, "1:2:3:4::", &addr);
                    501: 
                    502:     /* tests */
                    503:     if (ipv6_pool_allocate(NULL, D6O_IA_NA, &addr,
                    504:                            64, 128, MDL) != ISC_R_INVALIDARG) {
                    505:         atf_tc_fail("ERROR: ipv6_pool_allocate() %s:%d", MDL);
                    506:     }
                    507:     pool = (struct ipv6_pool *)1;
                    508:     if (ipv6_pool_allocate(&pool, D6O_IA_NA, &addr,
                    509:                            64, 128, MDL) != ISC_R_INVALIDARG) {
                    510:         atf_tc_fail("ERROR: ipv6_pool_allocate() %s:%d", MDL);
                    511:     }
                    512:     if (ipv6_pool_reference(NULL, pool, MDL) != ISC_R_INVALIDARG) {
                    513:         atf_tc_fail("ERROR: ipv6_pool_reference() %s:%d", MDL);
                    514:     }
                    515:     pool_copy = (struct ipv6_pool *)1;
                    516:     if (ipv6_pool_reference(&pool_copy, pool, MDL) != ISC_R_INVALIDARG) {
                    517:         atf_tc_fail("ERROR: ipv6_pool_reference() %s:%d", MDL);
                    518:     }
                    519:     pool_copy = NULL;
                    520:     if (ipv6_pool_reference(&pool_copy, NULL, MDL) != ISC_R_INVALIDARG) {
                    521:         atf_tc_fail("ERROR: ipv6_pool_reference() %s:%d", MDL);
                    522:     }
                    523:     if (ipv6_pool_dereference(NULL, MDL) != ISC_R_INVALIDARG) {
                    524:         atf_tc_fail("ERROR: ipv6_pool_dereference() %s:%d", MDL);
                    525:     }
                    526:     if (ipv6_pool_dereference(&pool_copy, MDL) != ISC_R_INVALIDARG) {
                    527:         atf_tc_fail("ERROR: ipv6_pool_dereference() %s:%d", MDL);
                    528:     }
                    529: }
                    530: 
                    531: 
                    532: /*
                    533:  * Order of expiration.
                    534:  * Add several addresses to a pool and check that
                    535:  * they expire in the proper order.
                    536:  */
                    537: 
                    538: ATF_TC(expire_order);
                    539: ATF_TC_HEAD(expire_order, tc)
                    540: {
                    541:     atf_tc_set_md_var(tc, "descr", "This test case checks that order "
                    542:                       "of lease expiration is handled properly.");
                    543: }
                    544: ATF_TC_BODY(expire_order, tc)
                    545: {
                    546:     struct iasubopt *iaaddr;
                    547:     struct ipv6_pool *pool;
                    548:     struct in6_addr addr;
                    549:         int i;
                    550:     char *uid;
                    551:     struct data_string ds;
                    552:     struct iasubopt *expired_iaaddr;
                    553:     unsigned int attempts;
                    554: 
                    555:     /* and other common arguments */
                    556:     inet_pton(AF_INET6, "1:2:3:4::", &addr);
                    557: 
                    558:     uid = "client0";
                    559:     memset(&ds, 0, sizeof(ds));
                    560:     ds.len = strlen(uid);
                    561:     if (!buffer_allocate(&ds.buffer, ds.len, MDL)) {
                    562:         atf_tc_fail("Out of memory");
                    563:     }
                    564:     ds.data = ds.buffer->data;
                    565:     memcpy((char *)ds.data, uid, ds.len);
                    566: 
                    567:     iaaddr = NULL;
                    568:     expired_iaaddr = NULL;
                    569: 
                    570:     /* tests */
                    571:     pool = NULL;
                    572:     if (ipv6_pool_allocate(&pool, D6O_IA_NA, &addr,
                    573:                            64, 128, MDL) != ISC_R_SUCCESS) {
                    574:         atf_tc_fail("ERROR: ipv6_pool_allocate() %s:%d", MDL);
                    575:     }
                    576: 
                    577:     for (i=10; i<100; i+=10) {
                    578:         if (create_lease6(pool, &iaaddr, &attempts,
                    579:                   &ds, i) != ISC_R_SUCCESS) {
                    580:             atf_tc_fail("ERROR: create_lease6() %s:%d", MDL);
                    581:                 }
                    582:         if (renew_lease6(pool, iaaddr) != ISC_R_SUCCESS) {
                    583:             atf_tc_fail("ERROR: renew_lease6() %s:%d", MDL);
                    584:                 }
                    585:         if (iasubopt_dereference(&iaaddr, MDL) != ISC_R_SUCCESS) {
                    586:             atf_tc_fail("ERROR: iasubopt_dereference() %s:%d", MDL);
                    587:                 }
                    588:         if (pool->num_active != (i / 10)) {
                    589:             atf_tc_fail("ERROR: bad num_active %s:%d", MDL);
                    590:                 }
                    591:     }
                    592:     if (pool->num_active != 9) {
                    593:         atf_tc_fail("ERROR: bad num_active %s:%d", MDL);
                    594:     }
                    595: 
                    596:     for (i=10; i<100; i+=10) {
                    597:         if (expire_lease6(&expired_iaaddr,
                    598:                   pool, 1000) != ISC_R_SUCCESS) {
                    599:             atf_tc_fail("ERROR: expire_lease6() %s:%d", MDL);
                    600:                 }
                    601:         if (expired_iaaddr == NULL) {
                    602:             atf_tc_fail("ERROR: should have expired a lease %s:%d",
                    603:                    MDL);
                    604:                 }
                    605:         if (pool->num_active != (9 - (i / 10))) {
                    606:             atf_tc_fail("ERROR: bad num_active %s:%d", MDL);
                    607:                 }
                    608:         if (expired_iaaddr->hard_lifetime_end_time != i) {
                    609:             atf_tc_fail("ERROR: bad hard_lifetime_end_time %s:%d",
                    610:                    MDL);
                    611:                 }
                    612:         if (iasubopt_dereference(&expired_iaaddr, MDL) !=
                    613:                 ISC_R_SUCCESS) {
                    614:             atf_tc_fail("ERROR: iasubopt_dereference() %s:%d", MDL);
                    615:                 }
                    616:     }
                    617:     if (pool->num_active != 0) {
                    618:         atf_tc_fail("ERROR: bad num_active %s:%d", MDL);
                    619:     }
                    620:     expired_iaaddr = NULL;
                    621:     if (expire_lease6(&expired_iaaddr, pool, 1000) != ISC_R_SUCCESS) {
                    622:         atf_tc_fail("ERROR: expire_lease6() %s:%d", MDL);
                    623:     }
                    624:     if (ipv6_pool_dereference(&pool, MDL) != ISC_R_SUCCESS) {
                    625:         atf_tc_fail("ERROR: ipv6_pool_dereference() %s:%d", MDL);
                    626:     }
                    627: }
                    628: 
                    629: /*
                    630:  * Reduce the expiration period of a lease.
                    631:  * This test reduces the expiration period of
                    632:  * a lease to verify we process reductions
                    633:  * properly.
                    634:  */
                    635: ATF_TC(expire_order_reduce);
                    636: ATF_TC_HEAD(expire_order_reduce, tc)
                    637: {
                    638:     atf_tc_set_md_var(tc, "descr", "This test case checks that reducing "
                    639:                       "the expiration time of a lease works properly.");
                    640: }
                    641: ATF_TC_BODY(expire_order_reduce, tc)
                    642: {
                    643:     struct iasubopt *iaaddr1, *iaaddr2;
                    644:     struct ipv6_pool *pool;
                    645:     struct in6_addr addr;
                    646:     char *uid;
                    647:     struct data_string ds;
                    648:     struct iasubopt *expired_iaaddr;
                    649:     unsigned int attempts;
                    650: 
                    651:     /* and other common arguments */
                    652:     inet_pton(AF_INET6, "1:2:3:4::", &addr);
                    653: 
                    654:     uid = "client0";
                    655:     memset(&ds, 0, sizeof(ds));
                    656:     ds.len = strlen(uid);
                    657:     if (!buffer_allocate(&ds.buffer, ds.len, MDL)) {
                    658:         atf_tc_fail("Out of memory");
                    659:     }
                    660:     ds.data = ds.buffer->data;
                    661:     memcpy((char *)ds.data, uid, ds.len);
                    662: 
                    663:     pool = NULL;
                    664:     iaaddr1 = NULL;
                    665:     iaaddr2 = NULL;
                    666:     expired_iaaddr = NULL;
                    667: 
                    668:     /*
                    669:      * Add two leases iaaddr1 with expire time of 200
                    670:      * and iaaddr2 with expire time of 300.  Then update
                    671:      * iaaddr2 to expire in 100 instead.  This should cause
                    672:      * iaaddr2 to move with the hash list.
                    673:      */
                    674:     /* create pool and add iaaddr1 and iaaddr2 */
                    675:     if (ipv6_pool_allocate(&pool, D6O_IA_NA, &addr,
                    676:                            64, 128, MDL) != ISC_R_SUCCESS) {
                    677:         atf_tc_fail("ERROR: ipv6_pool_allocate() %s:%d", MDL);
                    678:     }
                    679:     if (create_lease6(pool, &iaaddr1, &attempts, &ds, 200) != ISC_R_SUCCESS) {
                    680:         atf_tc_fail("ERROR: create_lease6() %s:%d", MDL);
                    681:     }
                    682:     if (renew_lease6(pool, iaaddr1) != ISC_R_SUCCESS) {
                    683:             atf_tc_fail("ERROR: renew_lease6() %s:%d", MDL);
                    684:     }
                    685:     if (create_lease6(pool, &iaaddr2, &attempts, &ds, 300) != ISC_R_SUCCESS) {
                    686:         atf_tc_fail("ERROR: create_lease6() %s:%d", MDL);
                    687:     }
                    688:     if (renew_lease6(pool, iaaddr2) != ISC_R_SUCCESS) {
                    689:             atf_tc_fail("ERROR: renew_lease6() %s:%d", MDL);
                    690:     }
                    691: 
                    692:     /* verify pool */
                    693:     if (pool->num_active != 2) {
                    694:         atf_tc_fail("ERROR: bad num_active %s:%d", MDL);
                    695:     }
                    696: 
                    697:     /* reduce lease for iaaddr2 */
                    698:     iaaddr2->soft_lifetime_end_time = 100;
                    699:     if (renew_lease6(pool, iaaddr2) != ISC_R_SUCCESS) {
                    700:             atf_tc_fail("ERROR: renew_lease6() %s:%d", MDL);
                    701:     }
                    702: 
                    703:     /* expire a lease, it should be iaaddr2 with an expire time of 100 */
                    704:     if (expire_lease6(&expired_iaaddr, pool, 1000) != ISC_R_SUCCESS) {
                    705:         atf_tc_fail("ERROR: expire_lease6() %s:%d", MDL);
                    706:     }
                    707:     if (expired_iaaddr == NULL) {
                    708:         atf_tc_fail("ERROR: should have expired a lease %s:%d", MDL);
                    709:     }
                    710:     if (expired_iaaddr != iaaddr2) {
                    711:         atf_tc_fail("Error: incorrect lease expired %s:%d", MDL);
                    712:     }
                    713:     if (expired_iaaddr->hard_lifetime_end_time != 100) {
                    714:         atf_tc_fail("ERROR: bad hard_lifetime_end_time %s:%d", MDL);
                    715:     }
                    716:     if (iasubopt_dereference(&expired_iaaddr, MDL) != ISC_R_SUCCESS) {
                    717:         atf_tc_fail("ERROR: iasubopt_dereference() %s:%d", MDL);
                    718:     }
                    719: 
                    720:     /* expire a lease, it should be iaaddr1 with an expire time of 200 */
                    721:     if (expire_lease6(&expired_iaaddr, pool, 1000) != ISC_R_SUCCESS) {
                    722:         atf_tc_fail("ERROR: expire_lease6() %s:%d", MDL);
                    723:     }
                    724:     if (expired_iaaddr == NULL) {
                    725:         atf_tc_fail("ERROR: should have expired a lease %s:%d", MDL);
                    726:     }
                    727:     if (expired_iaaddr != iaaddr1) {
                    728:         atf_tc_fail("Error: incorrect lease expired %s:%d", MDL);
                    729:     }
                    730:     if (expired_iaaddr->hard_lifetime_end_time != 200) {
                    731:         atf_tc_fail("ERROR: bad hard_lifetime_end_time %s:%d", MDL);
                    732:     }
                    733:     if (iasubopt_dereference(&expired_iaaddr, MDL) != ISC_R_SUCCESS) {
                    734:         atf_tc_fail("ERROR: iasubopt_dereference() %s:%d", MDL);
                    735:     }
                    736: 
                    737:     /* cleanup */
                    738:     if (iasubopt_dereference(&iaaddr1, MDL) != ISC_R_SUCCESS) {
                    739:         atf_tc_fail("ERROR: iasubopt_dereference() %s:%d", MDL);
                    740:     }
                    741:     if (iasubopt_dereference(&iaaddr2, MDL) != ISC_R_SUCCESS) {
                    742:         atf_tc_fail("ERROR: iasubopt_dereference() %s:%d", MDL);
                    743:     }
                    744:     if (ipv6_pool_dereference(&pool, MDL) != ISC_R_SUCCESS) {
                    745:         atf_tc_fail("ERROR: ipv6_pool_dereference() %s:%d", MDL);
                    746:     }
                    747: }
                    748: 
                    749: /*
                    750:  * Small pool.
                    751:  * check that a small pool behaves properly.
                    752:  */
                    753: 
                    754: ATF_TC(small_pool);
                    755: ATF_TC_HEAD(small_pool, tc)
                    756: {
                    757:     atf_tc_set_md_var(tc, "descr", "This test case checks that small pool "
                    758:                       "is handled properly.");
                    759: }
                    760: ATF_TC_BODY(small_pool, tc)
                    761: {
                    762:     struct in6_addr addr;
                    763:     struct ipv6_pool *pool;
                    764:     struct iasubopt *iaaddr;
                    765:     char *uid;
                    766:     struct data_string ds;
                    767:     unsigned int attempts;
                    768: 
                    769:     /* and other common arguments */
                    770:     inet_pton(AF_INET6, "1:2:3:4::", &addr);
                    771:     addr.s6_addr[14] = 0x81;
                    772: 
                    773:     uid = "client0";
                    774:     memset(&ds, 0, sizeof(ds));
                    775:     ds.len = strlen(uid);
                    776:     if (!buffer_allocate(&ds.buffer, ds.len, MDL)) {
                    777:         atf_tc_fail("Out of memory");
                    778:     }
                    779:     ds.data = ds.buffer->data;
                    780:     memcpy((char *)ds.data, uid, ds.len);
                    781: 
                    782:     pool = NULL;
                    783:     iaaddr = NULL;
                    784: 
                    785:     /* tests */
                    786:     if (ipv6_pool_allocate(&pool, D6O_IA_NA, &addr,
                    787:                            127, 128, MDL) != ISC_R_SUCCESS) {
                    788:         atf_tc_fail("ERROR: ipv6_pool_allocate() %s:%d", MDL);
                    789:     }
                    790: 
                    791:     if (create_lease6(pool, &iaaddr, &attempts,
                    792:               &ds, 42) != ISC_R_SUCCESS) {
                    793:         atf_tc_fail("ERROR: create_lease6() %s:%d", MDL);
                    794:     }
                    795:     if (renew_lease6(pool, iaaddr) != ISC_R_SUCCESS) {
                    796:         atf_tc_fail("ERROR: renew_lease6() %s:%d", MDL);
                    797:     }
                    798:     if (iasubopt_dereference(&iaaddr, MDL) != ISC_R_SUCCESS) {
                    799:         atf_tc_fail("ERROR: iasubopt_dereference() %s:%d", MDL);
                    800:     }
                    801:     if (create_lease6(pool, &iaaddr, &attempts,
                    802:               &ds, 11) != ISC_R_SUCCESS) {
                    803:         atf_tc_fail("ERROR: create_lease6() %s:%d", MDL);
                    804:     }
                    805:     if (renew_lease6(pool, iaaddr) != ISC_R_SUCCESS) {
                    806:         atf_tc_fail("ERROR: renew_lease6() %s:%d", MDL);
                    807:     }
                    808:     if (iasubopt_dereference(&iaaddr, MDL) != ISC_R_SUCCESS) {
                    809:         atf_tc_fail("ERROR: iasubopt_dereference() %s:%d", MDL);
                    810:     }
                    811:     if (create_lease6(pool, &iaaddr, &attempts,
                    812:               &ds, 11) != ISC_R_NORESOURCES) {
                    813:         atf_tc_fail("ERROR: create_lease6() %s:%d", MDL);
                    814:     }
                    815:     if (ipv6_pool_dereference(&pool, MDL) != ISC_R_SUCCESS) {
                    816:         atf_tc_fail("ERROR: ipv6_pool_dereference() %s:%d", MDL);
                    817:     }
                    818: }
                    819: 
                    820: /*
                    821:  * Address to pool mapping.
                    822:  * Verify that we find the proper pool for an address
                    823:  * or don't find a pool if we don't have one for the given
                    824:  * address.
                    825:  */
                    826: ATF_TC(many_pools);
                    827: ATF_TC_HEAD(many_pools, tc)
                    828: {
                    829:     atf_tc_set_md_var(tc, "descr", "This test case checks that functions "
                    830:                       "across all pools are working correctly.");
                    831: }
                    832: ATF_TC_BODY(many_pools, tc)
                    833: {
                    834:     struct in6_addr addr;
                    835:     struct ipv6_pool *pool;
                    836: 
                    837:     /* and other common arguments */
                    838:     inet_pton(AF_INET6, "1:2:3:4::", &addr);
                    839: 
                    840:     /* tests */
                    841: 
                    842:     pool = NULL;
                    843:     if (ipv6_pool_allocate(&pool, D6O_IA_NA, &addr,
                    844:                            64, 128, MDL) != ISC_R_SUCCESS) {
                    845:         atf_tc_fail("ERROR: ipv6_pool_allocate() %s:%d", MDL);
                    846:     }
                    847:     if (add_ipv6_pool(pool) != ISC_R_SUCCESS) {
                    848:         atf_tc_fail("ERROR: add_ipv6_pool() %s:%d", MDL);
                    849:     }
                    850:     if (ipv6_pool_dereference(&pool, MDL) != ISC_R_SUCCESS) {
                    851:         atf_tc_fail("ERROR: ipv6_pool_dereference() %s:%d", MDL);
                    852:     }
                    853:     pool = NULL;
                    854:     if (find_ipv6_pool(&pool, D6O_IA_NA, &addr) != ISC_R_SUCCESS) {
                    855:         atf_tc_fail("ERROR: find_ipv6_pool() %s:%d", MDL);
                    856:     }
                    857:     if (ipv6_pool_dereference(&pool, MDL) != ISC_R_SUCCESS) {
                    858:         atf_tc_fail("ERROR: ipv6_pool_dereference() %s:%d", MDL);
                    859:     }
                    860:     inet_pton(AF_INET6, "1:2:3:4:ffff:ffff:ffff:ffff", &addr);
                    861:     pool = NULL;
                    862:     if (find_ipv6_pool(&pool, D6O_IA_NA, &addr) != ISC_R_SUCCESS) {
                    863:         atf_tc_fail("ERROR: find_ipv6_pool() %s:%d", MDL);
                    864:     }
                    865:     if (ipv6_pool_dereference(&pool, MDL) != ISC_R_SUCCESS) {
                    866:         atf_tc_fail("ERROR: ipv6_pool_dereference() %s:%d", MDL);
                    867:     }
                    868:     inet_pton(AF_INET6, "1:2:3:5::", &addr);
                    869:     pool = NULL;
                    870:     if (find_ipv6_pool(&pool, D6O_IA_NA, &addr) != ISC_R_NOTFOUND) {
                    871:         atf_tc_fail("ERROR: find_ipv6_pool() %s:%d", MDL);
                    872:     }
                    873:     inet_pton(AF_INET6, "1:2:3:3:ffff:ffff:ffff:ffff", &addr);
                    874:     pool = NULL;
                    875:     if (find_ipv6_pool(&pool, D6O_IA_NA, &addr) != ISC_R_NOTFOUND) {
                    876:         atf_tc_fail("ERROR: find_ipv6_pool() %s:%d", MDL);
                    877:     }
                    878: 
                    879: /*  iaid = 666;
                    880:     ia_na = NULL;
                    881:     if (ia_allocate(&ia_na, iaid, "TestDUID", 8, MDL) != ISC_R_SUCCESS) {
                    882:         atf_tc_fail("ERROR: ia_allocate() %s:%d", MDL);
                    883:     }*/
                    884: 
                    885:     {
                    886:         struct in6_addr r;
                    887:         struct data_string ds;
                    888:         u_char data[16];
                    889:         char buf[64];
                    890:         int i, j;
                    891: 
                    892:         memset(&ds, 0, sizeof(ds));
                    893:         memset(data, 0xaa, sizeof(data));
                    894:         ds.len = 16;
                    895:         ds.data = data;
                    896: 
                    897:         inet_pton(AF_INET6, "3ffe:501:ffff:100::", &addr);
                    898:         for (i = 32; i < 42; i++)
                    899:             for (j = i + 1; j < 49; j++) {
                    900:                 memset(&r, 0, sizeof(r));
                    901:                 memset(buf, 0, 64);
                    902:                 build_prefix6(&r, &addr, i, j, &ds);
                    903:                 inet_ntop(AF_INET6, &r, buf, 64);
                    904:                 printf("%d,%d-> %s/%d\n", i, j, buf, j);
                    905:             }
                    906:     }
                    907: }
                    908: 
                    909: ATF_TP_ADD_TCS(tp)
                    910: {
                    911:     ATF_TP_ADD_TC(tp, iaaddr_basic);
                    912:     ATF_TP_ADD_TC(tp, iaaddr_negative);
                    913:     ATF_TP_ADD_TC(tp, ia_na_basic);
                    914:     ATF_TP_ADD_TC(tp, ia_na_manyaddrs);
                    915:     ATF_TP_ADD_TC(tp, ia_na_negative);
                    916:     ATF_TP_ADD_TC(tp, ipv6_pool_basic);
                    917:     ATF_TP_ADD_TC(tp, ipv6_pool_negative);
                    918:     ATF_TP_ADD_TC(tp, expire_order);
                    919:     ATF_TP_ADD_TC(tp, expire_order_reduce);
                    920:     ATF_TP_ADD_TC(tp, small_pool);
                    921:     ATF_TP_ADD_TC(tp, many_pools);
                    922: 
                    923:     return (atf_no_error());
                    924: }

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