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