-- File: DriverTypes.Mesa, Last Edit: HGM January 7, 1981 10:21 PM DIRECTORY NSAddress USING [broadcastHostNumber, HostNumber, ProcessorID]; DriverTypes: DEFINITIONS = BEGIN Byte: TYPE = [0..377B]; Nibble: TYPE = [0..17B]; DeviceType: TYPE = { unknown, ethernet, ethernetOne, local, sla, arpanet, packetradio, phonenet, spare}; HostNumber: TYPE = NSAddress.HostNumber; ProcessorID: TYPE = NSAddress.ProcessorID; -- ENCAPSULATION -- This lives here because it is common to Pup and Ois, and needs to be compiled before BufferDefs -- An instance of this record is the last thing in a Buffer before the real data block. The hardware transfers bits to/from it and then keeps going into the body of the packet. Note that the spare words are at the beginning of the record, not the end. That way the driver can easily skip over them by just starting at the right place. -- BEWARE OF QUAD WORD ALIGNMENT HICKUPS REALLY!!!!!! Encapsulation: TYPE = MACHINE DEPENDENT RECORD [ SELECT OVERLAID DeviceType FROM local => [ localSpare1, localSpare2, localSpare3, localSpare4, localSpare5: WORD, localHost: CARDINAL, localType: LocalPacketType], ethernet => [ -- bits on the wire start here ethernetDest: HostNumber, ethernetSource: ProcessorID, ethernetType: EthernetPacketType], ethernetOne => [ etherSpare1, etherSpare2, etherSpare3, etherSpare4: WORD, etherSpare5: [0..77777B], translationWorked: BOOLEAN, -- Bits on the ether start here ethernetOneDest, ethernetOneSource: Byte, ethernetOneType: EthernetOnePacketType], sla => [ slaSpare1: WORD, slaSpare2: WORD, slaSpare3: [0..37777B], slaHi: BOOLEAN, slaBroadcast: BOOLEAN, slaTimeQueued: CARDINAL, slaSourceLine, slaDestHost: WORD, -- BEWARE: these don't get sent -- Bits on the line start here slaType: SlaPacketType], arpanet => [ arpaSpare1, arpaSpare2, arpaSpare3, arpaSpare4, arpaSpare5: WORD, arpanetControl: Byte, -- 0 for "Regular message" arpanetHost: Byte, -- source if sending, dest if receiving arpanetLink: ArpanetLink, apranetZero: Byte], packetradio => [ -- Larry Stewart prSpare1: WORD, prLength: WORD, timer: CARDINAL, prSequence: WORD, prBroadcast: BOOLEAN, numFrags, numFragsTrans, numFragsRcvd: [0..3], first, second, third: BOOLEAN, transCount: [0..77B], prAddress: WORD, prType: PRPacketType, prSpare: Nibble, prSpare2: Byte], phonenet => [ -- Larry Garlick framing0, framing1, framing2, framing3, framing4, framing5: Byte, recognition: Byte, -- 0 for auto recognition of OISCP vs SDLC/HDLC pnType: PhonePacketType, pnSrcID: NSAddress.ProcessorID], spare => [spare1, spare2, spare3, spare4, spare5, spare6, spare7: WORD], ENDCASE]; -- Many places will fall apart if SIZE[Encapsulation]#7. Look carefully at the buffer allocation routines to be sure that the allignment works out correctly. encapsulationTrap: [7..7] = SIZE[Encapsulation]; -- EthernetOne magic host numbers ethernetOneBroadcastHost: Byte = 0; ethernetOnePeekHost: Byte = 376B; -- DMT error info ethernetOneBootLoaderHost: Byte = 377B; -- Ethernet() magic host numbers ethernetBroadcastHost: HostNumber = NSAddress.broadcastHostNumber; -- offsets are in words localEncapsulationOffset: CARDINAL = 5; localEncapsulationBytes: CARDINAL = 4; ethernetEncapsulationOffset: CARDINAL = 5; ethernetEncapsulationBytes: CARDINAL = 4; slaEncapsulationOffset: CARDINAL = 6; slaEncapsulationBytes: CARDINAL = 2; prEncapsulationOffset: CARDINAL = 7; prEncapsulationBytes: CARDINAL = 0; prEncapsulationWords: CARDINAL = prEncapsulationBytes/2; phoneEncapsulationOffset: CARDINAL = 3; phoneEncapsulationBytes: CARDINAL = 8; LocalPacketType: TYPE = MACHINE DEPENDENT{pup(1000B), ois(3000B), (LAST[WORD])}; EthernetPacketType: TYPE = MACHINE DEPENDENT{ echoMe(700B), echoed(701B), pup(1000B), translation(1001B), ois(3000B), (LAST[ WORD])}; EthernetOnePacketType: TYPE = MACHINE DEPENDENT{ peekData(402B), breathOfLife(602B), echoMe(700B), echoed(701B), pup(1000B), ois(3000B), translation(3001B), (LAST[WORD])}; SlaPacketType: TYPE = MACHINE DEPENDENT{ debugging(700B), pup(1000B), routing(1001B), password(1002B), ois(3000B), (LAST[WORD])}; ArpanetLink: TYPE = MACHINE DEPENDENT{pup(152), (LAST[Byte])}; PRPacketType: TYPE = MACHINE DEPENDENT{ pup(1), ois(2), imAlive(3), broadcastPup(4), (LAST[Nibble])}; PhonePacketType: TYPE = MACHINE DEPENDENT{ pupPhonePacket(100B), oisPhonePacket(300B), turnAroundPhonePacket(301B), turnAroundMTSPhonePacket(302B), (LAST[Byte])}; -- DEBUGGING Seal: TYPE = RECORD [WORD]; unsealed: Seal = [0]; queueSeal: Seal = [123001B]; bufferSeal: Seal = [123002B]; bufferPoolSeal: Seal = [123003B]; END. J%