#include "packon.h"
#include "wzport.h"

/* 8088/86 long pointer */
struct longptr
{
  unsigned short    lp_offset;      /* offset */
  unsigned short    lp_seg;         /* segment */
};

/* 286 far pointer */
union farptr
{
  struct longptr lp;  /* way to build far ptr (offset, segment) */
  char FAR      *fp;  /* far pointer */
};

#define NAMSZ           16      /* max length of a net name */

/*
** Network Control Block
*/
struct ncb
{
  unsigned char   ncb_com;        /* command */
  unsigned char   ncb_ret;        /* return code */
  unsigned char   ncb_lsn;        /* local session # */
  unsigned char   ncb_num;        /* number of network name */
#ifdef REALMODE
  struct longptr  ncb_bfr;        /* pntr to message buffer */
#else
  char FAR       *ncb_bfr;        /* pntr to message buffer */
#endif
  unsigned short  ncb_len;        /* msg length in unsigned chars */
  char            ncb_rname[NAMSZ]; /* blank-padded name of
                                     * remote end of connection */
  char            ncb_name[NAMSZ];  /* our blank-padded network name */
  unsigned char   ncb_rto;        /* rcv timeout/retry count */
  unsigned char   ncb_sto;        /* send timeout/sys timeout */
#ifdef REALMODE
  struct longptr  ncb_sig;        /* interrupt signal routine */
#else
  char FAR       *ncb_sem;        /* semaphore handle */
#endif
  unsigned char   ncb_lnum;       /* lana (adapter) number */
  unsigned char   ncb_done;       /* 0xff => commmand pending */
#ifdef NT
  unsigned char	  ncb_res[10];	  /* reserved */
  HANDLE	  ncb_event;	  /* completion event */
#else
  unsigned char	  ncb_res[14];	  /* reserved */
#endif
};

/* Net command codes */

#define NCALL           0x10
#define NLISTEN         0x11
#define NHANGUP         0x12
#define NHANGALL        0x13
#define NSESSND         0x14
#define NSESREC         0x15
#define NSESRECANY      0x16
#define NDATSND         0x20
#define NDATREC         0x21
#define NBROADSND       0x22
#define NBROADREC       0x23
#define NADDNAME        0x30
#define NDELNAME        0x31
#define NRESET          0x32
#define NADAPSTAT       0x33
#define NSESSTAT        0x34
#define NCANCEL         0x35

#define NCALLNIU        0x74    /* UB special */
#define NRCVPKT         0x78    /* UB special */

#define ASYNCH          0x80

/* ncb return codes */

#define NRC_GOODRET     0x00    /* good return */
#define NRC_BUFLEN      0x01    /* illegal buffer length */
#define NRC_BFULL       0x02    /* buffers full, no receive issued */
#define NRC_ILLCMD      0x03    /* illegal command */
#define NRC_CMDTMO      0x05    /* command timed out */
#define NRC_INCOMP      0x06    /* message incomplete, issue another command */
#define NRC_BADDR       0x07    /* illegal buffer address */
#define NRC_SNUMOUT     0x08    /* session number out of range */
#define NRC_NORES       0x09    /* no resource available */
#define NRC_SCLOSED     0x0a    /* session closed */
#define NRC_CMDCAN      0x0b    /* command canceled */
#define NRC_DMAFAIL     0x0c    /* PC DMA failed */
#define NRC_DUPNAME     0x0d    /* duplicate name */
#define NRC_NAMTFUL     0x0e    /* name table full */
#define NRC_ACTSES      0x0f    /* no deletions, name has active sessions */
#define NRC_INVALID     0x10    /* name not found or no valid name */
#define NRC_LOCTFUL     0x11    /* local session table full */
#define NRC_REMTFUL     0x12    /* remote session table full */
#define NRC_ILLNN       0x13    /* illegal name number */
#define NRC_NOCALL      0x14    /* no callname */
#define NRC_NOWILD      0x15    /* cannot put * in NCB_NAME */
#define NRC_INUSE       0x16    /* name in use on remote adapter */
#define NRC_NAMERR      0x17    /* called name cannot == name nor name # */
#define NRC_SABORT      0x18    /* session ended abnormally */
#define NRC_NAMCONF     0x19    /* name conflict detected */
#define NRC_IFBUSY      0x21    /* interface busy, IRET before retrying */
#define NRC_TOOMANY     0x22    /* too many commands outstanding, retry later */
#define NRC_BRIDGE      0x23    /* ncb_bridge field not 00 or 01 */
#define NRC_CANOCCR     0x24    /* command completed while cancel occuring */
#define NRC_RESNAME     0x25    /* reserved name specified */
#define NRC_CANCEL      0x26    /* command not valid to cancel */
#define NRC_MULT        0x33    /* multiple requests for same session */
#define NRC_SYSTEM      0x40    /* system error */
#define NRC_ROM         0x41    /* ROM checksum failure */
#define NRC_RAM         0x42    /* RAM test failure */
#define NRC_DLF         0x43    /* digital loopback failure */
#define NRC_ALF         0x44    /* analog loopback failure */
#define NRC_IFAIL       0x45    /* interface failure */

#define NRC_PENDING     0xff    /* asynchronous command is not yet finished */

