+ ND_PRINT((ndo, "tos %u, %u (%u octets) %s",
+ nr->tos,
+ EXTRACT_BE_U_4(&nr->packets),
+ EXTRACT_BE_U_4(&nr->octets), buf));
+ }
+ return;
+
+trunc:
+ ND_PRINT((ndo, "[|cnfp]"));
+ return;
+}
+
+static void
+cnfp_v6_print(netdissect_options *ndo, const u_char *cp)
+{
+ register const struct nfhdr_v6 *nh;
+ register const struct nfrec_v6 *nr;
+ const char *p_name;
+ int nrecs, ver;
+#if 0
+ time_t t;
+#endif
+
+ nh = (const struct nfhdr_v6 *)cp;
+ ND_TCHECK(*nh);
+
+ ver = EXTRACT_BE_U_2(&nh->version);
+ nrecs = EXTRACT_BE_U_4(&nh->count);
+#if 0
+ /*
+ * This is seconds since the UN*X epoch, and is followed by
+ * nanoseconds. XXX - format it, rather than just dumping the
+ * raw seconds-since-the-Epoch.
+ */
+ t = EXTRACT_BE_U_4(&nh->utc_sec);
+#endif
+
+ ND_PRINT((ndo, "NetFlow v%x, %u.%03u uptime, %u.%09u, ", ver,
+ EXTRACT_BE_U_4(&nh->msys_uptime)/1000,
+ EXTRACT_BE_U_4(&nh->msys_uptime)%1000,
+ EXTRACT_BE_U_4(&nh->utc_sec), EXTRACT_BE_U_4(&nh->utc_nsec)));
+
+ ND_PRINT((ndo, "#%u, ", EXTRACT_BE_U_4(&nh->sequence)));
+ nr = (const struct nfrec_v6 *)&nh[1];
+
+ ND_PRINT((ndo, "%2u recs", nrecs));
+
+ for (; nrecs != 0; nr++, nrecs--) {
+ char buf[20];
+ char asbuf[20];
+
+ /*
+ * Make sure we have the entire record.
+ */
+ ND_TCHECK(*nr);
+ ND_PRINT((ndo, "\n started %u.%03u, last %u.%03u",
+ EXTRACT_BE_U_4(&nr->start_time)/1000,
+ EXTRACT_BE_U_4(&nr->start_time)%1000,
+ EXTRACT_BE_U_4(&nr->last_time)/1000,
+ EXTRACT_BE_U_4(&nr->last_time)%1000));
+
+ asbuf[0] = buf[0] = '\0';
+ snprintf(buf, sizeof(buf), "/%u", nr->src_mask);
+ snprintf(asbuf, sizeof(asbuf), ":%u",
+ EXTRACT_BE_U_2(&nr->src_as));
+ ND_PRINT((ndo, "\n %s%s%s:%u ", intoa(nr->src_ina.s_addr), buf, asbuf,
+ EXTRACT_BE_U_2(&nr->srcport)));
+
+ snprintf(buf, sizeof(buf), "/%d", nr->dst_mask);
+ snprintf(asbuf, sizeof(asbuf), ":%u",
+ EXTRACT_BE_U_2(&nr->dst_as));
+ ND_PRINT((ndo, "> %s%s%s:%u ", intoa(nr->dst_ina.s_addr), buf, asbuf,
+ EXTRACT_BE_U_2(&nr->dstport)));
+
+ ND_PRINT((ndo, ">> %s\n ", intoa(nr->nhop_ina.s_addr)));
+
+ if (!ndo->ndo_nflag && (p_name = netdb_protoname(nr->proto)) != NULL)
+ ND_PRINT((ndo, "%s ", p_name));
+ else
+ ND_PRINT((ndo, "%u ", nr->proto));
+
+ /* tcp flags for tcp only */
+ if (nr->proto == IPPROTO_TCP) {
+ int flags;
+ flags = nr->tcp_flags;
+ ND_PRINT((ndo, "%s%s%s%s%s%s%s",
+ flags & TH_FIN ? "F" : "",
+ flags & TH_SYN ? "S" : "",
+ flags & TH_RST ? "R" : "",
+ flags & TH_PUSH ? "P" : "",
+ flags & TH_ACK ? "A" : "",
+ flags & TH_URG ? "U" : "",
+ flags ? " " : ""));