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>