Coverage Report

Created: 2024-05-15 07:09

/src/libpcap/pcap-int.h
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