Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * Copyright (c) 1994, 1995, 1996 |
3 | | * The Regents of the University of California. All rights reserved. |
4 | | * |
5 | | * Redistribution and use in source and binary forms, with or without |
6 | | * modification, are permitted provided that the following conditions |
7 | | * are met: |
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. |
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 | | |
34 | | #ifndef pcap_int_h |
35 | | #define pcap_int_h |
36 | | |
37 | | #include <stddef.h> |
38 | | |
39 | | #include <signal.h> |
40 | | |
41 | | #include <pcap/pcap.h> |
42 | | |
43 | | #ifdef MSDOS |
44 | | #include <fcntl.h> |
45 | | #include <io.h> |
46 | | #endif |
47 | | |
48 | | #include "varattrs.h" |
49 | | #include "fmtutils.h" |
50 | | |
51 | | #include <stdarg.h> |
52 | | |
53 | | #include "portability.h" |
54 | | |
55 | | /* |
56 | | * If we're compiling with Visual Studio, make sure we have at least |
57 | | * VS 2015 or later, so we have sufficient C99 support. |
58 | | * |
59 | | * XXX - verify that we have at least C99 support on UN*Xes? |
60 | | * |
61 | | * What about MinGW or various DOS toolchains? We're currently assuming |
62 | | * sufficient C99 support there. |
63 | | */ |
64 | | #if defined(_MSC_VER) |
65 | | /* |
66 | | * Compiler is MSVC. Make sure we have VS 2015 or later. |
67 | | */ |
68 | | #if _MSC_VER < 1900 |
69 | | #error "Building libpcap requires VS 2015 or later" |
70 | | #endif |
71 | | #endif |
72 | | |
73 | | /* |
74 | | * Version string. |
75 | | * Uses PACKAGE_VERSION from config.h. |
76 | | */ |
77 | 0 | #define PCAP_VERSION_STRING "libpcap version " PACKAGE_VERSION |
78 | | |
79 | | #ifdef __cplusplus |
80 | | extern "C" { |
81 | | #endif |
82 | | |
83 | | /* |
84 | | * If pcap_new_api is set, we disable pcap_lookupdev(), because: |
85 | | * |
86 | | * it's not thread-safe, and is marked as deprecated, on all |
87 | | * platforms; |
88 | | * |
89 | | * on Windows, it may return UTF-16LE strings, which the program |
90 | | * might then pass to pcap_create() (or to pcap_open_live(), which |
91 | | * then passes them to pcap_create()), requiring pcap_create() to |
92 | | * check for UTF-16LE strings using a hack, and that hack 1) |
93 | | * *cannot* be 100% reliable and 2) runs the risk of going past the |
94 | | * end of the string. |
95 | | * |
96 | | * We keep it around in legacy mode for compatibility. |
97 | | * |
98 | | * We also disable the aforementioned hack in pcap_create(). |
99 | | */ |
100 | | extern int pcap_new_api; |
101 | | |
102 | | /* |
103 | | * If pcap_utf_8_mode is set, on Windows we treat strings as UTF-8. |
104 | | * |
105 | | * On UN*Xes, we assume all strings are and should be in UTF-8, regardless |
106 | | * of the setting of this flag. |
107 | | */ |
108 | | extern int pcap_utf_8_mode; |
109 | | |
110 | | /* |
111 | | * Map packet buffers with 32-bit addresses. |
112 | | */ |
113 | | extern int pcap_mmap_32bit; |
114 | | |
115 | | /* |
116 | | * Swap byte ordering of unsigned long long timestamp on a big endian |
117 | | * machine. |
118 | | */ |
119 | 31.3k | #define SWAPLL(ull) ((ull & 0xff00000000000000ULL) >> 56) | \ |
120 | 31.3k | ((ull & 0x00ff000000000000ULL) >> 40) | \ |
121 | 31.3k | ((ull & 0x0000ff0000000000ULL) >> 24) | \ |
122 | 31.3k | ((ull & 0x000000ff00000000ULL) >> 8) | \ |
123 | 31.3k | ((ull & 0x00000000ff000000ULL) << 8) | \ |
124 | 31.3k | ((ull & 0x0000000000ff0000ULL) << 24) | \ |
125 | 31.3k | ((ull & 0x000000000000ff00ULL) << 40) | \ |
126 | 31.3k | ((ull & 0x00000000000000ffULL) << 56) |
127 | | |
128 | | /* |
129 | | * Maximum snapshot length. |
130 | | * |
131 | | * Somewhat arbitrary, but chosen to be: |
132 | | * |
133 | | * 1) big enough for maximum-size Linux loopback packets (65549) |
134 | | * and some USB packets captured with USBPcap: |
135 | | * |
136 | | * https://desowin.org/usbpcap/ |
137 | | * |
138 | | * (> 131072, < 262144) |
139 | | * |
140 | | * and |
141 | | * |
142 | | * 2) small enough not to cause attempts to allocate huge amounts of |
143 | | * memory; some applications might use the snapshot length in a |
144 | | * savefile header to control the size of the buffer they allocate, |
145 | | * so a size of, say, 2^31-1 might not work well. (libpcap uses it |
146 | | * as a hint, but doesn't start out allocating a buffer bigger than |
147 | | * 2 KiB, and grows the buffer as necessary, but not beyond the |
148 | | * per-linktype maximum snapshot length. Other code might naively |
149 | | * use it; we want to avoid writing a too-large snapshot length, |
150 | | * in order not to cause that code problems.) |
151 | | * |
152 | | * We don't enforce this in pcap_set_snaplen(), but we use it internally. |
153 | | */ |
154 | 263k | #define MAXIMUM_SNAPLEN 262144 |
155 | | |
156 | | /* |
157 | | * Locale-independent macros for testing character types. |
158 | | * These can be passed any integral value, without worrying about, for |
159 | | * example, sign-extending char values, unlike the C macros. |
160 | | */ |
161 | | #define PCAP_ISDIGIT(c) \ |
162 | 0 | ((c) >= '0' && (c) <= '9') |
163 | | #define PCAP_ISXDIGIT(c) \ |
164 | 0 | (((c) >= '0' && (c) <= '9') || \ |
165 | 0 | ((c) >= 'A' && (c) <= 'F') || \ |
166 | 0 | ((c) >= 'a' && (c) <= 'f')) |
167 | | |
168 | | struct pcap_opt { |
169 | | char *device; |
170 | | int timeout; /* timeout for buffering */ |
171 | | u_int buffer_size; |
172 | | int promisc; |
173 | | int rfmon; /* monitor mode */ |
174 | | int immediate; /* immediate mode - deliver packets as soon as they arrive */ |
175 | | int nonblock; /* non-blocking mode - don't wait for packets to be delivered, return "no packets available" */ |
176 | | int tstamp_type; |
177 | | int tstamp_precision; |
178 | | |
179 | | /* |
180 | | * Platform-dependent options. |
181 | | */ |
182 | | #ifdef __linux__ |
183 | | int protocol; /* protocol to use when creating PF_PACKET socket */ |
184 | | #endif |
185 | | #ifdef _WIN32 |
186 | | int nocapture_local;/* disable NPF loopback */ |
187 | | #endif |
188 | | }; |
189 | | |
190 | | typedef int (*activate_op_t)(pcap_t *); |
191 | | typedef int (*can_set_rfmon_op_t)(pcap_t *); |
192 | | typedef int (*read_op_t)(pcap_t *, int cnt, pcap_handler, u_char *); |
193 | | typedef int (*next_packet_op_t)(pcap_t *, struct pcap_pkthdr *, u_char **); |
194 | | typedef int (*inject_op_t)(pcap_t *, const void *, int); |
195 | | typedef void (*save_current_filter_op_t)(pcap_t *, const char *); |
196 | | typedef int (*setfilter_op_t)(pcap_t *, struct bpf_program *); |
197 | | typedef int (*setdirection_op_t)(pcap_t *, pcap_direction_t); |
198 | | typedef int (*set_datalink_op_t)(pcap_t *, int); |
199 | | typedef int (*getnonblock_op_t)(pcap_t *); |
200 | | typedef int (*setnonblock_op_t)(pcap_t *, int); |
201 | | typedef int (*stats_op_t)(pcap_t *, struct pcap_stat *); |
202 | | typedef void (*breakloop_op_t)(pcap_t *); |
203 | | #ifdef _WIN32 |
204 | | typedef struct pcap_stat *(*stats_ex_op_t)(pcap_t *, int *); |
205 | | typedef int (*setbuff_op_t)(pcap_t *, int); |
206 | | typedef int (*setmode_op_t)(pcap_t *, int); |
207 | | typedef int (*setmintocopy_op_t)(pcap_t *, int); |
208 | | typedef HANDLE (*getevent_op_t)(pcap_t *); |
209 | | typedef int (*oid_get_request_op_t)(pcap_t *, bpf_u_int32, void *, size_t *); |
210 | | typedef int (*oid_set_request_op_t)(pcap_t *, bpf_u_int32, const void *, size_t *); |
211 | | typedef u_int (*sendqueue_transmit_op_t)(pcap_t *, pcap_send_queue *, int); |
212 | | typedef int (*setuserbuffer_op_t)(pcap_t *, int); |
213 | | typedef int (*live_dump_op_t)(pcap_t *, char *, int, int); |
214 | | typedef int (*live_dump_ended_op_t)(pcap_t *, int); |
215 | | typedef PAirpcapHandle (*get_airpcap_handle_op_t)(pcap_t *); |
216 | | #endif |
217 | | typedef void (*cleanup_op_t)(pcap_t *); |
218 | | |
219 | | /* |
220 | | * We put all the stuff used in the read code path at the beginning, |
221 | | * to try to keep it together in the same cache line or lines. |
222 | | */ |
223 | | struct pcap { |
224 | | /* |
225 | | * Method to call to read packets on a live capture. |
226 | | */ |
227 | | read_op_t read_op; |
228 | | |
229 | | /* |
230 | | * Method to call to read the next packet from a savefile. |
231 | | */ |
232 | | next_packet_op_t next_packet_op; |
233 | | |
234 | | #ifdef _WIN32 |
235 | | HANDLE handle; |
236 | | #else |
237 | | int fd; |
238 | | #endif /* _WIN32 */ |
239 | | |
240 | | /* |
241 | | * Read buffer. |
242 | | */ |
243 | | u_int bufsize; |
244 | | void *buffer; |
245 | | u_char *bp; |
246 | | int cc; |
247 | | |
248 | | sig_atomic_t break_loop; /* flag set to force break from packet-reading loop */ |
249 | | |
250 | | void *priv; /* private data for methods */ |
251 | | |
252 | | #ifdef ENABLE_REMOTE |
253 | | struct pcap_samp rmt_samp; /* parameters related to the sampling process. */ |
254 | | #endif |
255 | | |
256 | | int swapped; |
257 | | FILE *rfile; /* null if live capture, non-null if savefile */ |
258 | | u_int fddipad; |
259 | | struct pcap *next; /* list of open pcaps that need stuff cleared on close */ |
260 | | |
261 | | /* |
262 | | * File version number; meaningful only for a savefile, but we |
263 | | * keep it here so that apps that (mistakenly) ask for the |
264 | | * version numbers will get the same zero values that they |
265 | | * always did. |
266 | | */ |
267 | | int version_major; |
268 | | int version_minor; |
269 | | |
270 | | int snapshot; |
271 | | int linktype; /* Network linktype */ |
272 | | int linktype_ext; /* Extended information stored in the linktype field of a file */ |
273 | | int offset; /* offset for proper alignment */ |
274 | | int activated; /* true if the capture is really started */ |
275 | | int oldstyle; /* if we're opening with pcap_open_live() */ |
276 | | |
277 | | struct pcap_opt opt; |
278 | | |
279 | | /* |
280 | | * Place holder for pcap_next(). |
281 | | */ |
282 | | u_char *pkt; |
283 | | |
284 | | #ifdef _WIN32 |
285 | | struct pcap_stat stat; /* used for pcap_stats_ex() */ |
286 | | #endif |
287 | | |
288 | | /* We're accepting only packets in this direction/these directions. */ |
289 | | pcap_direction_t direction; |
290 | | |
291 | | /* |
292 | | * Flags to affect BPF code generation. |
293 | | */ |
294 | | int bpf_codegen_flags; |
295 | | |
296 | | #if !defined(_WIN32) && !defined(MSDOS) |
297 | | int selectable_fd; /* FD on which select()/poll()/epoll_wait()/kevent()/etc. can be done */ |
298 | | |
299 | | /* |
300 | | * In case there either is no selectable FD, or there is but |
301 | | * it doesn't necessarily work (e.g., if it doesn't get notified |
302 | | * if the packet capture timeout expires before the buffer |
303 | | * fills up), this points to a timeout that should be used |
304 | | * in select()/poll()/epoll_wait()/kevent() call. The pcap_t should |
305 | | * be put into non-blocking mode, and, if the timeout expires on |
306 | | * the call, an attempt should be made to read packets from all |
307 | | * pcap_t's with a required timeout, and the code must be |
308 | | * prepared not to see any packets from the attempt. |
309 | | */ |
310 | | const struct timeval *required_select_timeout; |
311 | | #endif |
312 | | |
313 | | /* |
314 | | * Placeholder for filter code if bpf not in kernel. |
315 | | */ |
316 | | struct bpf_program fcode; |
317 | | |
318 | | char errbuf[PCAP_ERRBUF_SIZE + 1]; |
319 | | #ifdef _WIN32 |
320 | | char acp_errbuf[PCAP_ERRBUF_SIZE + 1]; /* buffer for local code page error strings */ |
321 | | #endif |
322 | | int dlt_count; |
323 | | u_int *dlt_list; |
324 | | int tstamp_type_count; |
325 | | u_int *tstamp_type_list; |
326 | | int tstamp_precision_count; |
327 | | u_int *tstamp_precision_list; |
328 | | |
329 | | struct pcap_pkthdr pcap_header; /* This is needed for the pcap_next_ex() to work */ |
330 | | |
331 | | /* |
332 | | * More methods. |
333 | | */ |
334 | | activate_op_t activate_op; |
335 | | can_set_rfmon_op_t can_set_rfmon_op; |
336 | | inject_op_t inject_op; |
337 | | save_current_filter_op_t save_current_filter_op; |
338 | | setfilter_op_t setfilter_op; |
339 | | setdirection_op_t setdirection_op; |
340 | | set_datalink_op_t set_datalink_op; |
341 | | getnonblock_op_t getnonblock_op; |
342 | | setnonblock_op_t setnonblock_op; |
343 | | stats_op_t stats_op; |
344 | | breakloop_op_t breakloop_op; |
345 | | |
346 | | /* |
347 | | * Routine to use as callback for pcap_next()/pcap_next_ex(). |
348 | | */ |
349 | | pcap_handler oneshot_callback; |
350 | | |
351 | | #ifdef _WIN32 |
352 | | /* |
353 | | * These are, at least currently, specific to the Win32 NPF |
354 | | * driver. |
355 | | */ |
356 | | stats_ex_op_t stats_ex_op; |
357 | | setbuff_op_t setbuff_op; |
358 | | setmode_op_t setmode_op; |
359 | | setmintocopy_op_t setmintocopy_op; |
360 | | getevent_op_t getevent_op; |
361 | | oid_get_request_op_t oid_get_request_op; |
362 | | oid_set_request_op_t oid_set_request_op; |
363 | | sendqueue_transmit_op_t sendqueue_transmit_op; |
364 | | setuserbuffer_op_t setuserbuffer_op; |
365 | | live_dump_op_t live_dump_op; |
366 | | live_dump_ended_op_t live_dump_ended_op; |
367 | | get_airpcap_handle_op_t get_airpcap_handle_op; |
368 | | #endif |
369 | | cleanup_op_t cleanup_op; |
370 | | }; |
371 | | |
372 | | /* |
373 | | * BPF code generation flags. |
374 | | */ |
375 | 0 | #define BPF_SPECIAL_VLAN_HANDLING 0x00000001 /* special VLAN handling for Linux */ |
376 | | |
377 | | /* |
378 | | * This is a timeval as stored in a savefile. |
379 | | * It has to use the same types everywhere, independent of the actual |
380 | | * `struct timeval'; `struct timeval' has 32-bit tv_sec values on some |
381 | | * platforms and 64-bit tv_sec values on other platforms, and writing |
382 | | * out native `struct timeval' values would mean files could only be |
383 | | * read on systems with the same tv_sec size as the system on which |
384 | | * the file was written. |
385 | | */ |
386 | | |
387 | | struct pcap_timeval { |
388 | | bpf_int32 tv_sec; /* seconds */ |
389 | | bpf_int32 tv_usec; /* microseconds */ |
390 | | }; |
391 | | |
392 | | /* |
393 | | * This is a `pcap_pkthdr' as actually stored in a savefile. |
394 | | * |
395 | | * Do not change the format of this structure, in any way (this includes |
396 | | * changes that only affect the length of fields in this structure), |
397 | | * and do not make the time stamp anything other than seconds and |
398 | | * microseconds (e.g., seconds and nanoseconds). Instead: |
399 | | * |
400 | | * introduce a new structure for the new format; |
401 | | * |
402 | | * send mail to "tcpdump-workers@lists.tcpdump.org", requesting |
403 | | * a new magic number for your new capture file format, and, when |
404 | | * you get the new magic number, put it in "savefile.c"; |
405 | | * |
406 | | * use that magic number for save files with the changed record |
407 | | * header; |
408 | | * |
409 | | * make the code in "savefile.c" capable of reading files with |
410 | | * the old record header as well as files with the new record header |
411 | | * (using the magic number to determine the header format). |
412 | | * |
413 | | * Then supply the changes by forking the branch at |
414 | | * |
415 | | * https://github.com/the-tcpdump-group/libpcap/tree/master |
416 | | * |
417 | | * and issuing a pull request, so that future versions of libpcap and |
418 | | * programs that use it (such as tcpdump) will be able to read your new |
419 | | * capture file format. |
420 | | */ |
421 | | |
422 | | struct pcap_sf_pkthdr { |
423 | | struct pcap_timeval ts; /* time stamp */ |
424 | | bpf_u_int32 caplen; /* length of portion present */ |
425 | | bpf_u_int32 len; /* length of this packet (off wire) */ |
426 | | }; |
427 | | |
428 | | /* |
429 | | * How a `pcap_pkthdr' is actually stored in savefiles written |
430 | | * by some patched versions of libpcap (e.g. the ones in Red |
431 | | * Hat Linux 6.1 and 6.2). |
432 | | * |
433 | | * Do not change the format of this structure, in any way (this includes |
434 | | * changes that only affect the length of fields in this structure). |
435 | | * Instead, introduce a new structure, as per the above. |
436 | | */ |
437 | | |
438 | | struct pcap_sf_patched_pkthdr { |
439 | | struct pcap_timeval ts; /* time stamp */ |
440 | | bpf_u_int32 caplen; /* length of portion present */ |
441 | | bpf_u_int32 len; /* length of this packet (off wire) */ |
442 | | int index; |
443 | | unsigned short protocol; |
444 | | unsigned char pkt_type; |
445 | | }; |
446 | | |
447 | | /* |
448 | | * User data structure for the one-shot callback used for pcap_next() |
449 | | * and pcap_next_ex(). |
450 | | */ |
451 | | struct oneshot_userdata { |
452 | | struct pcap_pkthdr *hdr; |
453 | | const u_char **pkt; |
454 | | pcap_t *pd; |
455 | | }; |
456 | | |
457 | | #ifndef min |
458 | | #define min(a, b) ((a) > (b) ? (b) : (a)) |
459 | | #endif |
460 | | |
461 | | int pcap_offline_read(pcap_t *, int, pcap_handler, u_char *); |
462 | | |
463 | | /* |
464 | | * Does the packet count argument to a module's read routine say |
465 | | * "supply packets until you run out of packets"? |
466 | | */ |
467 | 271k | #define PACKET_COUNT_IS_UNLIMITED(count) ((count) <= 0) |
468 | | |
469 | | /* |
470 | | * Routines that most pcap implementations can use for non-blocking mode. |
471 | | */ |
472 | | #if !defined(_WIN32) && !defined(MSDOS) |
473 | | int pcap_getnonblock_fd(pcap_t *); |
474 | | int pcap_setnonblock_fd(pcap_t *p, int); |
475 | | #endif |
476 | | |
477 | | /* |
478 | | * Internal interfaces for "pcap_create()". |
479 | | * |
480 | | * "pcap_create_interface()" is the routine to do a pcap_create on |
481 | | * a regular network interface. There are multiple implementations |
482 | | * of this, one for each platform type (Linux, BPF, DLPI, etc.), |
483 | | * with the one used chosen by the configure script. |
484 | | * |
485 | | * "pcap_create_common()" allocates and fills in a pcap_t, for use |
486 | | * by pcap_create routines. |
487 | | */ |
488 | | pcap_t *pcap_create_interface(const char *, char *); |
489 | | |
490 | | /* |
491 | | * This wrapper takes an error buffer pointer and a type to use for the |
492 | | * private data, and calls pcap_create_common(), passing it the error |
493 | | * buffer pointer, the size for the private data type, in bytes, and the |
494 | | * offset of the private data from the beginning of the structure, in |
495 | | * bytes. |
496 | | */ |
497 | | #define PCAP_CREATE_COMMON(ebuf, type) \ |
498 | 0 | pcap_create_common(ebuf, \ |
499 | 0 | sizeof (struct { pcap_t __common; type __private; }), \ |
500 | 0 | offsetof (struct { pcap_t __common; type __private; }, __private)) |
501 | | pcap_t *pcap_create_common(char *, size_t, size_t); |
502 | | int pcap_do_addexit(pcap_t *); |
503 | | void pcap_add_to_pcaps_to_close(pcap_t *); |
504 | | void pcap_remove_from_pcaps_to_close(pcap_t *); |
505 | | void pcap_cleanup_live_common(pcap_t *); |
506 | | int pcap_check_activated(pcap_t *); |
507 | | void pcap_breakloop_common(pcap_t *); |
508 | | |
509 | | /* |
510 | | * Internal interfaces for "pcap_findalldevs()". |
511 | | * |
512 | | * A pcap_if_list_t * is a reference to a list of devices. |
513 | | * |
514 | | * A get_if_flags_func is a platform-dependent function called to get |
515 | | * additional interface flags. |
516 | | * |
517 | | * "pcap_platform_finddevs()" is the platform-dependent routine to |
518 | | * find local network interfaces. |
519 | | * |
520 | | * "pcap_findalldevs_interfaces()" is a helper to find those interfaces |
521 | | * using the "standard" mechanisms (SIOCGIFCONF, "getifaddrs()", etc.). |
522 | | * |
523 | | * "add_dev()" adds an entry to a pcap_if_list_t. |
524 | | * |
525 | | * "find_dev()" tries to find a device, by name, in a pcap_if_list_t. |
526 | | * |
527 | | * "find_or_add_dev()" checks whether a device is already in a pcap_if_list_t |
528 | | * and, if not, adds an entry for it. |
529 | | */ |
530 | | struct pcap_if_list; |
531 | | typedef struct pcap_if_list pcap_if_list_t; |
532 | | typedef int (*get_if_flags_func)(const char *, bpf_u_int32 *, char *); |
533 | | int pcap_platform_finddevs(pcap_if_list_t *, char *); |
534 | | #if !defined(_WIN32) && !defined(MSDOS) |
535 | | int pcap_findalldevs_interfaces(pcap_if_list_t *, char *, |
536 | | int (*)(const char *), get_if_flags_func); |
537 | | #endif |
538 | | pcap_if_t *find_or_add_dev(pcap_if_list_t *, const char *, bpf_u_int32, |
539 | | get_if_flags_func, const char *, char *); |
540 | | pcap_if_t *find_dev(pcap_if_list_t *, const char *); |
541 | | pcap_if_t *add_dev(pcap_if_list_t *, const char *, bpf_u_int32, const char *, |
542 | | char *); |
543 | | int add_addr_to_dev(pcap_if_t *, struct sockaddr *, size_t, |
544 | | struct sockaddr *, size_t, struct sockaddr *, size_t, |
545 | | struct sockaddr *dstaddr, size_t, char *errbuf); |
546 | | #ifndef _WIN32 |
547 | | pcap_if_t *find_or_add_if(pcap_if_list_t *, const char *, bpf_u_int32, |
548 | | get_if_flags_func, char *); |
549 | | int add_addr_to_if(pcap_if_list_t *, const char *, bpf_u_int32, |
550 | | get_if_flags_func, |
551 | | struct sockaddr *, size_t, struct sockaddr *, size_t, |
552 | | struct sockaddr *, size_t, struct sockaddr *, size_t, char *); |
553 | | #endif |
554 | | |
555 | | /* |
556 | | * Internal interfaces for "pcap_open_offline()" and other savefile |
557 | | * I/O routines. |
558 | | * |
559 | | * "pcap_open_offline_common()" allocates and fills in a pcap_t, for use |
560 | | * by pcap_open_offline routines. |
561 | | * |
562 | | * "pcap_adjust_snapshot()" adjusts the snapshot to be non-zero and |
563 | | * fit within an int. |
564 | | * |
565 | | * "sf_cleanup()" closes the file handle associated with a pcap_t, if |
566 | | * appropriate, and frees all data common to all modules for handling |
567 | | * savefile types. |
568 | | * |
569 | | * "charset_fopen()", in UTF-8 mode on Windows, does an fopen() that |
570 | | * treats the pathname as being in UTF-8, rather than the local |
571 | | * code page, on Windows. |
572 | | */ |
573 | | |
574 | | /* |
575 | | * This wrapper takes an error buffer pointer and a type to use for the |
576 | | * private data, and calls pcap_create_common(), passing it the error |
577 | | * buffer pointer, the size for the private data type, in bytes, and the |
578 | | * offset of the private data from the beginning of the structure, in |
579 | | * bytes. |
580 | | */ |
581 | | #define PCAP_OPEN_OFFLINE_COMMON(ebuf, type) \ |
582 | 62.9k | pcap_open_offline_common(ebuf, \ |
583 | 62.9k | sizeof (struct { pcap_t __common; type __private; }), \ |
584 | 62.9k | offsetof (struct { pcap_t __common; type __private; }, __private)) |
585 | | pcap_t *pcap_open_offline_common(char *ebuf, size_t total_size, |
586 | | size_t private_data); |
587 | | bpf_u_int32 pcap_adjust_snapshot(bpf_u_int32 linktype, bpf_u_int32 snaplen); |
588 | | void sf_cleanup(pcap_t *p); |
589 | | #ifdef _WIN32 |
590 | | FILE *charset_fopen(const char *path, const char *mode); |
591 | | #else |
592 | | /* |
593 | | * On other OSes, just use Boring Old fopen(). |
594 | | */ |
595 | 63.3k | #define charset_fopen(path, mode) fopen((path), (mode)) |
596 | | #endif |
597 | | |
598 | | /* |
599 | | * Internal interfaces for loading code at run time. |
600 | | */ |
601 | | #ifdef _WIN32 |
602 | | #define pcap_code_handle_t HMODULE |
603 | | #define pcap_funcptr_t FARPROC |
604 | | |
605 | | pcap_code_handle_t pcap_load_code(const char *); |
606 | | pcap_funcptr_t pcap_find_function(pcap_code_handle_t, const char *); |
607 | | #endif |
608 | | |
609 | | /* |
610 | | * Internal interfaces for doing user-mode filtering of packets and |
611 | | * validating filter programs. |
612 | | */ |
613 | | /* |
614 | | * Auxiliary data, for use when interpreting a filter intended for the |
615 | | * Linux kernel when the kernel rejects the filter (requiring us to |
616 | | * run it in userland). It contains VLAN tag information. |
617 | | */ |
618 | | struct pcap_bpf_aux_data { |
619 | | u_short vlan_tag_present; |
620 | | u_short vlan_tag; |
621 | | }; |
622 | | |
623 | | /* |
624 | | * Filtering routine that takes the auxiliary data as an additional |
625 | | * argument. |
626 | | */ |
627 | | u_int pcap_filter_with_aux_data(const struct bpf_insn *, |
628 | | const u_char *, u_int, u_int, const struct pcap_bpf_aux_data *); |
629 | | |
630 | | /* |
631 | | * Filtering routine that doesn't. |
632 | | */ |
633 | | u_int pcap_filter(const struct bpf_insn *, const u_char *, u_int, u_int); |
634 | | |
635 | | /* |
636 | | * Routine to validate a BPF program. |
637 | | */ |
638 | | int pcap_validate_filter(const struct bpf_insn *, int); |
639 | | |
640 | | /* |
641 | | * Internal interfaces for both "pcap_create()" and routines that |
642 | | * open savefiles. |
643 | | * |
644 | | * "pcap_oneshot()" is the standard one-shot callback for "pcap_next()" |
645 | | * and "pcap_next_ex()". |
646 | | */ |
647 | | void pcap_oneshot(u_char *, const struct pcap_pkthdr *, const u_char *); |
648 | | |
649 | | int install_bpf_program(pcap_t *, struct bpf_program *); |
650 | | |
651 | | int pcap_strcasecmp(const char *, const char *); |
652 | | |
653 | | /* |
654 | | * Internal interfaces for pcap_createsrcstr and pcap_parsesrcstr with |
655 | | * the additional bit of information regarding SSL support (rpcap:// vs. |
656 | | * rpcaps://). |
657 | | */ |
658 | | int pcap_createsrcstr_ex(char *, int, const char *, const char *, |
659 | | const char *, const char *, unsigned char, char *); |
660 | | int pcap_parsesrcstr_ex(const char *, int *, char *, char *, |
661 | | char *, char *, unsigned char *, char *); |
662 | | |
663 | | #ifdef YYDEBUG |
664 | | extern int pcap_debug; |
665 | | #endif |
666 | | |
667 | | #ifdef __cplusplus |
668 | | } |
669 | | #endif |
670 | | |
671 | | #endif |