104fb2745SSam Leffler /* 204fb2745SSam Leffler * Internal details for libpcap on DOS. 304fb2745SSam Leffler * 32-bit targets: djgpp, Pharlap or DOS4GW. 404fb2745SSam Leffler */ 504fb2745SSam Leffler 604fb2745SSam Leffler #ifndef __PCAP_DOS_H 704fb2745SSam Leffler #define __PCAP_DOS_H 804fb2745SSam Leffler 904fb2745SSam Leffler #ifdef __DJGPP__ 1004fb2745SSam Leffler #include <pc.h> /* simple non-conio kbhit */ 1104fb2745SSam Leffler #else 1204fb2745SSam Leffler #include <conio.h> 1304fb2745SSam Leffler #endif 1404fb2745SSam Leffler 1504fb2745SSam Leffler typedef int BOOL; 1604fb2745SSam Leffler typedef unsigned char BYTE; 1704fb2745SSam Leffler typedef unsigned short WORD; 1804fb2745SSam Leffler typedef unsigned long DWORD; 1904fb2745SSam Leffler typedef BYTE ETHER[6]; 2004fb2745SSam Leffler 2104fb2745SSam Leffler #define ETH_ALEN sizeof(ETHER) /* Ether address length */ 2204fb2745SSam Leffler #define ETH_HLEN (2*ETH_ALEN+2) /* Ether header length */ 2304fb2745SSam Leffler #define ETH_MTU 1500 2404fb2745SSam Leffler #define ETH_MIN 60 2504fb2745SSam Leffler #define ETH_MAX (ETH_MTU+ETH_HLEN) 2604fb2745SSam Leffler 2704fb2745SSam Leffler #ifndef TRUE 2804fb2745SSam Leffler #define TRUE 1 2904fb2745SSam Leffler #define FALSE 0 3004fb2745SSam Leffler #endif 3104fb2745SSam Leffler 3204fb2745SSam Leffler #define PHARLAP 1 3304fb2745SSam Leffler #define DJGPP 2 3404fb2745SSam Leffler #define DOS4GW 4 3504fb2745SSam Leffler 3604fb2745SSam Leffler #ifdef __DJGPP__ 3704fb2745SSam Leffler #undef DOSX 3804fb2745SSam Leffler #define DOSX DJGPP 3904fb2745SSam Leffler #endif 4004fb2745SSam Leffler 4104fb2745SSam Leffler #ifdef __WATCOMC__ 4204fb2745SSam Leffler #undef DOSX 4304fb2745SSam Leffler #define DOSX DOS4GW 4404fb2745SSam Leffler #endif 4504fb2745SSam Leffler 4604fb2745SSam Leffler #ifdef __HIGHC__ 4704fb2745SSam Leffler #include <pharlap.h> 4804fb2745SSam Leffler #undef DOSX 4904fb2745SSam Leffler #define DOSX PHARLAP 5004fb2745SSam Leffler #define inline 5104fb2745SSam Leffler #else 5204fb2745SSam Leffler typedef unsigned int UINT; 5304fb2745SSam Leffler #endif 5404fb2745SSam Leffler 5504fb2745SSam Leffler 5604fb2745SSam Leffler #if defined(__GNUC__) || defined(__HIGHC__) 5704fb2745SSam Leffler typedef unsigned long long uint64; 5804fb2745SSam Leffler typedef unsigned long long QWORD; 5904fb2745SSam Leffler #endif 6004fb2745SSam Leffler 6104fb2745SSam Leffler #if defined(__WATCOMC__) 6204fb2745SSam Leffler typedef unsigned __int64 uint64; 6304fb2745SSam Leffler typedef unsigned __int64 QWORD; 6404fb2745SSam Leffler #endif 6504fb2745SSam Leffler 6604fb2745SSam Leffler #define ARGSUSED(x) (void) x 6704fb2745SSam Leffler 6804fb2745SSam Leffler #if defined (__SMALL__) || defined(__LARGE__) 6904fb2745SSam Leffler #define DOSX 0 7004fb2745SSam Leffler 7104fb2745SSam Leffler #elif !defined(DOSX) 7204fb2745SSam Leffler #error DOSX not defined; 1 = PharLap, 2 = djgpp, 4 = DOS4GW 7304fb2745SSam Leffler #endif 7404fb2745SSam Leffler 7504fb2745SSam Leffler #ifdef __HIGHC__ 7604fb2745SSam Leffler #define min(a,b) _min(a,b) 7704fb2745SSam Leffler #define max(a,b) _max(a,b) 7804fb2745SSam Leffler #endif 7904fb2745SSam Leffler 8004fb2745SSam Leffler #ifndef min 8104fb2745SSam Leffler #define min(a,b) ((a) < (b) ? (a) : (b)) 8204fb2745SSam Leffler #endif 8304fb2745SSam Leffler 8404fb2745SSam Leffler #ifndef max 8504fb2745SSam Leffler #define max(a,b) ((a) < (b) ? (b) : (a)) 8604fb2745SSam Leffler #endif 8704fb2745SSam Leffler 8804fb2745SSam Leffler #if !defined(_U_) && defined(__GNUC__) 8904fb2745SSam Leffler #define _U_ __attribute__((unused)) 9004fb2745SSam Leffler #endif 9104fb2745SSam Leffler 9204fb2745SSam Leffler #ifndef _U_ 9304fb2745SSam Leffler #define _U_ 9404fb2745SSam Leffler #endif 9504fb2745SSam Leffler 9604fb2745SSam Leffler #if defined(USE_32BIT_DRIVERS) 9704fb2745SSam Leffler #include "msdos/pm_drvr/lock.h" 9804fb2745SSam Leffler 9904fb2745SSam Leffler #ifndef RECEIVE_QUEUE_SIZE 10004fb2745SSam Leffler #define RECEIVE_QUEUE_SIZE 60 10104fb2745SSam Leffler #endif 10204fb2745SSam Leffler 10304fb2745SSam Leffler #ifndef RECEIVE_BUF_SIZE 10404fb2745SSam Leffler #define RECEIVE_BUF_SIZE (ETH_MAX+20) 10504fb2745SSam Leffler #endif 10604fb2745SSam Leffler 10704fb2745SSam Leffler extern struct device el2_dev LOCKED_VAR; /* 3Com EtherLink II */ 10804fb2745SSam Leffler extern struct device el3_dev LOCKED_VAR; /* EtherLink III */ 10904fb2745SSam Leffler extern struct device tc59_dev LOCKED_VAR; /* 3Com Vortex Card (?) */ 11004fb2745SSam Leffler extern struct device tc515_dev LOCKED_VAR; 11104fb2745SSam Leffler extern struct device tc90x_dev LOCKED_VAR; 11204fb2745SSam Leffler extern struct device tc90bcx_dev LOCKED_VAR; 11304fb2745SSam Leffler extern struct device wd_dev LOCKED_VAR; 11404fb2745SSam Leffler extern struct device ne_dev LOCKED_VAR; 11504fb2745SSam Leffler extern struct device acct_dev LOCKED_VAR; 11604fb2745SSam Leffler extern struct device cs89_dev LOCKED_VAR; 11704fb2745SSam Leffler extern struct device rtl8139_dev LOCKED_VAR; 11804fb2745SSam Leffler 11904fb2745SSam Leffler struct rx_ringbuf { 12004fb2745SSam Leffler volatile int in_index; /* queue index head */ 12104fb2745SSam Leffler int out_index; /* queue index tail */ 12204fb2745SSam Leffler int elem_size; /* size of each element */ 12304fb2745SSam Leffler int num_elem; /* number of elements */ 12404fb2745SSam Leffler char *buf_start; /* start of buffer pool */ 12504fb2745SSam Leffler }; 12604fb2745SSam Leffler 12704fb2745SSam Leffler struct rx_elem { 12804fb2745SSam Leffler DWORD size; /* size copied to this element */ 12904fb2745SSam Leffler BYTE data[ETH_MAX+10]; /* add some margin. data[0] should be */ 13004fb2745SSam Leffler }; /* dword aligned */ 13104fb2745SSam Leffler 13204fb2745SSam Leffler extern BYTE *get_rxbuf (int len) LOCKED_FUNC; 13304fb2745SSam Leffler extern int peek_rxbuf (BYTE **buf); 13404fb2745SSam Leffler extern int release_rxbuf (BYTE *buf); 13504fb2745SSam Leffler 13604fb2745SSam Leffler #else 13704fb2745SSam Leffler #define LOCKED_VAR 13804fb2745SSam Leffler #define LOCKED_FUNC 13904fb2745SSam Leffler 14004fb2745SSam Leffler struct device { 14104fb2745SSam Leffler const char *name; 14204fb2745SSam Leffler const char *long_name; 14304fb2745SSam Leffler DWORD base_addr; /* device I/O address */ 14404fb2745SSam Leffler int irq; /* device IRQ number */ 14504fb2745SSam Leffler int dma; /* DMA channel */ 14604fb2745SSam Leffler DWORD mem_start; /* shared mem start */ 14704fb2745SSam Leffler DWORD mem_end; /* shared mem end */ 14804fb2745SSam Leffler DWORD rmem_start; /* shmem "recv" start */ 14904fb2745SSam Leffler DWORD rmem_end; /* shared "recv" end */ 15004fb2745SSam Leffler 15104fb2745SSam Leffler struct device *next; /* next device in list */ 15204fb2745SSam Leffler 15304fb2745SSam Leffler /* interface service routines */ 15404fb2745SSam Leffler int (*probe)(struct device *dev); 15504fb2745SSam Leffler int (*open) (struct device *dev); 15604fb2745SSam Leffler void (*close)(struct device *dev); 15704fb2745SSam Leffler int (*xmit) (struct device *dev, const void *buf, int len); 15804fb2745SSam Leffler void *(*get_stats)(struct device *dev); 15904fb2745SSam Leffler void (*set_multicast_list)(struct device *dev); 16004fb2745SSam Leffler 16104fb2745SSam Leffler /* driver-to-pcap receive buffer routines */ 16204fb2745SSam Leffler int (*copy_rx_buf) (BYTE *buf, int max); /* rx-copy (pktdrvr only) */ 16304fb2745SSam Leffler BYTE *(*get_rx_buf) (int len); /* rx-buf fetch/enqueue */ 16404fb2745SSam Leffler int (*peek_rx_buf) (BYTE **buf); /* rx-non-copy at queue */ 16504fb2745SSam Leffler int (*release_rx_buf) (BYTE *buf); /* release after peek */ 16604fb2745SSam Leffler 16704fb2745SSam Leffler WORD flags; /* Low-level status flags. */ 16804fb2745SSam Leffler void *priv; /* private data */ 16904fb2745SSam Leffler }; 17004fb2745SSam Leffler 17104fb2745SSam Leffler /* 17204fb2745SSam Leffler * Network device statistics 17304fb2745SSam Leffler */ 17404fb2745SSam Leffler typedef struct net_device_stats { 17504fb2745SSam Leffler DWORD rx_packets; /* total packets received */ 17604fb2745SSam Leffler DWORD tx_packets; /* total packets transmitted */ 17704fb2745SSam Leffler DWORD rx_bytes; /* total bytes received */ 17804fb2745SSam Leffler DWORD tx_bytes; /* total bytes transmitted */ 17904fb2745SSam Leffler DWORD rx_errors; /* bad packets received */ 18004fb2745SSam Leffler DWORD tx_errors; /* packet transmit problems */ 18104fb2745SSam Leffler DWORD rx_dropped; /* no space in Rx buffers */ 18204fb2745SSam Leffler DWORD tx_dropped; /* no space available for Tx */ 18304fb2745SSam Leffler DWORD multicast; /* multicast packets received */ 18404fb2745SSam Leffler 18504fb2745SSam Leffler /* detailed rx_errors: */ 18604fb2745SSam Leffler DWORD rx_length_errors; 18704fb2745SSam Leffler DWORD rx_over_errors; /* recv'r overrun error */ 18804fb2745SSam Leffler DWORD rx_osize_errors; /* recv'r over-size error */ 18904fb2745SSam Leffler DWORD rx_crc_errors; /* recv'd pkt with crc error */ 19004fb2745SSam Leffler DWORD rx_frame_errors; /* recv'd frame alignment error */ 19104fb2745SSam Leffler DWORD rx_fifo_errors; /* recv'r fifo overrun */ 19204fb2745SSam Leffler DWORD rx_missed_errors; /* recv'r missed packet */ 19304fb2745SSam Leffler 19404fb2745SSam Leffler /* detailed tx_errors */ 19504fb2745SSam Leffler DWORD tx_aborted_errors; 19604fb2745SSam Leffler DWORD tx_carrier_errors; 19704fb2745SSam Leffler DWORD tx_fifo_errors; 19804fb2745SSam Leffler DWORD tx_heartbeat_errors; 19904fb2745SSam Leffler DWORD tx_window_errors; 20004fb2745SSam Leffler DWORD tx_collisions; 20104fb2745SSam Leffler DWORD tx_jabbers; 20204fb2745SSam Leffler } NET_STATS; 20304fb2745SSam Leffler #endif 20404fb2745SSam Leffler 20504fb2745SSam Leffler extern struct device *active_dev LOCKED_VAR; 20604fb2745SSam Leffler extern const struct device *dev_base LOCKED_VAR; 20704fb2745SSam Leffler extern struct device *probed_dev; 20804fb2745SSam Leffler 20904fb2745SSam Leffler extern int pcap_pkt_debug; 21004fb2745SSam Leffler 21104fb2745SSam Leffler extern void _w32_os_yield (void); /* Watt-32's misc.c */ 21204fb2745SSam Leffler 21304fb2745SSam Leffler #ifdef NDEBUG 21404fb2745SSam Leffler #define PCAP_ASSERT(x) ((void)0) 21504fb2745SSam Leffler 21604fb2745SSam Leffler #else 21704fb2745SSam Leffler void pcap_assert (const char *what, const char *file, unsigned line); 21804fb2745SSam Leffler 21904fb2745SSam Leffler #define PCAP_ASSERT(x) do { \ 22004fb2745SSam Leffler if (!(x)) \ 22104fb2745SSam Leffler pcap_assert (#x, __FILE__, __LINE__); \ 22204fb2745SSam Leffler } while (0) 22304fb2745SSam Leffler #endif 22404fb2745SSam Leffler 22504fb2745SSam Leffler #endif /* __PCAP_DOS_H */ 226