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: TYPE = MACHINE DEPENDENT RECORD [ SELECT OVERLAID DeviceType FROM local => [ localSpare1, localSpare2, localSpare3, localSpare4, localSpare5: WORD, localHost: CARDINAL, localType: LocalPacketType], ethernet => [ ethernetDest: HostNumber, ethernetSource: ProcessorID, ethernetType: EthernetPacketType], ethernetOne => [ etherSpare1, etherSpare2, etherSpare3, etherSpare4: WORD, etherSpare5: [0..77777B], translationWorked: BOOLEAN, 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 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 => [ 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 => [ 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]; encapsulationTrap: [7..7] = SIZE[Encapsulation]; ethernetOneBroadcastHost: Byte = 0; ethernetOnePeekHost: Byte = 376B; -- DMT error info ethernetOneBootLoaderHost: Byte = 377B; ethernetBroadcastHost: HostNumber = NSAddress.broadcastHostNumber; 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])}; Seal: TYPE = RECORD [WORD]; unsealed: Seal = [0]; queueSeal: Seal = [123001B]; bufferSeal: Seal = [123002B]; bufferPoolSeal: Seal = [123003B]; END. ΠDriverTypes.Mesa Copyright c 1985 by Xerox Corporation. All rights reserved. HGM January 7, 1981 10:21 PM 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!!!!!! bits on the wire start here Bits on the ether start here Bits on the line start here Larry Stewart Larry Garlick 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. EthernetOne magic host numbers Ethernet() magic host numbers offsets are in words DEBUGGING Κo˜codešœ™Kšœ Οmœ1™K˜šœžœžœž œ˜'Kšœ.žœ ˜=K˜—šœžœžœž œ˜*K˜HKšœ!žœ ˜.K˜K˜—Kšœ ™ K˜Kšœžœžœžœ˜K˜K˜K˜K˜!K˜Kšžœ˜K˜K˜K˜——…—Y