os/boardsupport/emulator/emulatorbsp/wpdpack/include/pcap-int.h
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     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.68.2.9 2006/02/22 17:09:54 gianluca Exp $ (LBL)
    34  */
    35 
    36 #ifndef pcap_int_h
    37 #define pcap_int_h
    38 
    39 #ifdef __cplusplus
    40 extern "C" {
    41 #endif
    42 
    43 #include <pcap.h>
    44 
    45 #ifdef WIN32
    46 #include <Packet32.h>
    47 #endif /* WIN32 */
    48 
    49 #ifdef MSDOS
    50 #include <fcntl.h>
    51 #include <io.h>
    52 #endif
    53 
    54 /*
    55  * Savefile
    56  */
    57 typedef enum {
    58 	NOT_SWAPPED,
    59 	SWAPPED,
    60 	MAYBE_SWAPPED
    61 } swapped_type_t;
    62 
    63 struct pcap_sf {
    64 	FILE *rfile;
    65 	int swapped;
    66 	int hdrsize;
    67 	swapped_type_t lengths_swapped;
    68 	int version_major;
    69 	int version_minor;
    70 	u_char *base;
    71 };
    72 
    73 struct pcap_md {
    74 	struct pcap_stat stat;
    75 	/*XXX*/
    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 */
    83 #ifdef linux
    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() */
    92 #endif
    93 
    94 #ifdef HAVE_DAG_API
    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 */
    98 #else
    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
   108 				 * generally? */
   109 #endif /* HAVE_DAG_API */
   110 
   111 #ifdef HAVE_REMOTE
   112 /*!
   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:
   116 
   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).
   126 */
   127 	unsigned int TotNetDrops;	//!< keeps the number of packets that have been dropped by the network
   128 /*!
   129 	\brief It keeps the number of packets that have been received by the application.
   130 	
   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.
   138 */
   139 	unsigned int TotCapt;
   140 #endif /* HAVE_REMOTE */
   141 };
   142 
   143 /*
   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.
   146  */
   147 #if defined(ultrix) || defined(__osf__) || (defined(__NetBSD__) && __NetBSD_Version__ > 106000000)
   148 #define       PCAP_FDDIPAD 3
   149 #endif
   150 
   151 struct pcap {
   152 #ifdef WIN32
   153 	ADAPTER *adapter;
   154 	LPPACKET Packet;
   155 	int timeout;
   156 	int nonblock;
   157 #else
   158 	int fd;
   159 	int selectable_fd;
   160 	int send_fd;
   161 #endif /* WIN32 */
   162 	int snapshot;
   163 	int linktype;
   164 	int tzoff;		/* timezone offset */
   165 	int offset;		/* offset for proper alignment */
   166 
   167 	int break_loop;		/* flag set to force break from packet-reading loop */
   168 
   169 #ifdef PCAP_FDDIPAD
   170 	int fddipad;
   171 #endif
   172 
   173 #ifdef MSDOS
   174         int inter_packet_wait;   /* offline: wait between packets */
   175         void (*wait_proc)(void); /*          call proc while waiting */
   176 #endif
   177 
   178 	struct pcap_sf sf;
   179 	struct pcap_md md;
   180 
   181 	/*
   182 	 * Read buffer.
   183 	 */
   184 	int bufsize;
   185 	u_char *buffer;
   186 	u_char *bp;
   187 	int cc;
   188 
   189 	/*
   190 	 * Place holder for pcap_next().
   191 	 */
   192 	u_char *pkt;
   193 
   194 	/* We're accepting only packets in this direction/these directions. */
   195 	pcap_direction_t direction;
   196 
   197 	/*
   198 	 * Methods.
   199 	 */
   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 *);
   209 
   210 	/*
   211 	 * Placeholder for filter code if bpf not in kernel.
   212 	 */
   213 	struct bpf_program fcode;
   214 
   215 	char errbuf[PCAP_ERRBUF_SIZE + 1];
   216 	int dlt_count;
   217 	u_int *dlt_list;
   218 
   219 	struct pcap_pkthdr pcap_header;	/* This is needed for the pcap_next_ex() to work */
   220 
   221 #ifdef HAVE_REMOTE
   222 #ifndef WIN32	// Win32 already defines 'timeout'
   223 	int timeout;				//!< timeout to be used in the pcap_open()
   224 #endif
   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. */
   227 	int rmt_clientside;
   228 
   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 */
   236 };
   237 
   238 /*
   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.
   246  */
   247 
   248 struct pcap_timeval {
   249     bpf_int32 tv_sec;		/* seconds */
   250     bpf_int32 tv_usec;		/* microseconds */
   251 };
   252 
   253 /*
   254  * This is a `pcap_pkthdr' as actually stored in a savefile.
   255  *
   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:
   260  *
   261  *	introduce a new structure for the new format;
   262  *
   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";
   266  *
   267  *	use that magic number for save files with the changed record
   268  *	header;
   269  *
   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).
   273  *
   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.
   277  */
   278 
   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) */
   283 };
   284 
   285 /*
   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).
   289  *
   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.
   293  */
   294 
   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) */
   299     int		index;
   300     unsigned short protocol;
   301     unsigned char pkt_type;
   302 };
   303 
   304 int	yylex(void);
   305 
   306 #ifndef min
   307 #define min(a, b) ((a) > (b) ? (b) : (a))
   308 #endif
   309 
   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 *);
   313 
   314 #ifndef HAVE_STRLCPY
   315 #define strlcpy(x, y, z) \
   316 	(strncpy((x), (y), (z)), \
   317 	 ((z) <= 0 ? 0 : ((x)[(z) - 1] = '\0')), \
   318 	 strlen((y)))
   319 #endif
   320 
   321 #include <stdarg.h>
   322 
   323 #if !defined(HAVE_SNPRINTF)
   324 #define snprintf pcap_snprintf
   325 extern int snprintf (char *, size_t, const char *, ...);
   326 #endif
   327 
   328 #if !defined(HAVE_VSNPRINTF)
   329 #define vsnprintf pcap_vsnprintf
   330 extern int vsnprintf (char *, size_t, const char *, va_list ap);
   331 #endif
   332 
   333 /*
   334  * Routines that most pcap implementations can use for non-blocking mode.
   335  */
   336 #if !defined(WIN32) && !defined(MSDOS)
   337 int	pcap_getnonblock_fd(pcap_t *, char *);
   338 int	pcap_setnonblock_fd(pcap_t *p, int, char *);
   339 #endif
   340 
   341 void	pcap_close_common(pcap_t *);
   342 
   343 /*
   344  * Internal interfaces for "pcap_findalldevs()".
   345  *
   346  * "pcap_platform_finddevs()" is a platform-dependent routine to
   347  * add devices not found by the "standard" mechanisms (SIOCGIFCONF,
   348  * "getifaddrs()", etc..
   349  *
   350  * "pcap_add_if()" adds an interface to the list of interfaces.
   351  */
   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 *);
   360 
   361 #ifdef WIN32
   362 char	*pcap_win32strerror(void);
   363 #endif
   364 
   365 int	install_bpf_program(pcap_t *, struct bpf_program *);
   366 
   367 int	pcap_strcasecmp(const char *, const char *);
   368 
   369 #ifdef __cplusplus
   370 }
   371 #endif
   372 
   373 #endif