<?xml version="1.0" encoding="US-ASCII"?>
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
<!-- One method to get references from the online citation libraries.
     There has to be one entity for each item to be referenced.
     An alternate method (rfc include) is described in the references. -->

<!ENTITY RFC2119 PUBLIC "" "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2119">
<!ENTITY RFC2629 PUBLIC "" "http://xml.resource.org/public/rfc/bibxml/reference.RFC.2629">
<!ENTITY RFC4506 PUBLIC "" "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4506">
<!ENTITY RFC5531 PUBLIC "" "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5531">
<!ENTITY I-D.wilkinson-afs3-standardisation PUBLIC "" "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.wilkinson-afs3-standardisation">

]>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- used by XSLT processors -->

<!-- For a complete list and description of processing instructions (PIs),
     please see http://xml.resource.org/authoring/README.html. -->
<!-- Below are generally applicable Processing Instructions (PIs) that most I-Ds might want to use.
     (Here they are set differently than their defaults in xml2rfc v1.32) -->
<!-- give errors regarding ID-nits and DTD validation -->
<?rfc strict="yes" ?>

<!-- control the table of contents (ToC) -->
<!-- generate a ToC -->
<?rfc toc="yes" ?>

<!-- the number of levels of subsections in ToC. default: 3 -->
<?rfc tocdepth="4" ?>

<!-- control references -->
<?rfc symrefs="yes" ?>

<!-- use symbolic references tags, i.e, [RFC2119] instead of [1] -->
<?rfc sortrefs="yes" ?>

<!-- sort the reference entries alphabetically -->

<!-- control vertical white space
     (using these PIs as follows is recommended by the RFC Editor) -->
<!-- do not start each main section on a new page -->
<?rfc compact="yes" ?>
<!-- keep one blank line between list items -->
<?rfc subcompact="no" ?>

<!-- end of list of popular I-D processing instructions -->

<rfc
category="info"
docName="draft-keiser-afs3-xdr-union-06"
ipr="trust200902"
submissionType="independent">
  <!-- category values: std, bcp, info, exp, and historic
     ipr values: full3667, noModification3667, noDerivatives3667
     you can add the attributes updates="NNNN" and obsoletes="NNNN"
     they will automatically be output with "(if approved)" -->



  <!-- ***** FRONT MATTER ***** -->

  <front>
    <!-- The abbreviated title is used in the page header - it is only necessary if the
         full title is longer than 39 characters -->

    <title abbrev="Extensible XDR Union">Extensible XDR Discriminated Union Primitive Type</title>

    <!-- add role="editor" below for the editors if appropriate -->

    <!-- Another author who claims to be an editor -->



    <author fullname="Thomas Keiser" initials="T.E.K."
            surname="Keiser" >
      <organization abbrev="Sine Nomine">Sine Nomine Associates</organization>
      <address>
        <postal>
          <street>43596 Blacksmith Square</street>
          <city>Ashburn</city>
          <region>VA</region>
          <code>20147</code>
          <country>USA</country>
        </postal>
        <email>tkeiser@gmail.com</email>
      </address>
    </author>


    <author surname="Deason" fullname="Andrew Deason" initials="A.P.D." role="editor">
      <organization abbrev="Sine Nomine">Sine Nomine Associates</organization>
      <address>
        <postal>
          <street>43596 Blacksmith Square</street>
          <city>Ashburn</city>
          <region>Virginia</region>
          <code>20147-4606</code>
          <country>USA</country>
        </postal>

        <phone>+1 703 723 6673</phone>

        <email>adeason@sinenomine.net</email>
      </address>
    </author>


    <date year="2012" />

    <!-- If the month and year are both specified and are the current ones, xml2rfc will fill
         in the current day for you. If only the current year is specified, xml2rfc will fill
	 in the current day and month for you. If the year is not the current one, it is
	 necessary to specify at least a month (xml2rfc assumes day="1" if not specified for the
	 purpose of calculating the expiry date).  With drafts it is normally sufficient to
	 specify just the year. -->

    <!-- Meta-data Declarations -->

    <area>General</area>

    <workgroup>N/A</workgroup>

    <!-- WG name at the upperleft corner of the doc,
         IETF is fine for individual submissions.
	 If this element is not present, the default is "Network Working Group",
         which is used by the RFC Editor as a nod to the history of the IETF. -->

    <keyword>afs</keyword>
    <keyword>afs3</keyword>
    <keyword>afs-3</keyword>

    <!-- Keywords will be incorporated into HTML output
         files in a meta tag but they have no effect on text or nroff
         output. If you submit your draft to the RFC Editor, the
         keywords will be used for the search engine. -->

    <abstract>
