Annotation of embedaddon/dhcp/server/tests/mdb6_unittest.c, revision 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>