<?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 RFC4506 PUBLIC "" "http://xml.resource.org/public/rfc/bibxml/reference.RFC.4506">
<!ENTITY RFC5226 PUBLIC "" "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5226">
<!ENTITY RFC5531 PUBLIC "" "http://xml.resource.org/public/rfc/bibxml/reference.RFC.5531">
<!ENTITY I-D.brashear-afs3-pts-extended-names PUBLIC "" "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.brashear-afs3-pts-extended-names">
<!ENTITY I-D.keiser-afs3-xdr-primitive-types PUBLIC "" "http://xml.resource.org/public/rfc/bibxml3/reference.I-D.keiser-afs3-xdr-primitive-types">
<!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-capabilities-00"
ipr="noDerivativesTrust200902"
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="AFS-3 Capabilities">AFS-3 Protocol Capabilities Query Mechanism</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 fullname="Steven Jenkins" initials="S.J."
            surname="Jenkins" >
      <address>
        <email>steven.jenkins@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 is a distributed file system based upon prototypes
        developed at Carnegie Mellon University during the 1980s.
        AFS-3 heavily leverages Remote Procedure Calls (RPCs) as
        the foundation for its distributed architecture.  In 2003,
        new RPCs were introduced into AFS-3 that provide
        for capability querying between file servers and cache
        managers.  This memo provides a formal specification for that
        functionality, and provides analogous extensions to the
        volume server RPC interface.</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.  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>
	Unlike most network file systems (e.g., NFS), where protocol updates are
	traditionally handled in large batches, AFS-3 aims for incremental,
	evolutionary change to its wire protocol.  Because of this lack of
	RPC interface major versions, it is the responsibility of calling peers
	to ascertain what capabilities (i.e., available RPC interfaces, call
	semantics, etc.) are supported by the peer.  Naturally, this is a
	best-effort mechanism since the capabilities are assumed to be malleable
	by, e.g., transparent code upgrades at the remote peer.
      </t>

      <t>
	To this end, the afsint <xref target="AFS3-FSCM"/> and afscbint Rx RPC service
	endpoints--RXAFS (UDP port 7000, Rx service id 1), and RXAFSCB (UDP port
	7001, Rx service id 1), respectively--were (circa 2003) each extended with
	a capabilities query RPC.  These RPCs return (among other things) an OUT
	parameter containing an XDR <xref target="RFC4506"/>	variable-length array of
	reserved fields, which future extensions could utilize to advertise
	support of new protocol extensions.
      </t>

      <section title="Purpose">
        <t>
          This memo serves several purposes:
        </t>

        <t>
	  <list style="numbers">
<t>	     it serves as a historical record of the interfaces and semantics
	      (of the file server and cache manager capabilities query
	      interfaces), as they were designed and implemented circa 2003,
	      and informally specified in 2006;</t>
<t>it specifies the general data encoding and semantics for all
	      present AFS-3 capabilities interfaces (thus, hopefully, serving
	      as a normative reference for future capability drafts); and</t>
<t>specifies a new capabilities interface for the volint Rx RPC service
	      endpoint--AFSVol (UDP port 7005, Rx service id 4)--in order to permit
	      future extensions to the AFS-3 volume server.</t>

</list>

        </t>
      </section>

      <section title="Motivations">
        <t>
          The legacy method for extending AFS-3 protocols has been to define new RPCs
          with prototypes that augment existing RPC interfaces with additional arguments,
          or that supplant legacy data structures with new data structure definitions (and
	  associated new RPCs that references those definitions).
          While this solves the XDR decoding backwards compatibility problem, it does so
          at the expense of requiring an O(n) search to find out which RPC version is
          implemented on a given endpoint: by iterating backwards from the newest to the oldest 
          implementation of a given interface--until an invocation does not return the
          RXGEN_OPCODE error.  Consequently, the "get capabilities" mechanisms specified
          in this document reduce the worst-case capability probing from N round trips to 2--at
          the potential expense of 1 additional round-trip, occasionally, to
	  prevent capabilities cache staleness.
        </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="afscbint  -">AFS-3 Cache Manager RPC Interface Definition</t>

<t hangText="afsint    -">AFS-3 File Server RPC Interface Definition</t>

<t hangText="AFSVol    -">AFS Volume Server Rx RPC Implementation</t>

<t hangText="CM        -">AFS-3 Cache Manager</t>

<t hangText="FS        -">AFS-3 File Server</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="RXAFS     -">AFS File Server Rx RPC Implementation</t>

<t hangText="RXAFSCB   -">AFS Cache Manager Rx RPC Implementation</t>

<t hangText="TTL       -">Time to Live for cached data</t>

