// Pup1.decl - Pup level 1 declarations
// Copyright Xerox Corporation 1979, 1981

// Last modified November 21, 1981  11:07 AM by Taft


//----------------------------------------------------------------------------
structure PSIB:			// PupSocketInfoBlock
//----------------------------------------------------------------------------
[
// PBI allocations are number allowed, number now remaining.
// The number now assigned must be the right-hand byte in the word.
tAll word = [ maxTPBI byte; numTPBI byte ]	// total pbis
iAll word = [ maxIPBI byte; numIPBI byte ]	// input pbis
oAll word = [ maxOPBI byte; numOPBI byte ]	// output pbis

lev1Status word =		// status bits defined at level 1
   [
   doChecksum bit		// and generate checksums
   blank bit 15
   ]
]
manifest lenPSIB = size PSIB/16


//----------------------------------------------------------------------------
structure PupSoc:		// level 1 raw Pup Socket
//----------------------------------------------------------------------------
[
link word			// link to next socket
psib word lenPSIB = @PSIB	// socket info block
lclPort: @Port			// local port address
frnPort: @Port			// foreign port address
iQ:				// input PBI queue header
   [
   head word
   tail word
   ]
]
manifest lenPupSoc = size PupSoc/16

//----------------------------------------------------------------------------
structure RTE:			// Routing Table Entry
//----------------------------------------------------------------------------
[
net word			// matched against key; rtFreeEntry => invalid
recent bit			// this entry has been updated recently
blank bit 6-size Pup.hopCnt
hops bit size Pup.hopCnt+1	// hop count; 0 => host directly connected
host byte			// gateway host number
ndb word			// -> NDB for immediate destination net
timer word			// timeout for declaring entry obsolete
]
manifest lenRTE = size RTE/16

// invalid value of net word in RTE
manifest rtFreeEntry = -1	// entry is free

// highest legal value of Pup hop count
manifest maxHops = 1 lshift size Pup.hopCnt -1


// The following structure is now misnamed, given that the Pup routing table
// is no longer implemented using a hash table.  It should be called
// "Dictionary preamble" or something.

//----------------------------------------------------------------------------
structure HTP:		// Hash Table Preamble (object)
//----------------------------------------------------------------------------
[
lookup word		// Call0
insert word		// Call1
delete word		// Call2
enumerate word		// Call3
logSize word		// Only if this is really a hash table!
]
manifest lenHTP = size HTP/16


//----------------------------------------------------------------------------
compileif newname String then
   [ structure String: [ length byte; char↑1,255 byte ] ]
//----------------------------------------------------------------------------

manifest
[
// Error protocol
typeError = 4

// Sys.errors codes
ecNoSuchSocket = 2220
ecBadAllocation = 2221
ecNoNetworkInterface = 2222
ecPupRTFull = 2223

// High part of socket numbers for transient sockets --
// chosen to be an impossible Alto memory address (see OpenLevel1Socket)
socTransient = 177243B
]