Google
 

Trailing-Edge - PDP-10 Archives - SRI_NIC_PERM_SRC_1_19910112 - 6-sources/anadpy.mac
There are 14 other files named anadpy.mac in the archive. Click here to see a list.
;<SYSDPY>ANADPY.MAC.9, 31-Dec-83 16:16:50, Edit by LOUGHEED
; Mods for use with SYSDPY
;  Flush TCB and JFN AC definitions
;  Flush TEMP macro
;  Rename to ANADPY.MAC
;<5-3-MONITOR>ANAUNV.MAC.8, 30-Dec-83 21:32:01, Edit by LOUGHEED
; Define symbols for 10MB and 3MB Ethernet protocols
; Modify MEIS NCT template so that it works for both types of Ethernet
; Redefine offsets into MEIS NCT for use with both Ethernets
;<5-3-MONITOR>ANAUNV.MAC.7, 15-Dec-83 19:36:17, Edit by MRC
;Stanford changes:
; Ethernet/MEIS definitions
;<TCPIP.5.3.MONITOR>ANAUNV.MAC.6,  6-Dec-83 23:47:26, Edit by PAETZOLD
;Add TCDUR. 
;Get rid of HHSIZ. 
;TCO 6.1867 - Delete SAVP1 macro. 
;TCO 6.1866 - Add NTODTI offset to the NCT. Add NTODTI word to AN20 NCT.
;Move gateway block symbols to here from IPIPIP.
;<TCPIP.5.1.MONITOR>ANAUNV.MAC.35, 5-Jul-83 22:32:15, Edit by PAETZOLD
;TCP Changes for 5.1
	UNIVERSAL ANADPY - Universal for ARPANET TCP/IP

;THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED
; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE.
;
;COPYRIGHT (C) 1982,1983,
;BY DIGITAL EQUIPMENT CORPORATION, MAYNARD, MASS.

	SALL
	SEARCH PROLOG,MONSYM,MACSYM

	IFNDEF KLFLG,<KLFLG==0>
	IFNDEF SMFLG,<SMFLG==0>
	IFE KLFLG+SMFLG,<KLFLG==1>

	FT.BCP==1			;ALLOW BBN JSYS FOR NOW
	IFNDEF FT.BCP,<FT.BCP==:0>	;DEFAULT IS NOT BBN JSYS INTERFACE
	SUBTTL Parameters for 1822 (from IMPPAR)

;DEFINE THE WORDS IN A NET BUFFER

.NBHDR==0	;WORD 0 IS THE BUFFER HEADER (QUEUE POINTER AND SIZE)
.NBLD0==1	;IMP-TO-HOST LEADER, WORD 0
.NBLD1==2	;I-H LEADER, WORD 1
.NBLD2==3	;I-H LEADER, WORD 2
 .NBPTR==3	;While a file buffer, pointer to next byte goes here.
.NBHHL==4	;HOST-TO-HOST LEADER
 .NBCNT==4	;While a file buffer, count of bytes goes here.
.NBDW0==5	;DATA WORD ZERO

;DEFINE THE FIELDS IN THE BUFFER HEADER

DEFSTR NBQUE,.NBHDR,17,18	;LINK FOR QUEUE OF BUFFERS
DEFSTR NBBSZ,.NBHDR,35,18	;SIZE OF THE BUFFER

;FIELDS IN IMP-TO-HOST LEADER

DEFSTR IHFTY,.NBLD0,7,4		;FORMAT TYPE FIELD. MUST BE 17 FOR LONG LDRS
	ITY%LL==17		;TYPE 17 FOR LONG LEADERS FROM IMP
DEFSTR IHNET,.NBLD0,15,8	;NETWORK NUMBER MSG GOES TO/FROM
DEFSTR IHLDF,.NBLD0,23,4	;LEADER FLAGS
DEFSTR IHMTY,.NBLD0,31,8	;MESSAGE TYPE
DEFSTR IHHT2,.NBLD0,35,4	;HIGH 4 BITS OF HANDLING TYPE
DEFSTR IHHTY,.NBLD1,3,4		;HANDLING TYPE, LOW 4 BITS
	HTY%NP==7		;NUMBER OF PACKETS
	HTY%HP==200		;HIGH PRIORITY BIT
DEFSTR IHADR,.NBLD1,27,24	;ADDRESS (HOST AND IMP)
				;SUBSTRUCTURES FOR ABOVE
  DEFSTR IHHST,.NBLD1,11,8	;HOST (ON IMP)
  DEFSTR IHIMP,.NBLD1,27,16	;IMP NUMBER
DEFSTR IHLNK,.NBLD1,35,8	;LINK (TOP 8 OF MESSAGE ID)
DEFSTR IHMI2,.NBLD2,3,4		;REST OF MESSAGE ID
DEFSTR IHSTY,.NBLD2,7,4		;SUBTYPE
	STY%FC==0		;NORMAL FLOW-CONTROLLED
	STY%UC==3		;UNCONTROLLED FLOW
DEFSTR IHLEN,.NBLD2,23,16	;LENGTH OF MESSAGE
DEFSTR IHPD1,.NBLD2,35,12	;LOW 12 BITS MUST BE MOVED TO FLUSH PADDING

;IMPDV treats a host address as one 32-bit quantity

HSTMSK==037777777777		; Net b4-b11, Host b12-b19, Imp b20-b35

; For user interface only, old-style Imp message leader bits

IMPHIP==1B0			; Hi priority imp msg leader bit
FRMIMP==1B1			; From imp

;FIELDS IN HOST-TO-HOST LEADER

DEFSTR HHCNT,.NBHHL,27,16	;NUMBER OF BYTES IN THIS MESSAGE

;Imp-to-Host parameters

FKHOST==^D252		;Fake hosts are 252. thru 255. on each Imp.

;Special link numbers required for dispatching

INTLNK==^D155		;Internet traffic
LLINK==^D71		;Last link usable by NCP.

;Message types in IHMTY (I2H = Imp to Host, & v.v.)

.IHREG==0		;Regular messages (Host-to-host)
.IHEWO==1		;Error, WithOut message ID (H2I)
.IHEIL==1		;Err in leader (I2H)
.IHHGD==2		;Host Going Down (H2I)
.IHIGD==2		;Imp Going Down (I2H)
.IHNOP==4		;No-op, takes padding request, tells my address.
.IHRFN==5		;Ready For Next message (I2H)
.IHDHS==6		;Dead Host Status (I2H)
.IHDDD==7		;Destination DeaD (I2H)
.IHERW==^D8		;Error, With message ID (H2I)
.IHERD==^D8		;Error in Data (I2H)
.IHINC==^D9		;Incomplete transmission (I2H)
.IHRES==^D10		;Interface reset (I2H)

; Special Internet parameters

.INVER==.NBHHL+0	; Word in H-H leader containing Internet version
.INPRO==.NBHHL+2	; Word in H-H leader containing Internet protocol

DEFSTR(INPVR,.INVER,3,4)	; Internet packet version
  .INTVR==4
DEFSTR(INPPR,.INPRO,15,8)	; Internet packet protocol
  .SCRFM==2			; Secure TCP format
	SUBTTL	Internet Parameters (from IPPAR)

;FR			; Flags, preserved by routines
;T1			; Temporary ACs.  Maybe freely clobbered.
;T2			; Subrs never expected to preserve these.
;T3			; Used to send args to subrs.
;T4			; Functions return value in T1
NTEMPS==4		; Number of temps. (used only in TEMP macro)
;Q1			; Locals.  Always preserved by subrs.
;Q2
;Q3
;P1			; More locals.
NLOCLS==4		; Number of locals (used only in LOCAL macro)
FR==0			; Be sure that AC0 is what we use for flags
BFR=P2			; Global ACs.  Implicit args to lower level
;JFN=P2
TPKT=P3			; Subrs.  Changed only with great care.
PKT=P4
DEV=P4
;TCB=P5			; Pointer to connection (TCP)
;P6			; Frame base used by .TRSET
;CX			; Scratch AC used by Jxxx macros and stack stuff
;P			; Push pointer.  Always covers the stack.

DEFINE IFKL(STUFF)<IFN KLFLG,<STUFF>>
DEFINE IFSM(STUFF)<IFN SMFLG,<STUFF>>

IFKL <DEFINE SETSEC (AC,SECTION) <HRLI AC,SECTION>>
IFSM <DEFINE SETSEC (AC,SECTION) <>>

IFKL <DEFINE GIW (ADDR,X<0>,I<0>) <<I>B1!<X>B5!<ADDR>B35>>
IFSM <DEFINE GIW (ADDR,X<0>,I<0>) <<I>B13!<X>B17!<ADDR>B35>>

DEFINE MKWAIT(A),<
	ROT T2,-^D9
	LSHC T1,^D27
	HRRI T1,A>

; Some auxilliary macros to be used by local variable stuff

DEFINE $INIT <
	DEFINE $INFO(X,Y)<X
Y>
$ACVNM==0
$STVNM==0
$TMVNM==0
>

DEFINE $REMOTE(Z)<$INFO(<DEFINE $INFO(X,Y)><X
Z,Y>)>

DEFINE $HERE <
	$INFO
	$INIT>

DEFINE $IPMSG(L,M,A,S,T) <PRINTX M at L (A,S,T)>

DEFINE $POP(L) <
	GSOPDEF %POP%,<POP P,>
	$REMOTE (<%POP% L>)>

DEFINE $PURGE (L)<$REMOTE (<PURGE L>)>

; Macro to be used at entry to subroutine to define local variables
;  and assign ACs to them.

DEFINE LOCAL(LIST) <
	IFG $ACVNM,<	$IPMSG(\.,<?LOCAL: Missing RESTORE>,\$ACVNM)
			$ACVNM==0>
	IRP LIST,<	IFGE $ACVNM-NLOCLS,<$IPMSG(\.,<?Too many LOCALs>)>
			$DFACL(LIST,\<$ACVNM>)
			$ACVNM==$ACVNM+1>>

DEFINE $DFACL(N,V) <
	IFDEF N,<$IPMSG(\.,<?LOCAL AC N already defined>)>
	PUSH P,T1+NTEMPS+V
	N==T1+NTEMPS+V
	$PURGE N
	$POP T1+NTEMPS+V>

; Macro for giving names to temporary AC's

REPEAT 0,<
DEFINE	TEMP(LIST) <
	IFG $TMVNM+$STVNM+$STVNM,<	$IPMSG(\.,<?TEMP: Missing RESTORE>,\$ACVNM,\$STVNM,\$TMVNM)
					$STVNM==0
					$TMVNM==0
					$ACVNM==0>
	IRP LIST,<	IFGE $TMVNM-NTEMPS,<$IPMSG(\.,<?Too many TEMPs>)>
			$DFTMP(LIST,\<$TMVNM>)
			$TMVNM==$TMVNM+1>>

DEFINE $DFTMP(N,V) <
	IFDEF N,<$IPMSG(\.,<?TEMP N already defined>)>
	N==T1+V
	$PURGE N>
>;REPEAT 0

; Macro for allocating locals on the stack

DEFINE	STACKL(LIST) <
	IFG $ACVNM+$STVNM,<	$IPMSG(\.,<?STACKL: Missing RESTORE>,\$ACVNM,\$STVNM)
				$ACVNM==0
				$STVNM==0>
	IRP LIST,<	$STKL1(LIST)>
	JSP CX,.TRSET##
	$STVNM,,$STVNM>

