-- File: PupDefs.Mesa,  Last Edit: Garlick  January 26, 1981  1:58 PM

DIRECTORY
  BufferDefs USING [PupBuffer, Queue, QueueObject],
  PupStream USING [NameLookupErrorCode, Tocks, veryLongWait, veryShortWait],
  PupTypes USING [
    maxDataWordsPerGatewayPup, Pair, PupType, PupAddress, PupErrorCode, PupHostID,
    PupNetID, PupSocketID];

PupDefs: DEFINITIONS IMPORTS BufferDefs =
  BEGIN

  Byte: TYPE = [0..377B];

  -- TYPEs Copied from BufferDefs
  PupBuffer: TYPE = BufferDefs.PupBuffer;
  Queue: TYPE = BufferDefs.Queue;
  QueueObject: TYPE = BufferDefs.QueueObject;

  -- TYPEs Copied things from PupTypes
  PupAddress: TYPE = PupTypes.PupAddress;
  PupNetID: TYPE = PupTypes.PupNetID;
  PupHostID: TYPE = PupTypes.PupHostID;
  PupSocketID: TYPE = PupTypes.PupSocketID;
  Pair: TYPE = PupTypes.Pair;


  -- Buffer/Queue procedures
  EnqueuePup: PROCEDURE [Queue, PupBuffer];
  DequeuePup: PROCEDURE [Queue] RETURNS [PupBuffer];
  GetFreePupBuffer: PROCEDURE RETURNS [PupBuffer];
  ReturnFreePupBuffer: PROCEDURE [PupBuffer];
  GetClumpOfPupBuffers: PROCEDURE [q: Queue, n: CARDINAL, wait: BOOLEAN];
  ExtractPupFromQueue: PROCEDURE [Queue, PupBuffer] RETURNS [PupBuffer];


  -- Pup Routing
  InspectStrayPups: PROCEDURE [
    on: BOOLEAN, seeBroadcast: BOOLEAN,
    proc: PROCEDURE [PupBuffer] RETURNS [error: BOOLEAN]];
  PupRouterBroadcastThis: PROCEDURE [PupBuffer];
  PupRouterSendThis: PROCEDURE [PupBuffer];

  -- Start of things like this
  GetHopsToNetwork: PROCEDURE [PupNetID] RETURNS [CARDINAL];
  -- returns a big number if can't get there
  FastPath: PROCEDURE [PupAddress] RETURNS [BOOLEAN];

  -- default parameters collected here
  defaultNumberOfNetworks: CARDINAL = 126; -- two pages from the heap
  defaultDataWordsPerPup: CARDINAL = PupTypes.maxDataWordsPerGatewayPup;
  defaultPupsToAllocate: CARDINAL = 5; -- allocates for PktStreams


  -- Misc utilities
  GetLocalPupAddress: PROCEDURE [
    local: PupSocketID, remote: POINTER TO PupAddress] RETURNS [PupAddress];
  UniqueLocalPupSocketID: PROCEDURE RETURNS [PupSocketID];
  UniqueLocalPupAddress: PROCEDURE [POINTER TO PupAddress] RETURNS [PupAddress];
  SwapPupSourceAndDest: PROCEDURE [PupBuffer]; -- fixes up broadcast too

  SendPup: PROCEDURE [b: PupBuffer, type: PupTypes.PupType, bytes: CARDINAL];
  ReturnPup: PROCEDURE [b: PupBuffer, type: PupTypes.PupType, bytes: CARDINAL];


  -- Timeout things
  Tocks: TYPE = PupStream.Tocks;
  veryLongWait: Tocks = PupStream.veryLongWait;
  veryShortWait: Tocks = PupStream.veryShortWait;
  SecondsToTocks: PROCEDURE [CARDINAL] RETURNS [Tocks];
  MsToTocks: PROCEDURE [CARDINAL] RETURNS [Tocks];

  -- PupBuffer level utilities
  GetPupContentsBytes: PROCEDURE [PupBuffer] RETURNS [CARDINAL];
  SetPupContentsBytes: PROCEDURE [PupBuffer, CARDINAL];
  SetPupContentsWords: PROCEDURE [PupBuffer, CARDINAL];
  DataWordsPerPupBuffer: PROCEDURE RETURNS [CARDINAL];

  -- Socket Interface
  PupSocketMake: PROCEDURE [
    local: PupSocketID, remote: PupAddress, ticks: Tocks, id: Pair ← [0, 0]]
    RETURNS [PupSocket];
  PupSocketMakeFull: PROCEDURE [local, remote: PupAddress, ticks: Tocks]
    RETURNS [PupSocket];
  PupSocketKick: PROCEDURE [PupSocket];
  PupSocketDestroy: PROCEDURE [PupSocket];
  PupSocket: TYPE = POINTER TO PupSocketObject;
  PupSocketObject: TYPE = RECORD [
    put: PROCEDURE [PupBuffer],
    get: PROCEDURE RETURNS [PupBuffer], -- if none, wait, then return NIL
    setRemoteAddress: PROCEDURE [PupAddress],
    getLocalAddress: PROCEDURE RETURNS [PupAddress]];


  -- Start and Stop
  AdjustBufferParms: PROCEDURE [bufferPoolSize, bufferSize: CARDINAL];
  GetBufferParms: PROCEDURE RETURNS [bufferPoolSize, bufferSize: CARDINAL];
  PupPackageMake: PROCEDURE;
  PupPackageDestroy: PROCEDURE;
  GetPupPackageUseCount: PROCEDURE RETURNS [CARDINAL];
  UseNullChecksumMicrocode: PROCEDURE;
  UseSoftwareChecksumMicrocode: PROCEDURE;
  UseAltoChecksumMicrocode: PROCEDURE;
  UsePrincOpsChecksumMicrocode: PROCEDURE;
  SmashMyHostNumber: PROCEDURE [CARDINAL];

  -- NameConversion and STRING diddling
  GetPupAddress: PROCEDURE [POINTER TO PupAddress, STRING];
  PupNameLookup: PROCEDURE [POINTER TO PupAddress, STRING];
  NameLookupErrorCode: TYPE = PupStream.NameLookupErrorCode;
  ParsePupAddressConstant: PROCEDURE [POINTER TO PupAddress, STRING]
    RETURNS [BOOLEAN];
  EnumeratePupAddresses: PROCEDURE [
    s: STRING, filter: PROCEDURE [PupAddress] RETURNS [BOOLEAN]]
    RETURNS [hit: BOOLEAN];
  PupAddressLookup: PROCEDURE [STRING, PupAddress];
  AppendPupAddress: PROCEDURE [STRING, PupAddress];
  AppendHostName: PROCEDURE [STRING, PupAddress];
  AppendMyName: PROCEDURE [STRING];
  MoveStringBodyToPupBuffer: PROCEDURE [PupBuffer, STRING];
  AppendStringBodyToPupBuffer: PROCEDURE [PupBuffer, STRING];
  AppendErrorPup: PROCEDURE [STRING, PupBuffer];

  -- Does SwapPupSourceAndDest and such, then PupRouterSendThis
  SendErrorPup: PROCEDURE [PupBuffer, PupTypes.PupErrorCode, STRING];


  -- ERRORs
  PupNameTrouble: ERROR [e: STRING, code: NameLookupErrorCode];
  TockConversionTroubles: ERROR;

  -- Debugging
  SetLocalOnly: PROCEDURE [BOOLEAN];
  SetPupCheckit: PROCEDURE [x: BOOLEAN] = INLINE
    BEGIN
    IF x THEN UseSoftwareChecksumMicrocode[] ELSE UseNullChecksumMicrocode[];
    END;

  SetPupStormy: PROCEDURE [BOOLEAN]; -- lightning in Router
  SetErrorSuppression: PROCEDURE [dontSendErrors: BOOLEAN];
  SetBufferFullSuppression: PROCEDURE [dontSend: BOOLEAN];
  GetDoStats: PROCEDURE RETURNS [BOOLEAN];
  CaptureErrors: PROCEDURE [PROCEDURE [ERROR]];

  InspectIncomingPups: PROCEDURE [BOOLEAN, PROCEDURE [CARDINAL, PupBuffer]];
  InspectOutgoingPups: PROCEDURE [BOOLEAN, PROCEDURE [CARDINAL, PupBuffer]];
  ShowPupBuffer: PROCEDURE [POINTER, CARDINAL, PupBuffer]; -- in PupShow.bcd
  incomingPup: CARDINAL = 100; -- code numbers for Show
  outgoingPup: CARDINAL = 101;
  zappedIncomingPup: CARDINAL = 102;
  zappedOutgoingPup: CARDINAL = 103;

  END.