/*
*       ADAPTOR STATUS
*/

struct astat
{
  char                as_uid[6];      /* Unit identification number */
  char                as_ejs;         /* External jumper status */
  char                as_lst;         /* Results of last self-test */
  char                as_ver;         /* Software version number */
  char                as_rev;         /* Software revision number */
  unsigned short      as_dur;         /* Duration of reporting period */
  unsigned short      as_crc;         /* Number of CRC errors */
  unsigned short      as_align;       /* Number of alignment errors */
  unsigned short      as_coll;        /* Number of collisions */
  unsigned short      as_abort;       /* Number of aborted transmissions */
  long                as_spkt;        /* Number of successful packets sent */
  long                as_rpkt;        /* No. of successful packets rec'd */
  unsigned short      as_retry;       /* Number of retransmissions */
  unsigned short      as_exhst;       /* Number of times exhausted */
  char                as_res0[8];     /* Reserved */
  unsigned short      as_ncbfree;     /* Free ncbs */
  unsigned short      as_numncb;      /* number of ncbs configured */
  unsigned short      as_maxncb;      /* max configurable ncbs */
  char                as_res1[4];     /* Reserved */
  unsigned short      as_sesinuse;    /* sessions in use */
  unsigned short      as_numses;      /* number of sessions configured */
  unsigned short      as_maxses;      /* Max configurable sessions */
  unsigned short      as_maxdat;      /* Max. data packet size */
  unsigned short      as_names;       /* No. of names in local table */
  struct                              /* Name entries */
    {
      char            as_name[NAMSZ];
      /* Name */
      char            as_number;      /* Name number */
      char            as_status;      /* Name status */
    }
  as_struct[16];  /* Name entries */
};

/*
*       SESSION STATUS
*/

struct sstat
{
  char                ss_namenum;     /* Name number */
  char                ss_numsess;     /* # of sessions with this name */
  char                ss_numrdgm;     /* # of receive datagrams outstanding */
  char                ss_numrany;     /* # of receive anys outstanding */
  struct                              /* Name entries */
    {
      char            ss_lsn;         /* local session number */
      char            ss_sstate;      /* State of session:         */
                                      /* Listen pending       0x01 */
                                      /* Call pending         0x02 */
                                      /* Session established  0x03 */
                                      /* Hangup pending       0x04 */
                                      /* Hangup complete      0x05 */
                                      /* Session aborted      0x06 */
      char            ss_lname[NAMSZ]; /* local name */
      char            ss_rname[NAMSZ]; /* remote name */
      char            ss_numrec;      /* # of receives outstanding */
      char            ss_numsend;     /* # of sends outstanding */
    }
  ss_struct[16];  /* Name entries */
};

struct ncbw_ent
{
  short ncbw_res;       /* reserved (MBZ) */
#ifdef NT
  HANDLE  ncbw_sem;
#else
  char FAR *ncbw_sem;	 /* semaphore handle */
#endif
};

/* Net Control Block (extended to keep semaphore handle, seqno and status) */
struct ncb_a
{
  unsigned char   ncb_com;        /* command */
  unsigned char   ncb_ret;        /* return code */
  unsigned char   ncb_lsn;        /* local session # */
  unsigned char   ncb_num;        /* number of network name */
#ifdef REALMODE
  struct longptr  ncb_bfr;        /* pntr to message buffer */
#else
  char FAR       *ncb_bfr;        /* pntr to message buffer */
#endif
  unsigned short  ncb_len;        /* msg length in unsigned chars */
  char            ncb_rname[NAMSZ]; /* blank-padded name of
                                     * remote end of connection */
  char            ncb_name[NAMSZ];  /* our blank-padded network name */
  unsigned char   ncb_rto;        /* rcv timeout/retry count */
  unsigned char   ncb_sto;        /* send timeout/sys timeout */
#ifdef REALMODE
  struct longptr  ncb_sig;        /* interrupt signal routine */
#else
  char FAR       *ncb_sem;        /* semaphore handle */
#endif
  unsigned char   ncb_lnum;       /* lana (adapter) number */
  unsigned char   ncb_done;       /* 0xff => commmand pending */
#ifdef NT
  unsigned char	  ncb_res[10];	  /* reserved */
  HANDLE	  ncb_event;	  /* completion event */
  HANDLE	  ncb_sem_a;	  /* saved (event) handle */
#else
  unsigned char	  ncb_res[14];	  /* reserved */
  char FAR	  *ncb_sem_a;	  /* saved semaphore handle */
#endif
  unsigned long   ncb_seqno;	  /* sequence number */
  unsigned int    ncb_status;     /* async ncb status */
};

#ifdef ASYNCCMDS
struct ncb_a asyncncbs[ASYNCCMDS];
struct ncb_wlist
{
  short ncbw_semcnt;                   /* number of semaphores to wait on */
  struct ncbw_ent ncbw_ent[ASYNCCMDS]; /* entry for each semaphore to wait on */
}
ncb_wlist;
#else
/* define structure ncb_wlist */
struct ncb_wlist
{
  short ncbw_semcnt;           /* number of semaphores to wait on */
  struct ncbw_ent ncbw_ent[1]; /* entry for each semaphore to wait on */
};
#endif

#include "packoff.h"