pcap-dos.h revision 214518
157429Smarkm/*
257429Smarkm * Internal details for libpcap on DOS.
357429Smarkm * 32-bit targets: djgpp, Pharlap or DOS4GW.
457429Smarkm *
557429Smarkm * @(#) $Header: /tcpdump/master/libpcap/pcap-dos.h,v 1.1 2004-12-18 08:52:10 guy Exp $ (LBL)
657429Smarkm */
760573Skris
865668Skris#ifndef __PCAP_DOS_H
965668Skris#define __PCAP_DOS_H
1065668Skris
1165668Skris#ifdef __DJGPP__
1265668Skris#include <pc.h>    /* simple non-conio kbhit */
1365668Skris#else
1465668Skris#include <conio.h>
1560573Skris#endif
1692555Sdes
1760573Skristypedef int            BOOL;
1865668Skristypedef unsigned char  BYTE;
1965668Skristypedef unsigned short WORD;
2065668Skristypedef unsigned long  DWORD;
2165668Skristypedef BYTE           ETHER[6];
2265668Skris
2365668Skris#define ETH_ALEN       sizeof(ETHER)   /* Ether address length */
2465668Skris#define ETH_HLEN       (2*ETH_ALEN+2)  /* Ether header length  */
2565668Skris#define ETH_MTU        1500
2665668Skris#define ETH_MIN        60
2765668Skris#define ETH_MAX        (ETH_MTU+ETH_HLEN)
2865668Skris
2965668Skris#ifndef TRUE
3065668Skris  #define TRUE   1
3165668Skris  #define FALSE  0
3265668Skris#endif
3365668Skris
3465668Skris#define PHARLAP  1
3565668Skris#define DJGPP    2
3665668Skris#define DOS4GW   4
3757429Smarkm
3857429Smarkm#ifdef __DJGPP__
3957429Smarkm  #undef  DOSX
40146998Sdes  #define DOSX DJGPP
4157429Smarkm#endif
42124208Sdes
43124208Sdes#ifdef __WATCOMC__
4457429Smarkm  #undef  DOSX
4557429Smarkm  #define DOSX DOS4GW
4657429Smarkm#endif
4757429Smarkm
4857429Smarkm#ifdef __HIGHC__
4957429Smarkm  #include <pharlap.h>
5057429Smarkm  #undef  DOSX
5157429Smarkm  #define DOSX PHARLAP
5257429Smarkm  #define inline
5360573Skris#else
5457429Smarkm  typedef unsigned int UINT;
5560573Skris#endif
5676259Sgreen
5760573Skris
5860573Skris#if defined(__GNUC__) || defined(__HIGHC__)
5969587Sgreen  typedef unsigned long long  uint64;
6060573Skris  typedef unsigned long long  QWORD;
6176259Sgreen#endif
6276259Sgreen
6376259Sgreen#if defined(__WATCOMC__)
6492555Sdes  typedef unsigned __int64  uint64;
6598675Sdes  typedef unsigned __int64  QWORD;
6660573Skris#endif
6760573Skris
6860573Skris#define ARGSUSED(x)  (void) x
6960573Skris
7060573Skris#if defined (__SMALL__) || defined(__LARGE__)
7160573Skris  #define DOSX 0
7260573Skris
7357429Smarkm#elif !defined(DOSX)
7457429Smarkm  #error DOSX not defined; 1 = PharLap, 2 = djgpp, 4 = DOS4GW
7557429Smarkm#endif
7657429Smarkm
7757429Smarkm#ifdef __HIGHC__
7857429Smarkm#define min(a,b) _min(a,b)
7957429Smarkm#define max(a,b) _max(a,b)
8057429Smarkm#endif
8157429Smarkm
8257429Smarkm#ifndef min
8376259Sgreen#define min(a,b) ((a) < (b) ? (a) : (b))
8457429Smarkm#endif
8557429Smarkm
8657429Smarkm#ifndef max
8757429Smarkm#define max(a,b) ((a) < (b) ? (b) : (a))
8857429Smarkm#endif
8957429Smarkm
9057429Smarkm#if !defined(_U_) && defined(__GNUC__)
9157429Smarkm#define _U_  __attribute__((unused))
9298675Sdes#endif
9357429Smarkm
9457429Smarkm#ifndef _U_
9598675Sdes#define _U_
9657429Smarkm#endif
9757429Smarkm
9857429Smarkm#if defined(USE_32BIT_DRIVERS)
9957429Smarkm  #include "msdos/pm_drvr/lock.h"
10057429Smarkm
10157429Smarkm  #ifndef RECEIVE_QUEUE_SIZE
10257429Smarkm  #define RECEIVE_QUEUE_SIZE  60
10357429Smarkm  #endif
10457429Smarkm
10576259Sgreen  #ifndef RECEIVE_BUF_SIZE
10657429Smarkm  #define RECEIVE_BUF_SIZE   (ETH_MAX+20)
10757429Smarkm  #endif
10857429Smarkm
10957429Smarkm  extern struct device el2_dev     LOCKED_VAR;  /* 3Com EtherLink II */
11057429Smarkm  extern struct device el3_dev     LOCKED_VAR;  /*      EtherLink III */
111124208Sdes  extern struct device tc59_dev    LOCKED_VAR;  /* 3Com Vortex Card (?) */
11257429Smarkm  extern struct device tc515_dev   LOCKED_VAR;
11357429Smarkm  extern struct device tc90x_dev   LOCKED_VAR;
11457429Smarkm  extern struct device tc90bcx_dev LOCKED_VAR;
11557429Smarkm  extern struct device wd_dev      LOCKED_VAR;
11657429Smarkm  extern struct device ne_dev      LOCKED_VAR;
11757429Smarkm  extern struct device acct_dev    LOCKED_VAR;
11857429Smarkm  extern struct device cs89_dev    LOCKED_VAR;
11960573Skris  extern struct device rtl8139_dev LOCKED_VAR;
12076259Sgreen
121124208Sdes  struct rx_ringbuf {
122124208Sdes         volatile int in_index;   /* queue index head */
123124208Sdes         int          out_index;  /* queue index tail */
124124208Sdes         int          elem_size;  /* size of each element */
125124208Sdes         int          num_elem;   /* number of elements */
12660573Skris         char        *buf_start;  /* start of buffer pool */
127124208Sdes       };
128124208Sdes
129124208Sdes  struct rx_elem {
13098675Sdes         DWORD size;              /* size copied to this element */
13198675Sdes         BYTE  data[ETH_MAX+10];  /* add some margin. data[0] should be */
13298675Sdes       };                         /* dword aligned */
13398675Sdes
13492555Sdes  extern BYTE *get_rxbuf     (int len) LOCKED_FUNC;
13592555Sdes  extern int   peek_rxbuf    (BYTE **buf);
13660573Skris  extern int   release_rxbuf (BYTE  *buf);
137124208Sdes
138124208Sdes#else
139124208Sdes  #define LOCKED_VAR
140124208Sdes  #define LOCKED_FUNC
141124208Sdes
142124208Sdes  struct device {
143124208Sdes         const char *name;
14457429Smarkm         const char *long_name;
14557429Smarkm         DWORD  base_addr;      /* device I/O address       */
14657429Smarkm         int    irq;            /* device IRQ number        */
14757429Smarkm         int    dma;            /* DMA channel              */
14857429Smarkm         DWORD  mem_start;      /* shared mem start         */
14957429Smarkm         DWORD  mem_end;        /* shared mem end           */
15057429Smarkm         DWORD  rmem_start;     /* shmem "recv" start       */
15169587Sgreen         DWORD  rmem_end;       /* shared "recv" end        */
152106121Sdes
15369587Sgreen         struct device *next;   /* next device in list      */
15469587Sgreen
15557429Smarkm         /* interface service routines */
15657429Smarkm         int   (*probe)(struct device *dev);
157137015Sdes         int   (*open) (struct device *dev);
158137015Sdes         void  (*close)(struct device *dev);
159137015Sdes         int   (*xmit) (struct device *dev, const void *buf, int len);
160137015Sdes         void *(*get_stats)(struct device *dev);
16192555Sdes         void  (*set_multicast_list)(struct device *dev);
16257429Smarkm
16357429Smarkm         /* driver-to-pcap receive buffer routines */
16457429Smarkm         int   (*copy_rx_buf) (BYTE *buf, int max); /* rx-copy (pktdrvr only) */
16557429Smarkm         BYTE *(*get_rx_buf) (int len);             /* rx-buf fetch/enqueue */
16657429Smarkm         int   (*peek_rx_buf) (BYTE **buf);         /* rx-non-copy at queue */
16757429Smarkm         int   (*release_rx_buf) (BYTE *buf);       /* release after peek */
168124208Sdes
16957429Smarkm         WORD   flags;          /* Low-level status flags. */
17057429Smarkm         void  *priv;           /* private data */
17157429Smarkm       };
17257429Smarkm
17357429Smarkm  /*
17457429Smarkm   * Network device statistics
17592555Sdes   */
17657429Smarkm  typedef struct net_device_stats {
17757429Smarkm          DWORD  rx_packets;            /* total packets received       */
17857429Smarkm          DWORD  tx_packets;            /* total packets transmitted    */
17957429Smarkm          DWORD  rx_bytes;              /* total bytes received         */
18057429Smarkm          DWORD  tx_bytes;              /* total bytes transmitted      */
18157429Smarkm          DWORD  rx_errors;             /* bad packets received         */
18257429Smarkm          DWORD  tx_errors;             /* packet transmit problems     */
18357429Smarkm          DWORD  rx_dropped;            /* no space in Rx buffers       */
18457429Smarkm          DWORD  tx_dropped;            /* no space available for Tx    */
18557429Smarkm          DWORD  multicast;             /* multicast packets received   */
18657429Smarkm
18757429Smarkm          /* detailed rx_errors: */
18857429Smarkm          DWORD  rx_length_errors;
18957429Smarkm          DWORD  rx_over_errors;        /* recv'r overrun error         */
19057429Smarkm          DWORD  rx_osize_errors;       /* recv'r over-size error       */
19157429Smarkm          DWORD  rx_crc_errors;         /* recv'd pkt with crc error    */
19257429Smarkm          DWORD  rx_frame_errors;       /* recv'd frame alignment error */
19357429Smarkm          DWORD  rx_fifo_errors;        /* recv'r fifo overrun          */
19457429Smarkm          DWORD  rx_missed_errors;      /* recv'r missed packet         */
19557429Smarkm
19657429Smarkm          /* detailed tx_errors */
19757429Smarkm          DWORD  tx_aborted_errors;
19898675Sdes          DWORD  tx_carrier_errors;
19998675Sdes          DWORD  tx_fifo_errors;
20098675Sdes          DWORD  tx_heartbeat_errors;
20198675Sdes          DWORD  tx_window_errors;
20298675Sdes          DWORD  tx_collisions;
20398675Sdes          DWORD  tx_jabbers;
20498675Sdes        } NET_STATS;
20598675Sdes#endif
20698675Sdes
20798675Sdesextern struct device       *active_dev  LOCKED_VAR;
20898675Sdesextern const struct device *dev_base    LOCKED_VAR;
20998675Sdesextern struct device       *probed_dev;
21098675Sdes
21198675Sdesextern int pcap_pkt_debug;
21298675Sdes
21398675Sdesextern void _w32_os_yield (void); /* Watt-32's misc.c */
21498675Sdes
21598675Sdes#ifdef NDEBUG
21698675Sdes  #define PCAP_ASSERT(x) ((void)0)
21798675Sdes
21898675Sdes#else
21998675Sdes  void pcap_assert (const char *what, const char *file, unsigned line);
22098675Sdes
22198675Sdes  #define PCAP_ASSERT(x) do { \
22298675Sdes                           if (!(x)) \
22398675Sdes                              pcap_assert (#x, __FILE__, __LINE__); \
22498675Sdes                         } while (0)
22598675Sdes#endif
22698675Sdes
22798675Sdes#endif  /* __PCAP_DOS_H */
22898675Sdes