pcap-int.h revision 162015
15480Swollman/*
250476Speter * Copyright (c) 1994, 1995, 1996
31638Srgrimes *	The Regents of the University of California.  All rights reserved.
4106146Sru *
5106146Sru * Redistribution and use in source and binary forms, with or without
6106146Sru * modification, are permitted provided that the following conditions
7136910Sru * are met:
81638Srgrimes * 1. Redistributions of source code must retain the above copyright
91638Srgrimes *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 3. All advertising materials mentioning features or use of this software
14 *    must display the following acknowledgement:
15 *	This product includes software developed by the Computer Systems
16 *	Engineering Group at Lawrence Berkeley Laboratory.
17 * 4. Neither the name of the University nor of the Laboratory may be used
18 *    to endorse or promote products derived from this software without
19 *    specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31 * SUCH DAMAGE.
32 *
33 * $FreeBSD: head/contrib/libpcap/pcap-int.h 162015 2006-09-04 19:54:21Z sam $
34 * @(#) $Header: /tcpdump/master/libpcap/pcap-int.h,v 1.68.2.6 2005/07/07 06:56:04 guy Exp $ (LBL)
35 */
36
37#ifndef pcap_int_h
38#define pcap_int_h
39
40#ifdef __cplusplus
41extern "C" {
42#endif
43
44#include <pcap.h>
45
46#ifdef WIN32
47#include <packet32.h>
48#endif /* WIN32 */
49
50#ifdef MSDOS
51#include <fcntl.h>
52#include <io.h>
53#endif
54
55/*
56 * Savefile
57 */
58typedef enum {
59	NOT_SWAPPED,
60	SWAPPED,
61	MAYBE_SWAPPED
62} swapped_type_t;
63
64struct pcap_sf {
65	FILE *rfile;
66	int swapped;
67	int hdrsize;
68	swapped_type_t lengths_swapped;
69	int version_major;
70	int version_minor;
71	u_char *base;
72};
73
74struct pcap_md {
75	struct pcap_stat stat;
76	/*XXX*/
77	int use_bpf;		/* using kernel filter */
78	u_long	TotPkts;	/* can't oflow for 79 hrs on ether */
79	u_long	TotAccepted;	/* count accepted by filter */
80	u_long	TotDrops;	/* count of dropped packets */
81	long	TotMissed;	/* missed by i/f during this run */
82	long	OrigMissed;	/* missed by i/f before this run */
83	char	*device;	/* device name */
84#ifdef linux
85	int	sock_packet;	/* using Linux 2.0 compatible interface */
86	int	timeout;	/* timeout specified to pcap_open_live */
87	int	clear_promisc;	/* must clear promiscuous mode when we close */
88	int	cooked;		/* using SOCK_DGRAM rather than SOCK_RAW */
89	int	ifindex;	/* interface index of device we're bound to */
90	int	lo_ifindex;	/* interface index of the loopback device */
91	struct pcap *next;	/* list of open promiscuous sock_packet pcaps */
92#endif
93
94#ifdef HAVE_DAG_API
95#ifdef HAVE_DAG_STREAMS_API
96	u_char	*dag_mem_bottom;	/* DAG card current memory bottom pointer */
97	u_char	*dag_mem_top;	/* DAG card current memory top pointer */
98#else
99	void	*dag_mem_base;	/* DAG card memory base address */
100	u_int	dag_mem_bottom;	/* DAG card current memory bottom offset */
101	u_int	dag_mem_top;	/* DAG card current memory top offset */
102#endif /* HAVE_DAG_STREAMS_API */
103	int	dag_fcs_bits;	/* Number of checksum bits from link layer */
104	int	dag_offset_flags; /* Flags to pass to dag_offset(). */
105	int	dag_stream;	/* DAG stream number */
106	int	dag_timeout;	/* timeout specified to pcap_open_live.
107				 * Same as in linux above, introduce
108				 * generally? */
109#endif /* HAVE_DAG_API */
110};
111
112/*
113 * 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
114 * Tru64 UNIX, and NetBSD pad to make everything line up on a nice boundary.
115 */
116#if defined(ultrix) || defined(__osf__) || (defined(__NetBSD__) && __NetBSD_Version__ > 106000000)
117#define       PCAP_FDDIPAD 3
118#endif
119
120struct pcap {
121#ifdef WIN32
122	ADAPTER *adapter;
123	LPPACKET Packet;
124	int timeout;
125	int nonblock;
126#else
127	int fd;
128	int selectable_fd;
129	int send_fd;
130#endif /* WIN32 */
131	int snapshot;
132	int linktype;
133	int tzoff;		/* timezone offset */
134	int offset;		/* offset for proper alignment */
135
136	int break_loop;		/* flag set to force break from packet-reading loop */
137
138#ifdef PCAP_FDDIPAD
139	int fddipad;
140#endif
141
142#ifdef MSDOS
143        int inter_packet_wait;   /* offline: wait between packets */
144        void (*wait_proc)(void); /*          call proc while waiting */
145#endif
146
147	struct pcap_sf sf;
148	struct pcap_md md;
149
150	/*
151	 * Read buffer.
152	 */
153	int bufsize;
154	u_char *buffer;
155	u_char *bp;
156	int cc;
157
158	/*
159	 * Place holder for pcap_next().
160	 */
161	u_char *pkt;
162
163	/* We're accepting only packets in this direction/these directions. */
164	pcap_direction_t direction;
165
166	/*
167	 * Methods.
168	 */
169	int	(*read_op)(pcap_t *, int cnt, pcap_handler, u_char *);
170	int	(*inject_op)(pcap_t *, const void *, size_t);
171	int	(*setfilter_op)(pcap_t *, struct bpf_program *);
172	int	(*setdirection_op)(pcap_t *, pcap_direction_t);
173	int	(*set_datalink_op)(pcap_t *, int);
174	int	(*getnonblock_op)(pcap_t *, char *);
175	int	(*setnonblock_op)(pcap_t *, int, char *);
176	int	(*stats_op)(pcap_t *, struct pcap_stat *);
177	void	(*close_op)(pcap_t *);
178
179	/*
180	 * Placeholder for filter code if bpf not in kernel.
181	 */
182	struct bpf_program fcode;
183
184	char errbuf[PCAP_ERRBUF_SIZE + 1];
185	int dlt_count;
186	u_int *dlt_list;
187
188	struct pcap_pkthdr pcap_header;	/* This is needed for the pcap_next_ex() to work */
189};
190
191/*
192 * This is a timeval as stored in disk in a dumpfile.
193 * It has to use the same types everywhere, independent of the actual
194 * `struct timeval'
195 */
196
197struct pcap_timeval {
198    bpf_int32 tv_sec;		/* seconds */
199    bpf_int32 tv_usec;		/* microseconds */
200};
201
202/*
203 * How a `pcap_pkthdr' is actually stored in the dumpfile.
204 *
205 * Do not change the format of this structure, in any way (this includes
206 * changes that only affect the length of fields in this structure),
207 * and do not make the time stamp anything other than seconds and
208 * microseconds (e.g., seconds and nanoseconds).  Instead:
209 *
210 *	introduce a new structure for the new format;
211 *
212 *	send mail to "tcpdump-workers@tcpdump.org", requesting a new
213 *	magic number for your new capture file format, and, when
214 *	you get the new magic number, put it in "savefile.c";
215 *
216 *	use that magic number for save files with the changed record
217 *	header;
218 *
219 *	make the code in "savefile.c" capable of reading files with
220 *	the old record header as well as files with the new record header
221 *	(using the magic number to determine the header format).
222 *
223 * Then supply the changes to "patches@tcpdump.org", so that future
224 * versions of libpcap and programs that use it (such as tcpdump) will
225 * be able to read your new capture file format.
226 */
227
228struct pcap_sf_pkthdr {
229    struct pcap_timeval ts;	/* time stamp */
230    bpf_u_int32 caplen;		/* length of portion present */
231    bpf_u_int32 len;		/* length this packet (off wire) */
232};
233
234/*
235 * How a `pcap_pkthdr' is actually stored in dumpfiles written
236 * by some patched versions of libpcap (e.g. the ones in Red
237 * Hat Linux 6.1 and 6.2).
238 *
239 * Do not change the format of this structure, in any way (this includes
240 * changes that only affect the length of fields in this structure).
241 * Instead, introduce a new structure, as per the above.
242 */
243
244struct pcap_sf_patched_pkthdr {
245    struct pcap_timeval ts;	/* time stamp */
246    bpf_u_int32 caplen;		/* length of portion present */
247    bpf_u_int32 len;		/* length this packet (off wire) */
248    int		index;
249    unsigned short protocol;
250    unsigned char pkt_type;
251};
252
253int	yylex(void);
254
255#ifndef min
256#define min(a, b) ((a) > (b) ? (b) : (a))
257#endif
258
259/* XXX should these be in pcap.h? */
260int	pcap_offline_read(pcap_t *, int, pcap_handler, u_char *);
261int	pcap_read(pcap_t *, int cnt, pcap_handler, u_char *);
262
263#ifndef HAVE_STRLCPY
264#define strlcpy(x, y, z) \
265	(strncpy((x), (y), (z)), \
266	 ((z) <= 0 ? 0 : ((x)[(z) - 1] = '\0')), \
267	 strlen((y)))
268#endif
269
270#include <stdarg.h>
271
272/*
273 * Routines that most pcap implementations can use for non-blocking mode.
274 */
275#if !defined(WIN32) && !defined(MSDOS)
276int	pcap_getnonblock_fd(pcap_t *, char *);
277int	pcap_setnonblock_fd(pcap_t *p, int, char *);
278#endif
279
280void	pcap_close_common(pcap_t *);
281
282/*
283 * Internal interfaces for "pcap_findalldevs()".
284 *
285 * "pcap_platform_finddevs()" is a platform-dependent routine to
286 * add devices not found by the "standard" mechanisms (SIOCGIFCONF,
287 * "getifaddrs()", etc..
288 *
289 * "pcap_add_if()" adds an interface to the list of interfaces.
290 */
291int	pcap_platform_finddevs(pcap_if_t **, char *);
292int	add_addr_to_iflist(pcap_if_t **, const char *, u_int, struct sockaddr *,
293	    size_t, struct sockaddr *, size_t, struct sockaddr *, size_t,
294	    struct sockaddr *, size_t, char *);
295int	pcap_add_if(pcap_if_t **, const char *, u_int, const char *, char *);
296struct sockaddr *dup_sockaddr(struct sockaddr *, size_t);
297int	add_or_find_if(pcap_if_t **, pcap_if_t **, const char *, u_int,
298	    const char *, char *);
299
300#ifdef WIN32
301char	*pcap_win32strerror(void);
302#endif
303
304int	install_bpf_program(pcap_t *, struct bpf_program *);
305
306int	pcap_strcasecmp(const char *, const char *);
307
308#ifdef __cplusplus
309}
310#endif
311
312#endif
313