<t hangText="volint    -">AFS-3 Volume Server RPC Interface Definition</t>

<t hangText="volser    -">AFS-3 Volume Server</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="Capability Query Mechanism" anchor="sec-xdr">
      <t>
        Many AFS-3 services permit evolution by querying the capabilities
        of the service that they are contacting.  This is accomplished via
        a special RPC code point that is defined for many AFS-3 RPC services.
        This RPC returns an opaque bit string to the caller.  In terms of RPC-L,
        this bit string is defined as a variable-length sequence of 32-bit
	unsigned integers <xref target="I-D.keiser-afs3-xdr-primitive-types"/>:
      </t>

      <figure align="left">
        <artwork><![CDATA[
    const AFSCAPABILITIESMAX = 196;
    typedef afs_uint32 Capabilities<AFSCAPABILITIESMAX>;
        ]]></artwork>
      </figure>

      <t>
        This XDR encoding permits the size of a capabilities payload to grow quite
        large, while simultaneously keeping the payload small--until more elements
        in the variable-length array are allocated.  Moreover, it allows the semantics
	of the XDR variable-length array to be defined gradually.  The cost for this
	flexibility is that the 32-bit value of all zeroes MUST be treated the same
	as if the array index had not been returned at all.

<cref   source="TEK">
The above may be contentious: it imposes a stricture never
discussed in the past.  However, the only guarantee we have is that the registrar
SHOULD allocate the capability array indices in-order; there is no equivalent guarantee
that those indices will be standardized in a monotonic fashion.  Hence, it is crucial
that implementors have some notion of how to interpret/advertise allocated-yet-undefined
parts of the capability namespace.  Given that all zeroes was the precedent set forth
in 2003, it seems fitting to continue that trend.
</cref>


      </t>

      <section title="Capability Bit Vector (array index 0)" anchor="sec-cap-idx0">
	<t>
	  The file server and cache manager both define the first array slot--of their
	  capabilities arrays--to be a bit vector, where each bit position SHALL
	  be advertised as zero, until such time as a bit position is:
	</t>

	<t>
	  <list style="numbers">
<t>	    allocated by the AFS Assigned Numbers Registrar;</t>
<t>its semantics are agreed upon by the AFS-3 standardization group (if applicable); and</t>
<t>the attendant functionality is implemented by the callee of the capability query RPC.</t>

</list>

	</t>
      </section>

      <section title="Interpretation by caller">
	<t>
	  Interpreting the capabilities bit string returned by a server is
	  complicated by the fact that the client and/or the server may implement
	  differing subsets of the AFS-3 protocol.  For this reason, differing
	  subsets of the standardized capability bit vector array indices may
	  be supported by the caller and callee.
	</t>

	<t>
	  For example: the client may know how to decode the contents of
	  capability array indices 0, 1, and 3; the server may implement
	  the encodings of indices 0, 1, and 4.  In this example, the
	  server would return a 20-octet array where indices 2 and 3 are
	  all zero bits.  As noted earlier, the client SHALL interpret the
	  32-bit value of zero for indices 2 and 3 to mean that the server
	  does not support the standardized encodings for these indices,
	  let alone the standards whose capability metadata is encoded
	  therein.  Of course, the client would ignore the contents of
	  array indices 2 and 4, as it has no means of decoding those
	  capabilities.  Therefore, the client will decode and interpret
	  the intersection of known capabilities: array indices 0, and 1.
	</t>
      </section>
    </section>

    <section title="afsint Capability Query Interface" anchor="sec-afsint">
      <t>
        In 2003, the AFS-3 community agreed to define file server and cache manager
	capability RPC code points.  The RPC-L definition of the file server's
	(afsint) code point is as follows:
      </t>

      <figure align="left">
        <artwork><![CDATA[
    proc GetCapabilities(
      OUT Capabilities *caps
    ) multi = 65540;
        ]]></artwork>
      </figure>

      <t>
	The first array element in this variable-length array was defined as
	a 32-bit bit vector of capability flags (See <xref target="sec-cap-idx0"/>).
	Four flag bits were subsequently allocated:
      </t>

      <t>
	<list style="hanging" hangIndent="4">

<t hangText="VICED_CAPABILITY_ERRORTRANS = 1">
<vspace blankLines="1"/>

			Advertise support for the UAE error code translation table mechanism.
			When this flag is asserted, the server may translate system errno
			codes into the UAE namespace to preserve accuracy.
</t>
<t hangText="VICED_CAPABILITY_64BITFILES = 2">
<vspace blankLines="1"/>

			Advertise support for 64-bit variants of the FetchData and StoreData
			RPCs (i.e., RXAFS_FetchData64, and RXAFS_StoreData64).
