+ case IP6OPT_HOME_ADDRESS:
+ if (len - i < IP6OPT_HOMEADDR_MINLEN) {
+ printf("(homeaddr: trunc)");
+ goto trunc;
+ }
+ if (bp[i + 1] < IP6OPT_HOMEADDR_MINLEN - 2) {
+ printf("(homeaddr: invalid len %d)", bp[i + 1]);
+ goto trunc;
+ }
+ printf("(homeaddr: %s", ip6addr_string(&bp[i + 2]));
+ if (bp[i + 1] > IP6OPT_HOMEADDR_MINLEN - 2) {
+ ip6_sopt_print(&bp[i + IP6OPT_HOMEADDR_MINLEN],
+ (optlen-IP6OPT_HOMEADDR_MINLEN));
+ }
+ printf(")");
+ optlen = bp[i + 1] + 2;
+ break;
+ case IP6OPT_BINDING_UPDATE:
+ if (len - i < IP6OPT_BU_MINLEN) {
+ printf("(bu: trunc)");
+ goto trunc;
+ }
+ if (bp[i + 1] < IP6OPT_BU_MINLEN - 2) {
+ printf("(bu: invalid len %d)", bp[i + 1]);
+ goto trunc;
+ }
+ printf("(bu: ");
+ if (bp[i + 2] & 0x80)
+ printf("A");
+ if (bp[i + 2] & 0x40)
+ printf("H");
+ if (bp[i + 2] & 0x20)
+ printf("R");
+ if (bp[i + 2] & 0x10)
+ printf("D");
+ if (bp[i + 2] & 0x0f)
+ printf("res");
+ printf(", prefixlen: %u", bp[i + 3]);
+ printf(", sequence: %u",
+ (u_int16_t)ntohs(*(u_int16_t *)&bp[i + 4]));
+ printf(", lifetime: %u",
+ (u_int32_t)ntohs(*(u_int32_t *)&bp[i + 8]));
+
+ optlen = bp[i + 1] + 2;
+ if (bp[i + 1] > IP6OPT_BU_MINLEN - 2) {
+ ip6_sopt_print(&bp[i + IP6OPT_BU_MINLEN],
+ (optlen - IP6OPT_BU_MINLEN));
+ }
+ printf(")");
+ break;
+ case IP6OPT_BINDING_ACK:
+ if (len - i < IP6OPT_BA_MINLEN) {
+ printf("(ba: trunc)");
+ goto trunc;
+ }
+ if (bp[i + 1] < IP6OPT_BA_MINLEN - 2) {
+ printf("(ba: invalid len %d)", bp[i + 1]);
+ goto trunc;
+ }
+ printf("(ba: ");
+ printf("status: %u", bp[i + 2]);
+ printf(", sequence: %u",
+ (u_int16_t)ntohs(*(u_int16_t *)&bp[i + 3]));
+ printf(", lifetime: %u",
+ (u_int32_t)ntohs(*(u_int32_t *)&bp[i + 7]));
+ printf(", refresh: %u",
+ (u_int32_t)ntohs(*(u_int32_t *)&bp[i + 11]));
+
+ if (bp[i + 1] > IP6OPT_BA_MINLEN - 2) {
+ ip6_sopt_print(&bp[i + IP6OPT_BA_MINLEN],
+ (optlen-IP6OPT_BA_MINLEN));
+ }
+ printf(")");
+ optlen = bp[i + 1] + 2;
+ break;
+ case IP6OPT_BINDING_REQ:
+ if (len - i < IP6OPT_BR_MINLEN) {
+ printf("(br: trunc)");
+ goto trunc;
+ }
+ printf("(br");
+ if (bp[i + 1] > IP6OPT_BR_MINLEN - 2) {
+ ip6_sopt_print(&bp[i + IP6OPT_BR_MINLEN],
+ (optlen-IP6OPT_BR_MINLEN));
+ }
+ printf(")");
+ optlen = bp[i + 1] + 2;
+ break;