1*d56f51eaSDavid van Moolenbroek /* $NetBSD: pcap-dos.h,v 1.3 2015/03/31 21:39:42 christos Exp $ */ 2*d56f51eaSDavid van Moolenbroek 3*d56f51eaSDavid van Moolenbroek /* 4*d56f51eaSDavid van Moolenbroek * Internal details for libpcap on DOS. 5*d56f51eaSDavid van Moolenbroek * 32-bit targets: djgpp, Pharlap or DOS4GW. 6*d56f51eaSDavid van Moolenbroek */ 7*d56f51eaSDavid van Moolenbroek 8*d56f51eaSDavid van Moolenbroek #ifndef __PCAP_DOS_H 9*d56f51eaSDavid van Moolenbroek #define __PCAP_DOS_H 10*d56f51eaSDavid van Moolenbroek 11*d56f51eaSDavid van Moolenbroek #ifdef __DJGPP__ 12*d56f51eaSDavid van Moolenbroek #include <pc.h> /* simple non-conio kbhit */ 13*d56f51eaSDavid van Moolenbroek #else 14*d56f51eaSDavid van Moolenbroek #include <conio.h> 15*d56f51eaSDavid van Moolenbroek #endif 16*d56f51eaSDavid van Moolenbroek 17*d56f51eaSDavid van Moolenbroek typedef int BOOL; 18*d56f51eaSDavid van Moolenbroek typedef unsigned char BYTE; 19*d56f51eaSDavid van Moolenbroek typedef unsigned short WORD; 20*d56f51eaSDavid van Moolenbroek typedef unsigned long DWORD; 21*d56f51eaSDavid van Moolenbroek typedef BYTE ETHER[6]; 22*d56f51eaSDavid van Moolenbroek 23*d56f51eaSDavid van Moolenbroek #define ETH_ALEN sizeof(ETHER) /* Ether address length */ 24*d56f51eaSDavid van Moolenbroek #define ETH_HLEN (2*ETH_ALEN+2) /* Ether header length */ 25*d56f51eaSDavid van Moolenbroek #define ETH_MTU 1500 26*d56f51eaSDavid van Moolenbroek #define ETH_MIN 60 27*d56f51eaSDavid van Moolenbroek #define ETH_MAX (ETH_MTU+ETH_HLEN) 28*d56f51eaSDavid van Moolenbroek 29*d56f51eaSDavid van Moolenbroek #ifndef TRUE 30*d56f51eaSDavid van Moolenbroek #define TRUE 1 31*d56f51eaSDavid van Moolenbroek #define FALSE 0 32*d56f51eaSDavid van Moolenbroek #endif 33*d56f51eaSDavid van Moolenbroek 34*d56f51eaSDavid van Moolenbroek #define PHARLAP 1 35*d56f51eaSDavid van Moolenbroek #define DJGPP 2 36*d56f51eaSDavid van Moolenbroek #define DOS4GW 4 37*d56f51eaSDavid van Moolenbroek 38*d56f51eaSDavid van Moolenbroek #ifdef __DJGPP__ 39*d56f51eaSDavid van Moolenbroek #undef DOSX 40*d56f51eaSDavid van Moolenbroek #define DOSX DJGPP 41*d56f51eaSDavid van Moolenbroek #endif 42*d56f51eaSDavid van Moolenbroek 43*d56f51eaSDavid van Moolenbroek #ifdef __WATCOMC__ 44*d56f51eaSDavid van Moolenbroek #undef DOSX 45*d56f51eaSDavid van Moolenbroek #define DOSX DOS4GW 46*d56f51eaSDavid van Moolenbroek #endif 47*d56f51eaSDavid van Moolenbroek 48*d56f51eaSDavid van Moolenbroek #ifdef __HIGHC__ 49*d56f51eaSDavid van Moolenbroek #include <pharlap.h> 50*d56f51eaSDavid van Moolenbroek #undef DOSX 51*d56f51eaSDavid van Moolenbroek #define DOSX PHARLAP 52*d56f51eaSDavid van Moolenbroek #define inline 53*d56f51eaSDavid van Moolenbroek #else 54*d56f51eaSDavid van Moolenbroek typedef unsigned int UINT; 55*d56f51eaSDavid van Moolenbroek #endif 56*d56f51eaSDavid van Moolenbroek 57*d56f51eaSDavid van Moolenbroek 58*d56f51eaSDavid van Moolenbroek #if defined(__GNUC__) || defined(__HIGHC__) 59*d56f51eaSDavid van Moolenbroek typedef unsigned long long uint64; 60*d56f51eaSDavid van Moolenbroek typedef unsigned long long QWORD; 61*d56f51eaSDavid van Moolenbroek #endif 62*d56f51eaSDavid van Moolenbroek 63*d56f51eaSDavid van Moolenbroek #if defined(__WATCOMC__) 64*d56f51eaSDavid van Moolenbroek typedef unsigned __int64 uint64; 65*d56f51eaSDavid van Moolenbroek typedef unsigned __int64 QWORD; 66*d56f51eaSDavid van Moolenbroek #endif 67*d56f51eaSDavid van Moolenbroek 68*d56f51eaSDavid van Moolenbroek #define ARGSUSED(x) (void) x 69*d56f51eaSDavid van Moolenbroek 70*d56f51eaSDavid van Moolenbroek #if defined (__SMALL__) || defined(__LARGE__) 71*d56f51eaSDavid van Moolenbroek #define DOSX 0 72*d56f51eaSDavid van Moolenbroek 73*d56f51eaSDavid van Moolenbroek #elif !defined(DOSX) 74*d56f51eaSDavid van Moolenbroek #error DOSX not defined; 1 = PharLap, 2 = djgpp, 4 = DOS4GW 75*d56f51eaSDavid van Moolenbroek #endif 76*d56f51eaSDavid van Moolenbroek 77*d56f51eaSDavid van Moolenbroek #ifdef __HIGHC__ 78*d56f51eaSDavid van Moolenbroek #define min(a,b) _min(a,b) 79*d56f51eaSDavid van Moolenbroek #define max(a,b) _max(a,b) 80*d56f51eaSDavid van Moolenbroek #endif 81*d56f51eaSDavid van Moolenbroek 82*d56f51eaSDavid van Moolenbroek #ifndef min 83*d56f51eaSDavid van Moolenbroek #define min(a,b) ((a) < (b) ? (a) : (b)) 84*d56f51eaSDavid van Moolenbroek #endif 85*d56f51eaSDavid van Moolenbroek 86*d56f51eaSDavid van Moolenbroek #ifndef max 87*d56f51eaSDavid van Moolenbroek #define max(a,b) ((a) < (b) ? (b) : (a)) 88*d56f51eaSDavid van Moolenbroek #endif 89*d56f51eaSDavid van Moolenbroek 90*d56f51eaSDavid van Moolenbroek #if !defined(_U_) && defined(__GNUC__) 91*d56f51eaSDavid van Moolenbroek #define _U_ __attribute__((unused)) 92*d56f51eaSDavid van Moolenbroek #endif 93*d56f51eaSDavid van Moolenbroek 94*d56f51eaSDavid van Moolenbroek #ifndef _U_ 95*d56f51eaSDavid van Moolenbroek #define _U_ 96*d56f51eaSDavid van Moolenbroek #endif 97*d56f51eaSDavid van Moolenbroek 98*d56f51eaSDavid van Moolenbroek #if defined(USE_32BIT_DRIVERS) 99*d56f51eaSDavid van Moolenbroek #include "msdos/pm_drvr/lock.h" 100*d56f51eaSDavid van Moolenbroek 101*d56f51eaSDavid van Moolenbroek #ifndef RECEIVE_QUEUE_SIZE 102*d56f51eaSDavid van Moolenbroek #define RECEIVE_QUEUE_SIZE 60 103*d56f51eaSDavid van Moolenbroek #endif 104*d56f51eaSDavid van Moolenbroek 105*d56f51eaSDavid van Moolenbroek #ifndef RECEIVE_BUF_SIZE 106*d56f51eaSDavid van Moolenbroek #define RECEIVE_BUF_SIZE (ETH_MAX+20) 107*d56f51eaSDavid van Moolenbroek #endif 108*d56f51eaSDavid van Moolenbroek 109*d56f51eaSDavid van Moolenbroek extern struct device el2_dev LOCKED_VAR; /* 3Com EtherLink II */ 110*d56f51eaSDavid van Moolenbroek extern struct device el3_dev LOCKED_VAR; /* EtherLink III */ 111*d56f51eaSDavid van Moolenbroek extern struct device tc59_dev LOCKED_VAR; /* 3Com Vortex Card (?) */ 112*d56f51eaSDavid van Moolenbroek extern struct device tc515_dev LOCKED_VAR; 113*d56f51eaSDavid van Moolenbroek extern struct device tc90x_dev LOCKED_VAR; 114*d56f51eaSDavid van Moolenbroek extern struct device tc90bcx_dev LOCKED_VAR; 115*d56f51eaSDavid van Moolenbroek extern struct device wd_dev LOCKED_VAR; 116*d56f51eaSDavid van Moolenbroek extern struct device ne_dev LOCKED_VAR; 117*d56f51eaSDavid van Moolenbroek extern struct device acct_dev LOCKED_VAR; 118*d56f51eaSDavid van Moolenbroek extern struct device cs89_dev LOCKED_VAR; 119*d56f51eaSDavid van Moolenbroek extern struct device rtl8139_dev LOCKED_VAR; 120*d56f51eaSDavid van Moolenbroek 121*d56f51eaSDavid van Moolenbroek struct rx_ringbuf { 122*d56f51eaSDavid van Moolenbroek volatile int in_index; /* queue index head */ 123*d56f51eaSDavid van Moolenbroek int out_index; /* queue index tail */ 124*d56f51eaSDavid van Moolenbroek int elem_size; /* size of each element */ 125*d56f51eaSDavid van Moolenbroek int num_elem; /* number of elements */ 126*d56f51eaSDavid van Moolenbroek char *buf_start; /* start of buffer pool */ 127*d56f51eaSDavid van Moolenbroek }; 128*d56f51eaSDavid van Moolenbroek 129*d56f51eaSDavid van Moolenbroek struct rx_elem { 130*d56f51eaSDavid van Moolenbroek DWORD size; /* size copied to this element */ 131*d56f51eaSDavid van Moolenbroek BYTE data[ETH_MAX+10]; /* add some margin. data[0] should be */ 132*d56f51eaSDavid van Moolenbroek }; /* dword aligned */ 133*d56f51eaSDavid van Moolenbroek 134*d56f51eaSDavid van Moolenbroek extern BYTE *get_rxbuf (int len) LOCKED_FUNC; 135*d56f51eaSDavid van Moolenbroek extern int peek_rxbuf (BYTE **buf); 136*d56f51eaSDavid van Moolenbroek extern int release_rxbuf (BYTE *buf); 137*d56f51eaSDavid van Moolenbroek 138*d56f51eaSDavid van Moolenbroek #else 139*d56f51eaSDavid van Moolenbroek #define LOCKED_VAR 140*d56f51eaSDavid van Moolenbroek #define LOCKED_FUNC 141*d56f51eaSDavid van Moolenbroek 142*d56f51eaSDavid van Moolenbroek struct device { 143*d56f51eaSDavid van Moolenbroek const char *name; 144*d56f51eaSDavid van Moolenbroek const char *long_name; 145*d56f51eaSDavid van Moolenbroek DWORD base_addr; /* device I/O address */ 146*d56f51eaSDavid van Moolenbroek int irq; /* device IRQ number */ 147*d56f51eaSDavid van Moolenbroek int dma; /* DMA channel */ 148*d56f51eaSDavid van Moolenbroek DWORD mem_start; /* shared mem start */ 149*d56f51eaSDavid van Moolenbroek DWORD mem_end; /* shared mem end */ 150*d56f51eaSDavid van Moolenbroek DWORD rmem_start; /* shmem "recv" start */ 151*d56f51eaSDavid van Moolenbroek DWORD rmem_end; /* shared "recv" end */ 152*d56f51eaSDavid van Moolenbroek 153*d56f51eaSDavid van Moolenbroek struct device *next; /* next device in list */ 154*d56f51eaSDavid van Moolenbroek 155*d56f51eaSDavid van Moolenbroek /* interface service routines */ 156*d56f51eaSDavid van Moolenbroek int (*probe)(struct device *dev); 157*d56f51eaSDavid van Moolenbroek int (*open) (struct device *dev); 158*d56f51eaSDavid van Moolenbroek void (*close)(struct device *dev); 159*d56f51eaSDavid van Moolenbroek int (*xmit) (struct device *dev, const void *buf, int len); 160*d56f51eaSDavid van Moolenbroek void *(*get_stats)(struct device *dev); 161*d56f51eaSDavid van Moolenbroek void (*set_multicast_list)(struct device *dev); 162*d56f51eaSDavid van Moolenbroek 163*d56f51eaSDavid van Moolenbroek /* driver-to-pcap receive buffer routines */ 164*d56f51eaSDavid van Moolenbroek int (*copy_rx_buf) (BYTE *buf, int max); /* rx-copy (pktdrvr only) */ 165*d56f51eaSDavid van Moolenbroek BYTE *(*get_rx_buf) (int len); /* rx-buf fetch/enqueue */ 166*d56f51eaSDavid van Moolenbroek int (*peek_rx_buf) (BYTE **buf); /* rx-non-copy at queue */ 167*d56f51eaSDavid van Moolenbroek int (*release_rx_buf) (BYTE *buf); /* release after peek */ 168*d56f51eaSDavid van Moolenbroek 169*d56f51eaSDavid van Moolenbroek WORD flags; /* Low-level status flags. */ 170*d56f51eaSDavid van Moolenbroek void *priv; /* private data */ 171*d56f51eaSDavid van Moolenbroek }; 172*d56f51eaSDavid van Moolenbroek 173*d56f51eaSDavid van Moolenbroek /* 174*d56f51eaSDavid van Moolenbroek * Network device statistics 175*d56f51eaSDavid van Moolenbroek */ 176*d56f51eaSDavid van Moolenbroek typedef struct net_device_stats { 177*d56f51eaSDavid van Moolenbroek DWORD rx_packets; /* total packets received */ 178*d56f51eaSDavid van Moolenbroek DWORD tx_packets; /* total packets transmitted */ 179*d56f51eaSDavid van Moolenbroek DWORD rx_bytes; /* total bytes received */ 180*d56f51eaSDavid van Moolenbroek DWORD tx_bytes; /* total bytes transmitted */ 181*d56f51eaSDavid van Moolenbroek DWORD rx_errors; /* bad packets received */ 182*d56f51eaSDavid van Moolenbroek DWORD tx_errors; /* packet transmit problems */ 183*d56f51eaSDavid van Moolenbroek DWORD rx_dropped; /* no space in Rx buffers */ 184*d56f51eaSDavid van Moolenbroek DWORD tx_dropped; /* no space available for Tx */ 185*d56f51eaSDavid van Moolenbroek DWORD multicast; /* multicast packets received */ 186*d56f51eaSDavid van Moolenbroek 187*d56f51eaSDavid van Moolenbroek /* detailed rx_errors: */ 188*d56f51eaSDavid van Moolenbroek DWORD rx_length_errors; 189*d56f51eaSDavid van Moolenbroek DWORD rx_over_errors; /* recv'r overrun error */ 190*d56f51eaSDavid van Moolenbroek DWORD rx_osize_errors; /* recv'r over-size error */ 191*d56f51eaSDavid van Moolenbroek DWORD rx_crc_errors; /* recv'd pkt with crc error */ 192*d56f51eaSDavid van Moolenbroek DWORD rx_frame_errors; /* recv'd frame alignment error */ 193*d56f51eaSDavid van Moolenbroek DWORD rx_fifo_errors; /* recv'r fifo overrun */ 194*d56f51eaSDavid van Moolenbroek DWORD rx_missed_errors; /* recv'r missed packet */ 195*d56f51eaSDavid van Moolenbroek 196*d56f51eaSDavid van Moolenbroek /* detailed tx_errors */ 197*d56f51eaSDavid van Moolenbroek DWORD tx_aborted_errors; 198*d56f51eaSDavid van Moolenbroek DWORD tx_carrier_errors; 199*d56f51eaSDavid van Moolenbroek DWORD tx_fifo_errors; 200*d56f51eaSDavid van Moolenbroek DWORD tx_heartbeat_errors; 201*d56f51eaSDavid van Moolenbroek DWORD tx_window_errors; 202*d56f51eaSDavid van Moolenbroek DWORD tx_collisions; 203*d56f51eaSDavid van Moolenbroek DWORD tx_jabbers; 204*d56f51eaSDavid van Moolenbroek } NET_STATS; 205*d56f51eaSDavid van Moolenbroek #endif 206*d56f51eaSDavid van Moolenbroek 207*d56f51eaSDavid van Moolenbroek extern struct device *active_dev LOCKED_VAR; 208*d56f51eaSDavid van Moolenbroek extern const struct device *dev_base LOCKED_VAR; 209*d56f51eaSDavid van Moolenbroek extern struct device *probed_dev; 210*d56f51eaSDavid van Moolenbroek 211*d56f51eaSDavid van Moolenbroek extern int pcap_pkt_debug; 212*d56f51eaSDavid van Moolenbroek 213*d56f51eaSDavid van Moolenbroek extern void _w32_os_yield (void); /* Watt-32's misc.c */ 214*d56f51eaSDavid van Moolenbroek 215*d56f51eaSDavid van Moolenbroek #ifdef NDEBUG 216*d56f51eaSDavid van Moolenbroek #define PCAP_ASSERT(x) ((void)0) 217*d56f51eaSDavid van Moolenbroek 218*d56f51eaSDavid van Moolenbroek #else 219*d56f51eaSDavid van Moolenbroek void pcap_assert (const char *what, const char *file, unsigned line); 220*d56f51eaSDavid van Moolenbroek 221*d56f51eaSDavid van Moolenbroek #define PCAP_ASSERT(x) do { \ 222*d56f51eaSDavid van Moolenbroek if (!(x)) \ 223*d56f51eaSDavid van Moolenbroek pcap_assert (#x, __FILE__, __LINE__); \ 224*d56f51eaSDavid van Moolenbroek } while (0) 225*d56f51eaSDavid van Moolenbroek #endif 226*d56f51eaSDavid van Moolenbroek 227*d56f51eaSDavid van Moolenbroek #endif /* __PCAP_DOS_H */ 228