<t>        AFS-3 relies upon XDR to carry Rx RPC call payloads.  XDR discriminated
        unions are ill-suited to cases where the protocol needs to evolve
        without inventing new RPCs, i.e., unknown discriminant values cause
        the entire XDR payload to fail the decoding step.  While this can be
        circumvented through the use of opaque payloads (and recursive XDR 
        invocations), such solutions are inelegant and difficult to implement.
        This memo defines a new XDR primitive type, "ext-union", which is
        derived from the XDR discriminated union primitive type, but with two
        key variations: 1) each leg contains a length field, and 2) no default
        leg is supported.</t>

    </abstract>


    <note title="Internet Draft Comments">
      <t>
        Comments regarding this draft are solicited.  Please include the AFS-3 protocol
        standardization mailing list (afs3-standardization@openafs.org) as a recipient
        of any comments.
      </t>
    </note>


<note title="AFS-3 Document State">
<t>
  This document is in state "draft", as per the document state definitions
  set forth in <xref target="I-D.wilkinson-afs3-standardisation"/>.
</t>
</note>

  </front>



  <middle>
    <section title="Introduction">
      <t>
        AFS-3 <xref target="CMU-ITC-88-062"/> <xref target="CMU-ITC-87-068"/>
        is a distributed file system that has its origins
        in the VICE project <xref target="CMU-ITC-84-020"/>
        <xref target="CMU-ITC-85-039"/> at the Carnegie Mellon University
        Information Technology Center <xref target="CMU-ITC-83-025"/>,
        a joint venture between CMU and IBM.  VICE later became AFS when
        CMU moved development to a new commercial venture called
        Transarc Corporation, which later became IBM
        Pittsburgh Labs.  AFS-3 is a suite of un-standardized 
        network protocols based on a remote procedure call (RPC)
        suite known as Rx <xref target="AFS3-RX"/>.
        While de jure standards for AFS-3
        fail to exist, the various AFS-3 implementations have 
        agreed upon certain de facto
        standards, largely helped by the existence of
        an open source fork called OpenAFS that has served
        the role of reference implementation.  In addition to
        using OpenAFS as a reference, IBM wrote and donated developer
        documentation that contains somewhat outdated specifications
        for the Rx protocol and all AFS-3 remote procedure calls, as
        well as a detailed description of the AFS-3 system architecture.
      </t>

      <t>
        The Rx RPC protocol utilizes XDR <xref target="RFC4506"/> as its
        means of encoding RPC call and response payloads.  XDR provides a
        discriminated union type.  However, the semantics of the discriminated
        union base type do not lend themselves to evolution of the discriminant
        namespace: introduction of new discriminants--when there is no default
        leg--cause the remainder of the XDR octet stream to be un-parseable
        (due to the lack of a length field in the encoding) by older peers.  This
        memo introduces a new XDR primitive type that is identical to the XDR
        discriminated union, except that:
      </t>

      <t>
<list style="numbers">
<t>each leg contains a length field, and</t>
<t>the default leg is disallowed.</t>

</list>

      </t>

      <section title="Use Case">
        <t>
          Given that this design doubles the overhead from 4 to 8 octets
          (relative to the XDR discriminated union primitive type), it is 
          ill-suited for use with small implied legs.  Within the AFS-3 protocol
          suite, the primary use case for the extensible union type is to wrap
          large data structures, rather than small primitive types.
        </t>
      </section>

      <section title="Abbreviations">
  <t>
<list style="hanging" hangIndent="10">

<t hangText="AFS      -">Historically, AFS stood for the Andrew File System; AFS no longer stands for anything</t>

<t hangText="RPC      -">Remote Procedure Call</t>

<t hangText="RPC-L    -">Rx RPC Interface Definition Language (fork of ONC RPC <xref target="RFC5531"/> .x file format)</t>

<t hangText="Rx       -">The Remote Procedure Call mechanism utilized by AFS-3 <xref target="AFS3-RX"/></t>

<t hangText="XDR      -">eXternal Data Representation <xref target="RFC4506"/></t>


</list>
  </t>
