IBM RPL Protocol

I still have yet to get my 8227 to boot using all attempted concoctions of LANtastic. So, I'm starting to work with the protocol a bit and hopefully I'll end up with a usable bit of code that I can use to boot these things. I'm currently using a tcpdump of the boot process kindly donated by a fellow 8227 user. Also, much thanks to Dirk-Willem van Gulik for digging up a copy of the Novell Boot ROM Developer's Guide (PDF).

RPL frames are made up of what Novell calls Vectors (what I formerly called LTDs). Vectors are the triplet formed by two bytes of a Length field, two bytes of a Type field, and a (L-4) length Data field. The protocol is based on the nesting of this basic structure. The needed Vector types are listed in the table below. (Note that the Novell book does not abstract it this far. I like my way better, so that is whats diagrammed here.)

Container Vectors hold no data directly, but hold one or more further Vectors instead. Data Vectors (aka SubVectors) directly contain data of some sort (specific to type). Container Vectors always have the upper byte of their Type field set all low. You'll also notice that Container Types are evenly spaced at bit-angles. I suppose they could be combined, however RPL does not appear to do this.

Vector Types
TypeClassDescriptionComments
0001ContainerFIND command
0002ContainerFOUND command
0004ContainerSearchAlways contains a single Loader Information SubVector
0008ContainerConnect InfoUsually contains Frame Size SubVector and Connect Class SubVector
0010ContainerSend File Request Command
0020ContainerFile Data Response
4003DataCorrelator Vector (Dummy Sequence Number)
4006DataAddress Vector (Source MAC address) ["Ring address of this Adapter in Media Format"]
4007DataLogical SAP VectorAlways 0xfc ("Remote SAP Value")
4009DataFrame Size SubVector (Maximum frame size)
400aDataConnect Class SubVectorUsually 0x0001 ["Class I ONLY"]
400bDataResponse CorrelatorAlways 0x00 ["Response Code"]
400cDataSet Address VectorShould always be 0x000000000000 ["Group Address NOT Supported"]
4011DataSequence Number
4018DataFile Data VectorLoads the included data at the address specified by the Loader Address Vector
c005DataLoader Info SubVectorUsually L=0x24 and D is filled with mostly zeros also containing the phrase "SBNE2"
c014DataFirst four bytes: Address of DataStarts at Base Address and increments by (Vector.size-4) for each successive load
Second four bytes: Transfer Control AddressUsusually 00007c00
Final byte: Flags ["Bit Significant Option Flag"]Usually 0x20

Besides the Vectors, there are the parts of the ethernet header to work with. The Protocol Type field of the ether header should be set to 0x0056 for frames from the client, 0x003d for FOUND frames, and 0x05dc for File Data frames. There should then be three bytes immediatly following the ethernet header but prior to the top-level LTD container, of the values {0xfc, 0xfc, 0x03} (this is aparently some SAP wackiness).

Because of the above oddities, you CANNOT use tcpdump to debug this protocol. It does not give enough information in its header (namely, the ethernet type ID, which changes during protocol negotiation). I may throw together a patch for tcpdump if I get a chance. Otherwise, its "trivial" to throw together a basic non-parsing tcpdump equivelent using libpcap.

Oh, and all values are given in big-endian (network) byte order...


Adam Fritzler
Last modified: Fri Jul 2 23:30:15 MST 1999