</t>
<t hangText="VICED_CAPABILITY_WRITELOCKACL = 4">
<vspace blankLines="1"/>

			Advertise that RXAFS_SetLock and RXAFS_ExtendLock will permit
			ViceLockType of LockWrite (1) when the caller only possesses credentials
			conferring the PRSFS_INSERT privilege
			<xref target="afs3-stds-jaltman-2006-08-01"/>.
</t>
<t hangText="VICED_CAPABILITY_SANEACLS = 8">
<vspace blankLines="1"/>

			Hint to the client that volumes on this file server are, to the best
			knowledge of the system administrator, sane with respect to the lock ("k")
			permission bit <xref target="afs3-stds-jhutz-2006-07-19"/>.
</t>
</list>
      </t>

      <section title="Cache Coherence" anchor="sec-afsint-cap_cc">
        <t>
	  Clients SHOULD issue an RXAFS_GetCapabilities call frequently in order to
	  limit the capability incoherence time window.  It is RECOMMENDED that
	  clients issue RXAFS_GetCapabilities where they would have formerly issued
	  RXAFS_GetTime (usually during periodic server probing, and NAT table
	  entry refreshing).

<cref   source="TEK">
we should probably offer prescriptive text with an upper time bound
		       between GetCapabilities invocations...
</cref>


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

    <section title="afscbint Capability Query Interface" anchor="sec-afscbint">
      <t>
        In 2003, the AFS-3 community agreed to define file server and cache manager
	capability RPC code points.  The afscbint RPC-L definition is as follows:
      </t>

      <figure align="left">
        <artwork><![CDATA[
    proc TellMeAboutYourself(
      OUT struct interfaceAddr *addrs,
      OUT Capabilities *caps
    ) = 65538;
        ]]></artwork>
      </figure>

      <t>
        The semantics of the addrs parameter are as defined for RXAFSCB_WhoAreYou
	(a multi-home aware evolution beyond RXAFSCB_Probe <xref target="AFS3-FSCM"/>,
	 which was implemented by IBM during the 1990s).
	The first array element in the variable-length caps array was defined as
	a 32-bit bit vector of capability flags.  One flag was subsequently
	allocated and standardized:
      </t>

      <t>
	<list style="hanging" hangIndent="4">

<t hangText="CLIENT_CAPABILITY_ERRORTRANS = 1">
<vspace blankLines="1"/>

			Advertise support for the UAE error code translation table mechanism.
			When this flag is asserted, the server may translate system errno
			codes into the UAE namespace to preserve accuracy.
</t>
</list>
      </t>

      <section title="Cache Coherence" anchor="sec-afscbint-cap_cc">
        <t>
	  Clients SHOULD issue an RXAFSCB_TellMeAboutYourself call frequently in order to
	  limit the capability incoherence time window.

<cref   source="TEK">
we should probably offer prescriptive text with an upper time bound
		       between TellMeAboutYourself invocations...
