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 332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project/* Cisco NetFlow protocol */ 342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifndef lint 362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstatic const char rcsid[] _U_ = 3753f17a9db278d33517d9888dd77848f554522a38JP Abgrall "@(#) $Header: /tcpdump/master/tcpdump/print-cnfp.c,v 1.17 2005-04-20 20:53:18 guy Exp $"; 382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#ifdef HAVE_CONFIG_H 412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "config.h" 422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <tcpdump-stdinc.h> 452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <stdio.h> 472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include <string.h> 482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "interface.h" 502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "addrtoname.h" 512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "extract.h" 522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "tcp.h" 542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#include "ipproto.h" 552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct nfhdr { 572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t ver_cnt; /* version [15], and # of records */ 582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t msys_uptime; 592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t utc_sec; 602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t utc_nsec; 612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t sequence; /* v5 flow sequence number */ 622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t reserved; /* v5 only */ 632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectstruct nfrec { 662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct in_addr src_ina; 672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct in_addr dst_ina; 682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct in_addr nhop_ina; 692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t ifaces; /* src,dst ifaces */ 702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t packets; 712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t octets; 722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t start_time; /* sys_uptime value */ 732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t last_time; /* sys_uptime value */ 742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t ports; /* src,dst ports */ 752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t proto_tos; /* proto, tos, pad, flags(v5) */ 762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t asses; /* v1: flags; v5: src,dst AS */ 772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project u_int32_t masks; /* src,dst addr prefix; v6: encaps */ 782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct in_addr peer_nexthop; /* v6: IP address of the nexthop within the peer (FIB)*/ 792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project}; 802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectvoid 822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Projectcnfp_print(const u_char *cp, const u_char *bp _U_) 832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project{ 842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct nfhdr *nh; 852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project register const struct nfrec *nr; 862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project struct protoent *pent; 872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int nrecs, ver; 882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0 892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project time_t t; 902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 912949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 922949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nh = (const struct nfhdr *)cp; 932949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 942949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if ((const u_char *)(nh + 1) > snapend) 952949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project return; 962949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 972949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nrecs = EXTRACT_32BITS(&nh->ver_cnt) & 0xffff; 982949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project ver = (EXTRACT_32BITS(&nh->ver_cnt) & 0xffff0000) >> 16; 992949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#if 0 1002949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* 1012949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * This is seconds since the UN*X epoch, and is followed by 1022949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * nanoseconds. XXX - format it, rather than just dumping the 1032949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project * raw seconds-since-the-Epoch. 1042949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project */ 1052949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project t = EXTRACT_32BITS(&nh->utc_sec); 1062949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project#endif 1072949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1082949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("NetFlow v%x, %u.%03u uptime, %u.%09u, ", ver, 1092949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&nh->msys_uptime)/1000, 1102949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&nh->msys_uptime)%1000, 1112949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&nh->utc_sec), EXTRACT_32BITS(&nh->utc_nsec)); 1122949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1132949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ver == 5 || ver == 6) { 1142949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("#%u, ", EXTRACT_32BITS(&nh->sequence)); 1152949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nr = (const struct nfrec *)&nh[1]; 1162949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snaplen -= 24; 1172949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } else { 1182949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project nr = (const struct nfrec *)&nh->sequence; 1192949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snaplen -= 16; 1202949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1212949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1222949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%2u recs", nrecs); 1232949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1242949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project for (; nrecs-- && (const u_char *)(nr + 1) <= snapend; nr++) { 1252949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char buf[20]; 1262949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project char asbuf[20]; 1272949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1282949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n started %u.%03u, last %u.%03u", 1292949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&nr->start_time)/1000, 1302949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&nr->start_time)%1000, 1312949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&nr->last_time)/1000, 1322949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&nr->last_time)%1000); 1332949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1342949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project asbuf[0] = buf[0] = '\0'; 1352949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ver == 5 || ver == 6) { 1362949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(buf, sizeof(buf), "/%u", 1372949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (EXTRACT_32BITS(&nr->masks) >> 24) & 0xff); 1382949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(asbuf, sizeof(asbuf), ":%u", 1392949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (EXTRACT_32BITS(&nr->asses) >> 16) & 0xffff); 1402949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1412949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("\n %s%s%s:%u ", intoa(nr->src_ina.s_addr), buf, asbuf, 1422949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&nr->ports) >> 16); 1432949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1442949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ver == 5 || ver ==6) { 1452949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(buf, sizeof(buf), "/%d", 1462949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (EXTRACT_32BITS(&nr->masks) >> 16) & 0xff); 1472949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(asbuf, sizeof(asbuf), ":%u", 1482949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&nr->asses) & 0xffff); 1492949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1502949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("> %s%s%s:%u ", intoa(nr->dst_ina.s_addr), buf, asbuf, 1512949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&nr->ports) & 0xffff); 1522949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1532949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf(">> %s\n ", intoa(nr->nhop_ina.s_addr)); 1542949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1552949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project pent = getprotobynumber((EXTRACT_32BITS(&nr->proto_tos) >> 8) & 0xff); 1562949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (!pent || nflag) 1572949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%u ", 1582949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (EXTRACT_32BITS(&nr->proto_tos) >> 8) & 0xff); 1592949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 1602949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("%s ", pent->p_name); 1612949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1622949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project /* tcp flags for tcp only */ 1632949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (pent && pent->p_proto == IPPROTO_TCP) { 1642949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project int flags; 1652949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ver == 1) 1662949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags = (EXTRACT_32BITS(&nr->asses) >> 24) & 0xff; 1672949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project else 1682949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project flags = (EXTRACT_32BITS(&nr->proto_tos) >> 16) & 0xff; 1692949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (flags & TH_FIN) putchar('F'); 1702949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (flags & TH_SYN) putchar('S'); 1712949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (flags & TH_RST) putchar('R'); 1722949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (flags & TH_PUSH) putchar('P'); 1732949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (flags & TH_ACK) putchar('A'); 1742949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (flags & TH_URG) putchar('U'); 1752949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (flags) 1762949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project putchar(' '); 1772949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1782949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project 1792949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project buf[0]='\0'; 1802949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project if (ver == 6) { 1812949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project snprintf(buf, sizeof(buf), "(%u<>%u encaps)", 1822949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (EXTRACT_32BITS(&nr->masks) >> 8) & 0xff, 1832949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project (EXTRACT_32BITS(&nr->masks)) & 0xff); 1842949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1852949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project printf("tos %u, %u (%u octets) %s", 1862949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&nr->proto_tos) & 0xff, 1872949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&nr->packets), 1882949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project EXTRACT_32BITS(&nr->octets), buf); 1892949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project } 1902949f58a438f6fd85f66a8b7ed4708042cde4b37The Android Open Source Project} 191