
/*
 *  DNET.H
 *
 *  DNET (c)Copyright 1988, Matthew Dillon, All Rights Reserved.
 *
 */

#include <exec/types.h>
#include <exec/tasks.h>
#include <exec/memory.h>
#include <devices/serial.h>
#include <devices/timer.h>
#include <libraries/dos.h>
#include <libraries/dosextens.h>
#include <intuition/intuition.h>
#include <proto/all.h>

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "/version.h"

#define DNET_H

#define DMNWOFF     4	    /*	Deemu offset to NewWindow structure */

#define ARGS(foo)   foo

typedef struct IORequest    IOR;
typedef struct IOStdReq     IOSTD;
typedef struct IOExtSer     IOSER;
typedef struct IOStdReq     IOCON;
typedef struct timerequest  IOT;
typedef struct Window	    WIN;
typedef struct NewWindow    NW;
typedef struct RastPort     RP;
typedef struct Task	    TASK;
typedef struct Process	    PROC;
typedef struct MsgPort	    PORT;
typedef struct Node	    NODE;
typedef struct MinNode	    MNODE;
typedef struct List	    LIST;
typedef struct MinList	    MLIST;
typedef struct Message	    MSG;

typedef unsigned char	ubyte;
typedef unsigned short	uword;
typedef unsigned long	ulong;

#include "/dnet/channel.h"

#ifndef MAX(a,b)
#define MAX(a,b) (((a)>(b))?(a):(b))
#endif

#define CFGFILE "s:dnet.config"

#define PKT	struct _PKT
#define CTLPKT	struct _CTLPKT
#define PNODE	struct _PNODE
#define IOMSG	struct _IOMSG

#define DNETPORTNAME	    "DNET.UNIT."
#define OFFSET(ptr,elem)    ((long)((char *)&(ptr)->elem - (char *)(ptr)))

#define EMPTY	0	/*  empty (sent)                    */
#define READY	1	/*  data ready (not sent yet)       */

#define MAXCHAN 128	/*  Max # of channels supported     */
#define SYNC	0x5B	/*  SYNC character		    */
#define MAXPKT	200	/*  maximum packet size 	    */
#define MINPKT	32	/*  minimum maximum packet size
			    (for priority scheme)           */

#define MAXPACKET ((MAXPKT * 8 + 5) / 6 + 64)

#define OVERHEAD    7	/*  for packets with data	    */

PNODE {
    NODE    node;
    char    name[32];
    ulong   seg;
};

CTLPKT {
    uword   buflen;	/*  send: length of packet, recv: length of data    */
    ubyte   state;	/*  EMPTY, READY				    */

    ubyte   sync;	/*  THE PACKET	    */
    ubyte   ctl;
    ubyte   cchk;
};

PKT {
    uword   buflen;	/*  send: length of packet, recv: length of data    */
    ubyte   state;	/*  EMPTY, READY				    */

    ubyte   sync;	/*  THE PACKET	    */
    ubyte   ctl;
    ubyte   cchk;
    ubyte   lenh;
    ubyte   lenl;
    ubyte   dchkh;
    ubyte   dchkl;
    ubyte   data[MAXPACKET];
};

/*
 *  Used by the IoCtl() support routines.
 */

IOMSG {
    MSG     Msg;
    TASK    *ReplyTask;
    ulong   Cmd;
    ulong   Arg1;
    ulong   Arg2;
    ulong   Res;
};

#ifdef NOTDEF
			/*  RECEIVER STATES		    */
#define RS_SYNC 0	    /*	Waiting for sync		*/
#define RS_CTL	1	    /*	Waiting for command		*/
#define RS_CCHK 2	    /*	Waiting for check byte		*/
#define RS_LEN1 3	    /*	Waiting for MSB length byte	*/
#define RS_LEN2 4	    /*	Waiting for LSB length byte	*/
#define RS_DATA 5	    /*	Waiting for data & checksum	*/

#endif

#define DNCMD_OPEN	32  /*	Application open		*/
#define DNCMD_SOPEN	33  /*	Server open			*/
#define DNCMD_CLOSE	34  /*	Close a channel 		*/
#define DNCMD_EOF	35  /*	Will no longer write to channel */

#define DNCMD_WRITE	36  /*	Write data to a channel 	*/
#define DNCMD_QUIT	37  /*	Kill the DNET server		*/
#define DNCMD_IOCTL	38
#define DNCMD_EXEC	39  /*	server asks driver to Execute() something */

