Update contrib.
2 * Copyright (c) 1994, 1995, 1996
3 * The Regents of the University of California. All rights reserved.
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * 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.
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
33 * @(#) $Header: /tcpdump/master/libpcap/pcap-int.h,v 1.68.2.9 2006/02/22 17:09:54 gianluca Exp $ (LBL)
67 swapped_type_t lengths_swapped;
74 struct pcap_stat stat;
76 int use_bpf; /* using kernel filter */
77 u_long TotPkts; /* can't oflow for 79 hrs on ether */
78 u_long TotAccepted; /* count accepted by filter */
79 u_long TotDrops; /* count of dropped packets */
80 long TotMissed; /* missed by i/f during this run */
81 long OrigMissed; /* missed by i/f before this run */
82 char *device; /* device name */
84 int sock_packet; /* using Linux 2.0 compatible interface */
85 int timeout; /* timeout specified to pcap_open_live */
86 int clear_promisc; /* must clear promiscuous mode when we close */
87 int cooked; /* using SOCK_DGRAM rather than SOCK_RAW */
88 int ifindex; /* interface index of device we're bound to */
89 int lo_ifindex; /* interface index of the loopback device */
90 struct pcap *next; /* list of open promiscuous sock_packet pcaps */
91 u_int packets_read; /* count of packets read with recvfrom() */
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 */
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
109 #endif /* HAVE_DAG_API */
113 There is really a mess with previous variables, and it seems to me that they are not used
114 (they are used in pcap_pf.c only). I think we have to start using them.
115 The meaning is the following:
117 - TotPkts: the amount of packets received by the bpf filter, *before* applying the filter
118 - TotAccepted: the amount of packets that satisfies the filter
119 - TotDrops: the amount of packet that were dropped into the kernel buffer because of lack of space
120 - TotMissed: the amount of packets that were dropped by the physical interface; it is basically
121 the value of the hardware counter into the card. This number is never put to zero, so this number
122 takes into account the *total* number of interface drops starting from the interface power-on.
123 - OrigMissed: the amount of packets that were dropped by the interface *when the capture begins*.
124 This value is used to detect the number of packets dropped by the interface *during the present
125 capture*, so that (ps_ifdrops= TotMissed - OrigMissed).
127 unsigned int TotNetDrops; //!< keeps the number of packets that have been dropped by the network
129 \brief It keeps the number of packets that have been received by the application.
131 Packets dropped by the kernel buffer are not counted in this variable. The variable is always
132 equal to (TotAccepted - TotDrops), exept for the case of remote capture, in which we have also
133 packets in fligh, i.e. that have been transmitted by the remote host, but that have not been
134 received (yet) from the client. In this case, (TotAccepted - TotDrops - TotNetDrops) gives a
135 wrong result, since this number does not corresponds always to the number of packet received by
136 the application. For this reason, in the remote capture we need another variable that takes
137 into account of the number of packets actually received by the application.
139 unsigned int TotCapt;
140 #endif /* HAVE_REMOTE */
144 * 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
145 * Tru64 UNIX, and NetBSD pad to make everything line up on a nice boundary.
147 #if defined(ultrix) || defined(__osf__) || (defined(__NetBSD__) && __NetBSD_Version__ > 106000000)
148 #define PCAP_FDDIPAD 3
164 int tzoff; /* timezone offset */
165 int offset; /* offset for proper alignment */
167 int break_loop; /* flag set to force break from packet-reading loop */
174 int inter_packet_wait; /* offline: wait between packets */
175 void (*wait_proc)(void); /* call proc while waiting */
190 * Place holder for pcap_next().
194 /* We're accepting only packets in this direction/these directions. */
195 pcap_direction_t direction;
200 int (*read_op)(pcap_t *, int cnt, pcap_handler, u_char *);
201 int (*inject_op)(pcap_t *, const void *, size_t);
202 int (*setfilter_op)(pcap_t *, struct bpf_program *);
203 int (*setdirection_op)(pcap_t *, pcap_direction_t);
204 int (*set_datalink_op)(pcap_t *, int);
205 int (*getnonblock_op)(pcap_t *, char *);
206 int (*setnonblock_op)(pcap_t *, int, char *);
207 int (*stats_op)(pcap_t *, struct pcap_stat *);
208 void (*close_op)(pcap_t *);
211 * Placeholder for filter code if bpf not in kernel.
213 struct bpf_program fcode;
215 char errbuf[PCAP_ERRBUF_SIZE + 1];
219 struct pcap_pkthdr pcap_header; /* This is needed for the pcap_next_ex() to work */
222 #ifndef WIN32 // Win32 already defines 'timeout'
223 int timeout; //!< timeout to be used in the pcap_open()
225 /*! \brief '1' if we're the network client; needed by several functions (like pcap_setfilter() ) to know if
226 they have to use the socket or they have to open the local adapter. */
229 SOCKET rmt_sockctrl; //!< socket ID of the socket used for the control connection
230 SOCKET rmt_sockdata; //!< socket ID of the socket used for the data connection
231 int rmt_flags; //!< we have to save flags, since they are passed by the pcap_open_live(), but they are used by the pcap_startcapture()
232 int rmt_capstarted; //!< 'true' if the capture is already started (needed to knoe if we have to call the pcap_startcapture()
233 struct pcap_samp rmt_samp; //!< Keeps the parameters related to the sampling process.
234 char *currentfilter; //!< Pointer to a buffer (allocated at run-time) that stores the current filter. Needed when flag PCAP_OPENFLAG_NOCAPTURE_RPCAP is turned on.
235 #endif /* HAVE_REMOTE */
239 * This is a timeval as stored in a savefile.
240 * It has to use the same types everywhere, independent of the actual
241 * `struct timeval'; `struct timeval' has 32-bit tv_sec values on some
242 * platforms and 64-bit tv_sec values on other platforms, and writing
243 * out native `struct timeval' values would mean files could only be
244 * read on systems with the same tv_sec size as the system on which
245 * the file was written.
248 struct pcap_timeval {
249 bpf_int32 tv_sec; /* seconds */
250 bpf_int32 tv_usec; /* microseconds */
254 * This is a `pcap_pkthdr' as actually stored in a savefile.
256 * Do not change the format of this structure, in any way (this includes
257 * changes that only affect the length of fields in this structure),
258 * and do not make the time stamp anything other than seconds and
259 * microseconds (e.g., seconds and nanoseconds). Instead:
261 * introduce a new structure for the new format;
263 * send mail to "tcpdump-workers@tcpdump.org", requesting a new
264 * magic number for your new capture file format, and, when
265 * you get the new magic number, put it in "savefile.c";
267 * use that magic number for save files with the changed record
270 * make the code in "savefile.c" capable of reading files with
271 * the old record header as well as files with the new record header
272 * (using the magic number to determine the header format).
274 * Then supply the changes to "patches@tcpdump.org", so that future
275 * versions of libpcap and programs that use it (such as tcpdump) will
276 * be able to read your new capture file format.
279 struct pcap_sf_pkthdr {
280 struct pcap_timeval ts; /* time stamp */
281 bpf_u_int32 caplen; /* length of portion present */
282 bpf_u_int32 len; /* length this packet (off wire) */
286 * How a `pcap_pkthdr' is actually stored in savefiles written
287 * by some patched versions of libpcap (e.g. the ones in Red
288 * Hat Linux 6.1 and 6.2).
290 * Do not change the format of this structure, in any way (this includes
291 * changes that only affect the length of fields in this structure).
292 * Instead, introduce a new structure, as per the above.
295 struct pcap_sf_patched_pkthdr {
296 struct pcap_timeval ts; /* time stamp */
297 bpf_u_int32 caplen; /* length of portion present */
298 bpf_u_int32 len; /* length this packet (off wire) */
300 unsigned short protocol;
301 unsigned char pkt_type;
307 #define min(a, b) ((a) > (b) ? (b) : (a))
310 /* XXX should these be in pcap.h? */
311 int pcap_offline_read(pcap_t *, int, pcap_handler, u_char *);
312 int pcap_read(pcap_t *, int cnt, pcap_handler, u_char *);
315 #define strlcpy(x, y, z) \
316 (strncpy((x), (y), (z)), \
317 ((z) <= 0 ? 0 : ((x)[(z) - 1] = '\0')), \
323 #if !defined(HAVE_SNPRINTF)
324 #define snprintf pcap_snprintf
325 extern int snprintf (char *, size_t, const char *, ...);
328 #if !defined(HAVE_VSNPRINTF)
329 #define vsnprintf pcap_vsnprintf
330 extern int vsnprintf (char *, size_t, const char *, va_list ap);
334 * Routines that most pcap implementations can use for non-blocking mode.
336 #if !defined(WIN32) && !defined(MSDOS)
337 int pcap_getnonblock_fd(pcap_t *, char *);
338 int pcap_setnonblock_fd(pcap_t *p, int, char *);
341 void pcap_close_common(pcap_t *);
344 * Internal interfaces for "pcap_findalldevs()".
346 * "pcap_platform_finddevs()" is a platform-dependent routine to
347 * add devices not found by the "standard" mechanisms (SIOCGIFCONF,
348 * "getifaddrs()", etc..
350 * "pcap_add_if()" adds an interface to the list of interfaces.
352 int pcap_platform_finddevs(pcap_if_t **, char *);
353 int add_addr_to_iflist(pcap_if_t **, const char *, u_int, struct sockaddr *,
354 size_t, struct sockaddr *, size_t, struct sockaddr *, size_t,
355 struct sockaddr *, size_t, char *);
356 int pcap_add_if(pcap_if_t **, const char *, u_int, const char *, char *);
357 struct sockaddr *dup_sockaddr(struct sockaddr *, size_t);
358 int add_or_find_if(pcap_if_t **, pcap_if_t **, const char *, u_int,
359 const char *, char *);
362 char *pcap_win32strerror(void);
365 int install_bpf_program(pcap_t *, struct bpf_program *);
367 int pcap_strcasecmp(const char *, const char *);