| /* |
| * 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 */ |