-- PilotCommUtilPup.mesa -- BLyon on March 17, 1981 4:29 PM -- HGM on March 14, 1981 10:07 PM DIRECTORY BufferDefs USING [BufferAccessHandle, OisBuffer], CommUtilDefs USING [], Environment USING [Byte], EthernetOneFace USING [ DeviceHandle, GetEthernet1Address, GetNextDevice, nullDeviceHandle], OISCP USING [ GetFreeSendOisBufferFromPool, GetOisPacketTextLength, OiscpPackageMake, OiscpPackageDestroy, ReturnFreeOisBuffer, SetOisPacketTextLength], OISCPConstantsAdditions USING [pupAddressTranslation], OISCPTypesAdditions USING [pupAddrTransPacket], PilotMP USING [cFindPupAddress, cClient], ProcessorFace USING [SetMP], PupDefs USING [PupAddress], Socket USING [ Abort, AssignNetworkAddress, Create, Delete, GetPacket, PutPacketToAllConnectedNets, SetWaitTime, TimeOut, TransferStatus], SocketInternal USING [GetBufferPool, SocketHandle], SpecialSystem USING [GetProcessorID, ProcessorID]; PilotCommUtilPup: MONITOR IMPORTS BufferDefs, EthernetOneFace, OISCP, ProcessorFace, Socket, SocketInternal, SpecialSystem EXPORTS CommUtilDefs, PupDefs, Socket SHARES BufferDefs = BEGIN -- EXPORTED TYPEs ChannelHandle: PUBLIC TYPE = SocketInternal.SocketHandle; translationRequest: CARDINAL = 1; translationResponse: CARDINAL = 2; translationError: CARDINAL = 3; myHostNumber: CARDINAL _ 0; SmashMyHostNumber: PUBLIC ENTRY PROCEDURE [new: CARDINAL] = BEGIN myHostNumber _ new; END; -- SmashMyhostNumber GetEthernetHostNumber: PUBLIC ENTRY PROCEDURE RETURNS [CARDINAL] = BEGIN i: CARDINAL; cH: ChannelHandle; myBufferAccessHandle: BufferDefs.BufferAccessHandle; hit: BOOLEAN; b: BufferDefs.OisBuffer; status: Socket.TransferStatus; where: LONG POINTER TO SpecialSystem.ProcessorID; myID: SpecialSystem.ProcessorID; ether: EthernetOneFace.DeviceHandle; IF myHostNumber#0 THEN RETURN[myHostNumber]; -- easy known case -- if the machine has a real ethernetOne then get the address from the device ether _ EthernetOneFace.GetNextDevice[EthernetOneFace.nullDeviceHandle]; IF ether#EthernetOneFace.nullDeviceHandle THEN BEGIN net, host: Environment.Byte; [net, host] _ EthernetOneFace.GetEthernet1Address[ether]; RETURN[myHostNumber _ host]; END; -- hard case: there is no ethernetOne, so probe for it. ProcessorFace.SetMP[PilotMP.cFindPupAddress]; OISCP.OiscpPackageMake[]; cH _ Socket.Create[Socket.AssignNetworkAddress[]]; Socket.SetWaitTime[cH, 3000]; myBufferAccessHandle _ SocketInternal.GetBufferPool[cH]; myID _ SpecialSystem.GetProcessorID[]; hit _ FALSE; UNTIL hit DO i _ i + 1; b _ OISCP.GetFreeSendOisBufferFromPool[myBufferAccessHandle]; OISCP.SetOisPacketTextLength[b, 2*(3+SIZE[SpecialSystem.ProcessorID])]; b.ois.transCntlAndPktTp.packetType _ OISCPTypesAdditions.pupAddrTransPacket; b.ois.destination.socket _ OISCPConstantsAdditions.pupAddressTranslation; b.ois.oisWords[0] _ b.ois.oisWords[1] _ i; b.ois.oisWords[2] _ translationRequest; where _ LOOPHOLE[@b.ois.oisWords[3]]; where^ _ myID; Socket.PutPacketToAllConnectedNets[cH, b]; UNTIL hit DO b _ Socket.GetPacket[cH ! Socket.TimeOut => EXIT]; status _ LOOPHOLE[b.status]; IF (status = goodCompletion) AND (OISCP.GetOisPacketTextLength[b] >= 2*(3 + SIZE[PupDefs.PupAddress])) AND (b.ois.oisWords[2] = translationResponse) THEN BEGIN -- the response we were looking for myLoc: LONG POINTER TO PupDefs.PupAddress = LOOPHOLE[@b.ois.oisWords[3]]; me: PupDefs.PupAddress _ myLoc^; myHostNumber _ me.host; hit _ TRUE; END; OISCP.ReturnFreeOisBuffer[b]; ENDLOOP; ENDLOOP; Socket.Abort[cH]; Socket.Delete[cH]; OISCP.OiscpPackageDestroy[]; ProcessorFace.SetMP[PilotMP.cClient]; RETURN[myHostNumber]; END; -- GetEthernetHostNumber END..