#define DNCMD_INFO	64  /*	Ascii status message		*/

				/*  REQUEST TYPES	    */
#define RTO_REQ 	1   /*	Network read timeout		*/
#define WTO_REQ 	2   /*	Network write-ack timeout	*/
#define RNET_REQ	3   /*	Network read data		*/
#define WNET_REQ	4   /*	Network write data sent 	*/
#define PKT_REQ 	5   /*	Returned packets from servers	*/
#define OPEN_REQ	6
#define IGWNET_REQ	7
#define CTO_REQ 	8
#define CNET_REQ	9

				    /*	PACKET CONTROL BYTE */
#define PKF_SEQUENCE	0x07	/*  Sequence #			*/
#define PKF_MASK	0x78	/*  command mask		*/

#define PKCMD_RESTART	0x20	/*  Restart			*/
#define PKCMD_ACKRSTART 0x28	/*  Restart Acknowledge 	*/
#define PKCMD_WRITE6	0x30	/*  A DATA packet 6 bit enc	*/
#define PKCMD_WRITE	0x38	/*  A DATA packet		*/
#define PKCMD_CHECK	0x40	/*  Request ACK or NAK for win	*/
#define PKCMD_ACK	0x48	/*  ACK a window		*/
#define PKCMD_NAK	0x50	/*  NAK a window		*/
#define PKCMD_WRITE7	0x58	/*  compressed 7 bit in 8 bit pkt */
				/*  0x60-0x7F reserved		*/

				    /*	CHANNEL COMMANDS    */
#define SCMD_SWITCH	0x00	/*  switch active channel #	*/
#define SCMD_OPEN	0x01	/*  open a channel		*/
#define SCMD_CLOSE	0x02	/*  close a channel		*/
#define SCMD_ACKCMD	0x03	/*  ack an open/close request	*/
#define SCMD_EOFCMD	0x04	/*  Reof or Weof		*/
#define SCMD_QUIT	0x05	/*  crash dnet			*/
#define SCMD_IOCTL	0x06	/*  ioctl			*/

#define SCMD_DATA	0x08	/*  stream command, DATA	*/

#define CHAN_FREE	0x01	/*  free channel		*/
#define CHAN_ROPEN	0x02	/*  remote open, wait port msg	*/
#define CHAN_LOPEN	0x03	/*  local open, wait reply	*/
#define CHAN_OPEN	0x04
#define CHAN_CLOSE	0x05	/*  see flags			*/
#define CHANF_ROK	0x01	/*  NOT read eof		*/
#define CHANF_WOK	0x02	/*  remote will accept data	*/
#define CHANF_LCLOSE	0x04
#define CHANF_RCLOSE	0x08

extern void  *ArbitrateNext();
extern long  IoHandler();

#ifndef NOEXT
extern IOT Rto; 	       /*  Read-Timeout/reset	       */
extern IOT Wto; 	       /*  Write-Timeout/retry	       */
extern IOT Cto;
extern PKT Pkts[9];
extern PKT *Raux;	       /*  next packet in	       */
extern PKT *RPak[4];
extern PKT *WPak[4];
extern PORT *DNetPort;	       /*  Remote Command/Control in	*/
extern PORT *IOSink;	       /*  Return port for ALL IO	*/
#ifdef NOTDEF
extern PORT *IPCPort;	       /*  IPC comm port		*/
#endif
extern CHAN Chan[MAXCHAN];
extern LIST TxList;	       /*  For pending DNCMD_WRITE reqs.   */
extern ubyte Rto_act;
extern ubyte Wto_act;
extern ubyte Cto_act;
extern ubyte Cd;
extern uword RChan;
extern uword WChan;
extern uword RPStart;
extern uword WPStart;
extern uword WPUsed;
extern uword RState;
extern uword Protocol;
extern short DDebug;
extern short PDebug;
extern ubyte Restart;
extern ubyte OnLine;
extern ubyte Quit;
extern ubyte Mode7;	    /* 7 bit line    */
extern short AutoHangup;
extern short DialOut;
extern short AutoAnswer;
extern short Master8;
extern short NetworkNum;
extern short Getty;
extern ulong NumCon;
extern ulong WTimeoutVal;
extern ulong RTimeoutVal;
extern long Baud;
extern long TOBaud;
extern char *HostName;	    /*	The Amiga's HostName    */
extern long DResBase;
extern char PortName[];

extern short Deemu[];

extern long    BytesOut, PacketsOut, PacketsResent;
extern long    BytesIn , PacketsIn , PacketsNakd;
extern long    GarbageIn;