DEFINE $STKL1(PAIR)<$STKL2(PAIR)>

DEFINE $STKL2(NAME,SIZE) <
	$STKL3(NAME,\$STVNM)
	IFB <SIZE>,<$STVNM==$STVNM+1>
	IFNB <SIZE>,<$STVNM==$STVNM+SIZE>>

DEFINE $STKL3(NAME,LOC) <
	IFDEF NAME,<$IPMSG(\.,<?STACKL local NAME already defined>)>
	DEFINE NAME<^O'LOC+1(P6)>
	$PURGE NAME>

; Macro to restore all locals

DEFINE RESTORE <
	IFLE $ACVNM+$STVNM+$TMVNM,<$IPMSG(\.,<?Extra RESTORE macro>,\$ACVNM,\$STVNM,\$TMVNM)>
	$HERE>
$INIT

; Macro to leave a subroutine.
; Assembles as a RET if no RESTORE is needed.

DEFINE EXIT(TAG) <
	IFN $ACVNM,<JRST TAG>
	IFE $ACVNM,<RET>>

; Internet Gateway Parameters -- determine buffer and packet sizes:

;MF==^D<512/8>	; Fragments are a multiple of this size.
;		;  Must be power of 2.
;M0==^D144	; Segment size guaranteed not to require Internet
;		;  fragmentation.  Net input buffer must be this big.
;M1==4*M0	; Smallest segment size all Internet reassemblers
;		;  guarantee to handle.
;M2==M1		; Largest segment that a particular Internet layer is
;		;  able to receive, independent of reassembly.  Local
;		;  implementation limitation.
;M3==M1		; Largest seg size a particular protocol implementation
		;  will accept.  Determined by mutual agreement.
;M4==^D<2_14>	; Largest segment Internet level can talk about
; Constraints on the above:
; MF le M0 le M1 le M2 le M3  and M2 le M4.
; M0 chosen to so that one subtype-3 ARPANET packet can contain an
; Internet fragment.

; Where to get interface number from GWAY or LCLHID word

DEFSTR INTNUM,,3,4

; Protocol table definitions

.INTPC==0	; (Extended) address of Time Check routine (xxxCHK)
.INTPF==1	; Run request flag (xxxFLG)
.INTPI==2	; (Extended) address of Initialization routine (xxxINI)
.INTPQ==3	; (Extended) address of Input Queue head (xxxIPQ)
.INTPO==4	; Protocol ON flag (0 is off) (xxxON)
.INTPL==5	; Protocol number (.xxxFM)
.INTPP==6	; (Extended) address of Processing routine (xxxPRC)
.INTPS==7	; Protocol Segment Id (xxxSID)
.INTPT==^D8	; Next run Time, msec (xxxTIM)
.INTPE==^D9	; Handle an ICMP error message for this protocal (xxxICM)
.INTPZ==^D10	; Table length

; Definitions of network formats
; These extract a network number from right justified host number.

DEFSTR  NETCLS,0,6,3			; Bits identifying network class

					; Class A network. High 8 bits
.NETCA==1B4				; Bit is off for a class A network
DEFSTR	NETCA,0,11,8

					; Class B network. High 16 bits
.NETCB==1B5				; Bit is on for a class B network
DEFSTR	NETCB,0,19,16

					; Class C network. High 24 bits.
DEFSTR	NETCC,0,27,24

; Macro for extracting the network number from a host address,
; both SRC and DST must be AC's (obviously).

DEFINE	NETNUM(DST,SRC,%HERE)<
	TXNN	SRC,.NETCA		; Class A network?
	 JRST	[LOAD	DST,NETCA,+SRC	; Get number
		 JRST	%HERE]
	TXNN	SRC,.NETCB		; Class B?
	 JRST	[LOAD	DST,NETCB,+SRC
		 JRST	%HERE]
	LOAD	DST,NETCC,+SRC		; Must be class C
%HERE:!>

; PACKET structure (indexed by PKT):

PKTQ==<.P==0>			; Offset of Packet queue

PKTFLG==<.P==.P+QSZ>		; Packet flags -- internal use only
DEFSTR(PFLGS,\<PKTFLG>,35,36)
				; Specific flags:
  DEFSTR(PPROG,\<PKTFLG>,0,1)	; non-0 means program still needs pkt
				; e.g. TCP RX
  DEFSTR(PINTL,\<PKTFLG>,1,1)	; non-0 means int. level still has Pkt
  DEFSTR(PFSIZ,\<PKTFLG>,2,1)	; non-0 if this is a full size pkt
				; MAXPSZ is buffer length & PACKSZ is IMPPHY length
				; I.E. it can be recycled as an input buffer
  DEFSTR(PRXD,\<PKTFLG>,3,1)	; non-0 means packet has been retrans'd
  DEFSTR(PSCR,\<PKTFLG>,4,1)	; non-0 if packet on a secure connection
  DEFSTR(PNLCL,\<PKTFLG>,5,1)	; non-0 to prevent local delivery
				; I.E. Send it to the source from the dest
  DEFSTR(PSROU,\<PKTFLG>,6,1)	; non-0 if user is source routing
  DEFSTR(PLCLO,\<PKTFLG>,7,1)	; 0 if packet came from net, 1 if from host

PKTSII==<.P==.P+1>		; Start of internal information

DEFSTR(PTG,\<.P>,35,36)		; PACKET.TIME-GENERATED
.P==.P+1
DEFSTR(PXT,\<.P>,35,36)		; PACKET.XMIT-TIME
.P==.P+1
DEFSTR(PRXI,\<.P>,35,36)	; PACKET.REXMIT-INTERVAL
.P==.P+1
DEFSTR(PDCT,\<.P>,35,36)	; PACKET.DISCARD-TIME
.P==.P+1
DEFSTR(PTS,\<.P>,35,36)		; PACKET.TIMESTAMP
.P==.P+1
DEFSTR(PESEQ,\<.P>,35,36)	; PACKET.END-SEQUENCE (for TCP)

LCLPKT==<.P==.P+1>		; Marks start of local substructure

;Area  between  LCLPKT  and  PKTELI  must  be  big enough to hold the
;biggest possible local leader including fake free header. The  first
;word  of  all  local  packets  is  a  fake IMPPHY-style free storage
;header.

IMP96L==LCLPKT			; 96-bit ARPANET Leader (should be flushed)
MAXLDR==4			; Current maximum local leader (Arpanet)
PKTELI==<.P==.P+MAXLDR>		; End Local Information

; Some related numbers:

;INTXPB (in STG) contains maximum PIPL for any interface.
;INTXPW (in STG) contains the maximum # words for PACKET structure.
;Note:	Packets buffers of this size are "full size" and have PFSIZ set.

;PACKSZ==PKTELI-LCLPKT+<M2+3>/4	; Num. words in IMPPHY Pkt
;MAXPSZ==LCLPKT+PACKSZ		; Maximum packet size
;Note:	MAXWPM <-> NBBSZ <-> PACKSZ <=> PFSIZ <=> MAXPSZ (for GETBLK)

; Internet Header:
			; Word offsets:
.IPKVR==0		; Word with version, type of service, etc
.IPKSG==1		; Word with segmentation info
.IPKPR==2		; Word with time to live, checksum, protocol
.IPKSH==3		; Word with source host
.IPKDH==4		; Word with destination host
MINIHS==<.IPKDH+1>*4	; Minimum Internet Header size (bytes)

DEFSTR(PIVER,PKTELI+.IPKVR,3,4)		; PACKET.IP.VERSION
DEFSTR(PIDO,PKTELI+.IPKVR,7,4)		; PACKET.IP.DATA-OFFSET
DEFSTR(PITOS,PKTELI+.IPKVR,15,8)	; PACKET.IP.TYPE-OF-SERVICE
					; Overlays for the above:
  DEFSTR(PIPRC,PKTELI+.IPKVR,10,3)	; PACKET.IP.PRECEDENCE
  DEFSTR(PILDY,PKTELI+.IPKVR,11,1)	; PACKET.IP.LOW-DELAY
  DEFSTR(PIHTR,PKTELI+.IPKVR,12,1)	; PACKET.IP.HIGH-THROUGHPUT
  DEFSTR(PIHRL,PKTELI+.IPKVR,13,1)	; PACKET.IP.HIGH-RELIABILITY
					; 2 Unused bits
DEFSTR(PIPL,PKTELI+.IPKVR,31,16)	; PACKET.IP.PACKET-LENGTH
DEFSTR(PISID,PKTELI+.IPKSG,15,16)	; PACKET.IP.SEGMENT-ID
DEFSTR(PIFLG,PKTELI+.IPKSG,18,3)	; PACKET.IP.FLAGS
					; Overlays for the above:
					; 1 Unused bit
  DEFSTR(PIDF,PKTELI+.IPKSG,17,1)	; PACKET.IP.DONT-FRAGMENT
  DEFSTR(PIMF,PKTELI+.IPKSG,18,1)	; PACKET.IP.MORE-FRAGMENTS
DEFSTR(PIFO,PKTELI+.IPKSG,31,13)	; PACKET.IP.FRAGMENT-OFFSET
DEFSTR(PITTL,PKTELI+.IPKPR,7,8)		; PACKET.IP.TIME-TO-LIVE
DEFSTR(PIPRO,PKTELI+.IPKPR,15,8)	; PACKET.IP.PROTOCOL
  .ICMFM==1				; Internet Control Message protocol
  .SCRFM==2				; Secure TCP format
  .GGPFM==3				; Gateway-gateway protocol
  .TCPFM==6				; TCP format
  .CHAFM==20				; CHAOS format (Kludge)
DEFSTR(PICKS,PKTELI+.IPKPR,31,16)	; PACKET.IP.HEADER-CHECKSUM
DEFSTR(PISH,PKTELI+.IPKSH,31,32)	; PACKET.IP.SOURCE-HOST
DEFSTR(PIDH,PKTELI+.IPKDH,31,32)	; PACKET.IP.DESTINATION-HOST

; Internet options, if any, are here.
; ***** beware

MAXIOS==<.RTJST(-1,PIDO)*4-MINIHS>	; Maximum # Option bytes possible

; Options: Two cases.
; Case 1: A single byte of option code
; ENDOPT is and must be 0.  This marks the end of the option list.
; NOPOPT is and must be 1.  This is one byte long and has no purpose.

; Case 2: General form of options is 1 byte of "kind", 1 byte of total
; length, and N-2 bytes of data, where N is read from the length byte.

; All options are included under the appropriate checksum.
; IP Options which are copied on fragmentation if this bit is set

CPYOPT==200

; Class 0: Control

; END	End of options		ENDOPT
; NOP	Filler			NOPOPT
; LSR	Loose Source Routing	LSROPT,Len,ptr.ge.4,<route data>
; RRT	Record Route		RRTOPT,Len,ptr.ge.4,<route data>
; SID	Stream ID		SIDOPT,4,I,D
; SSR	Strict Source Routing	SSROPT,Len,ptr.ge.4,<route data>
; STY	Autodin II security	STYOPT,^D11,S,S,C,C,H,H,TCC,TCC,TCC

; Class 1: Reserved for future use	(OBSOLETE)

; ERR	Error
; SOP	Secure Open
; SCL	Secure Close

; Class 2: Debugging and measurement

