Log in

No account? Create an account
The Conversation Pit [entries|archive|friends|userinfo]
Rob Landley

[ website | My Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

I hate NFS. [Jan. 21st, 2011|12:19 pm]
Rob Landley
[Current Location |Austin, TX]
[mood |grumpygrumpy]

I've been reading the NFS RFC documents written by Sun, a company that apparently could not express itself clearly, or proofread its work.

Let's summarize RFC 1014:

Data is sent in multiples of 4 bytes, everything big endian. Ints are 4 bytes, longs are 8 bytes ala the LP64 standard. Enums are signed integers. Boolean type is an integer with 0 for false and 1 for true.

There are IEEE 754 floating points (single precision is 1 sign bit, 8 exponent bits, 23 data bits. Double is 1 sign bit, 11 exponent bits, 52 data bits). And if NFS ever sends them for anything Sun was even more screwed up than I thought, but if they do there's an existing standard for them.

Fixed length opaque data blobs get zero padded at the end to multiples of 4 bytes. Variable length opaque data blobs start with an unsigned int length, followed by the data (again zero padded to a multiple of 4 bytes). Strings are sent as variable length opaque data blobs.

They have a definition of arrays in here that, as far as I can tell, contains no actual information. Variable length arrays are just like opaque data blobs except the size of each element isn't in bytes. (What is it? Magical a-priori knowledge on the part of whoever is sending the data. Rounded up to the nearest four bytes, of course.) A structure is indistinguishable from sending the structure's components in order.

They have something called a "discriminant union" which is an int followed by a structure, the int specifying which structure. Of course the structures don't have to be the same size. Oh, and this can have a default value in case the int has a crazy value in it, but it isn't required to.

They define a void type, which is zero bytes long. (Yes really. Section 3.15.) They follow it with declaring constants and typedefs that don't go across the wire either, despite the title of the RFC being about a wire protocol.

All of this takes them many, many pages to say. Just getting through "Big endian, 4 byte alignment, LP64, with IEEE 754 floats." takes well over a dozen pages.

It's been like this all week...

[User Picture]From: atheorist
2011-01-21 07:23 pm (UTC)
I thought NFS was built on RPC / rpcgen? Is that not standardized, or is it standardized as a section inside of NFS?
(Reply) (Thread)
[User Picture]From: landley
2011-01-21 07:49 pm (UTC)
NFS (RFC 1094 for v2, RFC 1813 for v3) is built on RPC (RFC 1057), which uses XDR "External Data Representation" (Yeah, X instead of E, go figure) for the RFC wire protocol, which was the RFC I summarized above.

So this is part of a part of NFS.
(Reply) (Parent) (Thread)