1999-10-07 23:46:40 +00:00
|
|
|
/*
|
|
|
|
* Copyright (c) 1994, 1995, 1996
|
|
|
|
* 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 the following conditions
|
|
|
|
* are met:
|
|
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer.
|
|
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
|
|
* documentation and/or other materials provided with the distribution.
|
|
|
|
* 3. All advertising materials mentioning features or use of this software
|
|
|
|
* must display the following acknowledgement:
|
|
|
|
* This product includes software developed by the Computer Systems
|
|
|
|
* Engineering Group at Lawrence Berkeley Laboratory.
|
|
|
|
* 4. Neither the name of the University nor of the Laboratory may be used
|
|
|
|
* to endorse or promote products derived from this software without
|
|
|
|
* specific prior written permission.
|
|
|
|
*
|
|
|
|
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
|
|
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
|
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
|
|
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
|
|
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
|
|
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
|
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
|
|
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
|
|
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
|
|
|
* SUCH DAMAGE.
|
|
|
|
*
|
2002-08-02 03:25:32 +00:00
|
|
|
* @(#) $Header: /tcpdump/master/libpcap/pcap-int.h,v 1.39 2002-08-02 03:25:32 guy Exp $ (LBL)
|
1999-10-07 23:46:40 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef pcap_int_h
|
|
|
|
#define pcap_int_h
|
|
|
|
|
2000-07-29 07:36:41 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
|
|
|
#endif
|
|
|
|
|
1999-10-07 23:46:40 +00:00
|
|
|
#include <pcap.h>
|
|
|
|
|
2002-08-01 08:33:01 +00:00
|
|
|
#ifdef WIN32
|
|
|
|
#include <packet32.h>
|
|
|
|
#endif /* WIN32 */
|
|
|
|
|
1999-10-07 23:46:40 +00:00
|
|
|
/*
|
|
|
|
* Savefile
|
|
|
|
*/
|
|
|
|
struct pcap_sf {
|
|
|
|
FILE *rfile;
|
|
|
|
int swapped;
|
2000-07-18 03:43:47 +00:00
|
|
|
int hdrsize;
|
1999-10-07 23:46:40 +00:00
|
|
|
int version_major;
|
|
|
|
int version_minor;
|
|
|
|
u_char *base;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct pcap_md {
|
|
|
|
struct pcap_stat stat;
|
|
|
|
/*XXX*/
|
2000-06-08 06:40:09 +00:00
|
|
|
int use_bpf; /* using kernel filter */
|
1999-10-07 23:46:40 +00:00
|
|
|
u_long TotPkts; /* can't oflow for 79 hrs on ether */
|
|
|
|
u_long TotAccepted; /* count accepted by filter */
|
|
|
|
u_long TotDrops; /* count of dropped packets */
|
|
|
|
long TotMissed; /* missed by i/f during this run */
|
|
|
|
long OrigMissed; /* missed by i/f before this run */
|
|
|
|
#ifdef linux
|
2000-06-08 06:40:09 +00:00
|
|
|
int sock_packet; /* using Linux 2.0 compatible interface */
|
|
|
|
int timeout; /* timeout specified to pcap_open_live */
|
Clean up promiscuous mode, when using SOCK_PACKET, as best we can;
remember which pcap_t's were opened (with SOCK_PACKET) in promiscuous
mode on interfaces not already in promiscuous mode, turn promiscuous
mode off when closing such a pcap_t, and arrange that, when the program
exits, all pcap_t's of that sort not already closed have their
interfaces taken out of promiscuous mode. (It's not sufficient to do
this on exit - applications may close a pcap_t without exiting, e.g.
Ethereal.)
This won't always work right (if somebody else requests promiscuous mode
after it's opened by libpcap, we'll turn promiscuous mode off when we
close the pcap_t, and if the program doesn't exit cleanly, it won't
clean up the interfaces), but neither of those problems are fixable -
the only way to get things to work correctly is to use PF_PACKET
sockets, which requires a 2.2 or later kernel.
On a 2.0[.x] kernel, when doing a "recvfrom()" on a SOCK_PACKET socket
to read a captured packet, don't pass a byte count value based on the
snapshot length - "recvfrom()" won't return the actual packet length if
you do that. (2.2 and later kernels will return the actual packet
length if MSG_TRUNC is passed in.)
2000-12-16 10:43:26 +00:00
|
|
|
int clear_promisc; /* must clear promiscuous mode when we close */
|
2000-12-21 10:29:21 +00:00
|
|
|
int cooked; /* using SOCK_DGRAM rather than SOCK_RAW */
|
If we're receiving packets from a PF_PACKET socket, check whether the
interface index of the interface for the packet is the interface index
of the loopback interface and, if it is, check if the packet is an
outgoing packet; if so, ignore it, as we'll also be seeing that packet
as a received packet.
If we don't handle the arphrd type of an interface, and fall back on
cooked mode, report the arphrd type, so we know what type we should
consider supporting (if that type can't be supported well, e.g. if you
don't get any link-layer header, as happens with PPP, we'd be silent).
2000-10-25 07:46:49 +00:00
|
|
|
int lo_ifindex; /* interface index of the loopback device */
|
2000-06-08 06:40:09 +00:00
|
|
|
char *device; /* device name */
|
Clean up promiscuous mode, when using SOCK_PACKET, as best we can;
remember which pcap_t's were opened (with SOCK_PACKET) in promiscuous
mode on interfaces not already in promiscuous mode, turn promiscuous
mode off when closing such a pcap_t, and arrange that, when the program
exits, all pcap_t's of that sort not already closed have their
interfaces taken out of promiscuous mode. (It's not sufficient to do
this on exit - applications may close a pcap_t without exiting, e.g.
Ethereal.)
This won't always work right (if somebody else requests promiscuous mode
after it's opened by libpcap, we'll turn promiscuous mode off when we
close the pcap_t, and if the program doesn't exit cleanly, it won't
clean up the interfaces), but neither of those problems are fixable -
the only way to get things to work correctly is to use PF_PACKET
sockets, which requires a 2.2 or later kernel.
On a 2.0[.x] kernel, when doing a "recvfrom()" on a SOCK_PACKET socket
to read a captured packet, don't pass a byte count value based on the
snapshot length - "recvfrom()" won't return the actual packet length if
you do that. (2.2 and later kernels will return the actual packet
length if MSG_TRUNC is passed in.)
2000-12-16 10:43:26 +00:00
|
|
|
struct pcap *next; /* list of open promiscuous sock_packet pcaps */
|
1999-10-07 23:46:40 +00:00
|
|
|
#endif
|
|
|
|
};
|
|
|
|
|
|
|
|
struct pcap {
|
2002-08-01 08:33:01 +00:00
|
|
|
#ifdef WIN32
|
|
|
|
ADAPTER *adapter;
|
|
|
|
LPPACKET Packet;
|
|
|
|
int timeout;
|
|
|
|
int nonblock;
|
|
|
|
#else
|
1999-10-07 23:46:40 +00:00
|
|
|
int fd;
|
2002-08-01 08:33:01 +00:00
|
|
|
#endif /* WIN32 */
|
1999-10-07 23:46:40 +00:00
|
|
|
int snapshot;
|
|
|
|
int linktype;
|
|
|
|
int tzoff; /* timezone offset */
|
|
|
|
int offset; /* offset for proper alignment */
|
|
|
|
|
|
|
|
struct pcap_sf sf;
|
|
|
|
struct pcap_md md;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Read buffer.
|
|
|
|
*/
|
|
|
|
int bufsize;
|
|
|
|
u_char *buffer;
|
|
|
|
u_char *bp;
|
|
|
|
int cc;
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Place holder for pcap_next().
|
|
|
|
*/
|
|
|
|
u_char *pkt;
|
|
|
|
|
2002-06-11 17:04:44 +00:00
|
|
|
|
1999-10-07 23:46:40 +00:00
|
|
|
/*
|
|
|
|
* Placeholder for filter code if bpf not in kernel.
|
|
|
|
*/
|
|
|
|
struct bpf_program fcode;
|
|
|
|
|
|
|
|
char errbuf[PCAP_ERRBUF_SIZE];
|
|
|
|
};
|
|
|
|
|
1999-11-21 01:10:20 +00:00
|
|
|
/*
|
|
|
|
* This is a timeval as stored in disk in a dumpfile.
|
|
|
|
* It has to use the same types everywhere, independent of the actual
|
|
|
|
* `struct timeval'
|
|
|
|
*/
|
|
|
|
|
|
|
|
struct pcap_timeval {
|
|
|
|
bpf_int32 tv_sec; /* seconds */
|
|
|
|
bpf_int32 tv_usec; /* microseconds */
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* How a `pcap_pkthdr' is actually stored in the dumpfile.
|
2000-09-14 09:49:28 +00:00
|
|
|
*
|
|
|
|
* Do not change the format of this structure, in any way (this includes
|
|
|
|
* changes that only affect the length of fields in this structure),
|
|
|
|
* and do not make the time stamp anything other than seconds and
|
|
|
|
* microseconds (e.g., seconds and nanoseconds). Instead:
|
|
|
|
*
|
|
|
|
* introduce a new structure for the new format;
|
|
|
|
*
|
|
|
|
* send mail to "tcpdump-workers@tcpdump.org", requesting a new
|
|
|
|
* magic number for your new capture file format, and, when
|
|
|
|
* you get the new magic number, put it in "savefile.c";
|
|
|
|
*
|
|
|
|
* use that magic number for save files with the changed record
|
|
|
|
* header;
|
|
|
|
*
|
|
|
|
* make the code in "savefile.c" capable of reading files with
|
|
|
|
* the old record header as well as files with the new record header
|
|
|
|
* (using the magic number to determine the header format).
|
|
|
|
*
|
|
|
|
* Then supply the changes to "patches@tcpdump.org", so that future
|
|
|
|
* versions of libpcap and programs that use it (such as tcpdump) will
|
|
|
|
* be able to read your new capture file format.
|
1999-11-21 01:10:20 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
struct pcap_sf_pkthdr {
|
|
|
|
struct pcap_timeval ts; /* time stamp */
|
|
|
|
bpf_u_int32 caplen; /* length of portion present */
|
|
|
|
bpf_u_int32 len; /* length this packet (off wire) */
|
|
|
|
};
|
|
|
|
|
2000-07-18 03:43:47 +00:00
|
|
|
/*
|
|
|
|
* How a `pcap_pkthdr' is actually stored in dumpfiles written
|
|
|
|
* by some patched versions of libpcap (e.g. the ones in Red
|
|
|
|
* Hat Linux 6.1 and 6.2).
|
2000-09-14 09:49:28 +00:00
|
|
|
*
|
|
|
|
* Do not change the format of this structure, in any way (this includes
|
|
|
|
* changes that only affect the length of fields in this structure).
|
|
|
|
* Instead, introduce a new structure, as per the above.
|
2000-07-18 03:43:47 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
struct pcap_sf_patched_pkthdr {
|
|
|
|
struct pcap_timeval ts; /* time stamp */
|
|
|
|
bpf_u_int32 caplen; /* length of portion present */
|
|
|
|
bpf_u_int32 len; /* length this packet (off wire) */
|
|
|
|
int index;
|
|
|
|
unsigned short protocol;
|
|
|
|
unsigned char pkt_type;
|
|
|
|
};
|
|
|
|
|
1999-10-07 23:46:40 +00:00
|
|
|
int yylex(void);
|
|
|
|
|
|
|
|
#ifndef min
|
|
|
|
#define min(a, b) ((a) > (b) ? (b) : (a))
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* XXX should these be in pcap.h? */
|
|
|
|
int pcap_offline_read(pcap_t *, int, pcap_handler, u_char *);
|
|
|
|
int pcap_read(pcap_t *, int cnt, pcap_handler, u_char *);
|
|
|
|
|
2002-08-01 08:33:01 +00:00
|
|
|
#ifdef WIN32
|
|
|
|
/* sf_next_packet must be exported for pcap_read_ex */
|
|
|
|
int sf_next_packet(pcap_t *, struct pcap_pkthdr *, u_char *, int);
|
|
|
|
#endif
|
|
|
|
|
2000-09-19 03:28:10 +00:00
|
|
|
/*
|
|
|
|
* Ultrix, DEC OSF/1^H^H^H^H^H^H^H^H^HDigital UNIX^H^H^H^H^H^H^H^H^H^H^H^H
|
|
|
|
* Tru64 UNIX, and NetBSD pad to make everything line up on a nice boundary.
|
|
|
|
*/
|
|
|
|
#if defined(ultrix) || defined(__osf__) || defined(__NetBSD__)
|
1999-10-07 23:46:40 +00:00
|
|
|
#define PCAP_FDDIPAD 3
|
|
|
|
#endif
|
|
|
|
|
2000-05-04 13:34:24 +00:00
|
|
|
#ifndef HAVE_STRLCPY
|
|
|
|
#define strlcpy(x, y, z) \
|
2000-07-04 00:22:03 +00:00
|
|
|
(strncpy((x), (y), (z)), \
|
|
|
|
((z) <= 0 ? 0 : ((x)[(z) - 1] = '\0')), \
|
|
|
|
strlen((y)))
|
2000-05-04 13:34:24 +00:00
|
|
|
#endif
|
|
|
|
|
2002-07-11 09:06:30 +00:00
|
|
|
/*
|
|
|
|
* Internal interfaces for "pcap_findalldevs()".
|
|
|
|
*
|
|
|
|
* "pcap_platform_finddevs()" is a platform-dependent routine to
|
|
|
|
* add devices not found by the "standard" mechanisms (SIOCGIFCONF,
|
|
|
|
* "getifaddrs()", etc..
|
|
|
|
*
|
|
|
|
* "pcap_add_if()" adds an interface to the list of interfaces.
|
|
|
|
*/
|
|
|
|
int pcap_platform_finddevs(pcap_if_t **, char *);
|
2002-07-27 18:45:34 +00:00
|
|
|
int add_addr_to_iflist(pcap_if_t **, char *, u_int, struct sockaddr *,
|
2002-07-30 08:12:13 +00:00
|
|
|
size_t, struct sockaddr *, size_t, struct sockaddr *, size_t,
|
|
|
|
struct sockaddr *, size_t, char *);
|
2002-07-11 09:06:30 +00:00
|
|
|
int pcap_add_if(pcap_if_t **, char *, u_int, const char *, char *);
|
2002-08-02 03:25:32 +00:00
|
|
|
struct sockaddr *dup_sockaddr(struct sockaddr *, size_t);
|
|
|
|
int add_or_find_if(pcap_if_t **, pcap_if_t **, char *, u_int,
|
|
|
|
const char *, char *);
|
2002-07-11 09:06:30 +00:00
|
|
|
|
Clean up promiscuous mode, when using SOCK_PACKET, as best we can;
remember which pcap_t's were opened (with SOCK_PACKET) in promiscuous
mode on interfaces not already in promiscuous mode, turn promiscuous
mode off when closing such a pcap_t, and arrange that, when the program
exits, all pcap_t's of that sort not already closed have their
interfaces taken out of promiscuous mode. (It's not sufficient to do
this on exit - applications may close a pcap_t without exiting, e.g.
Ethereal.)
This won't always work right (if somebody else requests promiscuous mode
after it's opened by libpcap, we'll turn promiscuous mode off when we
close the pcap_t, and if the program doesn't exit cleanly, it won't
clean up the interfaces), but neither of those problems are fixable -
the only way to get things to work correctly is to use PF_PACKET
sockets, which requires a 2.2 or later kernel.
On a 2.0[.x] kernel, when doing a "recvfrom()" on a SOCK_PACKET socket
to read a captured packet, don't pass a byte count value based on the
snapshot length - "recvfrom()" won't return the actual packet length if
you do that. (2.2 and later kernels will return the actual packet
length if MSG_TRUNC is passed in.)
2000-12-16 10:43:26 +00:00
|
|
|
#ifdef linux
|
|
|
|
void pcap_close_linux(pcap_t *);
|
|
|
|
#endif
|
|
|
|
|
2002-08-01 08:33:01 +00:00
|
|
|
#ifdef WIN32
|
|
|
|
char *pcap_win32strerror(void);
|
|
|
|
#endif
|
|
|
|
|
1999-10-07 23:46:40 +00:00
|
|
|
/* XXX */
|
|
|
|
extern int pcap_fddipad;
|
2000-07-29 07:36:41 +00:00
|
|
|
|
2000-11-04 10:09:55 +00:00
|
|
|
int install_bpf_program(pcap_t *, struct bpf_program *);
|
|
|
|
|
2000-07-29 07:36:41 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
1999-10-07 23:46:40 +00:00
|
|
|
#endif
|