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

DIRECTORY
  SpecialSystem 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: SpecialSystem.NetworkNumber, interrouterDelay: CARDINAL];

  BufferBody: TYPE = MACHINE DEPENDENT RECORD [
	  checksum: CARDINAL,
	  pktLength: CARDINAL, -- in bytes, includes header
     transCntlAndPktTp: TransControlAndPacketType,
	  destination, source: SpecialSystem.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.