-#else
- TCHECK((u_char *)opl + (opl->nd_opt_len << 3) - 1);
-#endif
- printf("(tgt lladdr: %s", /*)*/
- etheraddr_string((u_char *)(opl + 1)));
- if (opl->nd_opt_len != 1)
- printf("!");
- /*(*/
- printf(")");
- icmp6_opt_print((const u_char *)op + (op->nd_opt_len << 3),
- resid - (op->nd_opt_len << 3));
- break;
- case ND_OPT_PREFIX_INFORMATION:
- opp = (struct nd_opt_prefix_info *)op;
- TCHECK(opp->nd_opt_pi_prefix);
- printf("(prefix info: "); /*)*/
- if (opp->nd_opt_pi_flags_reserved & ND_OPT_PI_FLAG_ONLINK)
- printf("L");
- if (opp->nd_opt_pi_flags_reserved & ND_OPT_PI_FLAG_AUTO)
- printf("A");
- if (opp->nd_opt_pi_flags_reserved)
- printf(" ");
- printf("valid_ltime=");
- if ((u_int32_t)ntohl(opp->nd_opt_pi_valid_time) == ~0U)
- printf("infinity");
- else {
- printf("%u", (u_int32_t)ntohl(opp->nd_opt_pi_valid_time));
- }
- printf(", ");
- printf("preffered_ltime=");
- if ((u_int32_t)ntohl(opp->nd_opt_pi_preferred_time) == ~0U)
- printf("infinity");
- else {
- printf("%u", (u_int32_t)ntohl(opp->nd_opt_pi_preferred_time));
+
+ switch (op->nd_opt_type) {
+ case ND_OPT_SOURCE_LINKADDR:
+ opl = (struct nd_opt_hdr *)op;
+ printf("(src lladdr: ");
+ l = (op->nd_opt_len << 3) - 2;
+ print_lladdr(cp + 2, l);
+ /*(*/
+ printf(")");
+ break;
+ case ND_OPT_TARGET_LINKADDR:
+ opl = (struct nd_opt_hdr *)op;
+ printf("(tgt lladdr: ");
+ l = (op->nd_opt_len << 3) - 2;
+ print_lladdr(cp + 2, l);
+ /*(*/
+ printf(")");
+ break;
+ case ND_OPT_PREFIX_INFORMATION:
+ opp = (struct nd_opt_prefix_info *)op;
+ TCHECK(opp->nd_opt_pi_prefix);
+ printf("(prefix info: "); /*)*/
+ if (op->nd_opt_len != 4) {
+ printf("badlen");
+ /*(*/
+ printf(")");
+ break;
+ }
+ if (opp->nd_opt_pi_flags_reserved & ND_OPT_PI_FLAG_ONLINK)
+ printf("L");
+ if (opp->nd_opt_pi_flags_reserved & ND_OPT_PI_FLAG_AUTO)
+ printf("A");
+ if (opp->nd_opt_pi_flags_reserved & ND_OPT_PI_FLAG_ROUTER)
+ printf("R");
+ if (opp->nd_opt_pi_flags_reserved)
+ printf(" ");
+ printf("valid_ltime=%s,",
+ get_lifetime(EXTRACT_32BITS(&opp->nd_opt_pi_valid_time)));
+ printf("preferred_ltime=%s,",
+ get_lifetime(EXTRACT_32BITS(&opp->nd_opt_pi_preferred_time)));
+ printf("prefix=%s/%d",
+ ip6addr_string(&opp->nd_opt_pi_prefix),
+ opp->nd_opt_pi_prefix_len);
+ if (opp->nd_opt_pi_len != 4)
+ printf("!");
+ /*(*/
+ printf(")");
+ break;
+ case ND_OPT_REDIRECTED_HEADER:
+ opr = (struct icmp6_opts_redirect *)op;
+ printf("(redirect)");
+ /* xxx */
+ break;
+ case ND_OPT_MTU:
+ opm = (struct nd_opt_mtu *)op;
+ TCHECK(opm->nd_opt_mtu_mtu);
+ printf("(mtu:"); /*)*/
+ if (op->nd_opt_len != 1) {
+ printf("badlen");
+ /*(*/
+ printf(")");
+ break;
+ }
+ printf(" mtu=%u", EXTRACT_32BITS(&opm->nd_opt_mtu_mtu));
+ if (opm->nd_opt_mtu_len != 1)
+ printf("!");
+ printf(")");
+ break;
+ case ND_OPT_ADVINTERVAL:
+ opa = (struct nd_opt_advinterval *)op;
+ TCHECK(opa->nd_opt_adv_interval);
+ printf("(advint:"); /*)*/
+ printf(" advint=%u",
+ EXTRACT_32BITS(&opa->nd_opt_adv_interval));
+ /*(*/
+ printf(")");
+ break;
+ case ND_OPT_HOMEAGENT_INFO:
+ oph = (struct nd_opt_homeagent_info *)op;
+ TCHECK(oph->nd_opt_hai_lifetime);
+ printf("(ha info:"); /*)*/
+ printf(" pref=%d", EXTRACT_16BITS(&oph->nd_opt_hai_preference));
+ printf(", lifetime=%u", EXTRACT_16BITS(&oph->nd_opt_hai_lifetime));
+ printf(")");
+ break;
+ case ND_OPT_ROUTE_INFO:
+ opri = (struct nd_opt_route_info *)op;
+ TCHECK(opri->nd_opt_rti_lifetime);
+ memset(&in6, 0, sizeof(in6));
+ in6p = (struct in6_addr *)(opri + 1);
+ switch (op->nd_opt_len) {
+ case 1:
+ break;
+ case 2:
+ TCHECK2(*in6p, 8);
+ memcpy(&in6, opri + 1, 8);
+ break;
+ case 3:
+ TCHECK(*in6p);
+ memcpy(&in6, opri + 1, sizeof(in6));
+ break;
+ default:
+ goto trunc;
+ }
+ printf("(rtinfo:"); /*)*/
+ printf(" %s/%u", ip6addr_string(&in6),
+ opri->nd_opt_rti_prefixlen);
+ printf(", pref=%s", get_rtpref(opri->nd_opt_rti_flags));
+ printf(", lifetime=%s",
+ get_lifetime(EXTRACT_32BITS(&opri->nd_opt_rti_lifetime)));
+ /*(*/
+ printf(")");
+ break;
+ default:
+ printf("(unknown opt_type=%d, opt_len=%d)",
+ op->nd_opt_type, op->nd_opt_len);
+ break;