; TSP	Timestamp		TSPOPT,Len,Ptr,OFLW/FLAG,[<inet adr>],<tsmp>
; Flag 0 <timestamp> only
;      1 <internet adr>,<timestamp> pairs
;      3 <internet adr>,<timestamp> pairs with <internet adr> pre-specified

; Class 3: Reserved for future use

; General IP Option generation macro

DEFINE IPOPTS (USER,RECV,ECHO)<
  OPTION(I,END,,^D0,^D1,USER,RECV,ECHO)
  OPTION(I,NOP,,^D1,^D1,USER,RECV,ECHO)
  OPTION(I,LSR,C,^D3,^D7,USER,RECV,ECHO)
  OPTION(I,RRT,,^D7,^D7,USER,RECV,ECHO)
  OPTION(I,SID,C,^D8,^D4,USER,RECV,ECHO)
  OPTION(I,SSR,,^D9,^D7,USER,RECV,ECHO)
  OPTION(I,STY,C,^D2,^D11,USER,RECV,ECHO)

  OPTION(I,TSP,,^D68,^D8,USER,RECV,ECHO)

> ; End of DEFINE IPOPTS

; Define Option Names

DEFINE OPTION(TYPE,NAME,COPY,NUMBER,LENGTH,USER,RECV,ECHO)<
IFDIF <COPY>,<C>,<	NAME'OPT==NUMBER	>
IFIDN <COPY>,<C>,<	NAME'OPT==CPYOPT+NUMBER	>>

IPOPTS

; Packet Printer Buffer

; Size and layout of the Packet Printer Buffer
; Must make assumption about the size of the per-protocol
; area in the packet:

; Assume max protocol to be TCP at 17(8) words & allow 2 words of data
; Size of a packet header including options:

PPBFSZ==PKTELI+.RTJST(-1,PIDO)+17+2-LCLPKT

; Size of the Packet Printer Buffer including control words:

DEFSTR(DFLAG,PPBFSZ+0,35,36)	; PPB.FLAGS
DEFSTR(DSS,PPBFSZ+1,17,18)	; PPB.SOURCE STATE
DEFSTR(DDS,PPBFSZ+1,35,18)	; PPB.DESTINATION STATE
DEFSTR(DTIME,PPBFSZ+2,35,18)	; PPB.REPORT TIME
DEFSTR(DPKTP,PPBFSZ+3,17,18)	; PPB.PACKET ADDRESS
DEFSTR(DPTRC,PPBFSZ+4,35,36)	; PPB.TRACE BITS

PPBWDS==PPBFSZ+5+1+LCLPKT	; Remove LCLPKT, add to PPBFSZ & reorder

; Flag bits in PPFLAG cell (Kept in F locally):

PP%MT==1B0	; Buffer is empty
PP%SK==1B1	; Source address is known
PP%DK==1B2	; Destination address is known
PP%SNT==1B3	; Packet has been sent
PP%RCV==1B4	; Packet has been received
PP%REX==1B5	; Packet retransmitted
PP%PZ==1B6	; Packet passed through Packetizer
PP%RA==1B7	; Packet passed through Reassembler
PP%GSS==1B8	; Got Source state (LH of PPSTAT valid)
PP%GDS==1B9	; Got Dest state (RH of PPSTAT valid)
PP%DUN==1B10	; Packet printable

; Packet Printer Trace Codes
; Old codes

PT%XX0==^D0	;     BG is flushing packet printer buffer
PT%XX1==^D1	; PZ  Generated normal packet "being output"
PT%XX2==^D2	; SNT EMTPKT, ABTNTC
PT%XX3==^D3	; RCV PKT on no connection, for RA
PT%XX4==^D4	; RA  Reassembly from packet completed
PT%XX5==^D5	;     IP Flushed (checksum, PKT on closed conn)
PT%XX6==^D6	;     INPUT finished: New SYN, DUP, IGN, no SEQ#, sent RST
PT%XX7==^D7	; SNT Sent a RST in response to received packet
PT%XX8==^D8	; REX Retransmitted a PKT