</cref>


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

    <section title="volint Capability Query Interface">
      <t>
        This memo introduces a capabilities namespace, and
        GetCapabilities interface to the volint service.  The
        GetCapabilities interface SHALL be be functionally
        identical to the previously-defined RXAFS_GetCapabilities
        interface (see <xref target="sec-afsint"/>).  Its RPC-L definition SHALL be:
      </t>

      <figure align="left" anchor="getcaps">
        <artwork><![CDATA[
    proc GetCapabilities(
        OUT Capabilities * capabilities
    ) = XXX;
        ]]></artwork>
      </figure>

      <t>
        The "Capabilities" type referenced here is the same one utilized
	by the afsint interface.  As with that
	interface, the first index in the capabilities array MUST be
	interpreted as a 32-bit bit vector, where all bits SHALL be set
	to zero--until such time as they meet the requirements set forth
	in <xref target="sec-cap-idx0"/>.
      </t>

      <section title="Cache Coherence" anchor="sec-volint-cap_cc">
        <t>
          One important distinction between this capability querying
          interface and the ones utilized by afsint is: afsint is
          a stateful circuit -- file servers can reset the cached state across
          themselves and clients via the RXAFSCB_InitCallBackState,
          RXAFSCB_InitCallBackState2, and RXAFSCB_InitCallBackState3 RPCs.
          Because volint is a stateless (with the exception of rxkad and voltrans)
          client/server protocol, there is no
          means of maintaining volint capabilities cache coherence.  It is RECOMMENDED
          that clients receiving RPC error codes, or extended union legs that they
          cannot decode, perform a new AFSVolGetCapabilities invocation
          to ensure that capabilities cache incoherence is detected.
        </t>

        <t>
          Clearly, the above technique is open to races; volint clients SHOULD
          try to limit race probability by minimizing the time window between
          GetCapabilities calls, and invocation of capabilities-dependent RPCs.
          All volint clients MUST flush cached capabilities at most two
          hours after retrieving them via AFSVolGetCapabilities.
        </t>
      </section>
    </section>

    <section anchor="Acknowledgements" title="Acknowledgements">
      <t>
	The author would like to thank, in particular, Jeffrey Altman, and Jeffrey
	Hutzelman for their contributions to the 2006 mailing list discussions
	regarding the capabilities RPCs; and Derrick Brashear for the capabilities
	RPC language he wrote in <xref target="I-D.brashear-afs3-pts-extended-names"/>,
	which the author found quite useful while writing this specification.
      </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 makes one registry allocation request of the
	AFS Assigned Numbers Registrar.
      </t>

      <section title="AFSVol Capabilities Registry">
        <t>
          This memo requests the allocation of a new registry with
          the formal name "AFSVol Capabilities".  This registry
          will be used to track allocations of AFSVol capability
          bits.  The capability bit namespace contains 6272 bits,
          subdivided into 196 32-bit buckets.  Allocation requests
          for this namespace MUST be in the form of an RFC.  Furthermore,
          final approval for allocations SHALL be made by a Designated
          Expert <xref target="RFC5226"/> to be nominated by the AFS-3
          Working Group.  Should the AFS-3 Working Group be unable to
          assign a Designated Expert, the AFS Assigned Numbers
          Registrar will be free to appoint one or more Designated Experts
          to aid the registrar in the process of vetting requests for
          this namespace.  All allocation requests for this registry
          MUST include the following information:
        </t>

        <t>
	  <list style="symbols">
<t>            capability name, and</t>
<t>RFC section reference to definition of how this capability bit alters AFSVol protocol semantics.</t>

</list>

        </t>

        <t>
          In addition, an allocation request MAY include any of the following
          optional elements:
        </t>

        <t>
	  <list style="symbols">
<t>            capability description,</t>
<t>desired capability bucket number and bit position,</t>
<t>RFC section reference to discussion regarding backwards compatibility, or</t>
<t>RFC section reference to relevant security considerations.</t>

</list>

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

    <section anchor="Security" title="Security Considerations">
      <t>
        Given that these capability querying interfaces may be invoked over unprotected
        (e.g., rxnull) connections, application developers should be extremely careful when
        utilizing capability data to negotiate security-related mechanisms.  When such functionality
        is required, the implementor should make every effort to access the required capability bits
        over an Rx connection whose security class guarantees the capability bits are at least
        integrity-protected.
      </t>
    </section>
  </middle>

  <!-- BACK MATTER -->

  <back>

    <references title="Normative References">
      &RFC2119;
      &RFC5226;
      &I-D.keiser-afs3-xdr-primitive-types;
   </references>

    <references title="Informative References">
      &RFC4506;
      &RFC5531;
            <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>

            <reference anchor="AFS3-FSCM">
        <front>
          <title>AFS-3 Programmer's Reference: File Server/Cache Manager Interface</title>

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

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

            <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>

      &I-D.brashear-afs3-pts-extended-names;
      &I-D.wilkinson-afs3-standardisation;

      <reference anchor="afs3-stds-jhutz-2006-07-19"
       target="http://lists.openafs.org/pipermail/afs3-standardization/2006-July/000063.html">
        <front>
          <title>Locking, ACLs, and Capabilities</title>

          <author surname="Hutzelman" initials="J." fullname="Jeffrey Hutzelman">
            <organization abbrev="CMU">Carnegie Mellon University</organization>
          </author>

          <date year="2006" month="July" day="19" />
        </front>
        <seriesInfo name="AFS-3 Stds List" value="000063" />
      </reference>

      <reference anchor="afs3-stds-jaltman-2006-08-01"
       target="http://lists.openafs.org/pipermail/afs3-standardization/2006-August/000067.html">
        <front>
          <title>Locking, ACLs, and Capabilities</title>

          <author surname="Altman" initials="J." fullname="Jeffrey Altman">
            <organization>Seure Endpoints</organization>
          </author>

          <date year="2006" month="August" day="1" />
        </front>
        <seriesInfo name="AFS-3 Stds List" value="000067" />
      </reference>

      <reference anchor="openafs-delta-capabilities-20030304" target="http://git.openafs.org/?p=openafs.git;a=commitdiff;h=2712c1202ab17436ced8b466575c8bebdd9f68b7">
  <front>
    <title>DELTA capabilities-20030304</title>