extern long    Packets6In, Packets7In, Packets8In;
extern long    Packets6Out, Packets7Out, Packets8Out;


#ifdef NOTDEF

extern void do_rto	ARGS((IOT *));
extern void do_wto	ARGS((IOT *));
extern void do_rnet	ARGS((ubyte *, long));
extern void do_wnet	ARGS((void));
extern void do_wupdate	ARGS((void));
extern void dumpcheck	ARGS((ubyte *));
extern void do_cmd	ARGS((uword, ubyte *, int));
extern void do_rupdate	ARGS((void));
extern void do_reccmd	ARGS((int, ubyte *, int));
extern void replywindow ARGS((int));

/* Prototypes for functions defined in sernet.c */

extern void NetOpen	ARGS((PORT *, char *, int, int *));
extern void NetClose	ARGS((void));
extern void NetClWrite	ARGS((IOSER *));
extern void NetWrite	ARGS((void *, int, int));
extern void NetBreak	ARGS((void));
extern int  NetReady	ARGS((void));
extern int  SetBaudRate ARGS((int));
extern void DropDTR	ARGS((void));
extern void NetStartRead ARGS((long));
extern IOSER *NetAbortRead ARGS((void));
extern struct IOExtSer *NetReadReady ARGS((void));
extern int  NetReadReturned ARGS((int, ubyte **));
extern void NetWaitWrite ARGS((void));
extern void SaveState ARGS((void));
extern void RestoreState ARGS((void));
extern void NetRecvOff ARGS((void));
extern void NetRecvOn ARGS((void));
extern void NetSerialOff ARGS((void));
extern void NetSerialOn ARGS((void));


/* Prototypes for functions defined in time.c */

extern void do_cto	    ARGS((IOT *));
extern void ResetIdle	    ARGS((void));
extern void ResetConnect    ARGS((void));
extern void LessConnect     ARGS((int));
extern void SetConnectAlert ARGS((int, char *));
extern void SetIdleAlert    ARGS((int, char *));
extern int  GetIdle	    ARGS((void));
extern int  GetConnect	    ARGS((void));
/*
extern int  doipcmsg	    ARGS((char *, char *, short));
*/

/* Prototypes for functions defined in dnet.c */

void do_netreset ARGS((void));

/* Prototypes for functions defined in ipc.c */

/*
extern int  handle_ipc	    ARGS((void));
extern void  do_online	    ARGS((void));
extern void  do_offline     ARGS((void));
extern void  do_disconnect  ARGS((void));
extern void  do_quit	    ARGS((void));
extern void  do_stat	    ARGS((int, char **, int *));
extern void  do_state	    ARGS((void));
extern int   AllocAppend    ARGS((char **, int *, char *, int));
extern void  do_recvon	    ARGS((void));
extern void  do_recvoff     ARGS((void));
extern void  do_serialon    ARGS((void));
extern void  do_serialoff   ARGS((void));
extern void  do_baud	    ARGS((char **));
extern void  do_getidle     ARGS((char **, char **, int *));
extern void  do_getconnect  ARGS((char **, char **, int *));
*/

/* Prototypes for functions defined in subs.c */

extern void WriteStream     ARGS((int, void *, int, uword));
extern void WritePort	    ARGS((PORT *, int, void *, int, int, int));
extern int  alloc_channel   ARGS((void));
extern int  GetNext	ARGS((struct Node *));
extern int  chkbuf	ARGS((ubyte *, uword));
extern void TimerOpen	ARGS((struct timerequest *, struct MsgPort *));
extern void TimerClose	ARGS((struct timerequest *));
extern void InitServers ARGS((void));
extern void RunServer	ARGS((uword));
extern void DeleteServers ARGS((void));
extern void dneterror	ARGS((char *));
extern void fixsignal	ARGS((PORT *));
extern void SetTimeouts ARGS((int));

/* Prototypes for functions defined in window.c */

extern void  do_dnetwindow ARGS((int));
extern void  setparity ARGS((int,int,int));
extern void  addparity ARGS((ubyte *, int));
extern void  OpenConsole ARGS((WIN *, IOCON **, IOCON **));
extern void  CloseConsole ARGS((IOCON *, IOCON *));
extern void  InitDeemuNW ARGS((short *, NW *));
extern void  LoadConnectList ARGS((void));
extern void  UnLoadConnectList ARGS((void));
extern int   CheckConnect ARGS((int, char *, int));

#endif
#endif