</section>

    </section>

    <section title="Conventions" anchor="sec-rfc2119">
      <t>The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT",
      "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" in this
      document are to be interpreted as described in <xref
      target="RFC2119">RFC 2119</xref>.</t>
    </section>


    <section title="Extensible Discriminated Union">
      <t>
        The extensible discriminated union will contain a length field in every leg 
        so that decoding peers can compute the offset of the next object in the
        XDR octet stream, regardless of whether the discriminant is recognized.
        For small legs, this will result in significant encoding inefficiency,
        but it is necessary to permit the union to evolve over time (without
        peers failing to decode the entire XDR octet stream).
      </t>

      <section title="Extensible Union Type" anchor="ext-union">
        <t>
          The definition of the extensible discriminated union is derived from the
          XDR union defined in section 4.15 of the XDR specification
          <xref target="RFC4506"/>.  Unlike XDR discriminated unions, the XDR
          types mapped to each arm of the union need not be defined a priori.
          Instead, the length of the arm is always included in the wire encoding
          along with the discriminant value, thus permitting the decoder to
          continue decoding past an unknown discriminant in an XDR octet stream.
        </t>

        <t>
          How undefined discriminants are handled by the decoder is deliberately
          left unspecified by this document.  Rather, this memo merely specifies
          which error conditions must be flagged to the caller (see
          <xref target="sec-dec-err"/>).  The error handling semantics--for
          both length mismatches and unknown discriminants--are left up to the 
          definition of any type built upon the ext-union primitive type.  While
          this lends significant flexibility to the design, it also permits XDR
          decoding to continue when the expected implied arm length doesn't
          match the length on the wire.  It is RECOMMENDED that implementations
          fail to decode the entire XDR stream when such a length mismatch is
          encountered, as such a length mismatch is indicative of either:
        </t>

        <t>
<list style="numbers">
<t>a significant divergence in RPC-L definitions across the
                peers, or</t>
<t>an undetected bit error in the XDR octet stream.</t>

</list>

        </t>

        <t>
          Extensible discriminated unions are defined in RPC-L as follows:
        </t>

        <figure align="left" anchor="ext-union-rpc-l">
          <artwork><![CDATA[
    ext-union [ max-unknown-leg-length=X ]
       switch (discriminant-definition) {
    case discriminant-value-A:
       arm-declaration-A;
    case discriminant-value-B:
       arm-declaration-B;
    ...
    } identifier;
          ]]></artwork>
        </figure>

        <t>
          Because the discriminant namespace of an extensible union must be capable
          of evolving over time, it is not possible to support a default leg.
        </t>

        <t>
          The max-unknown-leg-length optional parameter specifies the maximum permissible leg length
          for any union leg whose discriminant value is not known to the decoder.  This
          is necessary to limit the scope of denial of service attacks: by permitting the
          decoder to detect inordinately large payloads--after only receiving the first few
          octets of the extensible union.
        </t>

        <t>
          The extensible discriminated union is encoded on the wire as: a 4-octet discriminant,
          followed by a 4-octet arm length, and finally the variable-length implied arm.
          The arm length field SHALL count the length of the implied arm in octets, and only
          the implied arm.  In other words, the 8 octets occupied by the discriminant and arm
          length fields SHALL NOT be counted as part of the arm length value.
        </t>

        <figure align="center" anchor="ext-union-octets">
          <artwork><![CDATA[
  0   1   2   3
+---+---+---+---+---+---+---+---+---+---+---+---+
|  discriminant |   arm length  |  implied arm  |
+---+---+---+---+---+---+---+---+---+---+---+---+
|<---4 octets-->|<---4 octets-->|
          ]]></artwork>
        </figure>

        <t>
          It should be noted that this design makes it convenient to implement
          extensible discriminated unions on top of existing XDR primitive types.
          Thus, in terms of the existing XDR primitives <xref target="RFC4506"/>,
          we can describe an extensible discriminated union as follows:
        </t>

        <figure align="left" anchor="ext-union-xdr">
          <artwork><![CDATA[
    struct ext_union {
        unsigned int discriminant;
        opaque implied_leg<>;
    };
          ]]></artwork>
        </figure>
      </section>

      <section title="RPC-L Changes">
        <t>
          In order to implement the above, the XDR grammar, as specified in
          Section 6.3 of <xref target="RFC4506"/>, will need to be modified in
          the following ways:
        </t>

        <t>
<list style="symbols">
<t>"type-specifier" will require a new production rule mapping to
                "ext-union-type-spec", and</t>
<t>an "ext-union-type-spec" production rule will need to be defined.</t>