; New codes  (NB don't use 400000,,0)

			; Bit indicating validity
PP%%VR==100000,,0	; Registers valid
PT%%VH==040000,,0	; Higher level protocol (TCB=14)
PT%%VB==020000,,0	; User buffer (BFR=11)
PT%%VP==010000,,0	; Protocol pkt (T/CPKT=12)
PT%%VI==004000,,0	; IP (PKT=13)
PT%%VG==002000,,0	; Gateway (PKT=13)
PT%%VN==001000,,0	; Local Net (PKT=13)

			; Bit indicating error level
PT%%EI==000400,,0	; Internal error
PT%%EU==000200,,0	; Unimplemented
PT%%ER==000100,,0	; Resource
PT%%EN==000040,,0	; Normal

			; Bit indicating level of detail
PT%%LH==000010,,0	; High level
PT%%LF==000004,,0	; Filter
PT%%LM==000002,,0	; Medium
PT%%LL==000001,,0	; Low

			; Bit indicating "protocol"
PT%%TC==200000		; TCP
PT%%UQ==100000		; IP User Queues
PT%%GG==040000		; GGP
PT%%IC==020000		; ICMP
PT%%IP==010000		; IP
PT%%GW==004000		; Gateway
PT%%NT==002000		; Local Net

			; Agent & Direction
PT%%SY==001000		; System
PT%%UR==000400		; User
PT%%OU==000200		; Output
PT%%IN==000100		; Input

; Plus an ID code

DEFINE PT(NAM,VAL,LST)<	.X==VAL
			IRP LST,<.X==.X+PT%%'LST>
			PT%'NAM==.X>

					; Input, gateway level
PT(RGW,30,<SY,IN,GW,LL,VI>)		; Packet received at gateway from net
PT(KIP,11,<SY,IN,GW,LL,VI,EN>)		; Killed invalid format
PT(KCS,13,<SY,IN,GW,LL,VI,EN>)		; Killed checksum
PT(KDP,14,<SY,IN,GW,LL,VI,EN>)		; Killed duplication
PT(KIS,20,<SY,IN,GW,LL,VI,ER>)		; Killed no space to reassemble
PT(KIT,21,<SY,IN,GW,LL,VI,EN>)		; Killed reassembly timeout
PT(QIF,40,<SY,IN,GW,LL,VI>)		; Internet fragment queued (INTRAQ)
PT(DIF,44,<SY,IN,GW,LL,VI>)		; Dequeued and reassembled
PT(IRA,45,<SY,IN,GW,LL,VI>)		; Reassembled packet created

					; Input, IP level
PT(IDD,30,<SY,IN,IP,LL,VI>)		; Dequeued for dispatch
PT(IKC,13,<SY,IN,IP,LL,VI,EN>)		; Killed due to invalid checksum
PT(IKP,16,<SY,IN,IP,LL,VI,EU>)		; Killed due to invalid protocol
PT(IQP,57,<SY,IN,IP,LL,VI>)		; Queued for protocol module

					; Output, IP level
PT(IDO,57,<SY,OU,IP,LL,VI>)		; Dequeued packet for output
PT(IQG,30,<SY,OU,IP,LL,VI>)		; Queued packet for gateway

					; Output, Gateway level
PT(RGI,57,<SY,OU,GW,LL,VI>)		; Received at gateway from IP
PT(KDF,24,<SY,OU,GW,LL,VI,EN>)		; Killed fragmentation not allowed
PT(KIA,23,<SY,OU,GW,LL,VI,EN>)		; Killed addressing failure
PT(KPT,21,<SY,OU,GW,LL,VI,EN>)		; Killed packet (fragmentation) timeout
PT(KIO,22,<SY,OU,GW,LL,VI,EN>)		; Killed ill formated options
PT(KFS,20,<SY,OU,GW,LL,VI,ER>)		; Killed insufficient space to fragment
PT(BYP,34,<SY,OU,GW,LL,VI>)		; Queued for GW input
PT(IFR,33,<SY,OU,GW,LL,VI>)		; Internet fragment created
PT(QLN,30,<SY,OU,GW,LL,VI>)		; Queued for local net

       					; ICMP
PT(CDI,30,<SY,IN,IC,LM,VP>)		; ICMP received packet
PT(CKS,12,<SY,IN,IC,LL,VP,EN>)		; Killed due to truncated packet
PT(CKC,13,<SY,IN,IC,LL,VP,EN>)		; Killed due to bad checksum
PT(CKT,16,<SY,IN,IC,LL,VP,EN>)		; Killed due to bad ICMP Type
PT(CKX,17,<SY,IN,IC,LL,VP,EN>)		; Killed due to bad ICMP Code

					; GGP
PT(GDI,30,<SY,IN,GG,LM,VP>)		; Received packet
PT(GKS,12,<SY,IN,GG,LL,VP,EN>)		; Killed due to truncated packet
PT(GKC,13,<SY,IN,GG,LL,VP,EN>)		; Killed due to bad checksum
PT(GKT,16,<SY,IN,GG,LL,VP,EN>)		; Killed due to bad GGP Type
PT(GKX,17,<SY,IN,GG,LL,VP,EN>)		; Killed due to bad GGP Code

					; Input, Internet User Queues
PT(UDI,30,<SY,IN,UQ,LM>)		; Received packet
PT(UKQ,16,<SY,IN,UQ,LL,EN>)		; Killed due to no such queue
PT(UKS,20,<SY,IN,UQ,LL,ER>)		; No space in RECIN queue
PT(UKT,21,<SY,IN,UQ,LL,EN>)		; RCVIN queue timedout
PT(UQU,57,<SY,IN,UQ,LM>)		; Passed to user

					; User Interface, Internet User Queues
PT(UQA,02,<UR,IN,UQ,LM>)		; User queue assigned
PT(URJ,30,<UR,IN,UQ,LM>)		; User receive
PT(USJ,57,<UR,OU,UQ,LM>)		; User send
PT(UQD,02,<UR,OU,UQ,LM>)		; User queue deassigned

					; Output, Internet User Queues
PT(UDU,57,<SY,OU,UQ,LH,VI>)		; Received from user
PT(UKP,11,<SY,OU,UQ,LL,VI>)		; Killed
PT(UQO,30,<SY,OU,UQ,LL,VI>)		; Queued for output

					; Input, TCP level
PT(TDI,30,<SY,IN,TC,LH,VH,VP,VI>)	; Received packet
PT(TRS,01,<SY,IN,TC,LL,VH,VP,VI,EN>)	; Reset received
PT(TKR,10,<SY,IN,TC,LL,VH,VP,VI,EN>)	; Killed & sent RST
PT(TKC,13,<SY,IN,TC,LL,VH,VP,VI,EN>)	; Killed due to bad checksum
PT(TKD,14,<SY,IN,TC,LL,VH,VP,VI,EN>)	; Killed due to duplicate
PT(TKS,15,<SY,IN,TC,LL,VH,VP,VI,EN>)	; Killed due to sequence error
PT(TKX,16,<SY,IN,TC,LL,VH,VP,VI,EN>)	; Killed due to no local connection
PT(TKN,17,<SY,IN,TC,LL,VH,VP,VI,EN>)	; Killed due to closed connection
PT(TKT,20,<SY,IN,TC,LL,VH,VP,VI,EN>)	; TRMPKT killed packet - no space
PT(TTP,37,<SY,IN,TC,LL,VH,VP,VI>)	; TRMPKT trimming packet
PT(TQR,40,<SY,IN,TC,LL,VH,VP,VI>)	; Queued for reassembly
PT(TRA,42,<SY,IN,TC,LM,VH,VP,VI>)	; Being reassembled
PT(TDR,44,<SY,IN,TC,LL,VH,VP,VI>)	; Dequeued from reassembly
PT(TID,60,<SY,IN,TC,LL,VH,VP,VI>)	; Done with packet
PT(TIR,01,<SY,OU,TC,LL,VH,VP,VI,EN>)	; Reset sent in response to input pkt

					; User Interface, TCP level
PT(TST,01,<UR,IN,TC,LM,VH,VP,VI>)	; User status request
PT(TOJ,02,<UR,IN,TC,LM,VH,VP,VI>)	; User Open
PT(TIS,03,<UR,IN,TC,LM,VH,VP,VI>)	; Interrupt levels specified
PT(TSL,05,<UR,IN,TC,LM,VH,VP,VI>)	; User security level change
PT(TRD,30,<UR,IN,TC,LM,VH,VP,VI>)	; User receive data
PT(TIO,34,<UR,OU,TC,LM,VH,VP,VI>)	; Options to user
PT(TOO,35,<UR,IN,TC,LM,VH,VP,VI>)	; User options processed
PT(TSD,57,<UR,OU,TC,LM,VH,VP,VI>)	; User send data
PT(TBD,60,<UR,IN,TC,LM,VH,VP,VI>)	; User buffer processing completed
PT(TER,11,<UR,OU,TC,LM,VH,VP,VI>)	; Error
PT(TIU,06,<UR,IN,TC,LM,VH,VP,VI>)	; Interrupt to user
PT(TSC,04,<UR,OU,TC,LM,VH,VP,VI>)	; Secure close
PT(TCJ,02,<UR,OU,TC,LM,VH,VP,VI>)	; User Close
PT(TAJ,01,<UR,OU,TC,LM,VH,VP,VI>)	; User Abort
PT(TAB,01,<SY,OU,TC,LM,VH,VP,VI>)	; Abort (not user)

					; Output, TCP level
PT(TPZ,60,<SY,OU,TC,LM,VH,VP,VI>)	; TCP packet generated (Normal)
PT(TQX,40,<SY,OU,TC,LM,VH,VP,VI>)	; TCP PKT queued for RX
PT(TRX,42,<SY,OU,TC,LM,VH,VP,VI>)	; TCP PKT being RX'd
PT(TDX,44,<SY,OU,TC,LM,VH,VP,VI>)	; TCP PKT dequeued from RX
PT(TRX,30,<SY,OU,TC,LM,VH,VP,VI>)	; TCP packet transmitted
PT(TSC,04,<SY,OU,TC,LM,VH,VP,VI>)	; TCP secure close generated
PT(TOR,03,<SY,OU,TC,LM,VH,VP,VI>)	; TCP Reset generated by output

				; QUEUE structure:
DEFSTR(QNEXT,0,35,18)		; QUEUE.NEXT
DEFSTR(QPREV,0,17,18)		; QUEUE.PREVIOUS
	QSZ==1			; Number of words in a QUEUE structure

				; LOCK Structure:
DEFSTR(LWORD,0,35,36)		; LOCK.WORD
DEFSTR(LIDX,1,35,36)		; LOCK.WAITBIT INDEX
DEFSTR(LLOKR,2,35,36)		; LOCK.LOCKER
DEFSTR(LCCNT,3,35,36)		; LOCK.CONFLICT COUNT
DEFSTR(LOLKR,4,17,18)		; LOCK.CONFLICT.OLDLOCKER
DEFSTR(LNLKR,4,35,18)		; LOCK.CONFLICT.NEWLOCKER
	LOCKSZ==5		; Number of words in a LOCK structure

				; Histogram structure
DEFSTR(HTOTL,0,35,36)		; HISTOGRAM.TOTAL
DEFSTR(HSMPL,1,35,36)		; HISTOGRAM.SAMPLES

DEFINE IHBIN(X,I)<
	MOVEI CX,2(X)
	ADDI CX,0(I)
	AOS 0(CX)>

NHBINS==^D14		; Number of real bins, not incl garbage bin
HISTSZ==2+NHBINS+1	; Number of words in a histogram (for STG)

; ICMP packet structure and error codes

				; Message types (error type)
ICM%ER==^D0			; Echo reply message
ICM%DU==^D3			; Destination unreachable
ICM%SQ==^D4			; Source quench
ICM%RD==^D5			; Redirect output
ICM%EC==^D8			; Echo message
ICM%TE==^D11			; Time exceeded
ICM%PP==^D12			; Parameter problem
ICM%TM==^D13			; Timestamp
ICM%TR==^D14			; Timestamp reply
ICM%IQ==^D15			; Information request
ICM%IR==^D16			; Information reply

; Error codes (error subtypes)

				; Codes for Destination unreachable
DU%NET==0			; Net unreachable
DU%HST==1			; Host unreachable
DU%PRO==2			; Protocal unreachable
DU%PRT==3			; Port unreachable
DU%FRG==4			; Fragmentaion needed
DU%SRF==5			; Source route failed

				; Codes for Redirect
RD%NET==0			; Redirect output for net.
RD%HST==1			; Redirect for host
RD%TSN==2			; Redirect type of service and net
RD%TSH==3			; Redirect type of service and host

				; Codes for Time Exceeded
TE%TTL==0			; Time to live exceeded
TE%RTE==1			; Reassembly time exceeded

				; Codes for Parameter Problem
PP%PTR==0			; Pointer to byte causing problem

; ICMP Packet format, offset from 0
; (preceded by an internet header)

DEFSTR(CMTYP,0,7,8)		; Type of message

DEFSTR(CMCOD,0,15,8)		; Code for messages
DEFSTR(CMCKS,0,31,16)		; Checksum

; The following structures are each only used by some message types.

DEFSTR(CMID,1,15,16)		; ID number in ICM%EC,R ICM%TM,R ICM%IQ,R
DEFSTR(CMSEQ,1,31,16)		; Sequence number in same

DEFSTR(CMPTR,1,7,8)		; Pointer for ICM%PP messages
DEFSTR(CMGWA,1,31,32)		; Gateway address for ICM%RD messages
.CMINH==2			; Internet header in ICM%SQ,ICM%RD,ICM%DU etc.

				; Timestamp fields
DEFSTR(CMTSO,2,31,32)		; Originate timestamp
DEFSTR(CMTSR,3,31,32)		; Receive timestamp
DEFSTR(CMTST,4,31,32)		; Transmit timestamp

; Structure of a Gateway block:

DEFSTR(GWUP,0,0,1)		; Gateway should be useable
DEFSTR(GWPIP,0,1,1)		; Ping in progress
DEFSTR(GWTYP,0,5,4)		; Gateway type
  GW%PRM==1			; Prime: Speaks ICMP
  GW%DUM==2			; Dumb: Fwd's pkts, but that's all
  GW%HST==3			; Host: Avoid except in emergency
  GW%AUP==4			; Always-up: Fwds but doesn't reflect
DEFSTR(GWHIS,0,14,7)		; Ping history bits
DEFSTR(GWSPC,0,17,3)		; Successful ping count
  .THRUP==<6*WID(GWHIS)>/8	; Threshold to say it is up
  .THRDN==<3*WID(GWHIS)>/8	; Threshold to say it is down
  IFL <<1_WID(GWSPC)>-1>-WID(GWHIS), PRINTX ?GWSPC too small
DEFSTR(GWICT,0,35,18)		; Interface count
.GWILS==1			; Where in block to find the list
	;NB: The FIRST ENTRY in the list is on a connected net
MXGWIC==6			; Maximum number of interfaces

GWBKSZ==.GWILS+MXGWIC		; Size of a gateway block
	SUBTTL	TCP Parameters (from TCPPAR)

; TCP Parameters:

MAXSEQ==1_^D32		;STG	; 32 bit sequence numbers
SEQMSK==MAXSEQ-1		; Mask for doing mod MAXSEQ by AND op.
DEFINE MODSEQ(A)<TLZ A,(-MAXSEQ)>

CYCTIM==^D<2*60*60>	;STG	; Network cycle time in seconds
SNSTEP==MAXSEQ/CYCTIM		; A second's worth of sequence numbers

; TCP Header (indexed by TPKT):

.P==0
DEFSTR(PSP,\<.P>,15,16)		; PACKET.SOURCE.PORT
DEFSTR(PDP,\<.P>,31,16)		; PACKET.DESTINATION.PORT

.P==.P+1
DEFSTR(PSEQ,\<.P>,31,32)	; PACKET.SEQUENCE

.P==.P+1
DEFSTR(PACKS,\<.P>,31,32)	; PACKET.ACK.SEQUENCE

.P==.P+1
DEFSTR(PCTL,\<.P>,35,36)	; Word containing control flags
				; Substructures and overlays for above
  DEFSTR(PTDO,\<.P>,3,4)	; PACKET.TCP.DATAOFFSET ( 32-BIT UNITS)
				; 4 Unused bits
  DEFSTR(PTCTL,\<.P>,15,8)	; PACKET.TCP.CONTROLS
    				; 2 Unsed bits
    DEFSTR(PURG,\<.P>,10,1)	; PACKET.CONTROL.URGENT
    DEFSTR(PACK,\<.P>,11,1)	; PACKET.CONTROL.ACK
    DEFSTR(PEOL,\<.P>,12,1)	; PACKET.CONTROL.EOL
    DEFSTR(PRST,\<.P>,13,1)	; PACKET.CONTROL.RST
    DEFSTR(PSYN,\<.P>,14,1)	; PACKET.CONTROL.SYN
    DEFSTR(PFIN,\<.P>,15,1)	; PACKET.CONTROL.FIN
  DEFSTR(PWNDO,\<.P>,31,16)	; PACKET.WINDOW

.P==.P+1
DEFSTR(PTCKS,\<.P>,15,16)	; PACKET.CHECKSUM
DEFSTR(PURGP,\<.P>,31,16)	; PACKET.URGENT.POINTER

.P==.P+1

MINTHS==4*.P			; Minimum TCP header size (bytes)

; TCP Options (if any) are here:

MAXTOS==<.RTJST(-1,PTDO)*4-MINTHS>	; Maximum # Option bytes possible

; Derive some useful numbers from the above:

TCPNPW==PKTELI+.RTJST(-1,PIDO)+.RTJST(-1,PTDO)+<<<1_^D<WID(PIPL)-WID(PIFO)>>+3>/4>

; Options: Two cases.
; Case 1: A single byte of option code
; ENDOPT is and must be 0.  This marks the end of the option list.
; NOPOPT is and must be 1.  This is one byte long and has no purpose.
; Case 2: General form of options is 1 byte of "kind", 1 byte of total
; length, and N-2 bytes of data, where N is read from the length byte.
; All options are included under the appropriate checksum.
; END	End of options		ENDOPT
; NOP	Filler			NOPOPT
; MSL	Maximul Segment Length	MSLOPT,4,len,gth
; LBL	Packet Label		LBLOPT,4,seg,id
; RBS	Receive Buffer Size	RBSOPT,4,bfr,lth
; LTS	Local Timestamp		LTSOPT,6,t,i,m,e

; General TCP Option generation macro

DEFINE TCPOPTS (USER,RECV,ECHO)<
  OPTION(I,END,,^D0,^D1,USER,RECV,ECHO)
  OPTION(I,NOP,,^D1,^D1,USER,RECV,ECHO)
  OPTION(T,MSL,,^D2,^D4,USER,RECV,ECHO)
  OPTION(T,LBL,,^D33,^D4,USER,RECV,ECHO)
> ; End of DEFINE TCPOPTS

; Define Option Names

DEFINE OPTION(TYPE,NAME,COPY,NUMBER,LENGTH,USER,RECV,ECHO)<
IFDIF <COPY>,<C>,<	NAME'OPT==NUMBER	>
IFIDN <COPY>,<C>,<	NAME'OPT==CPYOPT+NUMBER	>
>

TCPOPTS

; TCB (internal connection block) structure:

TCBQ==<.T==0>				; TCB.Queue (TCBH, DeadQ, etc)

TCBLCK==<.T==.T+QSZ>			; TCB.LOCK

.T==.T+LOCKSZ
DEFSTR(TOWNR,\<.T>,17,18)		; TCB.OWNER	(job #)
DEFSTR(TJCN,\<.T>,35,18)		; TCB.JCN	(n of JCNTCB+n)

.T=.T+1
DEFSTR(TFH,\<.T>,35,36)			; TCB.FH
DEFSTR(TFHC,\<.T>,6,3)			; TCB.FH.NET-CLASS
					; TCB.FH.NET	(0 => TWLDN=1)
.T=.T+1					; TCB.FH.TCP	(0 => TWLDT=1)
DEFSTR(TLH,\<.T>,35,36)			; TCB.LH

.T=.T+1
DEFSTR(TFP,\<.T>,35,36)			; TCB.FP        (0 => TWLDP=1)

.T=.T+1
DEFSTR(TLP,\<.T>,35,36)			; TCB.LP   only 16 bits

.T=.T+1					; TCB Flags
DEFSTR(TERR,\<.T>,7,8)			; TCB.ERROR
DEFSTR(TWLDN,\<.T>,8,1)			; OPEN with Net wild
DEFSTR(TWLDT,\<.T>,9,1)			; OPEN with TCP wild
DEFSTR(TWLDP,\<.T>,10,1)		; OPEN with Port wild
DEFSTR(TSFP,\<.T>,11,1)			; TCB.SEND.FORCE-PACKET
DEFSTR(TSEP,\<.T>,12,1)			; TCB.SEND.ENCOURAGE-PACKET
DEFSTR(TRPP,\<.T>,14,1)			; TCB.RECV.PARITAL-PACKET
DEFSTR(TSCR,\<.T>,15,1)			; TCB.SECURE-CONNECTION
DEFSTR(TTVT,\<.T>,16,1)			; TCB.TCP-Virtual-terminal
DEFSTR(TSAP,\<.T>,17,1)
DEFSTR(TERRT,\<.T>,18,1)		; TCB.ERROR.TRACE
DEFSTR(TDEC,\<.T>,19,1)			; DEC JSYS TCB

DEFSTR(TSTAT,\<.T>,35,14)		; TCB.STATE
					; Overlays for above
  DEFSTR(TRSYN,\<.T>,24,3)		; TCB.STATE.RECV-SYNC
  DEFSTR(TSSYN,\<.T>,27,3)		; TCB.STATE.SEND-SYNC
					; State codes for connections
	SYNABL==4			; SYNCHABLE: Activated by user call
	SYNSNT==<SYNRCV==5>		; SYN sent or received
	SYNCED==7			; SYN acked
	FINSNT==<FINRCV==2>		; FIN sent or received but not ACKd
	NOTSYN==0			; Connection fully closed or not open

					; 1 Unused bit
  DEFSTR(TSUOP,\<.T>,29,1)		; TCB.STATE.USER-OPEN
  DEFSTR(TSOPN,\<.T>,30,1)		; TCB.STATE.SAID-OPEN
  DEFSTR(TSPRS,\<.T>,31,1)		; TCB.STATE.PERSISTENT
  DEFSTR(TSABT,\<.T>,32,1)		; TCB.STATE.ABORT
  DEFSTR(TSSV,\<.T>,33,1)		; TCB.STATE.SEQUENCE-VALID
  DEFSTR(TSURG,\<.T>,34,1)		; TCB.SEND.URGENT-MODE
  DEFSTR(TRURG,\<.T>,35,1)		; TCB.RECV.URGENT-MODE

; Send variables

.T=.T+1
DEFSTR(TSLFT,\<.T>,35,36)		; TCB.SEND.LEFT

.T=.T+1
DEFSTR(TSSEQ,\<.T>,35,36)		; TCB.SEND.SEQUENCE

.T=.T+1
DEFSTR(TSURP,\<.T>,35,36)		; TCB.SEND.URGENT-POINTER

.T=.T+1
DEFSTR(TSWND,\<.T>,17,18)		; TCB.SEND.WINDOW
DEFSTR(TSCB,\<.T>,35,18)		; TCB.SEND.CURRENT-BUFFER

.T=.T+1
DEFSTR(TSTO,\<.T>,35,36)		; TCB.SEND.TIME-OUT

TCBSBQ==<.T=.T+1>			; TCB.SEND.BUFFER-QUEUE
TCBRXQ==<.T=.T+QSZ>			; TCB.SEND.REXMIT-QUEUE

; Recv variables

.T==.T+QSZ
DEFSTR(TRIS,\<.T>,35,36)		; TCB.RECV.INITIAL-SEQUENCE

.T=.T+1
DEFSTR(TRLFT,\<.T>,35,36)		; TCB.RECV.LEFT

.T=.T+1
DEFSTR(TRURP,\<.T>,35,36)		; TCB.RECV.URGENT-POINTER

.T=.T+1
DEFSTR(TRWND,\<.T>,17,18)		; TCB.RECV.WINDOW
DEFSTR(TRCB,\<.T>,35,18)		; TCB.RECV.CURRENT-BUFFER

.T=.T+1
DEFSTR(TRCBY,\<.T>,35,36)		; TCB.RECV.CURRENT-BYTE

.T=.T+1
DEFSTR(TRBS,\<.T>,35,36)		; TCB.RECV.BUFFER-SPACE

TCBRBQ==<.T=.T+1>			; TCB.RECV.BUFFER-QUEUE
TCBRPQ==<.T=.T+QSZ>			; TCB.RECV.PACKET-QUEUE

; PSI variables

TCBPIC==<.T=.T+QSZ>			; TCB.PSI-CHANNELS
DEFSTR(TPSIC,TCBPIC,35,36)		; All PSI channels
					; Overlays for above
  DEFSTR(TPICU,TCBPIC,5,6)		; URGENT DATA ARRIVED
  DEFSTR(TPICR,TCBPIC,11,6)		; RECV DONE
  DEFSTR(TPICS,TCBPIC,17,6)		; SEND DONE
  DEFSTR(TPICE,TCBPIC,23,6)		; ERROR
  DEFSTR(TPICX,TCBPIC,29,6)		; STATE CHANGE
  DEFSTR(TPICA,TCBPIC,35,6)		; EOL ACK

					; Following must have same order as above
TCBPIF==.T+1				; TCB.PSI-FORKS
DEFSTR(TPIFU,TCBPIF+0,17,18)		; URGENT DATA ARRIVED
DEFSTR(TPIFR,TCBPIF+0,35,18)		; RECV DONE
DEFSTR(TPIFS,TCBPIF+1,17,18)		; SEND DONE
DEFSTR(TPIFE,TCBPIF+1,35,18)		; ERROR
DEFSTR(TPIFX,TCBPIF+2,17,18)		; STATE CHANGE
DEFSTR(TPIFA,TCBPIF+2,35,18)		; EOL ACK

.T==TCBPIF+3
DEFSTR(TOPNF,\<.T>,8,9)			; TCB.OPEN.WAIT FLAG INDEX
DEFSTR(TERRF,\<.T>,17,9)		; TCB.ERROR.FLAG index
DEFSTR(TOFRK,\<.T>,35,18)		; TCB.OWNING-FORK

; Retransmission variables

.T=.T+1
DEFSTR(TSMRT,\<.T>,35,36)		; TCB.SMOOTHED-ROUND-TRIP (or)
DEFSTR(TMNRT,\<.T>,35,36)		; TCB.MIN-ROUND-TRIP

.T=.T+1
DEFSTR(TMXRT,\<.T>,35,36)		; TCB.MAX-ROUND-TRIP

.T=.T+1
DEFSTR(TRXI,\<.T>,35,36)		; TCB.RETRANSMIT-INTERVAL

.T=.T+1
DEFSTR(TRXP,\<.T>,35,36)		; TCB.Retransmission.Parameters
					; Substructures of the above:
  DEFSTR(TRXPN,\<.T>,8,9)		; Numberator of backoff fraction
  DEFSTR(TRXPD,\<.T>,17,9)		; Denominator thereof
  DEFSTR(TRXPI,\<.T>,35,18)		; Initial interval

; Queues and wakeup times for various processes:

TCBQRA==<.T=.T+1>			; Reassembler queue
TCBTRA==<.T=.T+QSZ>			; When RA needed

TCBQPZ==<.T=.T+1>			; Packetizer
TCBTPZ==<.T=.T+QSZ>

TCBQRX==<.T=.T+1>			; Retransmitter
TCBTRX==<.T=.T+QSZ>

TCBQDG==<.T=.T+1>			; Delay Actions
TCBTDG==<.T=.T+QSZ>

.T==.T+1
DEFSTR(TIFDF,\<.T>,0,1)			; IP Don't-Fragment flag
DEFSTR(TTTL,\<.T>,8,8)			; IP Time-to-live
					; 1 Unused bit
DEFSTR(TTOS,\<.T>,17,8)			; IP Type-of-service
DEFSTR(TABTFX,\<.T>,35,18)		; Forkx of ABORTER

.T=.T+1
DEFSTR(TSLVN,\<.T>,17,18)		; Next Security level
DEFSTR(TSLVC,\<.T>,35,18)		; Current Security Level

.T=.T+1
					; 2 bits really unused
DEFSTR(TOPFP,\<.T>,17,18)		; Foreign port at open
DEFSTR(TNUFM,\<.T>,18,1)		; OPENed with new formats
					; 8 unused bits
DEFSTR(TVTL,\<.T>,35,9)			; Virtual terminal line number

.T=.T+1
DEFSTR(TOPFH,\<.T>,35,36)		; TCB.OPEN-FH

.T=.T+1
DEFSTR(TOPLH,\<.T>,35,36)		; TCB.OPEN-LH

.T=.T+1
DEFSTR(TSBYT,\<.T>,35,36)		; Bytes left to send

.T=.T+1
DEFSTR(TRLAK,\<.T>,35,36)		; Seq # of last PACKS sent

.T=.T+1
DEFSTR(TRLWN,\<.T>,35,36)		; Seq # of last PWNDO sent or -1

.T=.T+1
DEFSTR(TSMXB,\<.T>,35,36)		; Max send rate

.T=.T+1
DEFSTR(TSMXP,\<.T>,35,36)		; Max send packet length (inc header)

; Option Variables

.T=.T+1
DEFSTR(TIPDO,\<.T>,5,4)			; IP Data offset, words
DEFSTR(TIPOR,\<.T>,11,6)		; IP Received options, bytes
DEFSTR(TIPOU,\<.T>,17,6)		; IP User options, bytes
DEFSTR(TIOPF,\<.T>,35,18)		; IP User option flags

.T=.T+1
DEFSTR(TTPDO,\<.T>,5,4)			; TCP Data offset, words
DEFSTR(TTPOR,\<.T>,11,6)		; TCP Received options, bytes
DEFSTR(TTPOU,\<.T>,17,6)		; TCP User options, bytes
DEFSTR(TTOPF,\<.T>,35,18)		; TCP User option flags

TCBIO==<.T=.T+1>			; IP Option list (send)
TCBIR==<.T=.T+<MAXIOS+3>/4>		; Last IP Options received
TCBIU==<.T=.T+<MAXIOS+3>/4>		; IP Options from User

TCBTO==<.T=.T+<MAXIOS+3>/4>		; TCP Option list (send)
TCBTR==<.T=.T+<MAXTOS+3>/4>		; Last TCP Options received
TCBTU==<.T=.T+<MAXTOS+3>/4>		; TCP Options from User

.T=.T+<MAXTOS+3>/4
DEFSTR(TERBF,\<.T>,17,18)		; Error/Trace (user) buffer adr
DEFSTR(TERJN,\<.T>,35,18)		; Error/trace (user) JFN

.T=.T+1
DEFSTR(TCTBS,\<.T>,17,18)		; Count of no-buffer errors
DEFSTR(TCTSQ,\<.T>,35,18)		; Count of sequence # pauses

.T=.T+1
DEFSTR(TSCPK,\<.T>,35,36)		; Send current packet

.T=.T+1
DEFSTR(TPRS1,\<.T>,17,18)		; Persistance parameter one
DEFSTR(TPRS2,\<.T>,35,18)		; Persistance parameter two

.T=.T+1					; DEC JFN Interface Flags
DEFSTR(TCDWT,\<.T>,0,1)			; DEC Wait mode flag
DEFSTR(TCDHT,\<.T>,1,1)			; DEC High Throughput Mode flag
DEFSTR(TCDFS,\<.T>,2,1)			; DEC Active Flag
DEFSTR(TCDOW,\<.T>,3,1)			; DEC OPENF block flag
DEFSTR(TCDGN,\<.T>,4,1)			; DEC GTJFN Name done once flag
DEFSTR(TCDGE,\<.T>,5,1)			; DEC GTJFN Extension done once flag
DEFSTR(TCDPS,\<.T>,6,1)			; DEC Persist flag
DEFSTR(TCDOB,\<.T>,7,1)			; DEC Output buffer setup
DEFSTR(TCDIB,\<.T>,8,1)			; DEC Input buffer setup
DEFSTR(TCDCW,\<.T>,9,1)			; DEC CLOSF Block flag
DEFSTR(TCDB8,\<.T>,10,1)		; DEC OPENF 8 bit byte mode
DEFSTR(TCDOQ,\<.T>,11,1)		; DEC Output buffer Queued
DEFSTR(TCDPU,\<.T>,12,1)		; DEC Do a PUSH flag
DEFSTR(TCDUR,\<.T>,13,1)		; DEC Do an URGENT flag

DEFSTR(TJFN,\<.T>,35,18)		; DEC TCB.JFN (JFN*MLJFN)

.T=.T+1
TJOBF=.T				; DEC TCB output buffer	for filling

.T=.T+1
TJOBA=.T       				; DEC TCB output buffer active

.T=.T+1
TJIBE=.T				; DEC TCB output buffer for emptying

.T=.T+1
TJIBA=.T				; DEC TCB output buffer active

.T=.T+1
TCPBCO=.T      				; DEC TCB real FILBCO

.T=.T+1
TCPBCI=.T				; DEC TCB real FILBCI

.T=.T+1					; Spare
TCBSIZ==.T+1				; Size of a TCB
	PURGE .T

; The following definition must match that in TTTVDV.MAC

TTNETW==4 			; (i.e. TTDEV)
DEFSTR(PTVT,TTNETW,35,18)	; Holds pointer to TVT's TCB

; Flag bit definitions:

TCP%ER==1B0			; ERROR
TCP%LE==1B1			; Local error flag (0 is remote)
TCP%PE==1B2			; Permanent error (0 is temporary)
TCP%EC==37B7			; Error code w/o flags
TCP%DN==1B12			; DONE
TCP%UR==1B15			; URGENT DATA
TCP%EL==1B16	; obsolete	; PUSH
TCP%PU==1B16			; PUSH
TCP%WM==1B17			; WORD MODE
.TCPBF==0			; Buffer Flags
.TCPBA==1			; Buffer data address
.TCPBC==2			; Buffer data count
.TCPBO==3			; Buffer option addresses
 .TCPOW==^D10			; Buffer option address word count
.TCPBI==4			; Buffer IP info
.TCPBS==5			; Buffer header size


; CHKARG stack parameter block definitions
;		Caller				Callee
;	STACKL <<ARGBLK,CHKADW>,...>
;	CHKADL <<locals>>			CHKADL <<locals>>
;	...code...				...code...
;	CHKADR					CHKADR

DEFINE CHKADL (LOCL)<
IFB  <LOCL>,<	LOCAL <PARAMS>		>
IFNB <LOCL>,<	LOCAL <PARAMS,LOCL>	>
	LALL
DEFINE LH<0(PARAMS)>
DEFINE LP<1(PARAMS)>
DEFINE FH<2(PARAMS)>
DEFINE FP<3(PARAMS)>
DEFINE JCN<4(PARAMS)>
DEFINE WILDOK<5(PARAMS)>
DEFINE FN<6(PARAMS)>
DEFINE ARG1<7(PARAMS)>
DEFINE ARG2<10(PARAMS)>
	SALL
> ; End of DEFINE CHKADL

CHKADW==11

DEFINE CHKADR <
	PURGE LH,LP,FH,FP,JCN,WILDOK,FN,ARG1,ARG2
	RESTORE
> ; End of CHKADR

; BUFFER Structure:

BFRQ==<.B==0>			; BUFFER QUEUE, LH contains flags

BFRSUI==<.B==.B+QSZ>		; BUFFER START USER INFORMATION
BFRFLG==BFRSUI+.TCPBF		; BUFFER FLAG WORD
DEFSTR(BURG,BFRFLG,^L<TCP%UR>,1); BUFFER URGENT
DEFSTR(BEOL,BFRFLG,^L<TCP%PU>,1); BUFFER END-OF-LETTER
DEFSTR(BWM,BFRFLG,^L<TCP%WM>,1)	; BUFFER WORD-MODE

BFRDAD==BFRSUI+.TCPBA
DEFSTR(BDADR,BFRDAD,35,36)	; BUFFER DATA ADDRESS

BFRCNT==BFRSUI+.TCPBC
DEFSTR(BCNT,BFRCNT,35,36)	; BUFFER.COUNT

BFROPT==BFRSUI+.TCPBO

BFREUI==<.B==BFRSUI+.TCPBS>	; BUFFER END USER INFO

DEFSTR(BHADR,\<.B>,35,36)	; BUFFER HEADER ADDRESS

.B==.B+1
DEFSTR(BICNT,\<.B>,35,36)	; BUFFER INITIAL COUNT

.B==.B+1
DEFSTR(BFRKX,\<.B>,17,18)	; BUFFER.FORKX
DEFSTR(BUPAG,\<.B>,35,18)	; BUFFER.USER PAGE

.B==.B+1
DEFSTR(BBLIP,\<.B>,17,18)	; BUFFER.BYTESLEFTINPAGE
DEFSTR(BMPAG,\<.B>,35,18)	; BUFFER.MONITORPAGE

BFRPTR==<.B==.B+1>
DEFSTR(BPTR,BFRPTR,35,36)	; BUFFER POINTER
				; Overlays for above:
  DEFSTR(BPTRP,BFRPTR,5,6)	; Size field
  DEFSTR(BPTRS,BFRPTR,11,6)	; Position field
  DEFSTR(BPTRA,BFRPTR,35,18)	; Address field

.B==.B+1
DEFSTR(BTCB,\<.B>,17,18)	; BUFFER.TCB
DEFSTR(BIDX,\<.B>,35,18)	; BUFFER.INDEX

.B==.B+1
DEFSTR(BTS,\<.B>,35,36)		; BUFFER.TIMESTAMP

	BFRSIZ==.B+1

; AC1 Bits for TCP JSYSs

TCP%JS==1B0	; JCN Supplied
TCP%WT==1B1	; Wait for completion
TCP%FS==1B5	; Force Synchronization (active open)
TCP%PS==1B6	; Persistent open
TCP%ST==1B7	; Return statistics (STAT)
TCP%SY==1B8	; Symbolic name list given (STAT)
TCP%SC==1B8	; Secure connection (OPEN, SEND)
TCP%HP==1B9	; High priority (OPEN, SEND)
TCP%VT==1B10	; TCP Virtual Terminal (OPEN)
TCP%TV==1B11	; TVT Supplied (STAT)
TCP%NT==1B12	; Return AOBJN pointer over TVTs (STAT)
TCP%IX==1B13	; Connection index supplied (STAT)
TCP%NI==1B14	; Return AOBJN pointer over connections (STAT)
TCP%SD==1B15	; Return STAT definitions instead of values (STAT)
TCP%ET==1B16	; ERROR info flag
TCP%PT==1B17	; Packet trace flag

; The connection block format is

.TCPLH==0	; Connection Local Host (0 is wild)
.TCPLP==1	; Connection Local Port (0 is illegal)
.TCPFH==2	; Connection Foreign Host (0 is wild)
.TCPFP==3	; Connection Foreign Port (0 is wild)
.TCPOP==4	; Connection Option addresses
 .TCPOW==^D10	; Connection Option address word count
.TCPIP==5	; Connection IP parameters (Flag=3B1, TTL=377B17, TOS=377B35)
.TCPCS==6	; Connection block word size

; Event codes:

E.BIT==200			; ERROR bit
L.BIT==100			; LOCAL condition bit
P.BIT==040			; PERMANENT condition bit

OK==0*E.BIT+0*L.BIT+0*P.BIT	; General success code
XFT==0*L.BIT+0*P.BIT		; Temporary Foreign condition
XFP==0*L.BIT+1*P.BIT		; Permanent Foreign condition
XLP==1*L.BIT+1*P.BIT		; Permanent Local condition
EFT==1*E.BIT+0*L.BIT+0*P.BIT	; Temporary Foreign Error
EFP==1*E.BIT+0*L.BIT+1*P.BIT	; Permanent Foreign Error
ELT==1*E.BIT+1*L.BIT+0*P.BIT	; Temporary Local Error
ELP==1*E.BIT+1*L.BIT+1*P.BIT	; Permanent Local Error

; Other codes:

IGN==100		; Packet is to be ignored
DUP==10			; Packet is a duplicate (in TCPIP)
ERR==1			; Packet is in error (in TCPIP)

; Process block

PRCQ==0			; (Ext) ptr to input queue head (TCBs, etc)
PRCLCK==1		; Lock
.F==PRCLCK+LOCKSZ
PRCROU==.F		; (Ext) address of routine
PRCWAK==.F+1		; -1 or TODCLK of wakeup
PRCQOF==.F+2		; TCB,,m	Pointer to queue in TCB
PRCWOF==.F+3		; TCB,,n	Pointer to wakeup in TCB
PRCSGT==.F+4		; TODCLK of most recent signal
PRCRNC==.F+5		; Pointer to run counter	xxRNCT
PRCTMR==.F+6		; Pointer to timer		xxUSE
	PROCSZ==.F+7	; Size of a process block

;Macro  which  expands  into  code  to cause a process to run after a
;specified delay. The interesting  case  is  0  delay  in  which  the
;routine  may be called directly, without the overhead of locking and
;unlocking the process Q twice, and locking the TCB again etc.

DEFINE $SIGNL(TPROC,DELTA,%TAGQ,%TAGX)<
	XMOVEI T1,TPROC		; Process to signal
  IFE DELTA,<
	MOVE T3,TODCLK		; Now
	SKIPL T2,PRCWAK(T1)	; If no wakeup set, NOW is ok
	 CAMLE T2,T3		; If past due, queue
	  SKIPLE NSKED		; NOW is ok unless NOSKED
	   JRST %TAGQ		; No.  Get in Q for FIFO behavior
	PUSH P,PROC		; Do it NOW
	MOVEM T3,PRCSGT(T1)	; TODCLK of most recent SIGNAL
	CALL TCPTSK		; Call the task
	POP P,PROC		; Restore our ID as running process
	JRST %TAGX		; All done
%TAGQ:	>	;IFE DELTA

; Avoid stack overflow on KA, always queue
	MOVX T2,DELTA		; Number of milliseconds
	CALL SIGNAL
  IFE DELTA,<
%TAGX:  >

> ; end DEFINE $SIGNL
	SUBTTL Definitions for Multinet

; MACROs

; DEFWRD - Define a full word structure, and increment place in table
; arguments are A - Name for offset
;		  SIZ - number of words to reserve ( default to 1)

DEFINE DEFWRD(A,SIZ)
<	IF1 <IFDEF A,<PRINTX ? Multiply defined offset in DEFWRD>>

; Make symbol printable or not depending on if overlaps AC's

	A==:..OFST			; Set value as offset into table
	IFB <SIZ>,<..OFST==..OFST+1>	; Increment offset
	IFNB <SIZ>,<..OFST==..OFST+SIZ> ; Incrment by buffer size
>					; End of DEFWRD

; SETSEC - Modify the section number of an index register

IFKL <DEFINE SETSEC (AC,SECTION) <HRLI AC,SECTION>>
IFSM <DEFINE SETSEC (AC,SECTION) <>>

; PUTSEC - make a pointer to the base of a section

IFKL <DEFINE PUTSEC (AC,SECTION)<HRLZI AC,SECTION>>
IFSM <DEFINE PUTSEC (AC,SECTION)<MOVEI AC,0>>

IFKL <DEFINE GIW (ADDR,X<0>,I<0>) <<I>B1!<X>B5!<ADDR>B35>>
IFSM <DEFINE GIW (ADDR,X<0>,I<0>) <<I>B13!<X>B17!<ADDR>B35>>

; The following macroes are used to access routines offset
; in the NCT

DEFINE	MNTCALL(FOO)<CALL @FOO(P1)>	; Call a routine
DEFINE	MNTJRST(FOO)<JRST @FOO(P1)>	; Jump to a routine
DEFINE	MNTXCT(FOO)<XCT FOO(P1)>	; Execute an instruction

;The  following MACROs are used to actually create the NCT or Network
;Control Table. The macro MKNCTS should be called at the location  of
;the  NCT  storage  table. ; The Macro MKPTRS should be called at the
;location of the NCT vector table

; MKNCTS - The basic MACRO
; **NOTE** That the following must be called in the RESCD PSECT

DEFINE	MKNCTS
<	XALL			; Show the lines temporarily
NT.NUM==0			; Start with Interface 0

NCTNUM==0			; Start out at zero
IFE STANSW,<
NT.TYP==NT.NCP			; Network Type is NCP
NT.DEV==NT.ANX			; Device type AN20
DV.NUM==0			; Back to number 0
MAKNCT(\DV.NUM,\NCTNUM,^D576)	; Make that type NCT
DV.NUM==DV.NUM+1		; increment number of that type
>;IFE STANSW
IFN STANSW,<
; We put the AN20 MAKNCT macro in a "REPEAT ANXN" conditional so that
;we don't get a spurious NCT defined if we don't have an AN20.

NT.TYP==NT.NCP			; Network Type is NCP
NT.DEV==NT.ANX			; Device type AN20
DV.NUM==0			; Back to number 0
REPEAT ANXN,<
MAKNCT(\DV.NUM,\NCTNUM,^D576)	; Make that type NCT
DV.NUM==DV.NUM+1		; increment number of that type
>;REPEAT ANXN
NT.TYP==NT.ETH			; Network Type (reset by MNETDV at startup)
NT.DEV==NT.MEI			; Device type MEIS
DV.NUM==0			; Start with number 0
REPEAT MEISN,<
MAKNCT(\DV.NUM,\NCTNUM,^D576)	; Make that type NCT
DV.NUM==DV.NUM+1		; increment number of that type
>;REPEAT MEISN
>;IFN STANSW
	SALL			; Again suppress expansions
>				; End of MKNCTS

; MAKNCT - Make a specific NCT
; *** WARNING *** This !MUST! agree with the table offsets defined below

DEFINE MAKNCT(NUM,NCTN,ISIZ)<

; The following section is the same among all NCT's
.NCT'NCTN=:.			; Set address of this NCT
	EXP	0		; Link word to next NCT in list
				; (filled in by MNTINI)
NCTNUM==NCTNUM+1		; Increment number of NCTS defined

	XWD	NT.TYP,NT.DEV	; Protocal and device codes
	EXP	NT.NUM		; Net index
NT.NUM==NT.NUM+1		; increment net index
	EXP	-1		; Internet network number (not yet set)
	EXP	-1		; Internet Address of this interface
	EXP	0		; Logical host mask for this network
IFB  <ISIZ>,<XWD 377777,-1>	; Maximum packet size
IFNB <ISIZ>,<EXP ISIZ>		; Maximum packet size

;NCP/AN20  MAKSAV  MACRO  Creates  an  interrupt AC save and dispatch
;routine in the  current  NCT  at  the  current  location.  Uses  The
;following  locations  (which  therefore must be defined for that net
;type). The argument PDP is the address of a Push  down  pointer  for
;this routine. DISP is the offset of the dispatch address.

DEFINE MAKSAV(PDP,DISP)
<	MOVEM P,.NCT'NCTN+NTSVAC+17	; Save P
	MOVEI P,.NCT'NCTN+NTSVAC	; Where the AC's go
	BLT P,.NCT'NCTN+NTSVAC+16	; Save all
	MOVE P,PDP			; Set new P
	XMOVEI P1,.NCT'NCTN		; Point to NCT
	CALL	@DISP(P1)		; And Goto routine
>					; End of MAKSAV


;MAKRES  - Make a 3 word AC restore , dismiss interrupt routine. AC's
;are assumed stored  at  NTSVAC.  Arg  PCW  is  the  address  of  the
;interrupt PC.

DEFINE	MAKRES(PCW)
<	MOVSI P,.NCT'NCTN+NTSVAC	; From there to 0
	BLT P,P				; Restore all AC's
	XJEN .NCT'NCTN+PCW		; And dismiss the interrupt
>					; End of MAKRES MACRO

IFE <<NT.TYP-NT.NCP>!<NT.DEV-NT.ANX>>,<

	ANI==520		; Input device address
	ANO==524		; Output side address

	CONSZ ANI,(T1)		; NTCNSZ - CONSZ Input
	CONSO ANI,(T1)		; NTCNSO - CONSO Input
	CONO ANI,(T1)		; NTCONO - CONO Input
	CONI ANI,T1		; NTCONI - CONI Input
	DATAO ANI,T1		; NTDATO - DATAO Input
	DATAI ANI,T1		; NTDATI - DATAI Input
	IFIW!ANXINI		; NTINI  - Initialization instruction
	IFIW!ANXKIL		; NTKILL - Shutdown instruction
	IFIW!ANXRSS		; NTRSRT - Restart instruction
	IFIW!ANISRT		; NTISRT - Start input instruction
	IFIW!ANOSRT		; NTOSRT - Start output instruction
	IFIW!IMPEIN		; NTIDUN - Input done dispatch
	IFIW!IMODUN		; NTODUN - Output done dispatch
	IFIW!IMPHDR		; NTLLDR - Make header instruction
	IFIW!RSKP		; NTOTOK - CLear packet for output
	IFIW!R			; NTMAIN - Maintainance
	IFIW!ANXSCK		; NTSCHK - Status check instruction
	BLOCK NTOCNO-NTIB	; NTIB through  NTOTYP
	CONO ANO,(T1)		; NTOCNO - CONO Output
	CONI ANO,T1		; NTOCNI - CONI Output
	CONSO ANO,(T1)		; NTOCSO - CONSO Output
	CONSZ ANO,(T1)		; NTOCSZ - CONSZ Output
	DATAO ANO,T1		; NTODTO - DATAO Output
	DATAI ANO,T1		; NTODTI - DATAI Output
	XPCW .+1		; NTIINT - Interrupt instruction
	BLOCK 2			; NTIPCW - Inturrupt PC storage
	EXP 0			; NTINPC - New flags (Input)
	XWD MSEC1,.+1		;          New PC (Input save)
	MAKSAV (IMPPDP,NTIDSP)	; NTIISV - 6 words of AC save routine
	MAKRES (NTIPCW)		; NTIIRS - 3 words of AC restore routine
	XPCW .+1	       	; NTOINT - Interrupt instruction
	BLOCK 2			; NTOPCW - PC storage
	EXP 0			; NTONPC - New flags
	XWD MSEC1,.+1		;          New PC (Output Save)
	MAKSAV (IMPPDP,NTODSP)	; NTIOSV _ 6 words of AC Save
	MAKRES (NTOPCW)		; NTIORS   3 words of AC restore
	BLOCK 20		; NTSVAC - AC storage
>				; End of NCP/ANX conditional
IFN STANSW,<
; MEIS based Ethernet (3 and 10MB)

IFE <NT.DEV-NT.MEI>,<
	HALT			; CONSZ Input
	HALT			; CONSO Input
	HALT			; CONO Input
	HALT			; CONI Input
	HALT			; DATAO Input
	HALT			; DATAI Input
	IFIW!ETHINI		; NTINI - Initialization instruction
	IFIW!ETHOFF		; NTKILL - Shutdown instruction
	IFIW!ETHON		; NTRSRT - Restart instruction
	IFIW!R			; NTISRT - Start input instruction
	IFIW!ETHOUT		; NTOSRT - Start output instruction
	IFIW!R			; NTIDUN - Input done dispatch
	IFIW!R			; NTODUN - Output done dispatch
	IFIW!R			; NTLLDR - Make header instruction
	IFIW!ETHOOK		; NTOTOK - Clear packet for output
	IFIW!R			; NTMAIN - Maintainance
	IFIW!R			; NTSCHK - Status check instruction
	BLOCK	NTSVAC+17-NTIB	; Storage
	>	;; End of MEIS based Ethernet conditional
>;IFN STANSW
>				; End of MAKNCT MACRO

; MKPTRS - Macro for createing the NCT vector table, called
; at vector table location
; The following must also be called in the RESCD PSECT
DEFINE MKPTRS<
..TMP==0			; Start at NCT #0
REPEAT %NETS,<
	MAKPTR(\..TMP)
	..TMP==..TMP+1>
>

; MAKPTR- Sub-macro for finding the proper NCT address
DEFINE MAKPTR(NUM)<	XWD MSEC1,.NCT'NUM>

; General Definitions

; Definitions of network and protocal types
NT.NCP==:0			; Protocal type 0, NCP
NT.NUN==:1			; PROTOCAL TYPE 1, NO LOCAL PROTOCAL
NT.CHA==:2			; Protocal type 2, CHAOSNet
IFN STANSW,<
NT.3MB==:3			; Protocol type 3, 3MB Ethernet
NT.ETH==:4			; Protocol type 4, 10MB Ethernet
>;IFN STANSW

NT.BBN==:0			; Device type 0, IMP10
NT.ANX==:1			; Device type 1, AN20
NT.CNT==:2			; DEVICE TYPE 2, CHEAPNET DTE
NT.NIN==:3			; No interface associated with address
IFN STANSW,<
NT.MEI==:4			; Device type 4, MEIS
>;IFN STANSW

; Field definitions for InterNet address'

DEFSTR IANET,0,11,8		; Net Number

;(The next 5 overlap since different nets use the parts differently)

DEFSTR IAHI,0,19,8		; 8 bit high part
DEFSTR IAHST,0,19,8		; 8 bit host number
DEFSTR IAIMP,0,35,16	; 16 bit Low part
DEFSTR IAMID,0,27,8		; 8 bit middle
DEFSTR IALOW,0,35,8		; 8 bit low part

; Structures in the Host tables.
; For reference the Hostables have the following formats.
;
; Tables indexed by a hash of the host number
; HOSTNN - The 32 bit host number
; HSTSTS - Status bits
;
; Tables indexed by order in the Hostname file
; HOSTN - LH 18 bit address in HSTNAM
;	    RH Index into hashed tables

DEFSTR HSTIDX,HOSTN,35,18	;INDEX TO STATUS TABLE
DEFSTR HSTNMP,HOSTN,17,16	;POINTER TO NAME STRING

; HSTNAM - a block NHSTN long which holds the null terminated
;		name strings.

; Offset Definitions for Tables

; Tables  for driving Multinet interfaces

; The basic philosphy here, is that each interface (and network type)
; has  some  subset  of functions in common with all others, and also
; will have some other (hopefully smaller) set of functions that  are
; unique  to  it.  Partly  in  order  to assure this, we restrict the
; interface  types  supported  to   packet-switched   networks,   and
; preferably supporting Internet protocals (though its not clear that
; this  is  actually  necessary).  The driver table is divided into 4
; parts ( possibly with some overlap)

; 1 - Device independent routines/instructions
;	i.e. I/O instructions and other things that
;	all will have in common
; 2 - Device independent storage, Input/Output buffers etc
; 3 - Device dependent routines, These depend on the type
;	of interface ( possibly type of network) and will
;	not exist except for those types ( i.e. each interface
;	type should have different definitions for the offsets
;	of these things)
; 4 - Device dependent storage - see 3

; The  present  design  has  been  heavily  influenced by the ARPANet
; 1822/AN20 code, however it should be general enough to be  expanded
; to any type of interface.

; Common Constants

DEFSTR	NTLNK,0,35,36		; Link to next Block
DEFSTR	NTTYP,1,17,18		; Type code of this network
DEFSTR	NTDEV,1,35,18		; Type code of device this interface is
DEFSTR	NTNUM,2,35,18		; Net number(internal index) of this net
..OFST==3			; Start after headers
DEFWRD	NTNET			; Internet network number of this interface
				; -1 until initialized
DEFWRD	NTLADR			; Local InterNet address on this interface
				; -1 until initialized
DEFWRD	NTNLHM			; Logical Host Mask for this (interface's) net
				; 0 if none
DEFWRD	NTPSIZ			; Maximum packet size for this network (bytes)

DEFWRD	NTCNSZ			; CONSZ (T1) instruction
DEFWRD	NTCNSO			; CONSO (T1) instruction
DEFWRD	NTCONO			; CONO (T1) instruction
DEFWRD	NTCONI			; CONI T1 instruction
DEFWRD	NTDATO			; DATAO T1 instruction
DEFWRD	NTDATI			; DATAI T1 instruction

DEFWRD	NTINI			; Network Initialization instruction
DEFWRD	NTKILL			; Shutdown instruction
DEFWRD	NTRSRT			; Network restart instruction
DEFWRD	NTISRT			; Start input instruction
DEFWRD	NTOSRT			; Start output instruction
DEFWRD	NTIDUN			; Input done dispatch instruction
				; Called with buffer in T1
DEFWRD	NTODUN			; Output done dispatch instruction
				; Called with buffer in T1
DEFWRD	NTLLDR			; Make a local header instruction
				; Called T1/ (first hop) destination address
				;	T2/ pointing to an Internet buffer
				;	P1/ address of NCT
DEFWRD	NTOTOK			; Check if a packet can be sent.
				; Called T1/ (first hop) destination address
				;	T2/ pointing to an Internet buffer
				;	P1/ address of NCT
				; Skip return if yes,
				; Else non-skip w/ICMP error in T1
DEFWRD	NTMAIN			; Maintainance routine
DEFWRD	NTSCHK			; Hardware status check instruction
				; checks on whether net is on hardware-wise
				; skip return if so ( for an 1822 device
				; Checks the ready-line, note that not all
				; network types may have some thing they
				; can check on)

; Storage needed by all nets

DEFWRD	NTIB			; Current input buffer
DEFWRD	NTOB			; Current output buffer
				; Input interrupts
DEFWRD	NTIDSP			; Input interrupt dispatch address
				; Output interrupts
DEFWRD	NTODSP			; Output interrupt dispatch address

; The  rational  behind  the following allocation for buffer lists is
; that these are all Internet  networks,  with  some  sort  of  local
; protocal, consequently there is one list for messages which must go
; out immediately, one for regular messages on the local network, and
; one  for  internet  messages.  Since these are FIFO queues there is
; both a head and a tail pointer for each. In order to keep local  or
; internet  from  choking  the  other off the NTPRIO word defines the
; priority of each, being more positive if  local  stuff  has  higher
; priority ( it would be good to keep this constant among the various
; network drivers).

; NTBFFL  is a flag indicating who owns a given buffer. The left half
; being for input buffers, rh for output. Negative if  internet,  >=0
; if local.

DEFWRD	NTHOBO			; High priority output list, head pointer
DEFWRD	NTHOBI			; Tail pointer

DEFWRD	NTLOBO			; Local network output list head pointer
DEFWRD	NTLOBI			; Tail pointer

DEFWRD	NTIOBO			; Internet output list, head pointer
DEFWRD	NTIOBI			; Tail pointer

DEFWRD	NTPRIO			; Priority word for deciding between lists
DEFWRD	NTBFFL			; Flag for who owns buffer ( lh = input, rh out)

; Status flags

; The following act as status flags (and correspond to the old IMPRDY
; GETAB  table)  between  them  governing the state of the network on
; that interface.

; Software  (protocal driver) flags

DEFWRD	NTRDY			; Acutal interface status, 0 = Down,
				; >0 = (TODCLK to abort) Going down, -1=Up
DEFWRD	NETON			; Desired interface status, 0 - Network off,
				; -1 - On, <0,,-1> - Cycle net down & up
DEFWRD	NTSTCH			; Network has unreported state change if >0
DEFWRD	NTORDY			; Output enabled on Interface if -1,
				; otherwise no packets are queued (ICM%SQ)
DEFWRD	NTIUPT			; T&D of last time Net came up Internally
				; (for ex. Last time NCP cycled for that net)
DEFWRD	NTXDNT			; T&D of last time net went off externally
				; (for ex. readyline drop)
DEFWRD	NTXUPP			; T&D of last time net came on externally
				; (for ex. ready-line up)

; Hardware (interface driver) flags

DEFWRD	NTERRF			; An external error condition has been noticed
				; by the hardware (i.e. ready-line drop) if -1
DEFWRD	NTNOP			; A (+)count of # of null messages to send
DEFWRD	NTFLS			; A (-)count of # of input messages to ignore
DEFWRD	NTTOUT			; Output hung timeout (TODCLK), or 0 if none

; Storage  needed  by  only some nets/interface types Since different
; nets use different storage here the same offset  can  be  known  by
; different names.

; [Presently  storage is allocated here optimaly for the two types of
; networks we have,  if  more  were  added  it  could  of  course  be
; rearranged]

DEFWRD	NT11ST,0		; 11's status word (Cheapnet DTE)
DEFWRD	HSTGDM			; Host going down message wanted (NCP type)
; 0 - not going down, +N (why/when) Send msg when output queues are empty,
; or -N if (no output since) sent
DEFWRD	IMPCCH			; Flag to reset hosts (NCP Type nets)
DEFWRD	NTINP			; Current input pointer (AN20)
DEFWRD	NTOUP			; Current Output pointer (AN20)
DEFWRD	NTITYP			; Input transfer type (AN20)
DEFWRD	NTOTYP			; Output tranfer type (AN20)
DEFWRD	NTOCNO			; Output side CONO (T1) (AN20)
DEFWRD	NTOCNI			; Output side CONI T1 (AN20)
DEFWRD	NTOCSO			; Output side CONSO (T1) (AN20)
DEFWRD	NTOCSZ			; Output side CONSZ (T1) (AN20)
DEFWRD	NTODTO			; Output side DATAO T1 (AN20)
DEFWRD	NTODTI			; Output side DATAI T1 (AN20)
				; The following are the interrupt handlers
DEFWRD	NTIINT			; Input interrupt instruction (AN20)
DEFWRD	NTIPCW,2		; Interrupt PC etc storage (AN20)
DEFWRD	NTINPC,2		; New PC and flags (AN20)
DEFWRD	NTIISV,6		; Input interrupt save routine (AN20)
DEFWRD	NTIIRS,3		; Interrupt restore routine (AN20)
DEFWRD	NTOINT			; Output interrupt instruction
DEFWRD	NTOPCW,2		; Interrupt Output PC,flags storage (AN20)
DEFWRD	NTONPC,2		; New Pc on output interrupt
DEFWRD	NTIOSV,6		; Output interrupt save routine (AN20)
DEFWRD	NTIORS,3		; Output restore routine (AN20)
DEFWRD	NTSVAC,20		; Interrupt AC storage

IFN STANSW,<
;DEFINE THE MEIS NCT STORAGE CELLS AFTER ALL OTHER DEFINITIONS, SINCE WE RESET
; THE VALUE OF ..OFST.

..OFST==HSTGDM			; Start the MEIS storage at HSTGDM offset
DEFWRD NTENCU			; Ethernet CDB,,UDB from ENCUTB
DEFWRD NTETHR			; -1 if 10MB Ethernet, 0 if 3MB Ethernet
DEFWRD NTSUBN			; Ethernet subnet number
DEFWRD NTHSTN			; 3MB Ethernet host number
DEFWRD NTHST0			; 10MB Ethernet host number (first word)
   DEFSTR HRDW0,NTHST0,31,32	; First four bytes of 10MB hardware address
DEFWRD NTHST1			; 10MB Ethernet host number (second word)
   DEFSTR HRDW1,NTHST1,35,16	; Last two bytes of 10MB hardware address 
DEFWRD NTCAPC			; Encapsulation word (16-bit) count
DEFWRD NTCAPB			; Encapsulation byte count
DEFWRD NTOFF			; Encapsulation buffer offset in 36-bit words
DEFWRD NTIPMN			; Minimum number of IP bytes to sniff
DEFWRD NTIPMX			; Maximum number of IP bytes to sniff
>;IFN STANSW

	END			; Of ANAUNV