/* RPCPkt.h*/
/* 28 July 1982 11:52 am PDT */

/* requires #include <Env.h>
   requires #include <RPC.h>
   requires #include <RPCInternal.h> */

struct PktType { /* "type" word of a Pup --*/
      byte transport;	/* should be zero before sending --*/
      byte fields; /*: Here's what would be in them.
      	subType	bit 3	{ rpc(3B), (7B) },
      	eom	bit	 { end(0), notEnd(1) },
      	ack	bit	 { dontAck(0), pleaseAck(1) },
      	class	bit 3 { call(0), data(1), ack(2), nak(3), rfa(4), (7) } */
      };
#define	subtypeField	0340
#define	eomField		0020
#define	ackField		0010
#define	classField		0007 
	#define rpc 0140
		/* constant value for subType*/
	#define call 0
		/* class values*/
	#define xtraData 1
	#define ack 2
	/* obsolete nak	= 3*/
	#define rfa 4

struct Socket {
	word ms;
	byte midS;
	byte LS; };	/* a "word", but socket numbers are small in RPC */
    #define lenSocket (sizeof (struct Socket)/2)

struct PktConversationID {
	/* Same as ConversationID, but abbreviated within a packet --*/
	/* Assumes originator is always caller or callee*/
	word LS;
	word fields; /*: Here's what would be in them
		originator bit {caller, callee} // BCPL-style
		ms	bit 15 */
	};
	#define lenPktConversationID (sizeof (struct PktConversationID)/2)
#define callerField		0000000
				  /* swab(0000000) */
#define calleeField		0000200
				  /* swab(0100000) */
#define originatorField	0000200
				  /* swab(0100000) */
#define notCalleeMask	0177577
				  /* swab(0077777) */

struct ConnectionID {
	/* Uniquely identifies an independent sequence of calls --*/
	struct PktConversationID conv;
	union Machine caller;
	num activity; }; /* PSB.PsbIndex*/
    #define lenConnectionID (sizeof (struct ConnectionID)/2)
	
struct CallCount {
      /* [ConnectionID,CallCount] uniquely identifies call for all hosts and a long time*/
	word LS;
	word ms; };
    #define lenCallCount (sizeof (struct CallCount)/2)
    	
struct PktID {
      /* [ConversationID,PktID] uniquely identifies pkt for all hosts and a long time --*/
      num activity;	/* PSB.PsbIndex*/
      struct CallCount callCt;
      num pktSeq; };
    #define lenPktID (sizeof (struct PktID)/2)

struct Header {
	  num length; /* here's what it should be:
        length	bit 15	// BCPL style
        oddByte	bit	 { no(0), yes(1) },
         [length must be swapped and shifted, viz:
        	to remove from packet: (swab(hdr->length))>>1
        	to insert into packet: swab(hdr->length<<1) ]	*/
      struct PktType type;
      num destPSB;	/* in Mesa, PSB.PsbIndex,-- field has 6 extra bits*/
      num srcePSB;	/* in Mesa, PSB.PsbIndex,-- field has 6 extra bits*/
      union Machine destHost;
      struct Socket destSoc;	/* PupTypes.PupSocketID,*/
      union Machine srceHost;
      struct Socket srceSoc;	/* PupTypes.PupSocketID,*/
      /* end of standard Pup header --*/
      struct PktConversationID conv;
      /* For secure conversations, the remainder of the packet must be encrypted --*/
      struct PktID pktID;
      union RPCCall callSpec;
      union RPCData callData; };
    #define lenHeader (20)
    	/* 10 Pup + 6 RPC + 4 Dispatcher -- omits callData */

/* ******** MUST TRACK PUP PACKAGE !!! ******* */
#define lenPBIOverhead 4
struct PBI {
  struct PBI *next;
  struct Queue *queue;
  struct ConversationObject *convHandle;
  struct Header *pup; };


/* Mapping from Pup pkt types to RPC pkt types:*/
#define typeCall	0140
	/* = [end,    dontAck,   call ]*/
#define typeData	0141
	/* = [end,    dontAck,   data ]*/
#define typeAck	0142
	/* = [end,    dontAck,   ack  ]*/
#define typeRFA	0144
	/* = [end,    dontAck,   rfa  ]*/
/*		150B  = [end,    pleaseAck, call ]*/
/*		151B = [end,    pleaseAck, data ]*/
#define typePing	0152
	/* = [end,    pleaseAck, ack  ]*/
/*		154B  = [,       pleaseAck, rfa  ] (also 174B)*/
/*		160B  = [notEnd, dontAck,   call ]*/
/*		161B  = [notEnd, dontAck,   data ]*/
/*		162B  = [notEnd, dontAck,   ack  ]*/
/*		164B  = [notEnd, dontAck,   rfa  ]*/
/*		170B  = [notEnd, pleaseAck, call ]*/
/*		171B  = [notEnd, pleaseAck, data ]*/
/*		172B  = [notEnd, pleaseAck, ack  ]*/

#define pktLengthOverhead (lenHeader+1)
	/* include checksum word*/

 /* Outcomes in outcome header-variant*/
#define result 0
	/* normal --*/
#define unbound 1
	/* dispatcher not known --*/
#define signal 2
	/* signal propagation --*/
#define unwind 3
	/* signal is unwinding --*/
#define protocol 4
	/* stub protocol error detected. --*/
	
/*  ******** Single-packet communication: exported by RPCPktIO ******** */

/* Packet Exchange States*/
/*	receiving=0*/
/*	sending=1*/
#define calling 2
#define endCall 3
#define authReq 4
	
#define rpcSocket 036
#define rpcBcstSocket 045