<author fullname="Derrick Brashear"  initials="D.J.B." surname="Brashear">
</author>

<date year="2003"  month="March" day="4"/>
  </front>
<seriesInfo name="OpenAFS Git" value="2712c1202ab17436ced8b466575c8bebdd9f68b7" />
</reference>

    </references>

    <section anchor="afsint-cap-rpcl" title="Sample RPC-L for afsint Capabilities Mechanism">
      <t>
	The following is excerpted from an OpenAFS change-set
	implementing the RXAFS_GetCapabilities functionality
	<xref target="openafs-delta-capabilities-20030304"/>.
      </t>

<figure align="left">
  <artwork><![CDATA[
    /*
     * Copyright 2000, International Business Machines Corporation
     * and others.  All Rights Reserved.
     *
     * This software has been released under the terms of the IBM
     * Public License.  For details, see the LICENSE file in the
     * top-level source directory or online at
     * http://www.openafs.org/dl/license10.html
     */

    const AFSCAPABILITIESMAX = 196;
    typedef afs_uint32 Capabilities<AFSCAPABILITIESMAX>;

    /* Viced Capability Flags */
    const VICED_CAPABILITY_ERRORTRANS   = 0x0001;
    const VICED_CAPABILITY_64BITFILES   = 0x0002;
    const VICED_CAPABILITY_WRITELOCKACL = 0x0004;
    const VICED_CAPABILITY_SANEACLS     = 0x0008;

    proc GetCapabilities(
      OUT Capabilities *caps
    ) multi = 65540;

]]></artwork>
</figure>
    </section>

    <section anchor="afscbint-cap-rpcl" title="Sample RPC-L for afscbint Capabilities Mechanism">
      <t>
	The following is excerpted from an OpenAFS change-set
	implementing the RXAFSCB_TellMeAboutYourself functionality
	<xref target="openafs-delta-capabilities-20030304"/>.
      </t>

<figure align="left">
  <artwork><![CDATA[
    /*
     * Copyright 2000, International Business Machines Corporation
     * and others.  All Rights Reserved.
     *
     * This software has been released under the terms of the IBM
     * Public License.  For details, see the LICENSE file in the
     * top-level source directory or online at
     * http://www.openafs.org/dl/license10.html
     */

    const AFSCAPABILITIESMAX = 196;
    typedef afs_uint32 Capabilities<AFSCAPABILITIESMAX>;

    /* Cache Manager Capability Flags */
    const CLIENT_CAPABILITY_ERRORTRANS  = 0x0001;

    const AFS_MAX_INTERFACE_ADDR  =  32;
    struct interfaceAddr {
        int         numberOfInterfaces;
        afsUUID     uuid;
        afs_int32   addr_in[AFS_MAX_INTERFACE_ADDR];
        afs_int32   subnetmask[AFS_MAX_INTERFACE_ADDR];
        afs_int32   mtu[AFS_MAX_INTERFACE_ADDR];
    };

    proc TellMeAboutYourself(
      OUT struct interfaceAddr *addrs,
      OUT Capabilities *caps
    ) = 65538;

]]></artwork>
</figure>
    </section>

    <section anchor="volint-cap-rpcl" title="Sample RPC-L for volint Capabilities Mechanism">
<figure align="left">
  <artwork><![CDATA[
    /*
     * Copyright 2000, International Business Machines Corporation
     * and others.  All Rights Reserved.
     *
     * This software has been released under the terms of the IBM
     * Public License.  For details, see the LICENSE file in the
     * top-level source directory or online at
     * http://www.openafs.org/dl/license10.html
     */

    const AFSVOL_CAPABILITIES_MAX = 196;
    typedef afs_uint32 AFSVolCapabilities<AFSVOL_CAPABILITIES_MAX>;

    proc GetCapabilities(
      OUT AFSVolCapabilities * caps
    ) = XXX;

]]></artwork>
</figure>
    </section>

    <!-- Change Log
v00 2012-09-10  TEK  - Forked from draft-tkeiser-afs3-volser-tlv
		     - converted to m4 front-matter macros
		     - converted to m4 bibxml
                     - added formal specifications for RXAFS_GetCapabilities
		       and RXAFSCB_TellMeAboutYourself
		     - added specifications (and footnotes) related to viced
		       capability bits
		     - substantially modified capabilities specification to
		       better describe how future cap array indices will be
		       allocated and interpreted
		     - added IPL to code blocks in the appendices
		     - referenced Derrick's delta
		     - added Andrew as an editor, so he can resurrect this
		       draft subsequent to my departure
     -->

  </back>

</rfc>
