| /* | 
 |  * Internal details for libpcap on DOS. | 
 |  * 32-bit targets: djgpp, Pharlap or DOS4GW. | 
 |  */ | 
 |  | 
 | #ifndef __PCAP_DOS_H | 
 | #define __PCAP_DOS_H | 
 |  | 
 | #ifdef __DJGPP__ | 
 | #include <pc.h>    /* simple non-conio kbhit */ | 
 | #else | 
 | #include <conio.h> | 
 | #endif | 
 |  | 
 | typedef int            BOOL; | 
 | typedef unsigned char  BYTE; | 
 | typedef unsigned short WORD; | 
 | typedef unsigned long  DWORD; | 
 | typedef BYTE           ETHER[6]; | 
 |  | 
 | #define ETH_ALEN       sizeof(ETHER)   /* Ether address length */ | 
 | #define ETH_HLEN       (2*ETH_ALEN+2)  /* Ether header length  */ | 
 | #define ETH_MTU        1500 | 
 | #define ETH_MIN        60 | 
 | #define ETH_MAX        (ETH_MTU+ETH_HLEN) | 
 |  | 
 | #ifndef TRUE | 
 |   #define TRUE   1 | 
 |   #define FALSE  0 | 
 | #endif | 
 |  | 
 | #define PHARLAP  1 | 
 | #define DJGPP    2 | 
 | #define DOS4GW   4 | 
 |  | 
 | #ifdef __DJGPP__ | 
 |   #undef  DOSX | 
 |   #define DOSX DJGPP | 
 | #endif | 
 |  | 
 | #ifdef __WATCOMC__ | 
 |   #undef  DOSX | 
 |   #define DOSX DOS4GW | 
 | #endif | 
 |  | 
 | #ifdef __HIGHC__ | 
 |   #include <pharlap.h> | 
 |   #undef  DOSX | 
 |   #define DOSX PHARLAP | 
 |   #define inline | 
 | #else | 
 |   typedef unsigned int UINT; | 
 | #endif | 
 |  | 
 |  | 
 | #if defined(__GNUC__) || defined(__HIGHC__) | 
 |   typedef unsigned long long  uint64; | 
 |   typedef unsigned long long  QWORD; | 
 | #endif | 
 |  | 
 | #if defined(__WATCOMC__) | 
 |   typedef unsigned __int64  uint64; | 
 |   typedef unsigned __int64  QWORD; | 
 | #endif | 
 |  | 
 | #define ARGSUSED(x)  (void) x | 
 |  | 
 | #if defined (__SMALL__) || defined(__LARGE__) | 
 |   #define DOSX 0 | 
 |  | 
 | #elif !defined(DOSX) | 
 |   #error DOSX not defined; 1 = PharLap, 2 = djgpp, 4 = DOS4GW | 
 | #endif | 
 |  | 
 | #ifdef __HIGHC__ | 
 | #define min(a,b) _min(a,b) | 
 | #define max(a,b) _max(a,b) | 
 | #endif | 
 |  | 
 | #ifndef min | 
 | #define min(a,b) ((a) < (b) ? (a) : (b)) | 
 | #endif | 
 |  | 
 | #ifndef max | 
 | #define max(a,b) ((a) < (b) ? (b) : (a)) | 
 | #endif | 
 |  | 
 | #if !defined(_U_) && defined(__GNUC__) | 
 | #define _U_  __attribute__((unused)) | 
 | #endif | 
 |  | 
 | #ifndef _U_ | 
 | #define _U_ | 
 | #endif | 
 |  | 
 | #if defined(USE_32BIT_DRIVERS) | 
 |   #include "msdos/pm_drvr/lock.h" | 
 |  | 
 |   #ifndef RECEIVE_QUEUE_SIZE | 
 |   #define RECEIVE_QUEUE_SIZE  60 | 
 |   #endif | 
 |  | 
 |   #ifndef RECEIVE_BUF_SIZE | 
 |   #define RECEIVE_BUF_SIZE   (ETH_MAX+20) | 
 |   #endif | 
 |  | 
 |   extern struct device el2_dev     LOCKED_VAR;  /* 3Com EtherLink II */ | 
 |   extern struct device el3_dev     LOCKED_VAR;  /*      EtherLink III */ | 
 |   extern struct device tc59_dev    LOCKED_VAR;  /* 3Com Vortex Card (?) */ | 
 |   extern struct device tc515_dev   LOCKED_VAR; | 
 |   extern struct device tc90x_dev   LOCKED_VAR; | 
 |   extern struct device tc90bcx_dev LOCKED_VAR; | 
 |   extern struct device wd_dev      LOCKED_VAR; | 
 |   extern struct device ne_dev      LOCKED_VAR; | 
 |   extern struct device acct_dev    LOCKED_VAR; | 
 |   extern struct device cs89_dev    LOCKED_VAR; | 
 |   extern struct device rtl8139_dev LOCKED_VAR; | 
 |  | 
 |   struct rx_ringbuf { | 
 |          volatile int in_index;   /* queue index head */ | 
 |          int          out_index;  /* queue index tail */ | 
 |          int          elem_size;  /* size of each element */ | 
 |          int          num_elem;   /* number of elements */ | 
 |          char        *buf_start;  /* start of buffer pool */ | 
 |        }; | 
 |  | 
 |   struct rx_elem { | 
 |          DWORD size;              /* size copied to this element */ | 
 |          BYTE  data[ETH_MAX+10];  /* add some margin. data[0] should be */ | 
 |        };                         /* dword aligned */ | 
 |  | 
 |   extern BYTE *get_rxbuf     (int len) LOCKED_FUNC; | 
 |   extern int   peek_rxbuf    (BYTE **buf); | 
 |   extern int   release_rxbuf (BYTE  *buf); | 
 |  | 
 | #else | 
 |   #define LOCKED_VAR | 
 |   #define LOCKED_FUNC | 
 |  | 
 |   struct device { | 
 |          const char *name; | 
 |          const char *long_name; | 
 |          DWORD  base_addr;      /* device I/O address       */ | 
 |          int    irq;            /* device IRQ number        */ | 
 |          int    dma;            /* DMA channel              */ | 
 |          DWORD  mem_start;      /* shared mem start         */ | 
 |          DWORD  mem_end;        /* shared mem end           */ | 
 |          DWORD  rmem_start;     /* shmem "recv" start       */ | 
 |          DWORD  rmem_end;       /* shared "recv" end        */ | 
 |  | 
 |          struct device *next;   /* next device in list      */ | 
 |  | 
 |          /* interface service routines */ | 
 |          int   (*probe)(struct device *dev); | 
 |          int   (*open) (struct device *dev); | 
 |          void  (*close)(struct device *dev); | 
 |          int   (*xmit) (struct device *dev, const void *buf, int len); | 
 |          void *(*get_stats)(struct device *dev); | 
 |          void  (*set_multicast_list)(struct device *dev); | 
 |  | 
 |          /* driver-to-pcap receive buffer routines */ | 
 |          int   (*copy_rx_buf) (BYTE *buf, int max); /* rx-copy (pktdrvr only) */ | 
 |          BYTE *(*get_rx_buf) (int len);             /* rx-buf fetch/enqueue */ | 
 |          int   (*peek_rx_buf) (BYTE **buf);         /* rx-non-copy at queue */ | 
 |          int   (*release_rx_buf) (BYTE *buf);       /* release after peek */ | 
 |  | 
 |          WORD   flags;          /* Low-level status flags. */ | 
 |          void  *priv;           /* private data */ | 
 |        }; | 
 |  | 
 |   /* | 
 |    * Network device statistics | 
 |    */ | 
 |   typedef struct net_device_stats { | 
 |           DWORD  rx_packets;            /* total packets received       */ | 
 |           DWORD  tx_packets;            /* total packets transmitted    */ | 
 |           DWORD  rx_bytes;              /* total bytes received         */ | 
 |           DWORD  tx_bytes;              /* total bytes transmitted      */ | 
 |           DWORD  rx_errors;             /* bad packets received         */ | 
 |           DWORD  tx_errors;             /* packet transmit problems     */ | 
 |           DWORD  rx_dropped;            /* no space in Rx buffers       */ | 
 |           DWORD  tx_dropped;            /* no space available for Tx    */ | 
 |           DWORD  multicast;             /* multicast packets received   */ | 
 |  | 
 |           /* detailed rx_errors: */ | 
 |           DWORD  rx_length_errors; | 
 |           DWORD  rx_over_errors;        /* recv'r overrun error         */ | 
 |           DWORD  rx_osize_errors;       /* recv'r over-size error       */ | 
 |           DWORD  rx_crc_errors;         /* recv'd pkt with crc error    */ | 
 |           DWORD  rx_frame_errors;       /* recv'd frame alignment error */ | 
 |           DWORD  rx_fifo_errors;        /* recv'r fifo overrun          */ | 
 |           DWORD  rx_missed_errors;      /* recv'r missed packet         */ | 
 |  | 
 |           /* detailed tx_errors */ | 
 |           DWORD  tx_aborted_errors; | 
 |           DWORD  tx_carrier_errors; | 
 |           DWORD  tx_fifo_errors; | 
 |           DWORD  tx_heartbeat_errors; | 
 |           DWORD  tx_window_errors; | 
 |           DWORD  tx_collisions; | 
 |           DWORD  tx_jabbers; | 
 |         } NET_STATS; | 
 | #endif | 
 |  | 
 | extern struct device       *active_dev  LOCKED_VAR; | 
 | extern const struct device *dev_base    LOCKED_VAR; | 
 | extern struct device       *probed_dev; | 
 |  | 
 | extern int pcap_pkt_debug; | 
 |  | 
 | extern void _w32_os_yield (void); /* Watt-32's misc.c */ | 
 |  | 
 | #ifdef NDEBUG | 
 |   #define PCAP_ASSERT(x) ((void)0) | 
 |  | 
 | #else | 
 |   void pcap_assert (const char *what, const char *file, unsigned line); | 
 |  | 
 |   #define PCAP_ASSERT(x) do { \ | 
 |                            if (!(x)) \ | 
 |                               pcap_assert (#x, __FILE__, __LINE__); \ | 
 |                          } while (0) | 
 | #endif | 
 |  | 
 | #endif  /* __PCAP_DOS_H */ |