// PupBSP.decl -- Byte Stream Protocol definitions
// Copyright Xerox Corporation 1979, 1982

// Last modified May 9, 1982  1:01 PM by Taft

// Pup0.decl, Pup1.decl, and PupRTP.decl must be compiled before this.

get "Streams.d"

//----------------------------------------------------------------------------
structure BSPStr:	// BSP Stream block (parallels PupBSPa.asm)
//----------------------------------------------------------------------------
[
@ST			// A standard OS stream
iPBI word		// current input buffer. 0 if none
iWordP word		// -> word containing next byte
iByteP word		// Next byte pos.  0 = left, 1 = right
iByteC word		// remaining input byte count
oPBI word		// current output buffer. 0 if none
oWordP word		// -> word containing next byte
oByteP word		// Next byte pos.  0 = left, 1 = right
oByteC word		// remaining output byte count
]
manifest lenBSPStr = size BSPStr/16

compileif offset BSPStr.iPBI/16 ne 12 then
   [ Barf("BSPStr structure disagrees with assumptions in PupBSPa.asm") ]

// Invariant: iByteC=0 iff iPBI=0, oByteC=0 iff oPBI=0

//----------------------------------------------------------------------------
structure BSPSoc:
//----------------------------------------------------------------------------
[
@RTPSoc =
   [
   blank word offset RTPSoc.rtpOtherPupProc/16
   bspPupProc word	// local name for rtpOtherPupProc
   bspTimer word	// local name for rtpOtherTimer
   bspTimerProc word	// local name for rtpOtherTimerProc
   ]
bspOtherPupProc word	// proc called for non-RTP and non-BSP pups
userByteID↑1,2 word	// ID of packet we are working on
rcvByteID↑1,2 word	// first byte beyond what I have acked
rcvIntID↑1,2 word	// ID of next incoming interrupt
unReadPups word		// Pups from left window edge to first hole
bspIQ:			// data and mark pups for local process
   [
   head word
   tail word
   ]
xmitByteID↑1,2 word	// ID of next outgoing packet created
xmitIntID↑1,2 word	// ID of next outgoing interrupt
lastAckID↑1,2 word	// ID of last received ack
unAckedPups word	// outstanding and unacknowledged Pups
unAckedBytes word	// outstanding and unacknowledged bytes
bytesPerPup word
pupAlloc word		// remaining outgoing Pup allocation
byteAlloc word		// remaining outgoing byte allocation
maxPupAlloc word	// upper bound on pupAlloc
pupAllocCount word	// counter controlling changes to maxPupAlloc
aDataCount word		// counter incremented once per AData sent
lastADataTime word	// time at which last AData was sent
aDataTimeout word	// AData timeout interval now being used
inactivityTimer word	// connection inactivity timer
bspTQ:			// pups awaiting acknowledgement
   [
   head word
   tail word
   ]
bspStatus word =
   [
   markPending bit	// encountered Mark in stream
   interruptOut bit	// unacknowledged Interrupt outstanding
   interruptIn bit	// Interrupt received
   ackPending bit	// AData received, need to send Ack
   ackRequested bit	// AData sent, expecting Ack
   sentZeroAlloc bit	// need to send gratuitous Ack
   noInactivityTimeout bit  // don't abort upon inactivity timeout
   ]
bspStr word lenBSPStr = @BSPStr
]
manifest lenBSPSoc = size BSPSoc/16

manifest
[
// Byte Stream Protocol Pup types
typeData = #20
typeAData = #21
typeAck = #22
typeMark = #23
typeAMark = #26
typeInterrupt = #24
typeInterruptReply = #25

// Error codes for BSP streams
ecBadStateForGets = 2200
ecGetsTimeout = 2201
ecMarkEncountered = 2202
ecBadStateForPuts = 2203
ecPutsTimeout = 2204
ecBadBSPGetMark = 2205

// timeout intervals

// initial value of aDataTimeout
// = time to wait after sending AData before reprobing
initialADataTimeout = 100

// maximum time after sending Data before eliciting Ack
outstandingDataTimeout = 100

// timeout to use when no packets are outstanding
idleTimeout = 1500

// inactivity timeout, expiration of which causes connection to be aborted
inactivityTimeout = 12000

// whenever pupAllocHysteresis outgoing Pups have been successfully
// acknowledged with no congestion errors, attempt to increase
// the outgoing Pup allocation (maxPupAlloc).
pupAllocHysteresis = 50

// initial maximum Pup allocation that the sender will use, regardless
// of the allocation provided by the receiver.
initialMaxPupAlloc = 5
]