-- OISCPTypes.mesa (last edited by: Garlick on: January 21, 1981 4:36 PM)

DIRECTORY
NSAddress USING [NetworkAddress, NetworkNumber];

OISCPTypes: DEFINITIONS =
BEGIN

-- TYPEs and definitions
Nibble: TYPE = [0..17B];
Byte: TYPE = [0..377B];

WaitTime: TYPE = LONG CARDINAL; -- in milliseconds

ConnectionID: TYPE = RECORD [WORD];

ExchangeClientType: TYPE = MACHINE DEPENDENT {
unspecified(0), timeService(1), clearinghouseService(2), (LAST[CARDINAL])};

ExchangeID: TYPE = MACHINE DEPENDENT RECORD [a, b: CARDINAL];

PacketType: TYPE = MACHINE DEPENDENT { -- eight bits!!
private(0), routingInformation(1), echo(2), error(3), packetExchange(4), sequencedPacket(5), (LAST[Byte])};

RoutingInfoType: TYPE = MACHINE DEPENDENT {
private(0), routingInfoRequest(1), routingInfoResponse(2), (LAST[CARDINAL])};

EchoType: TYPE = MACHINE DEPENDENT {
private(0), echoRequest(1), echoResponse(2), (LAST[CARDINAL])};

OISErrorCode: TYPE = MACHINE DEPENDENT{
-- packet got to the destination machine, but wasn't processed
unspecifiedOisErrorCode(0B), badChecksumOisErrorCode(1B),
noSocketOisErrorCode(2B), resourceLimitsOisErrorCode(3B),

-- Pup didn't get to the destination machine
unspecifiedInRouteOisErrorCode(1000B), inconsistentOisErrorCode(1001B),
cantGetThereOisErrorCode(1002B), excessHopsOisErrorCode(1003B),
tooBigOisErrorCode(1004B),

-- used by ForwardBuffer for various hacks
noErrorOisErrorCode(10000), connectionLimitOisErrorCode(10001),

filler(LAST[WORD])};

TransPortControl: TYPE = MACHINE DEPENDENT RECORD [
trace: BOOLEAN,
filler: [0 .. 7],
hopCount: [0 .. 17B]];

-- the TransportControl is included here so that we can obtain the address of the
-- WORD containing the transport control.
TransControlAndPacketType: TYPE = MACHINE DEPENDENT RECORD [
transportControl: TransPortControl, -- eight bits!!
packetType: PacketType];

RoutingInfoTuple: TYPE = MACHINE DEPENDENT RECORD [
objectNetID: NSAddress.NetworkNumber, interrouterDelay: CARDINAL];

BufferBody: TYPE = MACHINE DEPENDENT RECORD [
  checksum: CARDINAL,
  pktLength: CARDINAL, -- in bytes, includes header
transCntlAndPktTp: TransControlAndPacketType,
  destination, source: NSAddress.NetworkAddress,
  oisBody:
  SELECT OVERLAID * FROM
  oisWords => [oisWords: ARRAY [0..0) OF WORD],
  oisBytes => [oisBytes: PACKED ARRAY [0..0) OF Byte],
  oisChars => [oisChars: PACKED ARRAY [0..0) OF CHARACTER],
  routingInformation => [
  routingType: RoutingInfoType,
  routingTuple: ARRAY [0..0) OF RoutingInfoTuple],
  error => [
  errorType: OISErrorCode,
  errorParameter: CARDINAL,
  errorBody: ARRAY [0..0) OF WORD],
  echo => [
  echoType: EchoType,
  echoBody:
   SELECT OVERLAID * FROM
   echoWords => [echoWords: ARRAY [0..0) OF WORD],
   echoBytes => [echoBytes: PACKED ARRAY [0..0) OF Byte],
   ENDCASE],
  spp => [
 -- first word of level 2 Sequenced Protocol
  systemPacket: BOOLEAN,
  sendAck: BOOLEAN,
  attention: BOOLEAN,
  endOfMessage: BOOLEAN,
  unusedType: [0B..17B],
  subtype: Byte,
  sourceConnectionID: ConnectionID,
  destinationConnectionID: ConnectionID,
  sequenceNumber: CARDINAL,
  acknowledgeNumber: CARDINAL,
  allocationNumber: CARDINAL,
  sppBody:
   SELECT OVERLAID * FROM
   sppWords => [sppWords: ARRAY [0..0) OF WORD],
   sppBytes => [sppBytes: PACKED ARRAY [0..0) OF Byte],
   sppChars => [sppChars: PACKED ARRAY [0..0) OF CHARACTER],
   sppString => [sppString: StringBody],
   ENDCASE],
  packetExchange => [
  exchangeID: ExchangeID,
  exchangeType: ExchangeClientType,
  exchangeBody:
   SELECT OVERLAID * FROM
   exchangeWords => [exchangeWords: ARRAY [0..0) OF WORD],
   exchangeBytes => [exchangeBytes: PACKED ARRAY [0..0) OF Byte],
   exchangeChars => [exchangeChars: PACKED ARRAY [0..0) OF CHARACTER],
   exchangeString => [exchangeString: StringBody],
   ENDCASE],
  ENDCASE];

-- Magic numbers for the OIS communication (transport) protocols.
-- OIS packet header lengths.
zz: PRIVATE POINTER TO BufferBody = NIL; -- zz is declared so we can do arithmetic
maxBytesPerPkt: CARDINAL = 576;
wordPerPktHeader: CARDINAL =
LOOPHOLE[@zz.oisBody, CARDINAL] - LOOPHOLE[zz, CARDINAL];
bytesPerPktHeader: CARDINAL = wordPerPktHeader*2;
bytesPerPktText: CARDINAL = maxBytesPerPkt - bytesPerPktHeader;
wordsPerLevel2SppHeader: CARDINAL =
LOOPHOLE[@zz.sppBody, CARDINAL] - LOOPHOLE[@zz.oisBody, CARDINAL];
bytesPerLevel2SppHeader: CARDINAL = wordsPerLevel2SppHeader*2;
maxDataWordsPerSpp: CARDINAL = (bytesPerPktText - bytesPerLevel2SppHeader)/2;
wordsPerExchangeHeader: CARDINAL =
LOOPHOLE[@zz.exchangeBody, CARDINAL] - LOOPHOLE[@zz.oisBody, CARDINAL];
bytesPerExchangeHeader: CARDINAL = wordsPerExchangeHeader*2;
maxDataBytePerExchange: CARDINAL = bytesPerPktText - bytesPerExchangeHeader;

END..

LOG

Time: January 21, 1981 4:36 PM By: Garlick Action: Added OISErrorCode type and RoutingInfoType and altered BufferBody to use them. Added timeService and clearinghouseService to ExchangeClientType.