</list>

        </t>

        <t>
          The "type-specifier" grammar will now include a new production rule
          for "ext-union-type-spec":
        </t>

        <figure align="left" anchor="type-specifier-production-rule">
          <artwork><![CDATA[
    type-specifier:
         [ "unsigned" ] "int"
       | [ "unsigned" ] "hyper"
       | "float"
       | "double"
       | "quadruple"
       | "bool"
       | enum-type-spec
       | struct-type-spec
       | union-type-spec
       | identifier
       | ext-union-type-spec
          ]]></artwork>
        </figure>

        <t>
          The new "ext-union-type-spec" production rule, and the production
          rule for its nonterminal symbol dependency "ext-union-body", are
          defined as follows:
        </t>

        <figure align="left" anchor="ext-union-production-rule">
          <artwork><![CDATA[
    ext-union-type-spec:
       "ext-union" ext-union-body
     | "ext-union" ext-union-options ext-union-body

    ext-union-options:
       "[" ext-union-options-body "]"

    ext-union-options-body:
       ext-union-option
     | ext-union-option "," ext-union-options-body

    ext-union-option:
       "max-unknown-leg-length" "=" value

    ext-union-body:
       "switch" "(" declaration ")" "{"
          case-spec
          case-spec *
       "}"
          ]]></artwork>
        </figure>
      </section>

      <section title="Encoding">
        <t>
          It is RECOMMENDED that encoding of an AFS-3 extensible union proceed
          using the following algorithm:
        </t>

        <t>
<list style="numbers">
<t>              encode an XDR unsigned 32-bit integer (see Section 4.2 of
              <xref target="RFC4506"/>) containing the discrimant,</t>
<t>              XDR encode into temporary storage the implied leg (according to
              the type definition of the type specified for this discriminant
              value in the ext-union definition), and</t>
<t>              encode the implied leg using the XDR variable-length opaque
              specification (see Section 4.10 of <xref target="RFC4506"/>).</t>

</list>

        </t>

      </section>

      <section title="Decoding">
        <t>
          It is RECOMMENDED that decoding of an AFS-3 extensible union proceed
          using the following algorithm:
        </t>

        <t>
<list style="numbers">
<t>XDR decode the 32-bit unsigned integer containing the discriminant;</t>
<t>XDR decode the variable-length opaque blob into temporary storage;</t>
<t>If this is a known discriminant:
		<list style="numbers">
<t>
                  XDR decode the implied leg payload using the appropriate decoder
                  for the discriminant value;</t>
<t>                  Compare the length of the decoded XDR payload against the
                  previously-decoded extensible union implied leg length.
                  If the lengths do not match, then mark the union 
                  as failed to decode due to a length mismatch;</t>

</list>
</t>
<t>However, if this is an unknown discriminant, then mark
                the union as failed to decode due to an unknown discriminant;</t>
<t>XDR decoding continues at the current offset plus the length of
                the previously-decoded XDR variable-length opaque.</t>

</list>

        </t>

        <section title="Error Handling" anchor="sec-dec-err">
          <t>
            While the specific decoding algorithm used is left up to the
            implementor, error handling MUST be implemented as described in this
            section.

            <list style="hanging" hangIndent="4">
              <t hangText="Unknown Discriminant:">
                <vspace blankLines="1"/>
                When a decoder encounters an unknown discriminant, it MUST
                mark the discriminant as unknown, and SHOULD proceed to
                decoding the next element in the XDR stream by seeking past
                the length and implied leg fields.
              </t>
              <t hangText="Unexpected Length for Discriminant:">
                <vspace blankLines="1"/>
                When a decoder encounters a length field that doesn't agree with
                the length expected for this discriminant, it MUST mark the
                discriminant as failed to decode due to a length mismatch, and
                SHOULD fail to decode the rest of the XDR octet stream.
              </t>
              <t hangText="Excessively Long Payload:">
                <vspace blankLines="1"/>
                When the following conditions are satisfied:

                <list style="numbers">
<t>the max-unknown-leg-length value is specified in the extensible union type definition, and</t>
<t>the discriminant value is unknown, and</t>
<t>the implied leg length exceeds the max-unknown-leg-length specified in the type definition,</t>

