+ case DH6OPT_ELAPSED_TIME:
+ if (optlen != 2) {
+ printf(" ?)");
+ break;
+ }
+ memcpy(&val16, dh6o + 1, sizeof(val16));
+ val16 = ntohs(val16);
+ printf(" %d)", (int)val16);
+ break;
+ case DH6OPT_RELAY_MSG:
+ printf(" (");
+ dhcp6_print((const u_char *)(dh6o + 1), optlen);
+ printf(")");
+ break;
+ case DH6OPT_AUTH:
+ if (optlen < sizeof(authopt) - sizeof(*dh6o)) {
+ printf(" ?)");
+ break;
+ }
+ memcpy(&authopt, dh6o, sizeof(authopt));
+ switch (authopt.dh6opt_auth_proto) {
+ case DH6OPT_AUTHPROTO_DELAYED:
+ printf(" proto: delayed");
+ break;
+ case DH6OPT_AUTHPROTO_RECONFIG:
+ printf(" proto: reconfigure");
+ break;
+ default:
+ printf(" proto: %d",
+ authopt.dh6opt_auth_proto);
+ break;
+ }
+ switch (authopt.dh6opt_auth_alg) {
+ case DH6OPT_AUTHALG_HMACMD5:
+ /* XXX: may depend on the protocol */
+ printf(", alg: HMAC-MD5");
+ break;
+ default:
+ printf(", alg: %d", authopt.dh6opt_auth_alg);
+ break;
+ }
+ switch (authopt.dh6opt_auth_rdm) {
+ case DH6OPT_AUTHRDM_MONOCOUNTER:
+ printf(", RDM: mono");
+ break;
+ default:
+ printf(", RDM: %d", authopt.dh6opt_auth_rdm);
+ break;
+ }
+ tp = (u_char *)&authopt.dh6opt_auth_rdinfo;
+ printf(", RD:");
+ for (i = 0; i < 4; i++, tp += sizeof(val16))
+ printf(" %04x", EXTRACT_16BITS(tp));
+
+ /* protocol dependent part */
+ tp = (u_char *)dh6o + sizeof(authopt);
+ authinfolen =
+ optlen + sizeof(*dh6o) - sizeof(authopt);
+ switch (authopt.dh6opt_auth_proto) {
+ case DH6OPT_AUTHPROTO_DELAYED:
+ if (authinfolen == 0)
+ break;
+ if (authinfolen < 20) {
+ printf(" ??");
+ break;
+ }
+ authrealmlen = authinfolen - 20;
+ if (authrealmlen > 0) {
+ printf(", realm: ");
+ }
+ for (i = 0; i < authrealmlen; i++, tp++)
+ printf("%02x", *tp);
+ printf(", key ID: %08x", EXTRACT_32BITS(tp));
+ tp += 4;
+ printf(", HMAC-MD5:");
+ for (i = 0; i < 4; i++, tp+= 4)
+ printf(" %08x", EXTRACT_32BITS(tp));
+ break;
+ case DH6OPT_AUTHPROTO_RECONFIG:
+ if (authinfolen != 17) {
+ printf(" ??");
+ break;
+ }
+ switch (*tp++) {
+ case DH6OPT_AUTHRECONFIG_KEY:
+ printf(" reconfig-key");
+ break;
+ case DH6OPT_AUTHRECONFIG_HMACMD5:
+ printf(" type: HMAC-MD5");
+ break;
+ default:
+ printf(" type: ??");
+ break;
+ }
+ printf(" value:");
+ for (i = 0; i < 4; i++, tp+= 4)
+ printf(" %08x", EXTRACT_32BITS(tp));
+ break;
+ default:
+ printf(" ??");
+ break;
+ }
+
+ printf(")");
+ break;