xref: /freebsd/contrib/libpcap/pcap-dos.h (revision 04fb2745)
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 */
22604fb2745SSam Leffler