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