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