source: rtems-libbsd/freebsd/contrib/libpcap/pcap-int.h @ 084d4db

4.11
Last change on this file since 084d4db was 8440506, checked in by Chris Johns <chrisj@…>, on 06/15/15 at 07:42:23

Add tcpdump and libpcap.

  • Update the file builder generator to handle generator specific cflags and includes. The tcpdump and libpcap have localised headers and need specific headers paths to see them. There are also module specific flags and these need to be passed to the lex and yacc generators.
  • Add the tcpdump support.
  • Property mode set to 100644
File size: 16.2 KB
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 * @(#) $Header: /tcpdump/master/libpcap/pcap-int.h,v 1.94 2008-09-16 00:20:23 guy Exp $ (LBL)
34 */
35
36#ifndef pcap_int_h
37#define pcap_int_h
38
39#include <pcap/pcap.h>
40
41#ifdef __cplusplus
42extern "C" {
43#endif
44
45#ifdef HAVE_LIBDLPI
46#include <libdlpi.h>
47#endif
48
49#ifdef WIN32
50#include <Packet32.h>
51extern CRITICAL_SECTION g_PcapCompileCriticalSection;
52#endif /* WIN32 */
53
54#ifdef MSDOS
55#include <fcntl.h>
56#include <io.h>
57#endif
58
59#ifdef HAVE_SNF_API
60#include <snf.h>
61#endif
62
63#if (defined(_MSC_VER) && (_MSC_VER <= 1200)) /* we are compiling with Visual Studio 6, that doesn't support the LL suffix*/
64
65/*
66 * Swap byte ordering of unsigned long long timestamp on a big endian
67 * machine.
68 */
69#define SWAPLL(ull)  ((ull & 0xff00000000000000) >> 56) | \
70                      ((ull & 0x00ff000000000000) >> 40) | \
71                      ((ull & 0x0000ff0000000000) >> 24) | \
72                      ((ull & 0x000000ff00000000) >> 8)  | \
73                      ((ull & 0x00000000ff000000) << 8)  | \
74                      ((ull & 0x0000000000ff0000) << 24) | \
75                      ((ull & 0x000000000000ff00) << 40) | \
76                      ((ull & 0x00000000000000ff) << 56)
77
78#else /* A recent Visual studio compiler or not VC */
79
80/*
81 * Swap byte ordering of unsigned long long timestamp on a big endian
82 * machine.
83 */
84#define SWAPLL(ull)  ((ull & 0xff00000000000000LL) >> 56) | \
85                      ((ull & 0x00ff000000000000LL) >> 40) | \
86                      ((ull & 0x0000ff0000000000LL) >> 24) | \
87                      ((ull & 0x000000ff00000000LL) >> 8)  | \
88                      ((ull & 0x00000000ff000000LL) << 8)  | \
89                      ((ull & 0x0000000000ff0000LL) << 24) | \
90                      ((ull & 0x000000000000ff00LL) << 40) | \
91                      ((ull & 0x00000000000000ffLL) << 56)
92
93#endif /* _MSC_VER */
94
95/*
96 * Savefile
97 */
98typedef enum {
99        NOT_SWAPPED,
100        SWAPPED,
101        MAYBE_SWAPPED
102} swapped_type_t;
103
104/*
105 * Used when reading a savefile.
106 */
107struct pcap_sf {
108        FILE *rfile;
109        int (*next_packet_op)(pcap_t *, struct pcap_pkthdr *, u_char **);
110        int swapped;
111        size_t hdrsize;
112        swapped_type_t lengths_swapped;
113        int version_major;
114        int version_minor;
115        bpf_u_int32 ifcount;    /* number of interfaces seen in this capture */
116        u_int tsresol;          /* time stamp resolution */
117        u_int tsscale;          /* scaling factor for resolution -> microseconds */
118        u_int64_t tsoffset;     /* time stamp offset */
119};
120
121/*
122 * Used when doing a live capture.
123 */
124struct pcap_md {
125        struct pcap_stat stat;
126        /*XXX*/
127        int use_bpf;            /* using kernel filter */
128        u_long  TotPkts;        /* can't oflow for 79 hrs on ether */
129        u_long  TotAccepted;    /* count accepted by filter */
130        u_long  TotDrops;       /* count of dropped packets */
131        long    TotMissed;      /* missed by i/f during this run */
132        long    OrigMissed;     /* missed by i/f before this run */
133        char    *device;        /* device name */
134        int     timeout;        /* timeout for buffering */
135        int     must_do_on_close; /* stuff we must do when we close */
136        struct pcap *next;      /* list of open pcaps that need stuff cleared on close */
137#ifdef linux
138        int     sock_packet;    /* using Linux 2.0 compatible interface */
139        int     cooked;         /* using SOCK_DGRAM rather than SOCK_RAW */
140        int     ifindex;        /* interface index of device we're bound to */
141        int     lo_ifindex;     /* interface index of the loopback device */
142        u_int   packets_read;   /* count of packets read with recvfrom() */
143        bpf_u_int32 oldmode;    /* mode to restore when turning monitor mode off */
144        char    *mondevice;     /* mac80211 monitor device we created */
145        u_char  *mmapbuf;       /* memory-mapped region pointer */
146        size_t  mmapbuflen;     /* size of region */
147        int     vlan_offset;    /* offset at which to insert vlan tags; if -1, don't insert */
148        u_int   tp_version;     /* version of tpacket_hdr for mmaped ring */
149        u_int   tp_hdrlen;      /* hdrlen of tpacket_hdr for mmaped ring */
150        u_char  *oneshot_buffer; /* buffer for copy of packet */
151        long    proc_dropped; /* packets reported dropped by /proc/net/dev */
152#endif /* linux */
153
154#ifdef HAVE_DAG_API
155#ifdef HAVE_DAG_STREAMS_API
156        u_char  *dag_mem_bottom;        /* DAG card current memory bottom pointer */
157        u_char  *dag_mem_top;   /* DAG card current memory top pointer */
158#else /* HAVE_DAG_STREAMS_API */
159        void    *dag_mem_base;  /* DAG card memory base address */
160        u_int   dag_mem_bottom; /* DAG card current memory bottom offset */
161        u_int   dag_mem_top;    /* DAG card current memory top offset */
162#endif /* HAVE_DAG_STREAMS_API */
163        int     dag_fcs_bits;   /* Number of checksum bits from link layer */
164        int     dag_offset_flags; /* Flags to pass to dag_offset(). */
165        int     dag_stream;     /* DAG stream number */
166        int     dag_timeout;    /* timeout specified to pcap_open_live.
167                                 * Same as in linux above, introduce
168                                 * generally? */
169#endif /* HAVE_DAG_API */
170#ifdef HAVE_SNF_API
171        snf_handle_t snf_handle; /* opaque device handle */
172        snf_ring_t   snf_ring;   /* opaque device ring handle */
173        int          snf_timeout;
174        int          snf_boardnum;
175#endif /*HAVE_SNF_API*/
176
177#ifdef HAVE_ZEROCOPY_BPF
178       /*
179        * Zero-copy read buffer -- for zero-copy BPF.  'buffer' above will
180        * alternative between these two actual mmap'd buffers as required.
181        * As there is a header on the front size of the mmap'd buffer, only
182        * some of the buffer is exposed to libpcap as a whole via bufsize;
183        * zbufsize is the true size.  zbuffer tracks the current zbuf
184        * assocated with buffer so that it can be used to decide which the
185        * next buffer to read will be.
186        */
187       u_char *zbuf1, *zbuf2, *zbuffer;
188       u_int zbufsize;
189       u_int zerocopy;
190       u_int interrupted;
191       struct timespec firstsel;
192       /*
193        * If there's currently a buffer being actively processed, then it is
194        * referenced here; 'buffer' is also pointed at it, but offset by the
195        * size of the header.
196        */
197       struct bpf_zbuf_header *bzh;
198#endif /* HAVE_ZEROCOPY_BPF */
199};
200
201/*
202 * Stuff to do when we close.
203 */
204#define MUST_CLEAR_PROMISC      0x00000001      /* clear promiscuous mode */
205#define MUST_CLEAR_RFMON        0x00000002      /* clear rfmon (monitor) mode */
206#define MUST_DELETE_MONIF       0x00000004      /* delete monitor-mode interface */
207
208struct pcap_opt {
209        int     buffer_size;
210        char    *source;
211        int     promisc;
212        int     rfmon;
213        int     tstamp_type;
214};
215
216/*
217 * 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
218 * Tru64 UNIX, and some versions of NetBSD pad FDDI packets to make everything
219 * line up on a nice boundary.
220 */
221#ifdef __NetBSD__
222#include <rtems/bsd/sys/param.h>        /* needed to declare __NetBSD_Version__ */
223#endif
224
225#if defined(ultrix) || defined(__osf__) || (defined(__NetBSD__) && __NetBSD_Version__ > 106000000)
226#define       PCAP_FDDIPAD 3
227#endif
228
229typedef int     (*activate_op_t)(pcap_t *);
230typedef int     (*can_set_rfmon_op_t)(pcap_t *);
231typedef int     (*read_op_t)(pcap_t *, int cnt, pcap_handler, u_char *);
232typedef int     (*inject_op_t)(pcap_t *, const void *, size_t);
233typedef int     (*setfilter_op_t)(pcap_t *, struct bpf_program *);
234typedef int     (*setdirection_op_t)(pcap_t *, pcap_direction_t);
235typedef int     (*set_datalink_op_t)(pcap_t *, int);
236typedef int     (*getnonblock_op_t)(pcap_t *, char *);
237typedef int     (*setnonblock_op_t)(pcap_t *, int, char *);
238typedef int     (*stats_op_t)(pcap_t *, struct pcap_stat *);
239#ifdef WIN32
240typedef int     (*setbuff_op_t)(pcap_t *, int);
241typedef int     (*setmode_op_t)(pcap_t *, int);
242typedef int     (*setmintocopy_op_t)(pcap_t *, int);
243#endif
244typedef void    (*cleanup_op_t)(pcap_t *);
245
246struct pcap {
247#ifdef WIN32
248        ADAPTER *adapter;
249        LPPACKET Packet;
250        int nonblock;
251#else
252        int fd;
253        int selectable_fd;
254        int send_fd;
255#endif /* WIN32 */
256
257#ifdef HAVE_LIBDLPI
258        dlpi_handle_t dlpi_hd;
259#endif
260        int snapshot;
261        int linktype;           /* Network linktype */
262        int linktype_ext;       /* Extended information stored in the linktype field of a file */
263        int tzoff;              /* timezone offset */
264        int offset;             /* offset for proper alignment */
265        int activated;          /* true if the capture is really started */
266        int oldstyle;           /* if we're opening with pcap_open_live() */
267
268        int break_loop;         /* flag set to force break from packet-reading loop */
269
270#ifdef PCAP_FDDIPAD
271        int fddipad;
272#endif
273
274#ifdef MSDOS
275        void (*wait_proc)(void); /*          call proc while waiting */
276#endif
277
278        struct pcap_sf sf;
279        struct pcap_md md;
280        struct pcap_opt opt;
281
282        /*
283         * Read buffer.
284         */
285        int bufsize;
286        u_char *buffer;
287        u_char *bp;
288        int cc;
289
290        /*
291         * Place holder for pcap_next().
292         */
293        u_char *pkt;
294
295        /* We're accepting only packets in this direction/these directions. */
296        pcap_direction_t direction;
297
298        /*
299         * Methods.
300         */
301        activate_op_t activate_op;
302        can_set_rfmon_op_t can_set_rfmon_op;
303        read_op_t read_op;
304        inject_op_t inject_op;
305        setfilter_op_t setfilter_op;
306        setdirection_op_t setdirection_op;
307        set_datalink_op_t set_datalink_op;
308        getnonblock_op_t getnonblock_op;
309        setnonblock_op_t setnonblock_op;
310        stats_op_t stats_op;
311
312        /*
313         * Routine to use as callback for pcap_next()/pcap_next_ex().
314         */
315        pcap_handler oneshot_callback;
316
317#ifdef WIN32
318        /*
319         * These are, at least currently, specific to the Win32 NPF
320         * driver.
321         */
322        setbuff_op_t setbuff_op;
323        setmode_op_t setmode_op;
324        setmintocopy_op_t setmintocopy_op;
325#endif
326        cleanup_op_t cleanup_op;
327
328        /*
329         * Placeholder for filter code if bpf not in kernel.
330         */
331        struct bpf_program fcode;
332
333        char errbuf[PCAP_ERRBUF_SIZE + 1];
334        int dlt_count;
335        u_int *dlt_list;
336        int tstamp_type_count;
337        u_int *tstamp_type_list;
338
339        struct pcap_pkthdr pcap_header; /* This is needed for the pcap_next_ex() to work */
340};
341
342/*
343 * This is a timeval as stored in a savefile.
344 * It has to use the same types everywhere, independent of the actual
345 * `struct timeval'; `struct timeval' has 32-bit tv_sec values on some
346 * platforms and 64-bit tv_sec values on other platforms, and writing
347 * out native `struct timeval' values would mean files could only be
348 * read on systems with the same tv_sec size as the system on which
349 * the file was written.
350 */
351
352struct pcap_timeval {
353    bpf_int32 tv_sec;           /* seconds */
354    bpf_int32 tv_usec;          /* microseconds */
355};
356
357/*
358 * This is a `pcap_pkthdr' as actually stored in a savefile.
359 *
360 * Do not change the format of this structure, in any way (this includes
361 * changes that only affect the length of fields in this structure),
362 * and do not make the time stamp anything other than seconds and
363 * microseconds (e.g., seconds and nanoseconds).  Instead:
364 *
365 *      introduce a new structure for the new format;
366 *
367 *      send mail to "tcpdump-workers@lists.tcpdump.org", requesting
368 *      a new magic number for your new capture file format, and, when
369 *      you get the new magic number, put it in "savefile.c";
370 *
371 *      use that magic number for save files with the changed record
372 *      header;
373 *
374 *      make the code in "savefile.c" capable of reading files with
375 *      the old record header as well as files with the new record header
376 *      (using the magic number to determine the header format).
377 *
378 * Then supply the changes by forking the branch at
379 *
380 *      https://github.com/mcr/libpcap/issues
381 *
382 * and issuing a pull request, so that future versions of libpcap and
383 * programs that use it (such as tcpdump) will be able to read your new
384 * capture file format.
385 */
386
387struct pcap_sf_pkthdr {
388    struct pcap_timeval ts;     /* time stamp */
389    bpf_u_int32 caplen;         /* length of portion present */
390    bpf_u_int32 len;            /* length this packet (off wire) */
391};
392
393/*
394 * How a `pcap_pkthdr' is actually stored in savefiles written
395 * by some patched versions of libpcap (e.g. the ones in Red
396 * Hat Linux 6.1 and 6.2).
397 *
398 * Do not change the format of this structure, in any way (this includes
399 * changes that only affect the length of fields in this structure).
400 * Instead, introduce a new structure, as per the above.
401 */
402
403struct pcap_sf_patched_pkthdr {
404    struct pcap_timeval ts;     /* time stamp */
405    bpf_u_int32 caplen;         /* length of portion present */
406    bpf_u_int32 len;            /* length this packet (off wire) */
407    int         index;
408    unsigned short protocol;
409    unsigned char pkt_type;
410};
411
412/*
413 * User data structure for the one-shot callback used for pcap_next()
414 * and pcap_next_ex().
415 */
416struct oneshot_userdata {
417        struct pcap_pkthdr *hdr;
418        const u_char **pkt;
419        pcap_t *pd;
420};
421
422int     yylex(void);
423
424#ifndef min
425#define min(a, b) ((a) > (b) ? (b) : (a))
426#endif
427
428/* XXX should these be in pcap.h? */
429int     pcap_offline_read(pcap_t *, int, pcap_handler, u_char *);
430int     pcap_read(pcap_t *, int cnt, pcap_handler, u_char *);
431
432#ifndef HAVE_STRLCPY
433#define strlcpy(x, y, z) \
434        (strncpy((x), (y), (z)), \
435         ((z) <= 0 ? 0 : ((x)[(z) - 1] = '\0')), \
436         strlen((y)))
437#endif
438
439#include <stdarg.h>
440
441#if !defined(HAVE_SNPRINTF)
442#define snprintf pcap_snprintf
443extern int snprintf (char *, size_t, const char *, ...);
444#endif
445
446#if !defined(HAVE_VSNPRINTF)
447#define vsnprintf pcap_vsnprintf
448extern int vsnprintf (char *, size_t, const char *, va_list ap);
449#endif
450
451/*
452 * Routines that most pcap implementations can use for non-blocking mode.
453 */
454#if !defined(WIN32) && !defined(MSDOS)
455int     pcap_getnonblock_fd(pcap_t *, char *);
456int     pcap_setnonblock_fd(pcap_t *p, int, char *);
457#endif
458
459/*
460 * Internal interfaces for "pcap_create()".
461 *
462 * "pcap_create_interface()" is the routine to do a pcap_create on
463 * a regular network interface.  There are multiple implementations
464 * of this, one for each platform type (Linux, BPF, DLPI, etc.),
465 * with the one used chosen by the configure script.
466 *
467 * "pcap_create_common()" allocates and fills in a pcap_t, for use
468 * by pcap_create routines.
469 */
470pcap_t  *pcap_create_interface(const char *, char *);
471pcap_t  *pcap_create_common(const char *, char *);
472int     pcap_do_addexit(pcap_t *);
473void    pcap_add_to_pcaps_to_close(pcap_t *);
474void    pcap_remove_from_pcaps_to_close(pcap_t *);
475void    pcap_cleanup_live_common(pcap_t *);
476int     pcap_not_initialized(pcap_t *);
477int     pcap_check_activated(pcap_t *);
478
479/*
480 * Internal interfaces for "pcap_findalldevs()".
481 *
482 * "pcap_findalldevs_interfaces()" finds interfaces using the
483 * "standard" mechanisms (SIOCGIFCONF, "getifaddrs()", etc.).
484 *
485 * "pcap_platform_finddevs()" is a platform-dependent routine to
486 * add devices not found by the "standard" mechanisms.
487 *
488 * "pcap_add_if()" adds an interface to the list of interfaces, for
489 * use by various "find interfaces" routines.
490 */
491int     pcap_findalldevs_interfaces(pcap_if_t **, char *);
492int     pcap_platform_finddevs(pcap_if_t **, char *);
493int     add_addr_to_iflist(pcap_if_t **, const char *, u_int, struct sockaddr *,
494            size_t, struct sockaddr *, size_t, struct sockaddr *, size_t,
495            struct sockaddr *, size_t, char *);
496int     pcap_add_if(pcap_if_t **, const char *, u_int, const char *, char *);
497struct sockaddr *dup_sockaddr(struct sockaddr *, size_t);
498int     add_or_find_if(pcap_if_t **, pcap_if_t **, const char *, u_int,
499            const char *, char *);
500
501#ifdef WIN32
502char    *pcap_win32strerror(void);
503#endif
504
505int     install_bpf_program(pcap_t *, struct bpf_program *);
506
507int     pcap_strcasecmp(const char *, const char *);
508
509#ifdef __cplusplus
510}
511#endif
512
513#endif
Note: See TracBrowser for help on using the repository browser.