</list>


                then the decoder MUST mark the discriminant as failed to decode due
                to excessive length, and SHOULD fail to decode the rest of the XDR
                octet stream.  In addition, an implementation MAY choose to mark a discriminant
                as failed to decode--and MAY fail to decode the rest of the XDR octet stream--when
                a known implied leg's length exceeds the max-unknown-leg-length in the extensible
                union type specification.
              </t>
            </list>
          </t>
        </section>
      </section>
    </section>

    <section anchor="Acknowledgements" title="Acknowledgements">
      <t>
        The author would like to thank Jeffrey Hutzelman for proposing
        standardization of a new XDR primitive type; and Matt Benjamin, 
        Derrick Brashear, Andrew Deason, Steven Jenkins, Michael Meffie,
        Mark Vitale, and Simon Wilkinson for helping to refine the design of
        this extensible union type.  Finally, the author would like to thank
        the attendees of the 2011 Pittsburgh AFS Hackathon for their review
        and comments regarding the -01 draft.
      </t>
    </section>

    <!-- Possibly a 'Contributors' section ... -->

    <section title="IANA Considerations">
      <t>This memo includes no request to IANA.</t>
    </section>

    <section title="AFS Assigned Numbers Registrar Considerations">
      <t>
        This memo includes no request to the AFS Assigned Numbers Registrar.
      </t>
    </section>

    <section anchor="Security" title="Security Considerations">
      <t>
        Users of this extensible type should understand that any Rx XDR payload
        is only as secure as the security class bound to the Rx connection in
        question.  This document merely standardizes a primitive type; it is up
        to the authors of standards defining new types (upon the "ext-union"
        primitive type) to ensure that the contents of their types are only
        marshalled over sufficiently-secure security classes.
      </t>

      <t>
        Decoders should take special care when encountering unexpected implied
        arm lengths.  This could be indicative of serious errors, such as
        octet stream bit errors that were undetected by lower-layer checksums.  
        At the very least, this error condition implies that the peers do not
        agree upon their ext-union type-to-discriminant mappings.  It is
        RECOMMENDED that decoders treat this as a hard error and fail to decode
        the remainder of the XDR octet stream.
      </t>
    </section>
  </middle>

  <!-- BACK MATTER -->

  <back>

    <references title="Normative References">
      &RFC2119;
      &RFC4506;
    </references>

    <references title="Informative References">
      &RFC5531;
            <reference anchor="AFS3-RX">
        <front>
          <title>AFS-3 Programmer's Reference: Specification for the Rx Remote Procedure Call Facility</title>

          <author initials="E.R." surname="Zayas" fullname="Edward R. Zayas">
            <organization abbrev="Transarc">Transarc Corporation</organization>
          </author>

          <date year="1991" month="August" day="28" />
        </front>
        <seriesInfo name="Transarc Corp. Tech. Rep." value="FS-00-D164" />
      </reference>

            <reference anchor="CMU-ITC-84-020">
        <front>
          <title>VICE File System Services</title>

          <author initials="M.J." surname="West" fullname="MJ West">
            <organization abbrev="CMU-ITC">Carnegie Mellon University Information Technology Center</organization>
          </author>

          <date year="1984" month="August" day="7" />
        </front>
        <seriesInfo name="CMU ITC Tech. Rep." value="CMU-ITC-84-020" />
      </reference>

            <reference anchor="CMU-ITC-83-025">
        <front>
          <title>The Information Technology Center</title>

          <author initials="J.H." surname="Morris" fullname="James H. Morris">
            <organization abbrev="CMU">Carnegie Mellon University</organization>
          </author>
          <author initials="D." surname="Van Houweling" fullname="Douglas Van Houweling">
            <organization abbrev="CMU">Carnegie Mellon University</organization>
          </author>
          <author initials="K." surname="Slack" fullname="Keith Slack">
            <organization abbrev="IBM">International Business Machines Corporation</organization>
          </author>

          <date year="1983"/>
        </front>
        <seriesInfo name="CMU ITC Tech. Rep." value="CMU-ITC-83-025" />
      </reference>

            <reference anchor="CMU-ITC-85-039">
        <front>
          <title>The ITC Distributed File System: Principles and Design</title>

          <author initials="M." surname="Satyanarayanan" fullname="M. Satyanarayanan">
            <organization abbrev="CMU-ITC">Carnegie Mellon University Information Technology Center</organization>
          </author>
          <author initials="J.H." surname="Howard" fullname="John H. Howard">
            <organization abbrev="CMU-ITC">Carnegie Mellon University Information Technology Center</organization>
          </author>
          <author initials="D.A." surname="Nichols" fullname="David A. Nichols">
            <organization abbrev="CMU-ITC">Carnegie Mellon University Information Technology Center</organization>
          </author>
          <author initials="R.N." surname="Sidebotham" fullname="Robert N. Sidebotham">
            <organization abbrev="CMU-ITC">Carnegie Mellon University Information Technology Center</organization>
          </author>
          <author initials="A.Z." surname="Spector" fullname="Alfred Z. Spector">
            <organization abbrev="CMU-ITC">Carnegie Mellon University Information Technology Center</organization>
          </author>
          <author initials="M.J." surname="West" fullname="Michael J. West">
            <organization abbrev="CMU-ITC">Carnegie Mellon University Information Technology Center</organization>
          </author>

          <date year="1985" month="December"/>
        </front>
        <seriesInfo name="Proc. 10th ACM Symp. Operating Sys. Princ." value="Vol. 19, No. 5" />
      </reference>

            <reference anchor="CMU-ITC-88-062">
        <front>
          <title>An Overview of the Andrew File System"</title>

          <author initials="J.H." surname="Howard" fullname="John H. Howard">
            <organization abbrev="CMU-ITC">Carnegie Mellon University Information Technology Center</organization>
          </author>

          <date year="1988" month="February" />
        </front>
        <seriesInfo name="Proc. 1988 USENIX Winter Tech. Conf." value="pp. 23-26" />
      </reference>

            <reference anchor="CMU-ITC-87-068">
        <front>
          <title>Scale and Performance in a Distributed File System</title>

          <author initials="J.H." surname="Howard" fullname="John H. Howard">
            <organization abbrev="CMU">Carnegie Mellon University</organization>
          </author>
          <author initials="M.L." surname="Kazar" fullname="Michael L. Kazar">
            <organization abbrev="CMU">Carnegie Mellon University</organization>
          </author>
          <author initials="S.G." surname="Menees" fullname="Sherri G. Menees">
            <organization abbrev="CMU">Carnegie Mellon University</organization>
          </author>
          <author initials="D.A." surname="Nichols" fullname="David A. Nichols">
            <organization abbrev="CMU">Carnegie Mellon University</organization>
          </author>
          <author initials="M." surname="Satyanarayanan" fullname="M. Satyanarayanan">
            <organization abbrev="CMU">Carnegie Mellon University</organization>
          </author>
          <author initials="R.N." surname="Sidebotham" fullname="Robert N. Sidebotham">
            <organization abbrev="CMU">Carnegie Mellon University</organization>
          </author>
          <author initials="M.J." surname="West" fullname="Michael J. West">
            <organization abbrev="CMU">Carnegie Mellon University</organization>
          </author>

          <date year="1988" month="February" />
        </front>
        <seriesInfo name="ACM Trans. Comp. Sys." value="Vol. 6, No. 1, pp. 51-81" />
      </reference>

      &I-D.wilkinson-afs3-standardisation;
    </references>

    <!-- Change Log
