12949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*	$OpenBSD: print-cnfp.c,v 1.2 1998/06/25 20:26:59 mickey Exp $	*/
22949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
32949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/*
42949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Copyright (c) 1998 Michael Shalayeff
52949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * All rights reserved.
62949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
72949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * Redistribution and use in source and binary forms, with or without
82949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * modification, are permitted provided that the following conditions
92949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * are met:
102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    documentation and/or other materials provided with the distribution.
152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 3. All advertising materials mentioning features or use of this software
162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    must display the following acknowledgement:
172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *	This product includes software developed by Michael Shalayeff.
182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * 4. The name of the author may not be used to endorse or promote products
192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *    derived from this software without specific prior written permission.
202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project *
212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */
322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
33e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes/* \summary: Cisco NetFlow protocol printer */
34e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes
35892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/*
36892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Cisco NetFlow protocol
37892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes *
38892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * See
39892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes *
40892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes *    http://www.cisco.com/c/en/us/td/docs/net_mgmt/netflow_collection_engine/3-6/user/guide/format.html#wp1005892
41892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes */
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
47e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes#include <netdissect-stdinc.h>
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
52e2e3bd11bd7561bc9d6686283a668fa94e1206b7Elliott Hughes#include "netdissect.h"
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "tcp.h"
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ipproto.h"
582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
59892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct nfhdr_v1 {
60892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	version;	/* version number */
61892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	count;		/* # of records */
62892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	msys_uptime;
63892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	utc_sec;
64892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	utc_nsec;
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
67892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct nfrec_v1 {
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in_addr	src_ina;
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in_addr	dst_ina;
702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in_addr	nhop_ina;
71892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	input;		/* SNMP index of input interface */
72892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	output;		/* SNMP index of output interface */
73892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	packets;	/* packets in the flow */
74892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	octets;		/* layer 3 octets in the packets of the flow */
75892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	start_time;	/* sys_uptime value at start of flow */
76892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	last_time;	/* sys_uptime value when last packet of flow was received */
77892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	srcport;	/* TCP/UDP source port or equivalent */
78892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	dstport;	/* TCP/UDP source port or equivalent */
79892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	pad1;		/* pad */
80892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		proto;		/* IP protocol type */
81892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		tos;		/* IP type of service */
82892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		tcp_flags;	/* cumulative OR of TCP flags */
83892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		pad[3];		/* padding */
84892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	reserved;	/* unused */
85892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes};
86892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
87892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct nfhdr_v5 {
88892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	version;	/* version number */
89892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	count;		/* # of records */
90892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	msys_uptime;
91892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	utc_sec;
92892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	utc_nsec;
93892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	sequence;	/* flow sequence number */
94892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		engine_type;	/* type of flow-switching engine */
95892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		engine_id;	/* slot number of the flow-switching engine */
96892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	sampling_interval; /* sampling mode and interval */
97892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes};
98892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
99892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct nfrec_v5 {
100892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	struct in_addr	src_ina;
101892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	struct in_addr	dst_ina;
102892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	struct in_addr	nhop_ina;
103892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	input;		/* SNMP index of input interface */
104892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	output;		/* SNMP index of output interface */
105892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	packets;	/* packets in the flow */
106892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	octets;		/* layer 3 octets in the packets of the flow */
107892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	start_time;	/* sys_uptime value at start of flow */
108892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	last_time;	/* sys_uptime value when last packet of flow was received */
109892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	srcport;	/* TCP/UDP source port or equivalent */
110892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	dstport;	/* TCP/UDP source port or equivalent */
111892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		pad1;		/* pad */
112892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		tcp_flags;	/* cumulative OR of TCP flags */
113892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		proto;		/* IP protocol type */
114892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		tos;		/* IP type of service */
115892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	src_as;		/* AS number of the source */
116892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	dst_as;		/* AS number of the destination */
117892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		src_mask;	/* source address mask bits */
118892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		dst_mask;	/* destination address prefix mask bits */
119892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	pad2;
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in_addr	peer_nexthop;	/* v6: IP address of the nexthop within the peer (FIB)*/
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
123892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct nfhdr_v6 {
124892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	version;	/* version number */
125892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	count;		/* # of records */
126892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	msys_uptime;
127892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	utc_sec;
128892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	utc_nsec;
129892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	sequence;	/* v5 flow sequence number */
130892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	reserved;	/* v5 only */
131892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes};
132892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
133892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct nfrec_v6 {
134892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	struct in_addr	src_ina;
135892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	struct in_addr	dst_ina;
136892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	struct in_addr	nhop_ina;
137892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	input;		/* SNMP index of input interface */
138892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	output;		/* SNMP index of output interface */
139892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	packets;	/* packets in the flow */
140892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	octets;		/* layer 3 octets in the packets of the flow */
141892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	start_time;	/* sys_uptime value at start of flow */
142892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	last_time;	/* sys_uptime value when last packet of flow was received */
143892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	srcport;	/* TCP/UDP source port or equivalent */
144892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	dstport;	/* TCP/UDP source port or equivalent */
145892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		pad1;		/* pad */
146892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		tcp_flags;	/* cumulative OR of TCP flags */
147892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		proto;		/* IP protocol type */
148892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		tos;		/* IP type of service */
149892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	src_as;		/* AS number of the source */
150892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	dst_as;		/* AS number of the destination */
151892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		src_mask;	/* source address mask bits */
152892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		dst_mask;	/* destination address prefix mask bits */
153892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	flags;
154892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	struct in_addr	peer_nexthop;	/* v6: IP address of the nexthop within the peer (FIB)*/
155892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes};
156892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
157892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstatic void
158892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughescnfp_v1_print(netdissect_options *ndo, const u_char *cp)
1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
160892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	register const struct nfhdr_v1 *nh;
161892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	register const struct nfrec_v1 *nr;
162cec480af7b6e0879bd9b3ca961fa5dfba2d77fa3Elliott Hughes	const char *p_name;
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int nrecs, ver;
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	time_t t;
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
168892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	nh = (const struct nfhdr_v1 *)cp;
169892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_TCHECK(*nh);
1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
171892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ver = EXTRACT_16BITS(&nh->version);
172892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	nrecs = EXTRACT_32BITS(&nh->count);
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * This is seconds since the UN*X epoch, and is followed by
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * nanoseconds.  XXX - format it, rather than just dumping the
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * raw seconds-since-the-Epoch.
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	t = EXTRACT_32BITS(&nh->utc_sec);
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
182892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "NetFlow v%x, %u.%03u uptime, %u.%09u, ", ver,
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&nh->msys_uptime)/1000,
1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&nh->msys_uptime)%1000,
185892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	       EXTRACT_32BITS(&nh->utc_sec), EXTRACT_32BITS(&nh->utc_nsec)));
186892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
187892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	nr = (const struct nfrec_v1 *)&nh[1];
1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
189892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "%2u recs", nrecs));
1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
191892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	for (; nrecs != 0; nr++, nrecs--) {
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		char buf[20];
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		char asbuf[20];
1942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
195892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		/*
196892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		 * Make sure we have the entire record.
197892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		 */
198892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_TCHECK(*nr);
199892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "\n  started %u.%03u, last %u.%03u",
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&nr->start_time)/1000,
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&nr->start_time)%1000,
2022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&nr->last_time)/1000,
203892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->last_time)%1000));
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		asbuf[0] = buf[0] = '\0';
206892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "\n    %s%s%s:%u ", intoa(nr->src_ina.s_addr), buf, asbuf,
207892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			EXTRACT_16BITS(&nr->srcport)));
208892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
209892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "> %s%s%s:%u ", intoa(nr->dst_ina.s_addr), buf, asbuf,
210892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			EXTRACT_16BITS(&nr->dstport)));
211892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
212892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, ">> %s\n    ", intoa(nr->nhop_ina.s_addr)));
213892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
214cec480af7b6e0879bd9b3ca961fa5dfba2d77fa3Elliott Hughes		if (!ndo->ndo_nflag && (p_name = netdb_protoname(nr->proto)) != NULL)
215cec480af7b6e0879bd9b3ca961fa5dfba2d77fa3Elliott Hughes			ND_PRINT((ndo, "%s ", p_name));
216892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		else
217cec480af7b6e0879bd9b3ca961fa5dfba2d77fa3Elliott Hughes			ND_PRINT((ndo, "%u ", nr->proto));
218892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
219892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		/* tcp flags for tcp only */
220cec480af7b6e0879bd9b3ca961fa5dfba2d77fa3Elliott Hughes		if (nr->proto == IPPROTO_TCP) {
221892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			int flags;
222892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			flags = nr->tcp_flags;
223892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, "%s%s%s%s%s%s%s",
224892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_FIN  ? "F" : "",
225892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_SYN  ? "S" : "",
226892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_RST  ? "R" : "",
227892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_PUSH ? "P" : "",
228892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_ACK  ? "A" : "",
229892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_URG  ? "U" : "",
230892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags           ? " " : ""));
2312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
2322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
233892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		buf[0]='\0';
234892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "tos %u, %u (%u octets) %s",
235892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       nr->tos,
236892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->packets),
237892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->octets), buf));
238892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	}
239892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	return;
2402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
241892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughestrunc:
242892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "[|cnfp]"));
243892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	return;
244892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}
245892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
246892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstatic void
247892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughescnfp_v5_print(netdissect_options *ndo, const u_char *cp)
248892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes{
249892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	register const struct nfhdr_v5 *nh;
250892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	register const struct nfrec_v5 *nr;
251cec480af7b6e0879bd9b3ca961fa5dfba2d77fa3Elliott Hughes	const char *p_name;
252892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	int nrecs, ver;
253892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#if 0
254892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	time_t t;
255892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#endif
256892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
257892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	nh = (const struct nfhdr_v5 *)cp;
258892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_TCHECK(*nh);
259892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
260892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ver = EXTRACT_16BITS(&nh->version);
261892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	nrecs = EXTRACT_32BITS(&nh->count);
262892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#if 0
263892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	/*
264892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	 * This is seconds since the UN*X epoch, and is followed by
265892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	 * nanoseconds.  XXX - format it, rather than just dumping the
266892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	 * raw seconds-since-the-Epoch.
267892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	 */
268892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	t = EXTRACT_32BITS(&nh->utc_sec);
269892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#endif
270892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
271892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "NetFlow v%x, %u.%03u uptime, %u.%09u, ", ver,
272892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	       EXTRACT_32BITS(&nh->msys_uptime)/1000,
273892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	       EXTRACT_32BITS(&nh->msys_uptime)%1000,
274892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	       EXTRACT_32BITS(&nh->utc_sec), EXTRACT_32BITS(&nh->utc_nsec)));
275892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
276892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "#%u, ", EXTRACT_32BITS(&nh->sequence)));
277892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	nr = (const struct nfrec_v5 *)&nh[1];
278892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
279892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "%2u recs", nrecs));
280892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
281892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	for (; nrecs != 0; nr++, nrecs--) {
282892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		char buf[20];
283892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		char asbuf[20];
284892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
285892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		/*
286892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		 * Make sure we have the entire record.
287892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		 */
288892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_TCHECK(*nr);
289892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "\n  started %u.%03u, last %u.%03u",
290892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->start_time)/1000,
291892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->start_time)%1000,
292892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->last_time)/1000,
293892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->last_time)%1000));
294892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
295892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		asbuf[0] = buf[0] = '\0';
296892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		snprintf(buf, sizeof(buf), "/%u", nr->src_mask);
297892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		snprintf(asbuf, sizeof(asbuf), ":%u",
298892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			EXTRACT_16BITS(&nr->src_as));
299892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "\n    %s%s%s:%u ", intoa(nr->src_ina.s_addr), buf, asbuf,
300892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			EXTRACT_16BITS(&nr->srcport)));
301892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
302892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		snprintf(buf, sizeof(buf), "/%d", nr->dst_mask);
303892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		snprintf(asbuf, sizeof(asbuf), ":%u",
304892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			 EXTRACT_16BITS(&nr->dst_as));
305892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "> %s%s%s:%u ", intoa(nr->dst_ina.s_addr), buf, asbuf,
306892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			EXTRACT_16BITS(&nr->dstport)));
307892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
308892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, ">> %s\n    ", intoa(nr->nhop_ina.s_addr)));
309892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
310cec480af7b6e0879bd9b3ca961fa5dfba2d77fa3Elliott Hughes		if (!ndo->ndo_nflag && (p_name = netdb_protoname(nr->proto)) != NULL)
311cec480af7b6e0879bd9b3ca961fa5dfba2d77fa3Elliott Hughes			ND_PRINT((ndo, "%s ", p_name));
3122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
313cec480af7b6e0879bd9b3ca961fa5dfba2d77fa3Elliott Hughes			ND_PRINT((ndo, "%u ", nr->proto));
3142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* tcp flags for tcp only */
316cec480af7b6e0879bd9b3ca961fa5dfba2d77fa3Elliott Hughes		if (nr->proto == IPPROTO_TCP) {
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			int flags;
318892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			flags = nr->tcp_flags;
319892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, "%s%s%s%s%s%s%s",
320892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_FIN  ? "F" : "",
321892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_SYN  ? "S" : "",
322892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_RST  ? "R" : "",
323892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_PUSH ? "P" : "",
324892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_ACK  ? "A" : "",
325892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_URG  ? "U" : "",
326892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags           ? " " : ""));
3272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		buf[0]='\0';
330892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "tos %u, %u (%u octets) %s",
331892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       nr->tos,
332892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->packets),
333892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->octets), buf));
334892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	}
335892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	return;
336892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
337892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughestrunc:
338892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "[|cnfp]"));
339892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	return;
340892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}
341892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
342892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstatic void
343892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughescnfp_v6_print(netdissect_options *ndo, const u_char *cp)
344892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes{
345892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	register const struct nfhdr_v6 *nh;
346892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	register const struct nfrec_v6 *nr;
347cec480af7b6e0879bd9b3ca961fa5dfba2d77fa3Elliott Hughes	const char *p_name;
348892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	int nrecs, ver;
349892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#if 0
350892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	time_t t;
351892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#endif
352892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
353892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	nh = (const struct nfhdr_v6 *)cp;
354892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_TCHECK(*nh);
355892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
356892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ver = EXTRACT_16BITS(&nh->version);
357892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	nrecs = EXTRACT_32BITS(&nh->count);
358892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#if 0
359892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	/*
360892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	 * This is seconds since the UN*X epoch, and is followed by
361892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	 * nanoseconds.  XXX - format it, rather than just dumping the
362892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	 * raw seconds-since-the-Epoch.
363892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	 */
364892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	t = EXTRACT_32BITS(&nh->utc_sec);
365892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#endif
366892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
367892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "NetFlow v%x, %u.%03u uptime, %u.%09u, ", ver,
368892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	       EXTRACT_32BITS(&nh->msys_uptime)/1000,
369892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	       EXTRACT_32BITS(&nh->msys_uptime)%1000,
370892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	       EXTRACT_32BITS(&nh->utc_sec), EXTRACT_32BITS(&nh->utc_nsec)));
371892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
372892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "#%u, ", EXTRACT_32BITS(&nh->sequence)));
373892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	nr = (const struct nfrec_v6 *)&nh[1];
374892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
375892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "%2u recs", nrecs));
376892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
377892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	for (; nrecs != 0; nr++, nrecs--) {
378892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		char buf[20];
379892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		char asbuf[20];
380892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
381892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		/*
382892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		 * Make sure we have the entire record.
383892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		 */
384892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_TCHECK(*nr);
385892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "\n  started %u.%03u, last %u.%03u",
386892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->start_time)/1000,
387892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->start_time)%1000,
388892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->last_time)/1000,
389892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->last_time)%1000));
390892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
391892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		asbuf[0] = buf[0] = '\0';
392892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		snprintf(buf, sizeof(buf), "/%u", nr->src_mask);
393892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		snprintf(asbuf, sizeof(asbuf), ":%u",
394892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			EXTRACT_16BITS(&nr->src_as));
395892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "\n    %s%s%s:%u ", intoa(nr->src_ina.s_addr), buf, asbuf,
396892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			EXTRACT_16BITS(&nr->srcport)));
397892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
398892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		snprintf(buf, sizeof(buf), "/%d", nr->dst_mask);
399892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		snprintf(asbuf, sizeof(asbuf), ":%u",
400892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			 EXTRACT_16BITS(&nr->dst_as));
401892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "> %s%s%s:%u ", intoa(nr->dst_ina.s_addr), buf, asbuf,
402892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			EXTRACT_16BITS(&nr->dstport)));
403892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
404892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, ">> %s\n    ", intoa(nr->nhop_ina.s_addr)));
405892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
406cec480af7b6e0879bd9b3ca961fa5dfba2d77fa3Elliott Hughes		if (!ndo->ndo_nflag && (p_name = netdb_protoname(nr->proto)) != NULL)
407cec480af7b6e0879bd9b3ca961fa5dfba2d77fa3Elliott Hughes			ND_PRINT((ndo, "%s ", p_name));
408892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		else
409cec480af7b6e0879bd9b3ca961fa5dfba2d77fa3Elliott Hughes			ND_PRINT((ndo, "%u ", nr->proto));
410892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
411892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		/* tcp flags for tcp only */
412cec480af7b6e0879bd9b3ca961fa5dfba2d77fa3Elliott Hughes		if (nr->proto == IPPROTO_TCP) {
413892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			int flags;
414892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			flags = nr->tcp_flags;
415892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, "%s%s%s%s%s%s%s",
416892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_FIN  ? "F" : "",
417892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_SYN  ? "S" : "",
418892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_RST  ? "R" : "",
419892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_PUSH ? "P" : "",
420892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_ACK  ? "A" : "",
421892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_URG  ? "U" : "",
422892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags           ? " " : ""));
4232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
424892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
425892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		buf[0]='\0';
426892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		snprintf(buf, sizeof(buf), "(%u<>%u encaps)",
427892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			 (EXTRACT_16BITS(&nr->flags) >> 8) & 0xff,
428892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			 (EXTRACT_16BITS(&nr->flags)) & 0xff);
429892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "tos %u, %u (%u octets) %s",
430892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       nr->tos,
4312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&nr->packets),
432892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->octets), buf));
433892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	}
434892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	return;
435892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
436892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughestrunc:
437892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "[|cnfp]"));
438892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	return;
439892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}
440892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
441892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesvoid
442892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughescnfp_print(netdissect_options *ndo, const u_char *cp)
443892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes{
444892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	int ver;
445892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
446892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	/*
447892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	 * First 2 bytes are the version number.
448892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	 */
449892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_TCHECK2(*cp, 2);
450892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ver = EXTRACT_16BITS(cp);
451892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	switch (ver) {
452892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
453892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	case 1:
454892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		cnfp_v1_print(ndo, cp);
455892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		break;
456892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
457892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	case 5:
458892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		cnfp_v5_print(ndo, cp);
459892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		break;
460892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
461892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	case 6:
462892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		cnfp_v6_print(ndo, cp);
463892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		break;
464892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
465892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	default:
466892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "NetFlow v%x", ver));
467892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		break;
4682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
469892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	return;
470892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
471892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughestrunc:
472892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "[|cnfp]"));
473892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	return;
4742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
475