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
33892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes/*
34892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * Cisco NetFlow protocol
35892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes *
36892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes * See
37892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes *
38892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes *    http://www.cisco.com/c/en/us/td/docs/net_mgmt/netflow_collection_engine/3-6/user/guide/format.html#wp1005892
39892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes */
402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
41892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#define NETDISSECT_REWORKED
422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H
432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h"
442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h>
472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h>
492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h>
502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h"
522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h"
532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h"
542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "tcp.h"
562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ipproto.h"
572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
58892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct nfhdr_v1 {
59892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	version;	/* version number */
60892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	count;		/* # of records */
61892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	msys_uptime;
62892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	utc_sec;
63892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	utc_nsec;
642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
66892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct nfrec_v1 {
672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in_addr	src_ina;
682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in_addr	dst_ina;
692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in_addr	nhop_ina;
70892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	input;		/* SNMP index of input interface */
71892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	output;		/* SNMP index of output interface */
72892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	packets;	/* packets in the flow */
73892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	octets;		/* layer 3 octets in the packets of the flow */
74892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	start_time;	/* sys_uptime value at start of flow */
75892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	last_time;	/* sys_uptime value when last packet of flow was received */
76892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	srcport;	/* TCP/UDP source port or equivalent */
77892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	dstport;	/* TCP/UDP source port or equivalent */
78892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	pad1;		/* pad */
79892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		proto;		/* IP protocol type */
80892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		tos;		/* IP type of service */
81892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		tcp_flags;	/* cumulative OR of TCP flags */
82892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		pad[3];		/* padding */
83892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	reserved;	/* unused */
84892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes};
85892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
86892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct nfhdr_v5 {
87892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	version;	/* version number */
88892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	count;		/* # of records */
89892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	msys_uptime;
90892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	utc_sec;
91892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	utc_nsec;
92892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	sequence;	/* flow sequence number */
93892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		engine_type;	/* type of flow-switching engine */
94892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		engine_id;	/* slot number of the flow-switching engine */
95892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	sampling_interval; /* sampling mode and interval */
96892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes};
97892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
98892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct nfrec_v5 {
99892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	struct in_addr	src_ina;
100892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	struct in_addr	dst_ina;
101892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	struct in_addr	nhop_ina;
102892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	input;		/* SNMP index of input interface */
103892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	output;		/* SNMP index of output interface */
104892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	packets;	/* packets in the flow */
105892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	octets;		/* layer 3 octets in the packets of the flow */
106892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	start_time;	/* sys_uptime value at start of flow */
107892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	last_time;	/* sys_uptime value when last packet of flow was received */
108892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	srcport;	/* TCP/UDP source port or equivalent */
109892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	dstport;	/* TCP/UDP source port or equivalent */
110892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		pad1;		/* pad */
111892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		tcp_flags;	/* cumulative OR of TCP flags */
112892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		proto;		/* IP protocol type */
113892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		tos;		/* IP type of service */
114892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	src_as;		/* AS number of the source */
115892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	dst_as;		/* AS number of the destination */
116892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		src_mask;	/* source address mask bits */
117892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		dst_mask;	/* destination address prefix mask bits */
118892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	pad2;
1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct in_addr	peer_nexthop;	/* v6: IP address of the nexthop within the peer (FIB)*/
1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project};
1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
122892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct nfhdr_v6 {
123892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	version;	/* version number */
124892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	count;		/* # of records */
125892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	msys_uptime;
126892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	utc_sec;
127892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	utc_nsec;
128892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	sequence;	/* v5 flow sequence number */
129892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	reserved;	/* v5 only */
130892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes};
131892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
132892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstruct nfrec_v6 {
133892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	struct in_addr	src_ina;
134892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	struct in_addr	dst_ina;
135892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	struct in_addr	nhop_ina;
136892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	input;		/* SNMP index of input interface */
137892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	output;		/* SNMP index of output interface */
138892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	packets;	/* packets in the flow */
139892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	octets;		/* layer 3 octets in the packets of the flow */
140892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	start_time;	/* sys_uptime value at start of flow */
141892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint32_t	last_time;	/* sys_uptime value when last packet of flow was received */
142892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	srcport;	/* TCP/UDP source port or equivalent */
143892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	dstport;	/* TCP/UDP source port or equivalent */
144892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		pad1;		/* pad */
145892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		tcp_flags;	/* cumulative OR of TCP flags */
146892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		proto;		/* IP protocol type */
147892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		tos;		/* IP type of service */
148892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	src_as;		/* AS number of the source */
149892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	dst_as;		/* AS number of the destination */
150892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		src_mask;	/* source address mask bits */
151892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint8_t		dst_mask;	/* destination address prefix mask bits */
152892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	uint16_t	flags;
153892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	struct in_addr	peer_nexthop;	/* v6: IP address of the nexthop within the peer (FIB)*/
154892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes};
155892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
156892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstatic void
157892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughescnfp_v1_print(netdissect_options *ndo, const u_char *cp)
1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{
159892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	register const struct nfhdr_v1 *nh;
160892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	register const struct nfrec_v1 *nr;
1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	struct protoent *pent;
1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	int nrecs, ver;
1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0
1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	time_t t;
1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
167892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	nh = (const struct nfhdr_v1 *)cp;
168892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_TCHECK(*nh);
1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
170892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ver = EXTRACT_16BITS(&nh->version);
171892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	nrecs = EXTRACT_32BITS(&nh->count);
1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0
1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	/*
1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * This is seconds since the UN*X epoch, and is followed by
1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * nanoseconds.  XXX - format it, rather than just dumping the
1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 * raw seconds-since-the-Epoch.
1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	 */
1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	t = EXTRACT_32BITS(&nh->utc_sec);
1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif
1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
181892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "NetFlow v%x, %u.%03u uptime, %u.%09u, ", ver,
1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&nh->msys_uptime)/1000,
1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	       EXTRACT_32BITS(&nh->msys_uptime)%1000,
184892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	       EXTRACT_32BITS(&nh->utc_sec), EXTRACT_32BITS(&nh->utc_nsec)));
185892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
186892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	nr = (const struct nfrec_v1 *)&nh[1];
1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
188892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "%2u recs", nrecs));
1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
190892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	for (; nrecs != 0; nr++, nrecs--) {
1912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		char buf[20];
1922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		char asbuf[20];
1932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
194892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		/*
195892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		 * Make sure we have the entire record.
196892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		 */
197892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_TCHECK(*nr);
198892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "\n  started %u.%03u, last %u.%03u",
1992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&nr->start_time)/1000,
2002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&nr->start_time)%1000,
2012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&nr->last_time)/1000,
202892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->last_time)%1000));
2032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
2042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		asbuf[0] = buf[0] = '\0';
205892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "\n    %s%s%s:%u ", intoa(nr->src_ina.s_addr), buf, asbuf,
206892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			EXTRACT_16BITS(&nr->srcport)));
207892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
208892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "> %s%s%s:%u ", intoa(nr->dst_ina.s_addr), buf, asbuf,
209892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			EXTRACT_16BITS(&nr->dstport)));
210892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
211892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, ">> %s\n    ", intoa(nr->nhop_ina.s_addr)));
212892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
213892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		pent = getprotobynumber(nr->proto);
214892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		if (!pent || ndo->ndo_nflag)
215892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, "%u ", nr->proto));
216892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		else
217892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, "%s ", pent->p_name));
218892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
219892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		/* tcp flags for tcp only */
220892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		if (pent && pent->p_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;
251892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	struct protoent *pent;
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
310892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		pent = getprotobynumber(nr->proto);
311892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		if (!pent || ndo->ndo_nflag)
312892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, "%u ", nr->proto));
3132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		else
314892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, "%s ", pent->p_name));
3152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		/* tcp flags for tcp only */
3172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		if (pent && pent->p_proto == IPPROTO_TCP) {
3182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project			int flags;
319892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			flags = nr->tcp_flags;
320892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, "%s%s%s%s%s%s%s",
321892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_FIN  ? "F" : "",
322892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_SYN  ? "S" : "",
323892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_RST  ? "R" : "",
324892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_PUSH ? "P" : "",
325892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_ACK  ? "A" : "",
326892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_URG  ? "U" : "",
327892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags           ? " " : ""));
3282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
3292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project
3302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		buf[0]='\0';
331892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "tos %u, %u (%u octets) %s",
332892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       nr->tos,
333892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->packets),
334892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->octets), buf));
335892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	}
336892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	return;
337892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
338892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughestrunc:
339892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "[|cnfp]"));
340892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	return;
341892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}
342892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
343892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesstatic void
344892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughescnfp_v6_print(netdissect_options *ndo, const u_char *cp)
345892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes{
346892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	register const struct nfhdr_v6 *nh;
347892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	register const struct nfrec_v6 *nr;
348892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	struct protoent *pent;
349892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	int nrecs, ver;
350892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#if 0
351892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	time_t t;
352892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#endif
353892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
354892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	nh = (const struct nfhdr_v6 *)cp;
355892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_TCHECK(*nh);
356892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
357892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ver = EXTRACT_16BITS(&nh->version);
358892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	nrecs = EXTRACT_32BITS(&nh->count);
359892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#if 0
360892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	/*
361892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	 * This is seconds since the UN*X epoch, and is followed by
362892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	 * nanoseconds.  XXX - format it, rather than just dumping the
363892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	 * raw seconds-since-the-Epoch.
364892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	 */
365892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	t = EXTRACT_32BITS(&nh->utc_sec);
366892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes#endif
367892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
368892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "NetFlow v%x, %u.%03u uptime, %u.%09u, ", ver,
369892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	       EXTRACT_32BITS(&nh->msys_uptime)/1000,
370892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	       EXTRACT_32BITS(&nh->msys_uptime)%1000,
371892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	       EXTRACT_32BITS(&nh->utc_sec), EXTRACT_32BITS(&nh->utc_nsec)));
372892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
373892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "#%u, ", EXTRACT_32BITS(&nh->sequence)));
374892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	nr = (const struct nfrec_v6 *)&nh[1];
375892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
376892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "%2u recs", nrecs));
377892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
378892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	for (; nrecs != 0; nr++, nrecs--) {
379892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		char buf[20];
380892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		char asbuf[20];
381892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
382892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		/*
383892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		 * Make sure we have the entire record.
384892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		 */
385892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_TCHECK(*nr);
386892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "\n  started %u.%03u, last %u.%03u",
387892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->start_time)/1000,
388892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->start_time)%1000,
389892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->last_time)/1000,
390892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->last_time)%1000));
391892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
392892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		asbuf[0] = buf[0] = '\0';
393892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		snprintf(buf, sizeof(buf), "/%u", nr->src_mask);
394892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		snprintf(asbuf, sizeof(asbuf), ":%u",
395892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			EXTRACT_16BITS(&nr->src_as));
396892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "\n    %s%s%s:%u ", intoa(nr->src_ina.s_addr), buf, asbuf,
397892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			EXTRACT_16BITS(&nr->srcport)));
398892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
399892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		snprintf(buf, sizeof(buf), "/%d", nr->dst_mask);
400892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		snprintf(asbuf, sizeof(asbuf), ":%u",
401892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			 EXTRACT_16BITS(&nr->dst_as));
402892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "> %s%s%s:%u ", intoa(nr->dst_ina.s_addr), buf, asbuf,
403892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			EXTRACT_16BITS(&nr->dstport)));
404892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
405892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, ">> %s\n    ", intoa(nr->nhop_ina.s_addr)));
406892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
407892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		pent = getprotobynumber(nr->proto);
408892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		if (!pent || ndo->ndo_nflag)
409892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, "%u ", nr->proto));
410892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		else
411892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, "%s ", pent->p_name));
412892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
413892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		/* tcp flags for tcp only */
414892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		if (pent && pent->p_proto == IPPROTO_TCP) {
415892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			int flags;
416892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			flags = nr->tcp_flags;
417892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			ND_PRINT((ndo, "%s%s%s%s%s%s%s",
418892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_FIN  ? "F" : "",
419892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_SYN  ? "S" : "",
420892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_RST  ? "R" : "",
421892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_PUSH ? "P" : "",
422892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_ACK  ? "A" : "",
423892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags & TH_URG  ? "U" : "",
424892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes				flags           ? " " : ""));
4252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		}
426892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
427892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		buf[0]='\0';
428892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		snprintf(buf, sizeof(buf), "(%u<>%u encaps)",
429892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			 (EXTRACT_16BITS(&nr->flags) >> 8) & 0xff,
430892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes			 (EXTRACT_16BITS(&nr->flags)) & 0xff);
431892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "tos %u, %u (%u octets) %s",
432892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       nr->tos,
4332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project		       EXTRACT_32BITS(&nr->packets),
434892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		       EXTRACT_32BITS(&nr->octets), buf));
435892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	}
436892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	return;
437892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
438892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughestrunc:
439892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "[|cnfp]"));
440892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	return;
441892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes}
442892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
443892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughesvoid
444892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughescnfp_print(netdissect_options *ndo, const u_char *cp)
445892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes{
446892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	int ver;
447892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
448892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	/*
449892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	 * First 2 bytes are the version number.
450892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	 */
451892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_TCHECK2(*cp, 2);
452892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ver = EXTRACT_16BITS(cp);
453892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	switch (ver) {
454892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
455892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	case 1:
456892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		cnfp_v1_print(ndo, cp);
457892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		break;
458892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
459892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	case 5:
460892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		cnfp_v5_print(ndo, cp);
461892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		break;
462892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
463892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	case 6:
464892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		cnfp_v6_print(ndo, cp);
465892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		break;
466892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
467892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	default:
468892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		ND_PRINT((ndo, "NetFlow v%x", ver));
469892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes		break;
4702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project	}
471892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	return;
472892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes
473892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughestrunc:
474892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	ND_PRINT((ndo, "[|cnfp]"));
475892a68bdf2f50b40781212e4d7ee7369c8165953Elliott Hughes	return;
4762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}
477