+ break;
+ case DH6OPT_PREFIX_DELEGATION:
+ dhcp6opt_print((u_char *)(dh6o + 1),
+ (u_char *)(dh6o + 1) + optlen);
+ printf(")");
+ break;
+ case DH6OPT_PREFIX_INFORMATION:
+ if (optlen % 21)
+ printf(" ?)");
+ memcpy(&addr6, (u_char *)(dh6o + 1) + 5,
+ sizeof(addr6));
+ printf(" %s/%d", ip6addr_string(&addr6),
+ (int)*((u_char *)(dh6o + 1) + 4));
+ memcpy(&val32, dh6o + 1, sizeof(val32));
+ val32 = ntohl(val32);
+ if (val32 == DHCP6_DURATITION_INFINITE)
+ printf(" lease-duration: infinite)");
+ else
+ printf(" lease-duration: %u)", val32);
+ break;
+ case DH6OPT_STATUS_CODE:
+ if (optlen < 2) {
+ printf(" ?)");
+ break;
+ }
+ memcpy(&val16, (u_char *)(dh6o + 1), sizeof(val16));
+ val16 = ntohs(val16);
+ printf(" %s)", dhcp6stcode(val16));
+ break;
+ case DH6OPT_IA_NA:
+ case DH6OPT_IA_PD:
+ if (optlen < sizeof(ia) - 4) {
+ printf(" ?)");
+ break;
+ }
+ memcpy(&ia, (u_char *)dh6o, sizeof(ia));
+ ia.dh6opt_ia_iaid = ntohl(ia.dh6opt_ia_iaid);
+ ia.dh6opt_ia_t1 = ntohl(ia.dh6opt_ia_t1);
+ ia.dh6opt_ia_t2 = ntohl(ia.dh6opt_ia_t2);
+ printf(" IAID:%lu T1:%lu T2:%lu",
+ (unsigned long)ia.dh6opt_ia_iaid,
+ (unsigned long)ia.dh6opt_ia_t1,
+ (unsigned long)ia.dh6opt_ia_t2);
+ if (optlen > sizeof(ia) - 4) {
+ /* there are sub-options */
+ dhcp6opt_print((u_char *)dh6o + sizeof(ia),
+ (u_char *)(dh6o + 1) + optlen);
+ }
+ printf(")");
+ break;
+ case DH6OPT_IA_PD_PREFIX:
+ if (optlen < sizeof(ia_prefix) - 4) {
+ printf(" ?)");
+ break;
+ }
+ memcpy(&ia_prefix, (u_char *)dh6o, sizeof(ia_prefix));
+ printf(" %s/%d",
+ ip6addr_string(&ia_prefix.dh6opt_ia_prefix_addr),
+ ia_prefix.dh6opt_ia_prefix_plen);
+ ia_prefix.dh6opt_ia_prefix_pltime =
+ ntohl(ia_prefix.dh6opt_ia_prefix_pltime);
+ ia_prefix.dh6opt_ia_prefix_vltime =
+ ntohl(ia_prefix.dh6opt_ia_prefix_vltime);
+ printf(" pltime:%lu vltime:%lu",
+ (unsigned long)ia_prefix.dh6opt_ia_prefix_pltime,
+ (unsigned long)ia_prefix.dh6opt_ia_prefix_vltime);
+ if (optlen > sizeof(ia_prefix) - 4) {
+ /* there are sub-options */
+ dhcp6opt_print((u_char *)dh6o +
+ sizeof(ia_prefix),
+ (u_char *)(dh6o + 1) + optlen);
+ }
+ printf(")");
+ break;