📄 savefile.c
字号:
/* * Copyright (c) 1993, 1994, 1995, 1996, 1997 * The Regents of the University of California. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that: (1) source code distributions * retain the above copyright notice and this paragraph in its entirety, (2) * distributions including binary code include the above copyright notice and * this paragraph in its entirety in the documentation or other materials * provided with the distribution, and (3) all advertising materials mentioning * features or use of this software display the following acknowledgement: * ``This product includes software developed by the University of California, * Lawrence Berkeley Laboratory and its contributors.'' Neither the name of * the University nor the names of its contributors may be used to endorse * or promote products derived from this software without specific prior * written permission. * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. * * savefile.c - supports offline use of tcpdump * Extraction/creation by Jeffrey Mogul, DECWRL * Modified by Steve McCanne, LBL. * * Used to save the received packet headers, after filtering, to * a file, and then read them later. * The first record in the file contains saved values for the machine * dependent values so we can print the dump file on any architecture. */#ifndef lintstatic const char rcsid[] _U_ = "@(#) $Header: /tcpdump/master/libpcap/savefile.c,v 1.126.2.17 2006/07/27 21:06:18 gianluca Exp $ (LBL)";#endif#ifdef HAVE_CONFIG_H#include "config.h"#endif#include <errno.h>#include <memory.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include "pcap-int.h"#ifdef HAVE_OS_PROTO_H#include "os-proto.h"#endif/* * Standard libpcap format. */#define TCPDUMP_MAGIC 0xa1b2c3d4/* * Alexey Kuznetzov's modified libpcap format. */#define KUZNETZOV_TCPDUMP_MAGIC 0xa1b2cd34/* * Reserved for Francisco Mesquita <francisco.mesquita@radiomovel.pt> * for another modified format. */#define FMESQUITA_TCPDUMP_MAGIC 0xa1b234cd/* * Navtel Communcations' format, with nanosecond timestamps, * as per a request from Dumas Hwang <dumas.hwang@navtelcom.com>. */#define NAVTEL_TCPDUMP_MAGIC 0xa12b3c4d/* * Normal libpcap format, except for seconds/nanoseconds timestamps, * as per a request by Ulf Lamping <ulf.lamping@web.de> */#define NSEC_TCPDUMP_MAGIC 0xa1b23c4d/* * We use the "receiver-makes-right" approach to byte order, * because time is at a premium when we are writing the file. * In other words, the pcap_file_header and pcap_pkthdr, * records are written in host byte order. * Note that the bytes of packet data are written out in the order in * which they were received, so multi-byte fields in packets are not * written in host byte order, they're written in whatever order the * sending machine put them in. * * ntoh[ls] aren't sufficient because we might need to swap on a big-endian * machine (if the file was written in little-end order). */#define SWAPLONG(y) \((((y)&0xff)<<24) | (((y)&0xff00)<<8) | (((y)&0xff0000)>>8) | (((y)>>24)&0xff))#define SWAPSHORT(y) \ ( (((y)&0xff)<<8) | ((u_short)((y)&0xff00)>>8) )#define SFERR_TRUNC 1#define SFERR_BADVERSION 2#define SFERR_BADF 3#define SFERR_EOF 4 /* not really an error, just a status *//* * Setting O_BINARY on DOS/Windows is a bit tricky */#if defined(WIN32) #define SET_BINMODE(f) _setmode(_fileno(f), _O_BINARY)#elif defined(MSDOS) #if defined(__HIGHC__) #define SET_BINMODE(f) setmode(f, O_BINARY) #else #define SET_BINMODE(f) setmode(fileno(f), O_BINARY) #endif#endif/* * We don't write DLT_* values to the capture file header, because * they're not the same on all platforms. * * Unfortunately, the various flavors of BSD have not always used the same * numerical values for the same data types, and various patches to * libpcap for non-BSD OSes have added their own DLT_* codes for link * layer encapsulation types seen on those OSes, and those codes have had, * in some cases, values that were also used, on other platforms, for other * link layer encapsulation types. * * This means that capture files of a type whose numerical DLT_* code * means different things on different BSDs, or with different versions * of libpcap, can't always be read on systems other than those like * the one running on the machine on which the capture was made. * * Instead, we define here a set of LINKTYPE_* codes, and map DLT_* codes * to LINKTYPE_* codes when writing a savefile header, and map LINKTYPE_* * codes to DLT_* codes when reading a savefile header. * * For those DLT_* codes that have, as far as we know, the same values on * all platforms (DLT_NULL through DLT_FDDI), we define LINKTYPE_xxx as * DLT_xxx; that way, captures of those types can still be read by * versions of libpcap that map LINKTYPE_* values to DLT_* values, and * captures of those types written by versions of libpcap that map DLT_ * values to LINKTYPE_ values can still be read by older versions * of libpcap. * * The other LINKTYPE_* codes are given values starting at 100, in the * hopes that no DLT_* code will be given one of those values. * * In order to ensure that a given LINKTYPE_* code's value will refer to * the same encapsulation type on all platforms, you should not allocate * a new LINKTYPE_* value without consulting "tcpdump-workers@tcpdump.org". * The tcpdump developers will allocate a value for you, and will not * subsequently allocate it to anybody else; that value will be added to * the "pcap.h" in the tcpdump.org CVS repository, so that a future * libpcap release will include it. * * You should, if possible, also contribute patches to libpcap and tcpdump * to handle the new encapsulation type, so that they can also be checked * into the tcpdump.org CVS repository and so that they will appear in * future libpcap and tcpdump releases. * * Do *NOT* assume that any values after the largest value in this file * are available; you might not have the most up-to-date version of this * file, and new values after that one might have been assigned. Also, * do *NOT* use any values below 100 - those might already have been * taken by one (or more!) organizations. */#define LINKTYPE_NULL DLT_NULL#define LINKTYPE_ETHERNET DLT_EN10MB /* also for 100Mb and up */#define LINKTYPE_EXP_ETHERNET DLT_EN3MB /* 3Mb experimental Ethernet */#define LINKTYPE_AX25 DLT_AX25#define LINKTYPE_PRONET DLT_PRONET#define LINKTYPE_CHAOS DLT_CHAOS#define LINKTYPE_TOKEN_RING DLT_IEEE802 /* DLT_IEEE802 is used for Token Ring */#define LINKTYPE_ARCNET DLT_ARCNET /* BSD-style headers */#define LINKTYPE_SLIP DLT_SLIP#define LINKTYPE_PPP DLT_PPP#define LINKTYPE_FDDI DLT_FDDI/* * LINKTYPE_PPP is for use when there might, or might not, be an RFC 1662 * PPP in HDLC-like framing header (with 0xff 0x03 before the PPP protocol * field) at the beginning of the packet. * * This is for use when there is always such a header; the address field * might be 0xff, for regular PPP, or it might be an address field for Cisco * point-to-point with HDLC framing as per section 4.3.1 of RFC 1547 ("Cisco * HDLC"). This is, for example, what you get with NetBSD's DLT_PPP_SERIAL. * * We give it the same value as NetBSD's DLT_PPP_SERIAL, in the hopes that * nobody else will choose a DLT_ value of 50, and so that DLT_PPP_SERIAL * captures will be written out with a link type that NetBSD's tcpdump * can read. */#define LINKTYPE_PPP_HDLC 50 /* PPP in HDLC-like framing */#define LINKTYPE_PPP_ETHER 51 /* NetBSD PPP-over-Ethernet */#define LINKTYPE_SYMANTEC_FIREWALL 99 /* Symantec Enterprise Firewall */#define LINKTYPE_ATM_RFC1483 100 /* LLC/SNAP-encapsulated ATM */#define LINKTYPE_RAW 101 /* raw IP */#define LINKTYPE_SLIP_BSDOS 102 /* BSD/OS SLIP BPF header */#define LINKTYPE_PPP_BSDOS 103 /* BSD/OS PPP BPF header */#define LINKTYPE_C_HDLC 104 /* Cisco HDLC */#define LINKTYPE_IEEE802_11 105 /* IEEE 802.11 (wireless) */#define LINKTYPE_ATM_CLIP 106 /* Linux Classical IP over ATM */#define LINKTYPE_FRELAY 107 /* Frame Relay */#define LINKTYPE_LOOP 108 /* OpenBSD loopback */#define LINKTYPE_ENC 109 /* OpenBSD IPSEC enc *//* * These three types are reserved for future use. */#define LINKTYPE_LANE8023 110 /* ATM LANE + 802.3 */#define LINKTYPE_HIPPI 111 /* NetBSD HIPPI */#define LINKTYPE_HDLC 112 /* NetBSD HDLC framing */#define LINKTYPE_LINUX_SLL 113 /* Linux cooked socket capture */#define LINKTYPE_LTALK 114 /* Apple LocalTalk hardware */#define LINKTYPE_ECONET 115 /* Acorn Econet *//* * Reserved for use with OpenBSD ipfilter. */#define LINKTYPE_IPFILTER 116#define LINKTYPE_PFLOG 117 /* OpenBSD DLT_PFLOG */#define LINKTYPE_CISCO_IOS 118 /* For Cisco-internal use */#define LINKTYPE_PRISM_HEADER 119 /* 802.11+Prism II monitor mode */#define LINKTYPE_AIRONET_HEADER 120 /* FreeBSD Aironet driver stuff *//* * Reserved for Siemens HiPath HDLC. */#define LINKTYPE_HHDLC 121#define LINKTYPE_IP_OVER_FC 122 /* RFC 2625 IP-over-Fibre Channel */#define LINKTYPE_SUNATM 123 /* Solaris+SunATM *//* * Reserved as per request from Kent Dahlgren <kent@praesum.com> * for private use. */#define LINKTYPE_RIO 124 /* RapidIO */#define LINKTYPE_PCI_EXP 125 /* PCI Express */#define LINKTYPE_AURORA 126 /* Xilinx Aurora link layer */#define LINKTYPE_IEEE802_11_RADIO 127 /* 802.11 plus BSD radio header *//* * Reserved for the TZSP encapsulation, as per request from * Chris Waters <chris.waters@networkchemistry.com> * TZSP is a generic encapsulation for any other link type, * which includes a means to include meta-information * with the packet, e.g. signal strength and channel * for 802.11 packets. */#define LINKTYPE_TZSP 128 /* Tazmen Sniffer Protocol */#define LINKTYPE_ARCNET_LINUX 129 /* Linux-style headers *//* * Juniper-private data link types, as per request from * Hannes Gredler <hannes@juniper.net>. The corresponding * DLT_s are used for passing on chassis-internal * metainformation such as QOS profiles, etc.. */#define LINKTYPE_JUNIPER_MLPPP 130#define LINKTYPE_JUNIPER_MLFR 131#define LINKTYPE_JUNIPER_ES 132#define LINKTYPE_JUNIPER_GGSN 133#define LINKTYPE_JUNIPER_MFR 134#define LINKTYPE_JUNIPER_ATM2 135#define LINKTYPE_JUNIPER_SERVICES 136#define LINKTYPE_JUNIPER_ATM1 137#define LINKTYPE_APPLE_IP_OVER_IEEE1394 138 /* Apple IP-over-IEEE 1394 cooked header */#define LINKTYPE_MTP2_WITH_PHDR 139#define LINKTYPE_MTP2 140#define LINKTYPE_MTP3 141#define LINKTYPE_SCCP 142#define LINKTYPE_DOCSIS 143 /* DOCSIS MAC frames */#define LINKTYPE_LINUX_IRDA 144 /* Linux-IrDA *//* * Reserved for IBM SP switch and IBM Next Federation switch. */#define LINKTYPE_IBM_SP 145#define LINKTYPE_IBM_SN 146/* * Reserved for private use. If you have some link-layer header type * that you want to use within your organization, with the capture files * using that link-layer header type not ever be sent outside your * organization, you can use these values. * * No libpcap release will use these for any purpose, nor will any * tcpdump release use them, either. * * Do *NOT* use these in capture files that you expect anybody not using * your private versions of capture-file-reading tools to read; in * particular, do *NOT* use them in products, otherwise you may find that * people won't be able to use tcpdump, or snort, or Ethereal, or... to * read capture files from your firewall/intrusion detection/traffic * monitoring/etc. appliance, or whatever product uses that LINKTYPE_ value, * and you may also find that the developers of those applications will * not accept patches to let them read those files. * * Also, do not use them if somebody might send you a capture using them * for *their* private type and tools using them for *your* private type * would have to read them. * * Instead, in those cases, ask "tcpdump-workers@tcpdump.org" for a new DLT_ * and LINKTYPE_ value, as per the comment in pcap-bpf.h, and use the type * you're given. */#define LINKTYPE_USER0 147#define LINKTYPE_USER1 148#define LINKTYPE_USER2 149#define LINKTYPE_USER3 150#define LINKTYPE_USER4 151#define LINKTYPE_USER5 152#define LINKTYPE_USER6 153#define LINKTYPE_USER7 154#define LINKTYPE_USER8 155#define LINKTYPE_USER9 156#define LINKTYPE_USER10 157#define LINKTYPE_USER11 158#define LINKTYPE_USER12 159#define LINKTYPE_USER13 160#define LINKTYPE_USER14 161#define LINKTYPE_USER15 162/* * For future use with 802.11 captures - defined by AbsoluteValue * Systems to store a number of bits of link-layer information * including radio information: * * http://www.shaftnet.org/~pizza/software/capturefrm.txt * * but could and arguably should also be used by non-AVS Linux * 802.11 drivers; that may happen in the future. */#define LINKTYPE_IEEE802_11_RADIO_AVS 163 /* 802.11 plus AVS radio header *//* * Juniper-private data link type, as per request from * Hannes Gredler <hannes@juniper.net>. The corresponding * DLT_s are used for passing on chassis-internal * metainformation such as QOS profiles, etc.. */#define LINKTYPE_JUNIPER_MONITOR 164/* * Reserved for BACnet MS/TP. */#define LINKTYPE_BACNET_MS_TP 165/* * Another PPP variant as per request from Karsten Keil <kkeil@suse.de>. * * This is used in some OSes to allow a kernel socket filter to distinguish * between incoming and outgoing packets, on a socket intended to * supply pppd with outgoing packets so it can do dial-on-demand and * hangup-on-lack-of-demand; incoming packets are filtered out so they * don't cause pppd to hold the connection up (you don't want random * input packets such as port scans, packets from old lost connections, * etc. to force the connection to stay up). * * The first byte of the PPP header (0xff03) is modified to accomodate * the direction - 0x00 = IN, 0x01 = OUT. */#define LINKTYPE_PPP_PPPD 166/* * Juniper-private data link type, as per request from * Hannes Gredler <hannes@juniper.net>. The DLT_s are used * for passing on chassis-internal metainformation such as * QOS profiles, cookies, etc.. */#define LINKTYPE_JUNIPER_PPPOE 167#define LINKTYPE_JUNIPER_PPPOE_ATM 168#define LINKTYPE_GPRS_LLC 169 /* GPRS LLC */#define LINKTYPE_GPF_T 170 /* GPF-T (ITU-T G.7041/Y.1303) */#define LINKTYPE_GPF_F 171 /* GPF-T (ITU-T G.7041/Y.1303) *//* * Requested by Oolan Zimmer <oz@gcom.com> for use in Gcom's T1/E1 line * monitoring equipment. */#define LINKTYPE_GCOM_T1E1 172#define LINKTYPE_GCOM_SERIAL 173/* * Juniper-private data link type, as per request from * Hannes Gredler <hannes@juniper.net>. The DLT_ is used * for internal communication to Physical Interface Cards (PIC) */#define LINKTYPE_JUNIPER_PIC_PEER 174/* * Link types requested by Gregor Maier <gregor@endace.com> of Endace * Measurement Systems. They add an ERF header (see * http://www.endace.com/support/EndaceRecordFormat.pdf) in front of * the link-layer header. */#define LINKTYPE_ERF_ETH 175 /* Ethernet */#define LINKTYPE_ERF_POS 176 /* Packet-over-SONET *//* * Requested by Daniele Orlandi <daniele@orlandi.com> for raw LAPD * for vISDN (http://www.orlandi.com/visdn/). Its link-layer header * includes additional information before the LAPD header, so it's * not necessarily a generic LAPD header. */#define LINKTYPE_LINUX_LAPD 177/* * Juniper-private data link type, as per request from * Hannes Gredler <hannes@juniper.net>. * The Link Types are used for prepending meta-information * like interface index, interface name * before standard Ethernet, PPP, Frelay & C-HDLC Frames */#define LINKTYPE_JUNIPER_ETHER 178#define LINKTYPE_JUNIPER_PPP 179#define LINKTYPE_JUNIPER_FRELAY 180#define LINKTYPE_JUNIPER_CHDLC 181/* * Multi Link Frame Relay (FRF.16) */#define LINKTYPE_MFR 182/* * Juniper-private data link type, as per request from * Hannes Gredler <hannes@juniper.net>. * The DLT_ is used for internal communication with a * voice Adapter Card (PIC) */#define LINKTYPE_JUNIPER_VP 183/* * Arinc 429 frames. * DLT_ requested by Gianluca Varenni <gianluca.varenni@cacetech.com>. * Every frame contains a 32bit A429 label. * More documentation on Arinc 429 can be found at * http://www.condoreng.com/support/downloads/tutorials/ARINCTutorial.pdf */#define LINKTYPE_A429 184/* * Arinc 653 Interpartition Communication messages. * DLT_ requested by Gianluca Varenni <gianluca.varenni@cacetech.com>. * Please refer to the A653-1 standard for more information. */#define LINKTYPE_A653_ICM 185/*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -