#ifndef __PKTDRVR_H
#define __PKTDRVR_H

#define PUBLIC
#define LOCAL        static

#define RX_BUF_SIZE  ETH_MTU   /* buffer size variables. NB !! */
#define TX_BUF_SIZE  ETH_MTU   /* must be same as in pkt_rx*.* */

#ifdef __HIGHC__
#pragma Off(Align_members)
#else
#pragma pack(1)
#endif

typedef enum  {                /* Packet-driver classes */
       PD_ETHER      = 1,
       PD_PRONET10   = 2,
       PD_IEEE8025   = 3,
       PD_OMNINET    = 4,
       PD_APPLETALK  = 5,
       PD_SLIP       = 6,
       PD_STARTLAN   = 7,
       PD_ARCNET     = 8,
       PD_AX25       = 9,
       PD_KISS       = 10,
       PD_IEEE8023_2 = 11,
       PD_FDDI8022   = 12,
       PD_X25        = 13,
       PD_LANstar    = 14,
       PD_PPP        = 18
     } PKT_CLASS;

typedef enum  {             /* Packet-driver receive modes    */
       PDRX_OFF    = 1,    /* turn off receiver              */
       PDRX_DIRECT,        /* receive only to this interface */
       PDRX_BROADCAST,     /* DIRECT + broadcast packets     */
       PDRX_MULTICAST1,    /* BROADCAST + limited multicast  */
       PDRX_MULTICAST2,    /* BROADCAST + all multicast      */
       PDRX_ALL_PACKETS,   /* receive all packets on network */
     } PKT_RX_MODE;

typedef struct {
       char type[8];
       char len;
     } PKT_FRAME;


typedef struct {
       BYTE  class;        /* = 1 for DEC/Intel/Xerox Ethernet  */
       BYTE  number;       /* = 0 for single LAN adapter        */
       WORD  type;         /* = 13 for 3C523                    */
       BYTE  funcs;        /* Basic/Extended/HiPerf functions   */
       WORD  intr;         /* user interrupt vector number      */
       WORD  handle;       /* Handle associated with session    */
       BYTE  name [15];    /* Name of adapter interface,ie.3C523*/
       BOOL  quiet;        /* (don't) print errors to stdout    */
       const char *error;  /* address of error string           */
       BYTE  majVer;       /* Major driver implementation ver.  */
       BYTE  minVer;       /* Minor driver implementation ver.  */
       BYTE  dummyLen;     /* length of following data          */
       WORD  MAClength;    /* HiPerformance data, N/A           */
       WORD  MTU;          /* HiPerformance data, N/A           */
       WORD  multicast;    /* HiPerformance data, N/A           */
       WORD  rcvrBuffers;  /* valid for                         */
       WORD  UMTbufs;      /*   High Performance drivers only   */
       WORD  postEOIintr;  /*                  Usage ??         */
     } PKT_INFO;

#define PKT_PARAM_SIZE  14    /* members majVer - postEOIintr */


typedef struct {
       DWORD inPackets;          /* # of packets received    */
       DWORD outPackets;         /* # of packets transmitted */
       DWORD inBytes;            /* # of bytes received      */
       DWORD outBytes;           /* # of bytes transmitted   */
       DWORD inErrors;           /* # of reception errors    */
       DWORD outErrors;          /* # of transmission errors */
       DWORD lost;               /* # of packets lost (RX)   */
     } PKT_STAT;


typedef struct {
       ETHER destin;
       ETHER source;
       WORD  proto;
       BYTE  data [TX_BUF_SIZE];
     } TX_ELEMENT;

typedef struct {
       WORD  firstCount;         /* # of bytes on 1st         */
       WORD  secondCount;        /* and 2nd upcall            */
       WORD  handle;             /* instance that upcalled    */
       ETHER destin;             /* E-net destination address */
       ETHER source;             /* E-net source address      */
       WORD  proto;              /* protocol number           */
       BYTE  data [RX_BUF_SIZE];
     } RX_ELEMENT;


#ifdef __HIGHC__
#pragma pop(Align_members)
#else
#pragma pack()
#endif


/*
* Prototypes for publics
*/

#ifdef __cplusplus
extern "C" {
#endif

extern PKT_STAT    pktStat;     /* statistics for packets */
extern PKT_INFO    pktInfo;     /* packet-driver information */

extern PKT_RX_MODE receiveMode;
extern ETHER       myAddress, ethBroadcast;

extern BOOL  PktInitDriver (PKT_RX_MODE mode);
extern BOOL  PktExitDriver (void);

extern const char *PktGetErrorStr    (int errNum);
extern const char *PktGetClassName   (WORD class);
extern const char *PktRXmodeStr      (PKT_RX_MODE mode);
extern BOOL        PktSearchDriver   (void);
extern int         PktReceive        (BYTE *buf, int max);
extern BOOL        PktTransmit       (const void *eth, int len);
extern DWORD       PktRxDropped      (void);
extern BOOL        PktReleaseHandle  (WORD handle);
extern BOOL        PktTerminHandle   (WORD handle);
extern BOOL        PktResetInterface (WORD handle);
extern BOOL        PktSetReceiverMode(PKT_RX_MODE  mode);
extern BOOL        PktGetReceiverMode(PKT_RX_MODE *mode);
extern BOOL        PktGetStatistics  (WORD handle);
extern BOOL        PktSessStatistics (WORD handle);
extern BOOL        PktResetStatistics(WORD handle);
extern BOOL        PktGetAddress     (ETHER *addr);
extern BOOL        PktSetAddress     (const ETHER *addr);
extern BOOL        PktGetDriverInfo  (void);
extern BOOL        PktGetDriverParam (void);
extern void        PktQueueBusy      (BOOL busy);
extern WORD        PktBuffersUsed    (void);

#ifdef __cplusplus
}
#endif

#endif /* __PKTDRVR_H */