sl@0
|
1 |
/*
|
sl@0
|
2 |
* Copyright (c) 1994, 1995, 1996
|
sl@0
|
3 |
* The Regents of the University of California. All rights reserved.
|
sl@0
|
4 |
*
|
sl@0
|
5 |
* Redistribution and use in source and binary forms, with or without
|
sl@0
|
6 |
* modification, are permitted provided that the following conditions
|
sl@0
|
7 |
* are met:
|
sl@0
|
8 |
* 1. Redistributions of source code must retain the above copyright
|
sl@0
|
9 |
* notice, this list of conditions and the following disclaimer.
|
sl@0
|
10 |
* 2. Redistributions in binary form must reproduce the above copyright
|
sl@0
|
11 |
* notice, this list of conditions and the following disclaimer in the
|
sl@0
|
12 |
* documentation and/or other materials provided with the distribution.
|
sl@0
|
13 |
* 3. All advertising materials mentioning features or use of this software
|
sl@0
|
14 |
* must display the following acknowledgement:
|
sl@0
|
15 |
* This product includes software developed by the Computer Systems
|
sl@0
|
16 |
* Engineering Group at Lawrence Berkeley Laboratory.
|
sl@0
|
17 |
* 4. Neither the name of the University nor of the Laboratory may be used
|
sl@0
|
18 |
* to endorse or promote products derived from this software without
|
sl@0
|
19 |
* specific prior written permission.
|
sl@0
|
20 |
*
|
sl@0
|
21 |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
sl@0
|
22 |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
sl@0
|
23 |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
sl@0
|
24 |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
sl@0
|
25 |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
sl@0
|
26 |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
sl@0
|
27 |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
sl@0
|
28 |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
sl@0
|
29 |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
sl@0
|
30 |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
sl@0
|
31 |
* SUCH DAMAGE.
|
sl@0
|
32 |
*
|
sl@0
|
33 |
* @(#) $Header: /tcpdump/master/libpcap/pcap-int.h,v 1.68.2.9 2006/02/22 17:09:54 gianluca Exp $ (LBL)
|
sl@0
|
34 |
*/
|
sl@0
|
35 |
|
sl@0
|
36 |
#ifndef pcap_int_h
|
sl@0
|
37 |
#define pcap_int_h
|
sl@0
|
38 |
|
sl@0
|
39 |
#ifdef __cplusplus
|
sl@0
|
40 |
extern "C" {
|
sl@0
|
41 |
#endif
|
sl@0
|
42 |
|
sl@0
|
43 |
#include <pcap.h>
|
sl@0
|
44 |
|
sl@0
|
45 |
#ifdef WIN32
|
sl@0
|
46 |
#include <Packet32.h>
|
sl@0
|
47 |
#endif /* WIN32 */
|
sl@0
|
48 |
|
sl@0
|
49 |
#ifdef MSDOS
|
sl@0
|
50 |
#include <fcntl.h>
|
sl@0
|
51 |
#include <io.h>
|
sl@0
|
52 |
#endif
|
sl@0
|
53 |
|
sl@0
|
54 |
/*
|
sl@0
|
55 |
* Savefile
|
sl@0
|
56 |
*/
|
sl@0
|
57 |
typedef enum {
|
sl@0
|
58 |
NOT_SWAPPED,
|
sl@0
|
59 |
SWAPPED,
|
sl@0
|
60 |
MAYBE_SWAPPED
|
sl@0
|
61 |
} swapped_type_t;
|
sl@0
|
62 |
|
sl@0
|
63 |
struct pcap_sf {
|
sl@0
|
64 |
FILE *rfile;
|
sl@0
|
65 |
int swapped;
|
sl@0
|
66 |
int hdrsize;
|
sl@0
|
67 |
swapped_type_t lengths_swapped;
|
sl@0
|
68 |
int version_major;
|
sl@0
|
69 |
int version_minor;
|
sl@0
|
70 |
u_char *base;
|
sl@0
|
71 |
};
|
sl@0
|
72 |
|
sl@0
|
73 |
struct pcap_md {
|
sl@0
|
74 |
struct pcap_stat stat;
|
sl@0
|
75 |
/*XXX*/
|
sl@0
|
76 |
int use_bpf; /* using kernel filter */
|
sl@0
|
77 |
u_long TotPkts; /* can't oflow for 79 hrs on ether */
|
sl@0
|
78 |
u_long TotAccepted; /* count accepted by filter */
|
sl@0
|
79 |
u_long TotDrops; /* count of dropped packets */
|
sl@0
|
80 |
long TotMissed; /* missed by i/f during this run */
|
sl@0
|
81 |
long OrigMissed; /* missed by i/f before this run */
|
sl@0
|
82 |
char *device; /* device name */
|
sl@0
|
83 |
#ifdef linux
|
sl@0
|
84 |
int sock_packet; /* using Linux 2.0 compatible interface */
|
sl@0
|
85 |
int timeout; /* timeout specified to pcap_open_live */
|
sl@0
|
86 |
int clear_promisc; /* must clear promiscuous mode when we close */
|
sl@0
|
87 |
int cooked; /* using SOCK_DGRAM rather than SOCK_RAW */
|
sl@0
|
88 |
int ifindex; /* interface index of device we're bound to */
|
sl@0
|
89 |
int lo_ifindex; /* interface index of the loopback device */
|
sl@0
|
90 |
struct pcap *next; /* list of open promiscuous sock_packet pcaps */
|
sl@0
|
91 |
u_int packets_read; /* count of packets read with recvfrom() */
|
sl@0
|
92 |
#endif
|
sl@0
|
93 |
|
sl@0
|
94 |
#ifdef HAVE_DAG_API
|
sl@0
|
95 |
#ifdef HAVE_DAG_STREAMS_API
|
sl@0
|
96 |
u_char *dag_mem_bottom; /* DAG card current memory bottom pointer */
|
sl@0
|
97 |
u_char *dag_mem_top; /* DAG card current memory top pointer */
|
sl@0
|
98 |
#else
|
sl@0
|
99 |
void *dag_mem_base; /* DAG card memory base address */
|
sl@0
|
100 |
u_int dag_mem_bottom; /* DAG card current memory bottom offset */
|
sl@0
|
101 |
u_int dag_mem_top; /* DAG card current memory top offset */
|
sl@0
|
102 |
#endif /* HAVE_DAG_STREAMS_API */
|
sl@0
|
103 |
int dag_fcs_bits; /* Number of checksum bits from link layer */
|
sl@0
|
104 |
int dag_offset_flags; /* Flags to pass to dag_offset(). */
|
sl@0
|
105 |
int dag_stream; /* DAG stream number */
|
sl@0
|
106 |
int dag_timeout; /* timeout specified to pcap_open_live.
|
sl@0
|
107 |
* Same as in linux above, introduce
|
sl@0
|
108 |
* generally? */
|
sl@0
|
109 |
#endif /* HAVE_DAG_API */
|
sl@0
|
110 |
|
sl@0
|
111 |
#ifdef HAVE_REMOTE
|
sl@0
|
112 |
/*!
|
sl@0
|
113 |
There is really a mess with previous variables, and it seems to me that they are not used
|
sl@0
|
114 |
(they are used in pcap_pf.c only). I think we have to start using them.
|
sl@0
|
115 |
The meaning is the following:
|
sl@0
|
116 |
|
sl@0
|
117 |
- TotPkts: the amount of packets received by the bpf filter, *before* applying the filter
|
sl@0
|
118 |
- TotAccepted: the amount of packets that satisfies the filter
|
sl@0
|
119 |
- TotDrops: the amount of packet that were dropped into the kernel buffer because of lack of space
|
sl@0
|
120 |
- TotMissed: the amount of packets that were dropped by the physical interface; it is basically
|
sl@0
|
121 |
the value of the hardware counter into the card. This number is never put to zero, so this number
|
sl@0
|
122 |
takes into account the *total* number of interface drops starting from the interface power-on.
|
sl@0
|
123 |
- OrigMissed: the amount of packets that were dropped by the interface *when the capture begins*.
|
sl@0
|
124 |
This value is used to detect the number of packets dropped by the interface *during the present
|
sl@0
|
125 |
capture*, so that (ps_ifdrops= TotMissed - OrigMissed).
|
sl@0
|
126 |
*/
|
sl@0
|
127 |
unsigned int TotNetDrops; //!< keeps the number of packets that have been dropped by the network
|
sl@0
|
128 |
/*!
|
sl@0
|
129 |
\brief It keeps the number of packets that have been received by the application.
|
sl@0
|
130 |
|
sl@0
|
131 |
Packets dropped by the kernel buffer are not counted in this variable. The variable is always
|
sl@0
|
132 |
equal to (TotAccepted - TotDrops), exept for the case of remote capture, in which we have also
|
sl@0
|
133 |
packets in fligh, i.e. that have been transmitted by the remote host, but that have not been
|
sl@0
|
134 |
received (yet) from the client. In this case, (TotAccepted - TotDrops - TotNetDrops) gives a
|
sl@0
|
135 |
wrong result, since this number does not corresponds always to the number of packet received by
|
sl@0
|
136 |
the application. For this reason, in the remote capture we need another variable that takes
|
sl@0
|
137 |
into account of the number of packets actually received by the application.
|
sl@0
|
138 |
*/
|
sl@0
|
139 |
unsigned int TotCapt;
|
sl@0
|
140 |
#endif /* HAVE_REMOTE */
|
sl@0
|
141 |
};
|
sl@0
|
142 |
|
sl@0
|
143 |
/*
|
sl@0
|
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
|
sl@0
|
145 |
* Tru64 UNIX, and NetBSD pad to make everything line up on a nice boundary.
|
sl@0
|
146 |
*/
|
sl@0
|
147 |
#if defined(ultrix) || defined(__osf__) || (defined(__NetBSD__) && __NetBSD_Version__ > 106000000)
|
sl@0
|
148 |
#define PCAP_FDDIPAD 3
|
sl@0
|
149 |
#endif
|
sl@0
|
150 |
|
sl@0
|
151 |
struct pcap {
|
sl@0
|
152 |
#ifdef WIN32
|
sl@0
|
153 |
ADAPTER *adapter;
|
sl@0
|
154 |
LPPACKET Packet;
|
sl@0
|
155 |
int timeout;
|
sl@0
|
156 |
int nonblock;
|
sl@0
|
157 |
#else
|
sl@0
|
158 |
int fd;
|
sl@0
|
159 |
int selectable_fd;
|
sl@0
|
160 |
int send_fd;
|
sl@0
|
161 |
#endif /* WIN32 */
|
sl@0
|
162 |
int snapshot;
|
sl@0
|
163 |
int linktype;
|
sl@0
|
164 |
int tzoff; /* timezone offset */
|
sl@0
|
165 |
int offset; /* offset for proper alignment */
|
sl@0
|
166 |
|
sl@0
|
167 |
int break_loop; /* flag set to force break from packet-reading loop */
|
sl@0
|
168 |
|
sl@0
|
169 |
#ifdef PCAP_FDDIPAD
|
sl@0
|
170 |
int fddipad;
|
sl@0
|
171 |
#endif
|
sl@0
|
172 |
|
sl@0
|
173 |
#ifdef MSDOS
|
sl@0
|
174 |
int inter_packet_wait; /* offline: wait between packets */
|
sl@0
|
175 |
void (*wait_proc)(void); /* call proc while waiting */
|
sl@0
|
176 |
#endif
|
sl@0
|
177 |
|
sl@0
|
178 |
struct pcap_sf sf;
|
sl@0
|
179 |
struct pcap_md md;
|
sl@0
|
180 |
|
sl@0
|
181 |
/*
|
sl@0
|
182 |
* Read buffer.
|
sl@0
|
183 |
*/
|
sl@0
|
184 |
int bufsize;
|
sl@0
|
185 |
u_char *buffer;
|
sl@0
|
186 |
u_char *bp;
|
sl@0
|
187 |
int cc;
|
sl@0
|
188 |
|
sl@0
|
189 |
/*
|
sl@0
|
190 |
* Place holder for pcap_next().
|
sl@0
|
191 |
*/
|
sl@0
|
192 |
u_char *pkt;
|
sl@0
|
193 |
|
sl@0
|
194 |
/* We're accepting only packets in this direction/these directions. */
|
sl@0
|
195 |
pcap_direction_t direction;
|
sl@0
|
196 |
|
sl@0
|
197 |
/*
|
sl@0
|
198 |
* Methods.
|
sl@0
|
199 |
*/
|
sl@0
|
200 |
int (*read_op)(pcap_t *, int cnt, pcap_handler, u_char *);
|
sl@0
|
201 |
int (*inject_op)(pcap_t *, const void *, size_t);
|
sl@0
|
202 |
int (*setfilter_op)(pcap_t *, struct bpf_program *);
|
sl@0
|
203 |
int (*setdirection_op)(pcap_t *, pcap_direction_t);
|
sl@0
|
204 |
int (*set_datalink_op)(pcap_t *, int);
|
sl@0
|
205 |
int (*getnonblock_op)(pcap_t *, char *);
|
sl@0
|
206 |
int (*setnonblock_op)(pcap_t *, int, char *);
|
sl@0
|
207 |
int (*stats_op)(pcap_t *, struct pcap_stat *);
|
sl@0
|
208 |
void (*close_op)(pcap_t *);
|
sl@0
|
209 |
|
sl@0
|
210 |
/*
|
sl@0
|
211 |
* Placeholder for filter code if bpf not in kernel.
|
sl@0
|
212 |
*/
|
sl@0
|
213 |
struct bpf_program fcode;
|
sl@0
|
214 |
|
sl@0
|
215 |
char errbuf[PCAP_ERRBUF_SIZE + 1];
|
sl@0
|
216 |
int dlt_count;
|
sl@0
|
217 |
u_int *dlt_list;
|
sl@0
|
218 |
|
sl@0
|
219 |
struct pcap_pkthdr pcap_header; /* This is needed for the pcap_next_ex() to work */
|
sl@0
|
220 |
|
sl@0
|
221 |
#ifdef HAVE_REMOTE
|
sl@0
|
222 |
#ifndef WIN32 // Win32 already defines 'timeout'
|
sl@0
|
223 |
int timeout; //!< timeout to be used in the pcap_open()
|
sl@0
|
224 |
#endif
|
sl@0
|
225 |
/*! \brief '1' if we're the network client; needed by several functions (like pcap_setfilter() ) to know if
|
sl@0
|
226 |
they have to use the socket or they have to open the local adapter. */
|
sl@0
|
227 |
int rmt_clientside;
|
sl@0
|
228 |
|
sl@0
|
229 |
SOCKET rmt_sockctrl; //!< socket ID of the socket used for the control connection
|
sl@0
|
230 |
SOCKET rmt_sockdata; //!< socket ID of the socket used for the data connection
|
sl@0
|
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()
|
sl@0
|
232 |
int rmt_capstarted; //!< 'true' if the capture is already started (needed to knoe if we have to call the pcap_startcapture()
|
sl@0
|
233 |
struct pcap_samp rmt_samp; //!< Keeps the parameters related to the sampling process.
|
sl@0
|
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.
|
sl@0
|
235 |
#endif /* HAVE_REMOTE */
|
sl@0
|
236 |
};
|
sl@0
|
237 |
|
sl@0
|
238 |
/*
|
sl@0
|
239 |
* This is a timeval as stored in a savefile.
|
sl@0
|
240 |
* It has to use the same types everywhere, independent of the actual
|
sl@0
|
241 |
* `struct timeval'; `struct timeval' has 32-bit tv_sec values on some
|
sl@0
|
242 |
* platforms and 64-bit tv_sec values on other platforms, and writing
|
sl@0
|
243 |
* out native `struct timeval' values would mean files could only be
|
sl@0
|
244 |
* read on systems with the same tv_sec size as the system on which
|
sl@0
|
245 |
* the file was written.
|
sl@0
|
246 |
*/
|
sl@0
|
247 |
|
sl@0
|
248 |
struct pcap_timeval {
|
sl@0
|
249 |
bpf_int32 tv_sec; /* seconds */
|
sl@0
|
250 |
bpf_int32 tv_usec; /* microseconds */
|
sl@0
|
251 |
};
|
sl@0
|
252 |
|
sl@0
|
253 |
/*
|
sl@0
|
254 |
* This is a `pcap_pkthdr' as actually stored in a savefile.
|
sl@0
|
255 |
*
|
sl@0
|
256 |
* Do not change the format of this structure, in any way (this includes
|
sl@0
|
257 |
* changes that only affect the length of fields in this structure),
|
sl@0
|
258 |
* and do not make the time stamp anything other than seconds and
|
sl@0
|
259 |
* microseconds (e.g., seconds and nanoseconds). Instead:
|
sl@0
|
260 |
*
|
sl@0
|
261 |
* introduce a new structure for the new format;
|
sl@0
|
262 |
*
|
sl@0
|
263 |
* send mail to "tcpdump-workers@tcpdump.org", requesting a new
|
sl@0
|
264 |
* magic number for your new capture file format, and, when
|
sl@0
|
265 |
* you get the new magic number, put it in "savefile.c";
|
sl@0
|
266 |
*
|
sl@0
|
267 |
* use that magic number for save files with the changed record
|
sl@0
|
268 |
* header;
|
sl@0
|
269 |
*
|
sl@0
|
270 |
* make the code in "savefile.c" capable of reading files with
|
sl@0
|
271 |
* the old record header as well as files with the new record header
|
sl@0
|
272 |
* (using the magic number to determine the header format).
|
sl@0
|
273 |
*
|
sl@0
|
274 |
* Then supply the changes to "patches@tcpdump.org", so that future
|
sl@0
|
275 |
* versions of libpcap and programs that use it (such as tcpdump) will
|
sl@0
|
276 |
* be able to read your new capture file format.
|
sl@0
|
277 |
*/
|
sl@0
|
278 |
|
sl@0
|
279 |
struct pcap_sf_pkthdr {
|
sl@0
|
280 |
struct pcap_timeval ts; /* time stamp */
|
sl@0
|
281 |
bpf_u_int32 caplen; /* length of portion present */
|
sl@0
|
282 |
bpf_u_int32 len; /* length this packet (off wire) */
|
sl@0
|
283 |
};
|
sl@0
|
284 |
|
sl@0
|
285 |
/*
|
sl@0
|
286 |
* How a `pcap_pkthdr' is actually stored in savefiles written
|
sl@0
|
287 |
* by some patched versions of libpcap (e.g. the ones in Red
|
sl@0
|
288 |
* Hat Linux 6.1 and 6.2).
|
sl@0
|
289 |
*
|
sl@0
|
290 |
* Do not change the format of this structure, in any way (this includes
|
sl@0
|
291 |
* changes that only affect the length of fields in this structure).
|
sl@0
|
292 |
* Instead, introduce a new structure, as per the above.
|
sl@0
|
293 |
*/
|
sl@0
|
294 |
|
sl@0
|
295 |
struct pcap_sf_patched_pkthdr {
|
sl@0
|
296 |
struct pcap_timeval ts; /* time stamp */
|
sl@0
|
297 |
bpf_u_int32 caplen; /* length of portion present */
|
sl@0
|
298 |
bpf_u_int32 len; /* length this packet (off wire) */
|
sl@0
|
299 |
int index;
|
sl@0
|
300 |
unsigned short protocol;
|
sl@0
|
301 |
unsigned char pkt_type;
|
sl@0
|
302 |
};
|
sl@0
|
303 |
|
sl@0
|
304 |
int yylex(void);
|
sl@0
|
305 |
|
sl@0
|
306 |
#ifndef min
|
sl@0
|
307 |
#define min(a, b) ((a) > (b) ? (b) : (a))
|
sl@0
|
308 |
#endif
|
sl@0
|
309 |
|
sl@0
|
310 |
/* XXX should these be in pcap.h? */
|
sl@0
|
311 |
int pcap_offline_read(pcap_t *, int, pcap_handler, u_char *);
|
sl@0
|
312 |
int pcap_read(pcap_t *, int cnt, pcap_handler, u_char *);
|
sl@0
|
313 |
|
sl@0
|
314 |
#ifndef HAVE_STRLCPY
|
sl@0
|
315 |
#define strlcpy(x, y, z) \
|
sl@0
|
316 |
(strncpy((x), (y), (z)), \
|
sl@0
|
317 |
((z) <= 0 ? 0 : ((x)[(z) - 1] = '\0')), \
|
sl@0
|
318 |
strlen((y)))
|
sl@0
|
319 |
#endif
|
sl@0
|
320 |
|
sl@0
|
321 |
#include <stdarg.h>
|
sl@0
|
322 |
|
sl@0
|
323 |
#if !defined(HAVE_SNPRINTF)
|
sl@0
|
324 |
#define snprintf pcap_snprintf
|
sl@0
|
325 |
extern int snprintf (char *, size_t, const char *, ...);
|
sl@0
|
326 |
#endif
|
sl@0
|
327 |
|
sl@0
|
328 |
#if !defined(HAVE_VSNPRINTF)
|
sl@0
|
329 |
#define vsnprintf pcap_vsnprintf
|
sl@0
|
330 |
extern int vsnprintf (char *, size_t, const char *, va_list ap);
|
sl@0
|
331 |
#endif
|
sl@0
|
332 |
|
sl@0
|
333 |
/*
|
sl@0
|
334 |
* Routines that most pcap implementations can use for non-blocking mode.
|
sl@0
|
335 |
*/
|
sl@0
|
336 |
#if !defined(WIN32) && !defined(MSDOS)
|
sl@0
|
337 |
int pcap_getnonblock_fd(pcap_t *, char *);
|
sl@0
|
338 |
int pcap_setnonblock_fd(pcap_t *p, int, char *);
|
sl@0
|
339 |
#endif
|
sl@0
|
340 |
|
sl@0
|
341 |
void pcap_close_common(pcap_t *);
|
sl@0
|
342 |
|
sl@0
|
343 |
/*
|
sl@0
|
344 |
* Internal interfaces for "pcap_findalldevs()".
|
sl@0
|
345 |
*
|
sl@0
|
346 |
* "pcap_platform_finddevs()" is a platform-dependent routine to
|
sl@0
|
347 |
* add devices not found by the "standard" mechanisms (SIOCGIFCONF,
|
sl@0
|
348 |
* "getifaddrs()", etc..
|
sl@0
|
349 |
*
|
sl@0
|
350 |
* "pcap_add_if()" adds an interface to the list of interfaces.
|
sl@0
|
351 |
*/
|
sl@0
|
352 |
int pcap_platform_finddevs(pcap_if_t **, char *);
|
sl@0
|
353 |
int add_addr_to_iflist(pcap_if_t **, const char *, u_int, struct sockaddr *,
|
sl@0
|
354 |
size_t, struct sockaddr *, size_t, struct sockaddr *, size_t,
|
sl@0
|
355 |
struct sockaddr *, size_t, char *);
|
sl@0
|
356 |
int pcap_add_if(pcap_if_t **, const char *, u_int, const char *, char *);
|
sl@0
|
357 |
struct sockaddr *dup_sockaddr(struct sockaddr *, size_t);
|
sl@0
|
358 |
int add_or_find_if(pcap_if_t **, pcap_if_t **, const char *, u_int,
|
sl@0
|
359 |
const char *, char *);
|
sl@0
|
360 |
|
sl@0
|
361 |
#ifdef WIN32
|
sl@0
|
362 |
char *pcap_win32strerror(void);
|
sl@0
|
363 |
#endif
|
sl@0
|
364 |
|
sl@0
|
365 |
int install_bpf_program(pcap_t *, struct bpf_program *);
|
sl@0
|
366 |
|
sl@0
|
367 |
int pcap_strcasecmp(const char *, const char *);
|
sl@0
|
368 |
|
sl@0
|
369 |
#ifdef __cplusplus
|
sl@0
|
370 |
}
|
sl@0
|
371 |
#endif
|
sl@0
|
372 |
|
sl@0
|
373 |
#endif
|