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