v00 2011-03-02  TEK  Initial Version
v01 2011-04-19  TEK  - Rewrite "encoding" section (3.3) to describe an
                       algorithm, rather than the actual on-wire encoding
                     - Update "decoding" section to utilize XDR opaque<>
                     - Expand "union" section to describe a potential definition
                       using XDR primitives, so as to simplify implementation
                     - Add text to warn implementors about the dangers involved
                       in actual-versus-expected implied leg length mismatches
                     - Rename to ext-union in order to deal with security class
                       requirements
v02 2011-05-03  TEK  - Incorporate "error handling" section (3.4.1) changes
                       discussed at the 2011 Pittsburgh AFS Hackathon
                     - Add a small "Use Case" section (1.1) to discuss the
                       tradeoffs of the new type
                     - Add a sentence to the "acknowledgments" section giving
                       credit to the 2011 Pittsburgh AFS Hackathon attendees
v03 2011-07-27  TEK  - Fix two spelling mistakes
v04 2012-01-07  TEK  - Modify the decoding algorithm so that we perform depth-first
                       XDR decoding of nested ext-unions rather than attempting to
                       use heuristics to validate implied leg lengths prior to performing
                       decoding of implied legs
                     - Add grammar for the max-unknown-leg-length optional parameter
                     - Add a justification for the max-unknown-leg-length optional parameter
                     - Move the justification for implementing ext-union on top of an opaque
                       above the example C structure defining an ext-union using an opaque
                     - Add an error handling specification to deal with the optional
                       max-unknown-leg-length specification
v05 2012-02-03  TEK  - fix location of "switch" token in figure 1
v06 2012-09-10  TEK  - switch over to citation library, consequently change some citation
		       names
		     - use our m4 macro library to alleviate xml tedium
		     - break a few numbered lists out of paragraphs into real markup to
                       marginally improve readability
		     - add Deason as an editor so he can resurrect this docment after
		       my departure
     -->

  </back>

</rfc>
