- len = ntohs(ip6->ip6_plen);
- if (length < len + advance)
- (void)printf("truncated-ip6 - %d bytes missing!",
- len + advance - length);
+ if (!ndo->ndo_eflag)
+ ND_PRINT((ndo, "IP6 "));
+
+ if (IP6_VERSION(ip6) != 6) {
+ ND_PRINT((ndo,"version error: %u != 6", IP6_VERSION(ip6)));
+ return;
+ }
+
+ payload_len = EXTRACT_16BITS(&ip6->ip6_plen);
+ len = payload_len + sizeof(struct ip6_hdr);
+ if (length < len)
+ ND_PRINT((ndo, "truncated-ip6 - %u bytes missing!",
+ len - length));
+
+ if (ndo->ndo_vflag) {
+ flow = EXTRACT_32BITS(&ip6->ip6_flow);
+ ND_PRINT((ndo, "("));
+#if 0
+ /* rfc1883 */
+ if (flow & 0x0f000000)
+ ND_PRINT((ndo, "pri 0x%02x, ", (flow & 0x0f000000) >> 24));
+ if (flow & 0x00ffffff)
+ ND_PRINT((ndo, "flowlabel 0x%06x, ", flow & 0x00ffffff));
+#else
+ /* RFC 2460 */
+ if (flow & 0x0ff00000)
+ ND_PRINT((ndo, "class 0x%02x, ", (flow & 0x0ff00000) >> 20));
+ if (flow & 0x000fffff)
+ ND_PRINT((ndo, "flowlabel 0x%05x, ", flow & 0x000fffff));
+#endif
+
+ ND_PRINT((ndo, "hlim %u, next-header %s (%u) payload length: %u) ",
+ ip6->ip6_hlim,
+ tok2str(ipproto_values,"unknown",ip6->ip6_nxt),
+ ip6->ip6_nxt,
+ payload_len));
+ }
+
+ /*
+ * Cut off the snapshot length to the end of the IP payload.
+ */
+ ipend = bp + len;
+ if (ipend < ndo->ndo_snapend)
+ ndo->ndo_snapend = ipend;