1d17cd367Smrg<?xml version="1.0" encoding="UTF-8" ?>
29ef0b394Smrg<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
39ef0b394Smrg                   "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
49ef0b394Smrg[
59ef0b394Smrg<!ENTITY % defs SYSTEM "defs.ent"> %defs;
69ef0b394Smrg]>
7d17cd367Smrg
8d17cd367Smrg
9d17cd367Smrg<!-- lifted from troff+ms+XMan by doclifter -->
10d17cd367Smrg<book id="ice">
11d17cd367Smrg
12d17cd367Smrg<bookinfo>
13d17cd367Smrg   <title>Inter-Client Exchange (ICE) Protocol</title>
14d17cd367Smrg   <subtitle>X Consortium Standard</subtitle>
159ef0b394Smrg   <releaseinfo>X Version 11, Release &fullrelvers;</releaseinfo>
16d17cd367Smrg   <authorgroup>
17d17cd367Smrg      <author>
18d17cd367Smrg         <firstname>Robert</firstname><surname>Scheifler</surname>
199ef0b394Smrg         <affiliation><orgname>X Consortium</orgname></affiliation>
20d17cd367Smrg      </author>
21d17cd367Smrg      <othercredit>
22d17cd367Smrg         <firstname>Jordan</firstname><surname>Brown</surname>
23d17cd367Smrg         <affiliation><orgname>Quarterdeck Office Systems</orgname></affiliation>
24d17cd367Smrg      </othercredit>
25d17cd367Smrg   </authorgroup>
269ef0b394Smrg   <releaseinfo>Version 1.1</releaseinfo>
279ef0b394Smrg   <copyright>
289ef0b394Smrg     <year>1993</year><year>1994</year>
299ef0b394Smrg     <holder>X Consortium</holder>
309ef0b394Smrg   </copyright>
31d17cd367Smrg
32d17cd367Smrg<legalnotice>
33d17cd367Smrg<para>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the &ldquo;Software&rdquo;), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</para>
34d17cd367Smrg
35d17cd367Smrg<para>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</para>
36d17cd367Smrg
379ef0b394Smrg<para>THE SOFTWARE IS PROVIDED &ldquo;AS IS&rdquo;, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</para>
38d17cd367Smrg
39d17cd367Smrg<para>Except as contained in this notice, the name of the X Consortium shall not be used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from the X Consortium.</para>
40d17cd367Smrg
419ef0b394Smrg<para>X Window System is a trademark of The Open Group.</para>
42d17cd367Smrg</legalnotice>
43d17cd367Smrg
44d17cd367Smrg<abstract>
45d17cd367Smrg<para>
46d17cd367SmrgThere are numerous possible protocols that can be used for communication
47d17cd367Smrgamong clients.  They have many similarities and common needs, including
48d17cd367Smrgauthentication, version negotiation, data typing, and connection management.  The <emphasis remap='I'> Inter-Client Exchange</emphasis> (ICE) protocol
49d17cd367Smrgis intended to provide a framework for building such protocols.  Using
50d17cd367SmrgICE reduces the complexity of designing new protocols and
51d17cd367Smrgallows the sharing of many aspects of the implementation.
52d17cd367Smrg</para>
53d17cd367Smrg</abstract>
54d17cd367Smrg</bookinfo>
55d17cd367Smrg
569ef0b394Smrg<chapter id='Purpose_and_Goals'>
57d17cd367Smrg<title>Purpose and Goals</title>
58d17cd367Smrg
59d17cd367Smrg<para>
60d17cd367SmrgIn discussing a variety of protocols -- existing, under development, and
61d17cd367Smrghypothetical -- it was noted that they have many elements in common.  Most
62d17cd367Smrgprotocols need mechanisms for authentication, for
63d17cd367Smrgversion negotiation,
64d17cd367Smrgand for setting up and taking down connections.  There are also
65d17cd367Smrgcases where the same two parties need to talk to each other using multiple
66d17cd367Smrgprotocols.  For example, an embedding relationship between two parties is
67d17cd367Smrglikely to require the simultaneous use of session management, data transfer,
68d17cd367Smrgfocus negotiation, and command notification protocols.  While these are
69d17cd367Smrglogically separate protocols, it is desirable for them to share as many
70d17cd367Smrgpieces of implementation as possible.</para>
71d17cd367Smrg
72d17cd367Smrg<para>The
73d17cd367Smrg<emphasis remap='I'>
74d17cd367SmrgInter-Client Exchange
75d17cd367Smrg</emphasis>
76d17cd367Smrg(ICE) protocol provides a generic framework for building protocols on top of
77d17cd367Smrgreliable, byte-stream transport connections.  It provides basic mechanisms
78d17cd367Smrgfor setting up and shutting down connections, for performing authentication,
79d17cd367Smrgfor negotiating
80d17cd367Smrgversions,
81d17cd367Smrgand for reporting errors.  The
82d17cd367Smrgprotocols running within an ICE connection are referred to here as
83d17cd367Smrg<emphasis remap='I'>subprotocols.</emphasis>
84d17cd367SmrgICE provides facilities for each subprotocol to do its own version
85d17cd367Smrgnegotiation, authentication, and error reporting.  In addition, if two
86d17cd367Smrgparties are communicating using several different subprotocols, ICE will
87d17cd367Smrgallow them to share the same transport layer connection.</para>
88d17cd367Smrg
89d17cd367Smrg</chapter>
90d17cd367Smrg
919ef0b394Smrg<chapter id='Overview_of_the_Protocol'>
92d17cd367Smrg<title>Overview of the Protocol</title>
93d17cd367Smrg
94d17cd367Smrg
95d17cd367Smrg<para>Through some mechanism outside ICE, two parties make themselves known to
96d17cd367Smrgeach other and agree that they would like to communicate using an ICE
971009a292Smrgsubprotocol.  ICE assumes that this negotiation includes some notion by which
98a3129944Smrgthe parties will decide which is the <quote>originating</quote> party and which is
99a3129944Smrgthe <quote>answering</quote> party.  The negotiation will also need to provide the
100d17cd367Smrgoriginating party with a name or address of the answering party.  Examples
101d17cd367Smrgof mechanisms by which parties can make themselves known to each other are
102d17cd367Smrgthe X selection mechanism, environment
103d17cd367Smrgvariables, and shared files.</para>
104d17cd367Smrg
105d17cd367Smrg<para>The originating party first determines whether there is an existing ICE
106d17cd367Smrgconnection between the two parties.  If there is, it can re-use the existing
107d17cd367Smrgconnection and move directly to the setup of the subprotocol.  If no ICE
108d17cd367Smrgconnection exists, the originating party will open a transport connection to
109d17cd367Smrgthe answering party and will start ICE connection setup.</para>
110d17cd367Smrg
111d17cd367Smrg<para>The ICE connection setup dialog consists of three major parts: byte order
112d17cd367Smrgexchange, authentication, and connection information exchange.  The first
113d17cd367Smrgmessage in each direction is a
114d17cd367Smrg<function>ByteOrder</function>
115d17cd367Smrgmessage telling which byte order will be used by the sending party in
116d17cd367Smrgmessages that it sends.  After that, the originating party sends a
117d17cd367Smrg<function>ConnectionSetup</function>
118d17cd367Smrgmessage giving information about itself (vendor name and release number) and
119d17cd367Smrggiving a list of ICE version numbers it is capable of supporting and a list
120d17cd367Smrgof authentication schemes it is willing to accept.  Authentication is
121d17cd367Smrgoptional.  If no authentication is required, the answering party responds
122d17cd367Smrgwith a
123d17cd367Smrg<function>ConnectionReply</function>
124d17cd367Smrgmessage giving information about itself, and the connection setup is complete.</para>
125d17cd367Smrg
126d17cd367Smrg<para>If the connection setup is to be authenticated, the answering party will
127d17cd367Smrgrespond with an
128d17cd367Smrg<function>AuthenticationRequired</function>
129d17cd367Smrgmessage instead of a
130d17cd367Smrg<function>ConnectionReply</function>
131d17cd367Smrgmessage.  The parties then exchange
132d17cd367Smrg<function>AuthenticationReply</function>
133d17cd367Smrgand
134d17cd367Smrg<function>AuthenticationNextPhase</function>
135d17cd367Smrgmessages until authentication is complete, at which time the answering party
136d17cd367Smrgfinally sends its
137d17cd367Smrg<function>ConnectionReply</function>
138d17cd367Smrgmessage.</para>
139d17cd367Smrg
140d17cd367Smrg<para>Once an ICE connection is established (or an existing connection reused),
141d17cd367Smrgthe originating party starts subprotocol negotiation by sending a
142d17cd367Smrg<function>ProtocolSetup</function>
143d17cd367Smrgmessage.  This message gives the name of the subprotocol that the parties
144d17cd367Smrghave agreed to use, along with the ICE major opcode that the originating
145d17cd367Smrgparty has assigned to that subprotocol.  Authentication can also occur for
146d17cd367Smrgthe subprotocol, independently of authentication for the connection.
147d17cd367SmrgSubprotocol authentication is optional.  If there is no subprotocol
148d17cd367Smrgauthentication, the answering party responds with a
149d17cd367Smrg<function>ProtocolReply</function>
150d17cd367Smrgmessage, giving the ICE major opcode that it has assigned
151d17cd367Smrgfor the subprotocol.</para>
152d17cd367Smrg
153d17cd367Smrg<para>Subprotocols are authenticated independently of each other, because they may
154d17cd367Smrghave differing security requirements.  If there is authentication for this
155d17cd367Smrgparticular subprotocol, it takes place before the answering party emits the
156d17cd367Smrg<function>ProtocolReply</function>
157d17cd367Smrgmessage, and it uses the
158d17cd367Smrg<function>AuthenticationRequired</function>
159d17cd367Smrg<function>AuthenticationReply</function>
160d17cd367Smrgand
161d17cd367Smrg<function>AuthenticationNextPhase</function>
162d17cd367Smrgmessages, just as for the connection authentication.  Only when subprotocol
163d17cd367Smrgauthentication is complete does the answering party send its
164d17cd367Smrg<function>ProtocolReply</function>
165d17cd367Smrgmessage.</para>
166d17cd367Smrg
167d17cd367Smrg<para>When a subprotocol has been set up and authenticated, the two parties can
168d17cd367Smrgcommunicate using messages defined by the subprotocol.  Each message has two
169d17cd367Smrgopcodes: a major opcode and a minor opcode.  Each party will send messages
170d17cd367Smrgusing the major opcode it has assigned in its
171d17cd367Smrg<function>ProtocolSetup</function>
172d17cd367Smrgor
173d17cd367Smrg<function>ProtocolReply</function>
174d17cd367Smrgmessage.  These opcodes will, in general, not be the same.  For a particular
175d17cd367Smrgsubprotocol, each party will need to keep track of two major opcodes: the
176d17cd367Smrgmajor opcode it uses when it sends messages, and the major opcode it expects
177d17cd367Smrgto see in messages it receives.  The minor opcode values and semantics are
178d17cd367Smrgdefined by each individual subprotocol.</para>
179d17cd367Smrg
180d17cd367Smrg<para>Each subprotocol will have one or more messages whose semantics are that the
181d17cd367Smrgsubprotocol is to be shut down.  Whether this is done unilaterally or is
182d17cd367Smrgperformed through negotiation is defined by each subprotocol.  Once a
183d17cd367Smrgsubprotocol is shut down, its major opcodes are removed from
184d17cd367Smrguse; no further messages on this subprotocol should be sent until the
185d17cd367Smrgopcode is reestablished with
186d17cd367Smrg<function>ProtocolSetup</function>
187d17cd367Smrg</para>
188d17cd367Smrg
189d17cd367Smrg<para>ICE has a facility to negotiate the closing of the connection when there are
190d17cd367Smrgno longer any active subprotocols.  When either party decides that no
191d17cd367Smrgsubprotocols are active, it can send a
192d17cd367Smrg<function>WantToClose</function>
193d17cd367Smrgmessage.  If the other party agrees to close the connection, it can simply
194d17cd367Smrgdo so.  If the other party wants to keep the connection open, it can
195d17cd367Smrgindicate its desire by replying with a
196d17cd367Smrg<function>NoClose</function>
197d17cd367Smrgmessage.</para>
198d17cd367Smrg<!--  XXX \- Note that it's likely that both parties will WantToClose at once. -->
199d17cd367Smrg
200d17cd367Smrg<para>It should be noted that the party that initiates the connection isn't
201d17cd367Smrgnecessarily the same as the one that initiates setting up a subprotocol.
202d17cd367SmrgFor example, suppose party A connects to party B.  Party A will issue the
203d17cd367Smrg<function>ConnectionSetup</function>
204d17cd367Smrgmessage and party B will respond with a
205d17cd367Smrg<function>ConnectionReply</function>
206d17cd367Smrgmessage.  (The authentication steps are omitted here for brevity.)
207d17cd367SmrgTypically, party A will also issue the
208d17cd367Smrg<function>ProtocolSetup</function>
209d17cd367Smrgmessage and expect a
210d17cd367Smrg<function>ProtocolReply</function>
211d17cd367Smrgfrom party B.  Once the connection is established, however, either party may
212d17cd367Smrginitiate the negotiation of a subprotocol.  Continuing this example, party B
213d17cd367Smrgmay decide that it needs to set up a subprotocol for communication with
214d17cd367Smrgparty A.  Party B would issue the
215d17cd367Smrg<function>ProtocolSetup</function>
216d17cd367Smrgmessage and expect a
217d17cd367Smrg<function>ProtocolReply</function>
218d17cd367Smrgfrom party A.</para>
219d17cd367Smrg<!--  .nH 1 "Data Types" -->
220d17cd367Smrg</chapter>
221d17cd367Smrg
2229ef0b394Smrg<chapter id='Data_Types'>
223d17cd367Smrg<title>Data Types</title>
224d17cd367Smrg
225d17cd367Smrg<para>ICE messages contain several types of data.  Byte order is negotiated in
226d17cd367Smrgthe initial connection messages; in general data is sent in the sender's
227d17cd367Smrgbyte order and the receiver is required to swap it appropriately.
228d17cd367SmrgIn order to support 64-bit machines, ICE messages
229d17cd367Smrgare padded to multiples of 8 bytes.  All messages are designed so that
230a3129944Smrgfields are <quote>naturally</quote> aligned on 16-, 32-, and 64-bit boundaries.
231d17cd367SmrgThe following formula gives the number of bytes necessary
232d17cd367Smrgto pad <emphasis remap='I'>E</emphasis> bytes to the next multiple of
233d17cd367Smrg<emphasis remap='I'>b</emphasis>:</para>
234d17cd367Smrg<literallayout remap='DS'>
235d17cd367Smrg
236d17cd367Smrgpad(<emphasis remap='I'>E</emphasis>, <emphasis remap='I'>b</emphasis>) = (<emphasis remap='I'>b</emphasis> - (<emphasis remap='I'>E</emphasis> mod <emphasis remap='I'>b</emphasis>)) mod <emphasis remap='I'>b</emphasis>
237d17cd367Smrg</literallayout>
238d17cd367Smrg
2399ef0b394Smrg<sect1 id='Primitive_Types'>
240d17cd367Smrg<title>Primitive Types</title>
241d17cd367Smrg
2429ef0b394Smrg<informaltable frame='topbot'>
2439ef0b394Smrg  <?dbfo keep-together="always" ?>
2449ef0b394Smrg  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
2459ef0b394Smrg    <colspec colname='c1' colwidth='1.0*'/>
2469ef0b394Smrg    <colspec colname='c2' colwidth='3.0*'/>
247d17cd367Smrg    <thead>
2489ef0b394Smrg      <row rowsep='1'>
2499ef0b394Smrg        <entry>Type Name</entry>
2509ef0b394Smrg        <entry>Description</entry>
251d17cd367Smrg      </row>
252d17cd367Smrg    </thead>
253d17cd367Smrg    <tbody>
254d17cd367Smrg      <row>
2559ef0b394Smrg        <entry>CARD8</entry>
2569ef0b394Smrg        <entry>8-bit unsigned integer</entry>
257d17cd367Smrg      </row>
258d17cd367Smrg      <row>
2599ef0b394Smrg        <entry>CARD16</entry>
2609ef0b394Smrg        <entry>16-bit unsigned integer</entry>
261d17cd367Smrg      </row>
262d17cd367Smrg      <row>
2639ef0b394Smrg        <entry>CARD32</entry>
2649ef0b394Smrg        <entry>32-bit unsigned integer</entry>
265d17cd367Smrg      </row>
266d17cd367Smrg      <row>
2679ef0b394Smrg        <entry>BOOL</entry>
2689ef0b394Smrg        <entry><para><function>False</function>
269d17cd367Smrgor
270d17cd367Smrg<function>True</function></para></entry>
271d17cd367Smrg      </row>
272d17cd367Smrg      <row>
2739ef0b394Smrg        <entry>LPCE</entry>
2749ef0b394Smrg        <entry>A character from the X Portable Character Set in Latin Portable Character
275d17cd367SmrgEncoding</entry>
276d17cd367Smrg      </row>
277d17cd367Smrg    </tbody>
278d17cd367Smrg  </tgroup>
279d17cd367Smrg</informaltable>
280d17cd367Smrg
281d17cd367Smrg</sect1>
282d17cd367Smrg
2839ef0b394Smrg<sect1 id='Complex_Types'>
284d17cd367Smrg<title>Complex Types</title>
285d17cd367Smrg
2869ef0b394Smrg<informaltable frame='topbot'>
2879ef0b394Smrg  <?dbfo keep-together="always" ?>
2889ef0b394Smrg  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
2899ef0b394Smrg    <colspec colname='c1' colwidth='1.0*'/>
2909ef0b394Smrg    <colspec colname='c2' colwidth='3.0*'/>
291d17cd367Smrg    <thead>
2929ef0b394Smrg      <row rowsep='1'>
2939ef0b394Smrg        <entry>Type Name</entry>
2949ef0b394Smrg        <entry>Type</entry>
295d17cd367Smrg      </row>
296d17cd367Smrg    </thead>
297d17cd367Smrg    <tbody>
298d17cd367Smrg      <row>
2999ef0b394Smrg        <entry>VERSION</entry>
3009ef0b394Smrg        <entry>[Major, minor: CARD16]</entry>
301d17cd367Smrg      </row>
302d17cd367Smrg      <row>
3039ef0b394Smrg        <entry>STRING</entry>
3049ef0b394Smrg        <entry>LISTofLPCE</entry>
305d17cd367Smrg      </row>
306d17cd367Smrg    </tbody>
307d17cd367Smrg  </tgroup>
308d17cd367Smrg</informaltable>
309d17cd367Smrg
310d17cd367Smrg
311d17cd367Smrg<para>LISTof&lt;type&gt; denotes a counted collection of &lt;type&gt;.  The exact encoding
312d17cd367Smrgvaries depending on the context; see the encoding section.</para>
313d17cd367Smrg<!--  .nH 1 "Message Format" -->
314d17cd367Smrg</sect1>
315d17cd367Smrg
3169ef0b394Smrg<sect1 id='Message_Format'>
317d17cd367Smrg<title>Message Format</title>
318d17cd367Smrg
319d17cd367Smrg<para>All ICE messages include the following information:</para>
320d17cd367Smrg
3219ef0b394Smrg<informaltable frame='topbot'>
3229ef0b394Smrg  <?dbfo keep-together="always" ?>
3239ef0b394Smrg  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
3249ef0b394Smrg    <colspec colname='c1' colwidth='1.0*'/>
3259ef0b394Smrg    <colspec colname='c2' colwidth='3.0*'/>
326d17cd367Smrg    <thead>
3279ef0b394Smrg      <row rowsep='1'>
328d17cd367Smrg        <entry>Field Type</entry>
329d17cd367Smrg        <entry>Description</entry>
330d17cd367Smrg      </row>
331d17cd367Smrg    </thead>
332d17cd367Smrg    <tbody>
333d17cd367Smrg      <row>
3349ef0b394Smrg        <entry>CARD8</entry>
3359ef0b394Smrg        <entry>protocol major opcode</entry>
336d17cd367Smrg      </row>
337d17cd367Smrg      <row>
3389ef0b394Smrg        <entry>CARD8</entry>
3399ef0b394Smrg        <entry>protocol minor opcode</entry>
340d17cd367Smrg      </row>
341d17cd367Smrg      <row>
3429ef0b394Smrg        <entry>CARD32</entry>
3439ef0b394Smrg        <entry>length of remaining data in 8-byte units</entry>
344d17cd367Smrg      </row>
345d17cd367Smrg    </tbody>
346d17cd367Smrg  </tgroup>
347d17cd367Smrg</informaltable>
348d17cd367Smrg
349d17cd367Smrg
350d17cd367Smrg<para>The fields are as follows:</para>
351d17cd367Smrg
352d17cd367Smrg<variablelist>
353d17cd367Smrg  <varlistentry>
354d17cd367Smrg    <term>Protocol major opcode</term>
355d17cd367Smrg    <listitem>
356d17cd367Smrg      <para>
357d17cd367SmrgThis specifies what subprotocol the message is intended for.  Major opcode
358d17cd367Smrg0 is reserved for ICE control messages.  The major opcodes of other
359d17cd367Smrgsubprotocols are dynamically assigned and exchanged at protocol
360d17cd367Smrgnegotiation time.
361d17cd367Smrg      </para>
362d17cd367Smrg    </listitem>
363d17cd367Smrg  </varlistentry>
364d17cd367Smrg  <varlistentry>
365d17cd367Smrg    <term>Protocol minor opcode</term>
366d17cd367Smrg    <listitem>
367d17cd367Smrg      <para>
368d17cd367SmrgThis specifies what protocol-specific operation is to be performed.
369d17cd367SmrgMinor opcode 0 is reserved for Errors; other values are protocol-specific.
370d17cd367Smrg      </para>
371d17cd367Smrg    </listitem>
372d17cd367Smrg  </varlistentry>
373d17cd367Smrg  <varlistentry>
374d17cd367Smrg    <term>Length of data in 8-byte units</term>
375d17cd367Smrg    <listitem>
376d17cd367Smrg      <para>
377d17cd367SmrgThis specifies the length of the information following the first 8 bytes.
378d17cd367SmrgEach message-type has a different format, and will need to be separately
379d17cd367Smrglength-checked against this value.  As every data item has either an
380d17cd367Smrgexplicit length, or an implicit length, this can be easily accomplished.
381d17cd367SmrgMessages that have too little or too much data indicate a serious
382d17cd367Smrgprotocol failure, and should result in a <function>BadLength</function>
383d17cd367Smrgerror.
384d17cd367Smrg      </para>
385d17cd367Smrg    </listitem>
386d17cd367Smrg  </varlistentry>
387d17cd367Smrg</variablelist>
388d17cd367Smrg</sect1>
389d17cd367Smrg
390d17cd367Smrg</chapter>
391d17cd367Smrg
3929ef0b394Smrg<chapter id='Overall_Protocol_Description'>
393d17cd367Smrg<title>Overall Protocol Description</title>
394d17cd367Smrg
395d17cd367Smrg<para>
396d17cd367SmrgEvery message sent in a given direction has an implicit sequence number,
397d17cd367Smrgstarting with 1.  Sequence numbers are global to the connection; independent
398d17cd367Smrgsequence numbers are <emphasis remap='I'>not</emphasis> maintained for each protocol.</para>
399d17cd367Smrg
400d17cd367Smrg<para>Messages of a given major-opcode (i.e., of a given protocol) must be
401d17cd367Smrgresponded to (if a response is called for) in order by the receiving party.
402d17cd367SmrgMessages from different protocols can be responded to in arbitrary order.</para>
403d17cd367Smrg
404d17cd367Smrg<para>Minor opcode 0 in every protocol is for reporting errors.  At most one error
405d17cd367Smrgis generated per request.  If more than one error condition is encountered
406d17cd367Smrgin processing a request, the choice of which error is returned is
407d17cd367Smrgimplementation-dependent.
408d17cd367Smrg</para>
409d17cd367Smrg
410d17cd367Smrg<para><function>Error</function></para>
411d17cd367Smrg<variablelist remap='IP'>
412d17cd367Smrg  <varlistentry>
413d17cd367Smrg    <term><emphasis remap='I'>offending-minor-opcode</emphasis>:</term>
414d17cd367Smrg    <listitem>
415d17cd367Smrg      <para>CARD8</para>
416d17cd367Smrg    </listitem>
417d17cd367Smrg  </varlistentry>
418d17cd367Smrg  <varlistentry>
419d17cd367Smrg    <term><emphasis remap='I'>severity</emphasis>:</term>
420d17cd367Smrg    <listitem>
421d17cd367Smrg      <para>
422d17cd367Smrg{<symbol role='Pn'>CanContinue</symbol>,
423d17cd367Smrg<function>FatalToProtocol</function>
424d17cd367Smrg<function>FatalToConnection</function>
425d17cd367Smrg      </para>
426d17cd367Smrg    </listitem>
427d17cd367Smrg  </varlistentry>
428d17cd367Smrg  <varlistentry>
429d17cd367Smrg    <term><emphasis remap='I'>sequence-number</emphasis>:</term>
430d17cd367Smrg    <listitem>
431d17cd367Smrg      <para>CARD32</para>
432d17cd367Smrg    </listitem>
433d17cd367Smrg  </varlistentry>
434d17cd367Smrg  <varlistentry>
435d17cd367Smrg    <term><emphasis remap='I'>class</emphasis>:</term>
436d17cd367Smrg    <listitem>
437d17cd367Smrg      <para>CARD16</para>
438d17cd367Smrg    </listitem>
439d17cd367Smrg  </varlistentry>
440d17cd367Smrg  <varlistentry>
441d17cd367Smrg    <term><emphasis remap='I'>value(s)</emphasis>:</term>
442d17cd367Smrg    <listitem>
443d17cd367Smrg      <para>&lt;dependent on major/minor opcode and class&gt;</para>
444d17cd367Smrg    </listitem>
445d17cd367Smrg  </varlistentry>
446d17cd367Smrg</variablelist>
447d17cd367Smrg
448d17cd367Smrg<para>
449d17cd367SmrgThis message is sent to report an error in response to a message
450d17cd367Smrgfrom any protocol.  The <function>Error</function> message
451d17cd367Smrgexists in all protocol major-opcode spaces; it
452d17cd367Smrgis minor-opcode zero in every protocol.  The minor opcode of the
453d17cd367Smrgmessage that caused the error is reported, as well as the sequence
454d17cd367Smrgnumber of that message.
455d17cd367SmrgThe severity indicates the sender's behavior following
456d17cd367Smrgthe identification of the error.  <function>CanContinue</function>
457d17cd367Smrgindicates the sender is willing to accept additional messages for this
458d17cd367Smrgprotocol.  <function>FatalToProcotol</function>
459d17cd367Smrgindicates the sender is unwilling to accept further messages for this
460d17cd367Smrgprotocol but that messages for other protocols may be accepted.
461d17cd367Smrg<function>FatalToConnection</function>
462d17cd367Smrgindicates the sender is unwilling to accept any further
463d17cd367Smrgmessages for any protocols on the connection.  The sender
464d17cd367Smrgis required to conform to specified severity conditions
465d17cd367Smrgfor generic and ICE (major opcode 0) errors; see
4669ef0b394Smrg<xref linkend='Generic_Error_Classes' xrefstyle='select: title'/>
4679ef0b394Smrg<xref linkend='ICE_Error_Classes' xrefstyle='select: title'/>
468d17cd367Smrg.
469d17cd367SmrgThe class defines the generic class of
470d17cd367Smrgerror.  Classes are specified separately for each protocol (numeric
471d17cd367Smrgvalues can mean different things in different protocols).  The error
472d17cd367Smrgvalues, if any, and their types vary with the specific error class
473d17cd367Smrgfor the protocol.
474d17cd367Smrg</para>
475d17cd367Smrg</chapter>
476d17cd367Smrg
4779ef0b394Smrg<chapter id='ICE_Control_Subprotocol____Major_Opcode_0_0'>
478d17cd367Smrg<title>ICE Control Subprotocol -- Major Opcode 0</title>
479d17cd367Smrg
480d17cd367Smrg<para>
481d17cd367SmrgEach of the ICE control opcodes is described below.
482d17cd367SmrgMost of the messages have additional information included beyond the
483d17cd367Smrgdescription above.  The additional information is appended to the message
484d17cd367Smrgheader and the length field is computed accordingly.
485d17cd367Smrg</para>
486d17cd367Smrg
487d17cd367Smrg<para>
488a3129944SmrgIn the following message descriptions, <quote>Expected errors</quote> indicates
489d17cd367Smrgerrors that may occur in the normal course of events.  Other errors
490d17cd367Smrg(in particular
491d17cd367Smrg<function>BadMajor</function>
492d17cd367Smrg<function>BadMinor</function>
493d17cd367Smrg<function>BadState</function>
494d17cd367Smrg<function>BadLength</function>
495d17cd367Smrg<function>BadValue</function>
496d17cd367Smrg<function>ProtocolDuplicate</function> and
497d17cd367Smrg<function>MajorOpcodeDuplicate</function>
498d17cd367Smrgmight occur, but generally indicate a serious implementation failure on
499d17cd367Smrgthe part of the errant peer.
500d17cd367Smrg</para>
501d17cd367Smrg<para><function>ByteOrder</function></para>
502d17cd367Smrg
503d17cd367Smrg<variablelist>
504d17cd367Smrg  <varlistentry>
505d17cd367Smrg    <term><emphasis remap='I'>byte-order</emphasis>:</term>
506d17cd367Smrg    <listitem>
507d17cd367Smrg      <para>
508d17cd367Smrg{<symbol role='Pn'>MSBfirst</symbol>,
509d17cd367Smrg<function>LSBfirst</function>
510d17cd367Smrg      </para>
511d17cd367Smrg    </listitem>
512d17cd367Smrg  </varlistentry>
513d17cd367Smrg</variablelist>
514d17cd367Smrg
515d17cd367Smrg<para>
516d17cd367SmrgBoth parties must send this message before sending any other,
517d17cd367Smrgincluding errors.  This message specifies the byte order that
518d17cd367Smrgwill be used on subsequent messages sent by this party.
519d17cd367Smrg</para>
520d17cd367Smrg
521d17cd367Smrg<note>
522d17cd367Smrg<para>
523d17cd367SmrgNote:  If the receiver detects an error in this message,
524d17cd367Smrgit must be sure to send its own
525d17cd367Smrg<function>ByteOrder</function> message before sending the
526d17cd367Smrg<function>Error</function>.
527d17cd367Smrg</para>
528d17cd367Smrg</note>
529d17cd367Smrg
530d17cd367Smrg<para><function>ConnectionSetup</function></para>
531d17cd367Smrg
532d17cd367Smrg<variablelist>
533d17cd367Smrg  <varlistentry>
534d17cd367Smrg    <term><emphasis remap='I'>versions</emphasis>:</term>
535d17cd367Smrg    <listitem>
536d17cd367Smrg      <para>LISTofVERSION</para>
537d17cd367Smrg    </listitem>
538d17cd367Smrg  </varlistentry>
539d17cd367Smrg  <varlistentry>
540d17cd367Smrg    <term><emphasis remap='I'>must-authenticate</emphasis>:</term>
541d17cd367Smrg    <listitem>
542d17cd367Smrg      <para>BOOL</para>
543d17cd367Smrg    </listitem>
544d17cd367Smrg  </varlistentry>
545d17cd367Smrg  <varlistentry>
546d17cd367Smrg    <term><emphasis remap='I'>authentication-protocol-names</emphasis>:</term>
547d17cd367Smrg    <listitem>
548d17cd367Smrg      <para>LISTofSTRING</para>
549d17cd367Smrg    </listitem>
550d17cd367Smrg  </varlistentry>
551d17cd367Smrg  <varlistentry>
552d17cd367Smrg    <term><emphasis remap='I'>vendor</emphasis>:</term>
553d17cd367Smrg    <listitem>
554d17cd367Smrg      <para>STRING</para>
555d17cd367Smrg    </listitem>
556d17cd367Smrg  </varlistentry>
557d17cd367Smrg  <varlistentry>
558d17cd367Smrg    <term><emphasis remap='I'>release</emphasis>:</term>
559d17cd367Smrg    <listitem>
560d17cd367Smrg      <para>STRING</para>
561d17cd367Smrg    </listitem>
562d17cd367Smrg  </varlistentry>
563d17cd367Smrg  <varlistentry>
564d17cd367Smrg    <term>Responses:</term>
565d17cd367Smrg    <listitem>
566d17cd367Smrg      <para>
567d17cd367Smrg<function>ConnectionReply</function>,
568d17cd367Smrg<function>AuthenticationRequired</function> (See note)
569d17cd367Smrg      </para>
570d17cd367Smrg    </listitem>
571d17cd367Smrg  </varlistentry>
572d17cd367Smrg  <varlistentry>
573d17cd367Smrg    <term>Expected errors:</term>
574d17cd367Smrg    <listitem>
575d17cd367Smrg      <para>
576d17cd367Smrg<function>NoVersion</function>,
577d17cd367Smrg<function>SetupFailed</function>,
578d17cd367Smrg<function>NoAuthentication</function>,
579d17cd367Smrg<function>AuthenticationRejected</function>,
580d17cd367Smrg<function>AuthenticationFailed</function>
581d17cd367Smrg      </para>
582d17cd367Smrg    </listitem>
583d17cd367Smrg  </varlistentry>
584d17cd367Smrg</variablelist>
585d17cd367Smrg
586d17cd367Smrg<para>
587d17cd367SmrgThe party that initiates the connection (the one that does the
588d17cd367Smrg"connect()") must send this message as the second message (after
589d17cd367Smrg<function>ByteOrder</function> on startup.
590d17cd367Smrg</para>
591d17cd367Smrg
592d17cd367Smrg<para>
593d17cd367SmrgVersions gives a list, in decreasing order of preference, of the
594d17cd367Smrgprotocol versions this party is capable of speaking.  This document
595d17cd367Smrgspecifies major version 1, minor version 0.
596d17cd367Smrg</para>
597d17cd367Smrg
598d17cd367Smrg<para>
599d17cd367SmrgIf must-authenticate is <function>True</function> the initiating
600d17cd367Smrgparty demands authentication; the accepting party
601d17cd367Smrg<emphasis remap='I'>must</emphasis> pick an authentication scheme
602d17cd367Smrgand use it.  In this case, the only valid response is
603d17cd367Smrg<function>AuthenticationRequired</function>
604d17cd367Smrg</para>
605d17cd367Smrg
606d17cd367Smrg<para>
607d17cd367SmrgIf must-authenticate is <function>False</function> the accepting
608d17cd367Smrgparty may choose an authentication mechanism, use a host-address-based
609d17cd367Smrgauthentication scheme, or skip authentication.  When must-authenticate
610d17cd367Smrgis <function>False</function> <function>ConnectionReply</function> and
611d17cd367Smrg<function>AuthenticationRequired</function> are both valid responses.
612d17cd367SmrgIf a host-address-based authentication scheme is used,
613d17cd367Smrg<function>AuthenticationRejected</function> and
614d17cd367Smrg<function>AuthenticationFailed</function> errors are possible.
615d17cd367Smrg</para>
616d17cd367Smrg
617d17cd367Smrg<para>
618d17cd367SmrgAuthentication-protocol-names specifies a (possibly null, if
619d17cd367Smrgmust-authenticate is <function>False</function>
620d17cd367Smrglist of authentication protocols the party is willing to perform.  If
621d17cd367Smrgmust-authenticate is <function>True</function>
622d17cd367Smrgpresumably the party will offer only authentication mechanisms
623d17cd367Smrgallowing mutual authentication.
624d17cd367Smrg</para>
625d17cd367Smrg
626d17cd367Smrg<para>
627d17cd367SmrgVendor gives the name of the vendor of this ICE implementation.
628d17cd367Smrg</para>
629d17cd367Smrg
630d17cd367Smrg<para>
631d17cd367SmrgRelease gives the release identifier of this ICE implementation.
632d17cd367Smrg</para>
633d17cd367Smrg
634d17cd367Smrg<para><function>AuthenticationRequired</function></para>
635d17cd367Smrg
636d17cd367Smrg<variablelist>
637d17cd367Smrg  <varlistentry>
638d17cd367Smrg    <term><emphasis remap='I'>authentication-protocol-index</emphasis>:</term>
639d17cd367Smrg    <listitem>
640d17cd367Smrg      <para>CARD8</para>
641d17cd367Smrg    </listitem>
642d17cd367Smrg  </varlistentry>
643d17cd367Smrg  <varlistentry>
644d17cd367Smrg    <term><emphasis remap='I'>data</emphasis>:</term>
645d17cd367Smrg    <listitem>
646d17cd367Smrg      <para>&lt;specific to authentication protocol&gt;</para>
647d17cd367Smrg    </listitem>
648d17cd367Smrg  </varlistentry>
649d17cd367Smrg  <varlistentry>
650d17cd367Smrg    <term>Response:</term>
651d17cd367Smrg    <listitem>
652d17cd367Smrg      <para><function>AuthenticationReply</function></para>
653d17cd367Smrg    </listitem>
654d17cd367Smrg  </varlistentry>
655d17cd367Smrg    <varlistentry>
656d17cd367Smrg    <term>Expected errors:</term>
657d17cd367Smrg    <listitem>
658d17cd367Smrg      <para>
659d17cd367Smrg<function>AuthenticationRejected</function>,
660d17cd367Smrg<function>AuthenticationFailed</function>
661d17cd367Smrg      </para>
662d17cd367Smrg    </listitem>
663d17cd367Smrg  </varlistentry>
664d17cd367Smrg</variablelist>
665d17cd367Smrg
666d17cd367Smrg<para>
667d17cd367SmrgThis message is sent in response to a <function>ConnectionSetup</function>
668d17cd367Smrgor <function>ProtocolSetup</function>
669d17cd367Smrgmessage to specify that authentication is to be done and what
670d17cd367Smrgauthentication mechanism is to be used.
671d17cd367Smrg</para>
672d17cd367Smrg
673d17cd367Smrg<para>
674d17cd367SmrgThe authentication protocol is specified by a 0-based index into the list
675d17cd367Smrgof names given in the <function>ConnectionSetup</function> or
676d17cd367Smrg<function>ProtocolSetup</function>
677d17cd367SmrgAny protocol-specific data that might be required is also sent.
678d17cd367Smrg</para>
679d17cd367Smrg
680d17cd367Smrg
681d17cd367Smrg<para><function>AuthenticationReply</function></para>
682d17cd367Smrg<variablelist>
683d17cd367Smrg  <varlistentry>
684d17cd367Smrg    <term><emphasis remap='I'>data</emphasis>:</term>
685d17cd367Smrg    <listitem>
686d17cd367Smrg      <para>&lt;specific to authentication protocol&gt;</para>
687d17cd367Smrg    </listitem>
688d17cd367Smrg  </varlistentry>
689d17cd367Smrg  <varlistentry>
690d17cd367Smrg    <term>Responses:</term>
691d17cd367Smrg    <listitem>
692d17cd367Smrg      <para>
693d17cd367Smrg<function>AuthenticationNextPhase</function>,
694d17cd367Smrg<function>ConnectionReply</function>,
695d17cd367Smrg<function>ProtocolReply</function>
696d17cd367Smrg      </para>
697d17cd367Smrg    </listitem>
698d17cd367Smrg  </varlistentry>
699d17cd367Smrg  <varlistentry>
700d17cd367Smrg    <term>Expected errors:</term>
701d17cd367Smrg    <listitem>
702d17cd367Smrg      <para>
703d17cd367Smrg<function>AuthenticationRejected</function>,
704d17cd367Smrg<function>AuthenticationFailed</function>,
705d17cd367Smrg<function>SetupFailed</function>
706d17cd367Smrg      </para>
707d17cd367Smrg    </listitem>
708d17cd367Smrg  </varlistentry>
709d17cd367Smrg</variablelist>
710d17cd367Smrg
711d17cd367Smrg<para>
712d17cd367SmrgThis message is sent in response to an
713d17cd367Smrg<function>AuthenticationRequired</function> or
714d17cd367Smrg<function>AuthenticationNextPhase</function> message, to
715d17cd367Smrgsupply authentication data as defined by the authentication protocol
716d17cd367Smrgbeing used.
717d17cd367Smrg</para>
718d17cd367Smrg
719d17cd367Smrg<para>
720d17cd367SmrgNote that this message is sent by the party that initiated the current
721d17cd367Smrgnegotiation -- the party that sent the
722d17cd367Smrg<function>ConnectionSetup</function> or
723d17cd367Smrg<function>ProtocolSetup</function> message.
724d17cd367Smrg</para>
725d17cd367Smrg
726d17cd367Smrg<para>
727d17cd367Smrg<function>AuthenticationNextPhase</function>
728d17cd367Smrgindicates that more is to be done to complete the authentication.
729d17cd367SmrgIf the authentication is complete,
730d17cd367Smrg<function>ConnectionReply</function>
731d17cd367Smrgis appropriate if the current authentication handshake is the result of a
732d17cd367Smrg<function>ConnectionSetup</function> and a
733d17cd367Smrg<function>ProtocolReply</function>
734d17cd367Smrgis appropriate if it is the result of a
735d17cd367Smrg<function>ProtocolSetup</function>.
736d17cd367Smrg</para>
737d17cd367Smrg
738d17cd367Smrg<para><function>AuthenticationNextPhase</function></para>
739d17cd367Smrg
740d17cd367Smrg<variablelist>
741d17cd367Smrg  <varlistentry>
742d17cd367Smrg    <term><emphasis remap='I'>data</emphasis>:</term>
743d17cd367Smrg    <listitem>
744d17cd367Smrg      <para>&lt;specific to authentication protocol&gt;</para>
745d17cd367Smrg    </listitem>
746d17cd367Smrg  </varlistentry>
747d17cd367Smrg  <varlistentry>
748d17cd367Smrg    <term>Response:</term>
749d17cd367Smrg    <listitem>
750d17cd367Smrg      <para><function>AuthenticationReply</function></para>
751d17cd367Smrg    </listitem>
752d17cd367Smrg  </varlistentry>
753d17cd367Smrg  <varlistentry>
754d17cd367Smrg    <term>Expected errors:</term>
755d17cd367Smrg    <listitem>
756d17cd367Smrg      <para>
757d17cd367Smrg<function>AuthenticationRejected</function>,
758d17cd367Smrg<function>AuthenticationFailed</function>
759d17cd367Smrg      </para>
760d17cd367Smrg    </listitem>
761d17cd367Smrg  </varlistentry>
762d17cd367Smrg</variablelist>
763d17cd367Smrg
764d17cd367Smrg<para>
765d17cd367SmrgThis message is sent in response to an
766d17cd367Smrg<function>AuthenticationReply</function>
767d17cd367Smrgmessage, to supply authentication data as defined by the authentication
768d17cd367Smrgprotocol being used.
769d17cd367Smrg</para>
770d17cd367Smrg
771d17cd367Smrg<para><function>ConnectionReply</function></para>
772d17cd367Smrg<variablelist>
773d17cd367Smrg  <varlistentry>
774d17cd367Smrg    <term><emphasis remap='I'>version-index</emphasis>:</term>
775d17cd367Smrg    <listitem>
776d17cd367Smrg      <para>CARD8</para>
777d17cd367Smrg    </listitem>
778d17cd367Smrg  </varlistentry>
779d17cd367Smrg  <varlistentry>
780d17cd367Smrg    <term><emphasis remap='I'>vendor</emphasis>:</term>
781d17cd367Smrg    <listitem>
782d17cd367Smrg      <para>STRING</para>
783d17cd367Smrg    </listitem>
784d17cd367Smrg  </varlistentry>
785d17cd367Smrg  <varlistentry>
786d17cd367Smrg    <term><emphasis remap='I'>release</emphasis>:</term>
787d17cd367Smrg    <listitem>
788d17cd367Smrg      <para>STRING</para>
789d17cd367Smrg    </listitem>
790d17cd367Smrg  </varlistentry>
791d17cd367Smrg</variablelist>
792d17cd367Smrg
793d17cd367Smrg<para>
794d17cd367SmrgThis message is sent in response to a
795d17cd367Smrg<function>ConnectionSetup</function> or
796d17cd367Smrg<function>AuthenticationReply</function>
797d17cd367Smrgmessage to indicate that the authentication handshake is complete.
798d17cd367Smrg</para>
799d17cd367Smrg
800d17cd367Smrg<para>
801d17cd367SmrgVersion-index gives a 0-based index into the list of versions offered in
802d17cd367Smrgthe <function>ConnectionSetup</function> message; it specifies the
803d17cd367Smrgversion of the ICE protocol that both parties
804d17cd367Smrgshould speak for the duration of the connection.
805d17cd367Smrg</para>
806d17cd367Smrg
807d17cd367Smrg<para>Vendor gives the name of the vendor of this ICE implementation.</para>
808d17cd367Smrg
809d17cd367Smrg<para>
810d17cd367SmrgRelease gives the release identifier of this ICE implementation.
811d17cd367Smrg</para>
812d17cd367Smrg
813d17cd367Smrg<para><function>ProtocolSetup</function></para>
814d17cd367Smrg
815d17cd367Smrg<variablelist>
816d17cd367Smrg  <varlistentry>
817d17cd367Smrg    <term><emphasis remap='I'>protocol-name</emphasis>:</term>
818d17cd367Smrg    <listitem>
819d17cd367Smrg      <para>STRING</para>
820d17cd367Smrg    </listitem>
821d17cd367Smrg  </varlistentry>
822d17cd367Smrg  <varlistentry>
823d17cd367Smrg    <term><emphasis remap='I'>major-opcode</emphasis>:</term>
824d17cd367Smrg    <listitem>
825d17cd367Smrg      <para>CARD8</para>
826d17cd367Smrg    </listitem>
827d17cd367Smrg  </varlistentry>
828d17cd367Smrg  <varlistentry>
829d17cd367Smrg    <term><emphasis remap='I'>versions</emphasis>:</term>
830d17cd367Smrg    <listitem>
831d17cd367Smrg      <para>LISTofVERSION</para>
832d17cd367Smrg    </listitem>
833d17cd367Smrg  </varlistentry>
834d17cd367Smrg  <varlistentry>
835d17cd367Smrg    <term><emphasis remap='I'>vendor</emphasis>:</term>
836d17cd367Smrg    <listitem>
837d17cd367Smrg      <para>STRING</para>
838d17cd367Smrg    </listitem>
839d17cd367Smrg  </varlistentry>
840d17cd367Smrg  <varlistentry>
841d17cd367Smrg    <term><emphasis remap='I'>release</emphasis>:</term>
842d17cd367Smrg    <listitem>
843d17cd367Smrg      <para>STRING</para>
844d17cd367Smrg    </listitem>
845d17cd367Smrg  </varlistentry>
846d17cd367Smrg  <varlistentry>
847d17cd367Smrg    <term><emphasis remap='I'>must-authenticate</emphasis>:</term>
848d17cd367Smrg    <listitem>
849d17cd367Smrg      <para>BOOL</para>
850d17cd367Smrg    </listitem>
851d17cd367Smrg  </varlistentry>
852d17cd367Smrg  <varlistentry>
853d17cd367Smrg  <term><emphasis remap='I'>authentication-protocol-names</emphasis>:</term>
854d17cd367Smrg    <listitem>
855d17cd367Smrg      <para>LISTofSTRING</para>
856d17cd367Smrg    </listitem>
857d17cd367Smrg  </varlistentry>
858d17cd367Smrg  <varlistentry>
859d17cd367Smrg    <term>Responses:</term>
860d17cd367Smrg    <listitem>
861d17cd367Smrg      <para>
862d17cd367Smrg<function>AuthenticationRequired</function>,
863d17cd367Smrg<function>ProtocolReply</function>
864d17cd367Smrg      </para>
865d17cd367Smrg    </listitem>
866d17cd367Smrg  </varlistentry>
867d17cd367Smrg  <varlistentry>
868d17cd367Smrg    <term>Expected errors:</term>
869d17cd367Smrg    <listitem>
870d17cd367Smrg      <para>
871d17cd367Smrg<function>UnknownProtocol</function>,
872d17cd367Smrg<function>NoVersion</function>,
873d17cd367Smrg<function>SetupFailed</function>,
874d17cd367Smrg<function>NoAuthentication</function>,
875d17cd367Smrg<function>AuthenticationRejected</function>,
876d17cd367Smrg<function>AuthenticationFailed</function>
877d17cd367Smrg      </para>
878d17cd367Smrg    </listitem>
879d17cd367Smrg  </varlistentry>
880d17cd367Smrg</variablelist>
881d17cd367Smrg
882d17cd367Smrg<para>
883d17cd367SmrgThis message is used to initiate negotiation of a protocol and
884d17cd367Smrgestablish any authentication specific to it.
885d17cd367Smrg</para>
886d17cd367Smrg
887d17cd367Smrg<para>
888d17cd367SmrgProtocol-name gives the name of the protocol the party wishes
889d17cd367Smrgto speak.
890d17cd367Smrg</para>
891d17cd367Smrg
892d17cd367Smrg<para>
893d17cd367SmrgMajor-opcode gives the opcode that the party will use in messages
894d17cd367Smrgit sends.
895d17cd367Smrg</para>
896d17cd367Smrg
897d17cd367Smrg<para>
898d17cd367SmrgVersions gives a list of version numbers, in decreasing order of
899d17cd367Smrgpreference, that the party is willing to speak.
900d17cd367Smrg</para>
901d17cd367Smrg
902d17cd367Smrg<para>
903d17cd367SmrgVendor and release are identification strings with semantics defined
904d17cd367Smrgby the specific protocol being negotiated.
905d17cd367Smrg</para>
906d17cd367Smrg
907d17cd367Smrg<para>
908d17cd367SmrgIf must-authenticate is <function>True</function>,
909d17cd367Smrgthe initiating party demands authentication; the accepting party
910d17cd367Smrg<emphasis remap='I'>must</emphasis> pick an authentication scheme
911d17cd367Smrgand use it.  In this case, the only valid response is
912d17cd367Smrg<function>AuthenticationRequired</function>
913d17cd367Smrg</para>
914d17cd367Smrg
915d17cd367Smrg<para>
916d17cd367SmrgIf must-authenticate is <function>False</function>,
917d17cd367Smrgthe accepting party may choose an authentication mechanism, use a
918d17cd367Smrghost-address-based authentication scheme, or skip authentication.
919d17cd367SmrgWhen must-authenticate is <function>False</function>,
920d17cd367Smrg<function>ProtocolReply</function> and
921d17cd367Smrg<function>AuthenticationRequired</function>
922d17cd367Smrgare both valid responses.  If a host-address-based authentication
923d17cd367Smrgscheme is used, <function>AuthenticationRejected</function> and
924d17cd367Smrg<function>AuthenticationFailed</function> errors are possible.
925d17cd367Smrg</para>
926d17cd367Smrg
927d17cd367Smrg<para>
928d17cd367SmrgAuthentication-protocol-names  specifies a (possibly null, if
929d17cd367Smrgmust-authenticate is <function>False</function>
930d17cd367Smrglist of authentication protocols the party is willing to perform.  If
931d17cd367Smrgmust-authenticate is <function>True</function>
932d17cd367Smrgpresumably the party will offer only authentication mechanisms
933d17cd367Smrgallowing mutual authentication.
934d17cd367Smrg</para>
935d17cd367Smrg
936d17cd367Smrg<para><function>ProtocolReply</function></para>
937d17cd367Smrg<variablelist>
938d17cd367Smrg  <varlistentry>
939d17cd367Smrg    <term><emphasis remap='I'>major-opcode</emphasis>:</term>
940d17cd367Smrg    <listitem>
941d17cd367Smrg      <para>CARD8</para>
942d17cd367Smrg    </listitem>
943d17cd367Smrg  </varlistentry>
944d17cd367Smrg  <varlistentry>
945d17cd367Smrg    <term><emphasis remap='I'>version-index</emphasis>:</term>
946d17cd367Smrg    <listitem>
947d17cd367Smrg      <para>CARD8</para>
948d17cd367Smrg    </listitem>
949d17cd367Smrg  </varlistentry>
950d17cd367Smrg  <varlistentry>
951d17cd367Smrg    <term><emphasis remap='I'>vendor</emphasis>:</term>
952d17cd367Smrg    <listitem>
953d17cd367Smrg      <para>STRING</para>
954d17cd367Smrg    </listitem>
955d17cd367Smrg  </varlistentry>
956d17cd367Smrg  <varlistentry>
957d17cd367Smrg    <term><emphasis remap='I'>release</emphasis>:</term>
958d17cd367Smrg    <listitem>
959d17cd367Smrg      <para>STRING</para>
960d17cd367Smrg    </listitem>
961d17cd367Smrg  </varlistentry>
962d17cd367Smrg</variablelist>
963d17cd367Smrg
964d17cd367Smrg<para>
965d17cd367SmrgThis message is sent in response to a <function>ProtocolSetup</function>
966d17cd367Smrgor <function>AuthenticationReply</function>
967d17cd367Smrgmessage to indicate that the authentication handshake is complete.
968d17cd367Smrg</para>
969d17cd367Smrg
970d17cd367Smrg<para>
971d17cd367SmrgMajor-opcode gives the opcode that this party will use in
972d17cd367Smrgmessages that it sends.
973d17cd367Smrg</para>
974d17cd367Smrg
975d17cd367Smrg<para>
976d17cd367SmrgVersion-index gives a 0-based index into the list of versions offered in the
977d17cd367Smrg<function>ProtocolSetup</function> message; it specifies the version
978d17cd367Smrgof the protocol that both parties should speak for the duration of
979d17cd367Smrgthe connection.
980d17cd367Smrg</para>
981d17cd367Smrg
982d17cd367Smrg<para>
983d17cd367SmrgVendor and release are identification strings with semantics defined
984d17cd367Smrgby the specific protocol being negotiated.
985d17cd367Smrg</para>
986d17cd367Smrg
987d17cd367Smrg<para><function>Ping</function></para>
988d17cd367Smrg<variablelist>
989d17cd367Smrg  <varlistentry>
990d17cd367Smrg    <term>Response:</term>
991d17cd367Smrg    <listitem>
992d17cd367Smrg      <para><function>PingReply</function></para>
993d17cd367Smrg    </listitem>
994d17cd367Smrg  </varlistentry>
995d17cd367Smrg</variablelist>
996d17cd367Smrg
997d17cd367Smrg<para>
998d17cd367SmrgThis message is used to test if the connection is still functioning.
999d17cd367Smrg</para>
1000d17cd367Smrg
1001d17cd367Smrg<para><function>PingReply</function></para>
1002d17cd367Smrg
1003d17cd367Smrg<para>
1004d17cd367SmrgThis message is sent in response to a <function>Ping</function>
1005d17cd367Smrgmessage, indicating that the connection is still functioning.
1006d17cd367Smrg</para>
1007d17cd367Smrg
1008d17cd367Smrg<para><function>WantToClose</function></para>
1009d17cd367Smrg<variablelist>
1010d17cd367Smrg  <varlistentry>
1011d17cd367Smrg    <term>Responses:</term>
1012d17cd367Smrg    <listitem>
1013d17cd367Smrg      <para>
1014d17cd367Smrg<function>WantToClose</function>,
1015d17cd367Smrg<function>NoClose</function>,
1016d17cd367Smrg<function>ProtocolSetup</function>
1017d17cd367Smrg      </para>
1018d17cd367Smrg    </listitem>
1019d17cd367Smrg  </varlistentry>
1020d17cd367Smrg</variablelist>
1021d17cd367Smrg
1022d17cd367Smrg
1023d17cd367Smrg<para>
1024d17cd367SmrgThis message is used to initiate a possible close of the connection.
1025d17cd367SmrgThe sending party has noticed that, as a result of mechanisms specific
1026d17cd367Smrgto each protocol, there are no active protocols left.
1027d17cd367SmrgThere are four possible scenarios arising from this request:
1028d17cd367Smrg</para>
1029d17cd367Smrg
1030d17cd367Smrg<orderedlist>
1031d17cd367Smrg  <listitem>
1032d17cd367Smrg    <para>
1033d17cd367SmrgThe receiving side noticed too, and has already sent a
1034d17cd367Smrg<function>WantToClose</function> On receiving a
1035d17cd367Smrg<function>WantToClose</function> while already attempting to
1036d17cd367Smrgshut down, each party should simply close the connection.
1037d17cd367Smrg    </para>
1038d17cd367Smrg  </listitem>
1039d17cd367Smrg  <listitem>
1040d17cd367Smrg    <para>
1041d17cd367SmrgThe receiving side hasn't noticed, but agrees.  It closes the connection.
1042d17cd367Smrg    </para>
1043d17cd367Smrg  </listitem>
1044d17cd367Smrg  <listitem>
1045d17cd367Smrg    <para>
1046d17cd367SmrgThe receiving side has a <function>ProtocolSetup</function>
1047d17cd367Smrg"in flight," in which case it is to ignore
1048d17cd367Smrg<function>WantToClose</function> and the party sending
1049d17cd367Smrg<function>WantToClose</function> is to abandon the shutdown attempt
1050d17cd367Smrgwhen it receives the <function>ProtocolSetup</function>
1051d17cd367Smrg    </para>
1052d17cd367Smrg  </listitem>
1053d17cd367Smrg  <listitem>
1054d17cd367Smrg    <para>
1055d17cd367SmrgThe receiving side wants the connection kept open for some
1056d17cd367Smrgreason not specified by the ICE protocol, in which case it
1057d17cd367Smrgsends <function>NoClose</function>
1058d17cd367Smrg    </para>
1059d17cd367Smrg  </listitem>
1060d17cd367Smrg</orderedlist>
1061d17cd367Smrg
1062d17cd367Smrg<para>
1063d17cd367SmrgSee the state transition diagram for additional information.
1064d17cd367Smrg</para>
1065d17cd367Smrg
1066d17cd367Smrg<para><function>NoClose</function></para>
1067d17cd367Smrg
1068d17cd367Smrg<para>
1069d17cd367SmrgThis message is sent in response to a <function>WantToClose</function>
1070d17cd367Smrgmessage to indicate that the responding party does not want the
1071d17cd367Smrgconnection closed at this time.  The receiving party should not close the
1072d17cd367Smrgconnection.  Either party may again initiate
1073d17cd367Smrg<function>WantToClose</function> at some future time.
1074d17cd367Smrg</para>
1075d17cd367Smrg
10769ef0b394Smrg<sect1 id='Generic_Error_Classes'>
1077d17cd367Smrg<title>Generic Error Classes</title>
1078d17cd367Smrg
1079d17cd367Smrg<para>
1080d17cd367SmrgThese errors should be used by all protocols, as applicable.
1081d17cd367SmrgFor ICE (major opcode 0), <function>FatalToProtocol</function>
1082d17cd367Smrgshould be interpreted as <function>FatalToConnection</function>.
1083d17cd367Smrg</para>
1084d17cd367Smrg
1085d17cd367Smrg<para><function>BadMinor</function></para>
1086d17cd367Smrg
1087d17cd367Smrg<variablelist>
1088d17cd367Smrg  <varlistentry>
1089d17cd367Smrg    <term><emphasis remap='I'>offending-minor-opcode</emphasis>:</term>
1090d17cd367Smrg    <listitem>
1091d17cd367Smrg      <para>&lt;any&gt;</para>
1092d17cd367Smrg    </listitem>
1093d17cd367Smrg  </varlistentry>
1094d17cd367Smrg  <varlistentry>
1095d17cd367Smrg    <term><emphasis remap='I'>severity</emphasis>:</term>
1096d17cd367Smrg    <listitem>
1097d17cd367Smrg      <para>
1098d17cd367Smrg<function>FatalToProtocol</function> or
1099d17cd367Smrg<function>CanContinue</function>
1100d17cd367Smrg(protocol's discretion)
1101d17cd367Smrg      </para>
1102d17cd367Smrg    </listitem>
1103d17cd367Smrg  </varlistentry>
1104d17cd367Smrg  <varlistentry>
1105d17cd367Smrg    <term><emphasis remap='I'>values</emphasis>:</term>
1106d17cd367Smrg    <listitem>
1107d17cd367Smrg      <para>(none)</para>
1108d17cd367Smrg    </listitem>
1109d17cd367Smrg  </varlistentry>
1110d17cd367Smrg</variablelist>
1111d17cd367Smrg
1112d17cd367Smrg<para>
1113d17cd367SmrgReceived a message with an unknown minor opcode.
1114d17cd367Smrg</para>
1115d17cd367Smrg
1116d17cd367Smrg<para><function>BadState</function></para>
1117d17cd367Smrg<variablelist>
1118d17cd367Smrg  <varlistentry>
1119d17cd367Smrg    <term><emphasis remap='I'>offending-minor-opcode</emphasis>:</term>
1120d17cd367Smrg    <listitem>
1121d17cd367Smrg      <para>&lt;any&gt;</para>
1122d17cd367Smrg    </listitem>
1123d17cd367Smrg  </varlistentry>
1124d17cd367Smrg  <varlistentry>
1125d17cd367Smrg    <term><emphasis remap='I'>severity</emphasis>:</term>
1126d17cd367Smrg    <listitem>
1127d17cd367Smrg      <para>
1128d17cd367Smrg<function>FatalToProtocol</function> or
1129d17cd367Smrg<function>CanContinue</function> (protocol's discretion)
1130d17cd367Smrg      </para>
1131d17cd367Smrg    </listitem>
1132d17cd367Smrg  </varlistentry>
1133d17cd367Smrg  <varlistentry>
1134d17cd367Smrg    <term><emphasis remap='I'>values</emphasis>:</term>
1135d17cd367Smrg    <listitem>
1136d17cd367Smrg      <para>(none)</para>
1137d17cd367Smrg    </listitem>
1138d17cd367Smrg  </varlistentry>
1139d17cd367Smrg</variablelist>
1140d17cd367Smrg
1141d17cd367Smrg<para>
1142d17cd367SmrgReceived a message with a valid minor opcode which is not appropriate
1143d17cd367Smrgfor the current state of the protocol.
1144d17cd367Smrg</para>
1145d17cd367Smrg
1146d17cd367Smrg<para><function>BadLength</function></para>
1147d17cd367Smrg
1148d17cd367Smrg<variablelist>
1149d17cd367Smrg  <varlistentry>
1150d17cd367Smrg    <term><emphasis remap='I'>offending-minor-opcode</emphasis>:</term>
1151d17cd367Smrg    <listitem>
1152d17cd367Smrg      <para>&lt;any&gt;</para>
1153d17cd367Smrg    </listitem>
1154d17cd367Smrg  </varlistentry>
1155d17cd367Smrg  <varlistentry>
1156d17cd367Smrg    <term><emphasis remap='I'>severity</emphasis>:</term>
1157d17cd367Smrg    <listitem>
1158d17cd367Smrg      <para>
1159d17cd367Smrg<function>FatalToProtocol</function> or
1160d17cd367Smrg<function>CanContinue</function> (protocol's discretion)
1161d17cd367Smrg      </para>
1162d17cd367Smrg    </listitem>
1163d17cd367Smrg  </varlistentry>
1164d17cd367Smrg  <varlistentry>
1165d17cd367Smrg    <term><emphasis remap='I'>values</emphasis>:</term>
1166d17cd367Smrg    <listitem>
1167d17cd367Smrg      <para>(none)</para>
1168d17cd367Smrg    </listitem>
1169d17cd367Smrg  </varlistentry>
1170d17cd367Smrg</variablelist>
1171d17cd367Smrg
1172d17cd367Smrg<para>
1173d17cd367SmrgReceived a message with a bad length.  The length of the message is
1174d17cd367Smrglonger or shorter than required to contain the data.
1175d17cd367Smrg</para>
1176d17cd367Smrg
1177d17cd367Smrg<para><function>BadValue</function></para>
1178d17cd367Smrg
1179d17cd367Smrg<variablelist>
1180d17cd367Smrg  <varlistentry>
1181d17cd367Smrg    <term><emphasis remap='I'>offending-minor-opcode</emphasis>:</term>
1182d17cd367Smrg    <listitem>
1183d17cd367Smrg      <para>&lt;any&gt;</para>
1184d17cd367Smrg  </listitem>
1185d17cd367Smrg  </varlistentry>
1186d17cd367Smrg  <varlistentry>
1187d17cd367Smrg    <term><emphasis remap='I'>severity</emphasis>:</term>
1188d17cd367Smrg    <listitem>
1189d17cd367Smrg      <para><function>CanContinue</function></para>
1190d17cd367Smrg    </listitem>
1191d17cd367Smrg  </varlistentry>
1192d17cd367Smrg  <varlistentry>
1193d17cd367Smrg    <term><emphasis remap='I'>values</emphasis>:</term>
1194d17cd367Smrg    <listitem>
1195d17cd367Smrg      <para>
1196d17cd367SmrgCARD32 Byte offset to offending value in offending message.
1197d17cd367SmrgCARD32 Length of offending value.
1198d17cd367Smrg&lt;varies&gt; Offending value
1199d17cd367Smrg      </para>
1200d17cd367Smrg    </listitem>
1201d17cd367Smrg  </varlistentry>
1202d17cd367Smrg</variablelist>
1203d17cd367Smrg
1204d17cd367Smrg<para>Received a message with a bad value specified.</para>
1205d17cd367Smrg
1206d17cd367Smrg</sect1>
1207d17cd367Smrg
12089ef0b394Smrg<sect1 id='ICE_Error_Classes'>
1209d17cd367Smrg<title>ICE Error Classes</title>
1210d17cd367Smrg
1211d17cd367Smrg<para>These errors are all major opcode 0 errors.</para>
1212d17cd367Smrg
1213d17cd367Smrg<para><function>BadMajor</function></para>
1214d17cd367Smrg<variablelist>
1215d17cd367Smrg  <varlistentry>
1216d17cd367Smrg    <term><emphasis remap='I'>offending-minor-opcode</emphasis>:</term>
1217d17cd367Smrg    <listitem>
1218d17cd367Smrg      <para>&lt;any&gt;</para>
1219d17cd367Smrg    </listitem>
1220d17cd367Smrg  </varlistentry>
1221d17cd367Smrg  <varlistentry>
1222d17cd367Smrg    <term><emphasis remap='I'>severity</emphasis>:</term>
1223d17cd367Smrg    <listitem>
1224d17cd367Smrg      <para><function>CanContinue</function></para>
1225d17cd367Smrg    </listitem>
1226d17cd367Smrg  </varlistentry>
1227d17cd367Smrg  <varlistentry>
1228d17cd367Smrg    <term><emphasis remap='I'>values</emphasis>:</term>
1229d17cd367Smrg    <listitem>
1230d17cd367Smrg      <para>CARD8 Opcode</para>
1231d17cd367Smrg    </listitem>
1232d17cd367Smrg  </varlistentry>
1233d17cd367Smrg</variablelist>
1234d17cd367Smrg
1235d17cd367Smrg<para>The opcode given is not one that has been registered.</para>
1236d17cd367Smrg
1237d17cd367Smrg
1238d17cd367Smrg<para><function>NoAuthentication</function></para>
1239d17cd367Smrg
1240d17cd367Smrg<variablelist>
1241d17cd367Smrg  <varlistentry>
1242d17cd367Smrg    <term><emphasis remap='I'>offending-minor-opcode</emphasis>:</term>
1243d17cd367Smrg    <listitem>
1244d17cd367Smrg      <para>
1245d17cd367Smrg<function>ConnectionSetup</function>,
1246d17cd367Smrg<function>ProtocolSetup</function>
1247d17cd367Smrg      </para>
1248d17cd367Smrg    </listitem>
1249d17cd367Smrg  </varlistentry>
1250d17cd367Smrg  <varlistentry>
1251d17cd367Smrg    <term><emphasis remap='I'>severity</emphasis>:</term>
1252d17cd367Smrg    <listitem>
1253d17cd367Smrg      <para>
1254d17cd367Smrg<function>ConnectionSetup</function> \(-&gt;
1255d17cd367Smrg<function>FatalToConnection</function>
1256d17cd367Smrg<function>ProtocolSetup</function> \(-&gt;
1257d17cd367Smrg<function>FatalToProtocol</function>
1258d17cd367Smrg       </para>
1259d17cd367Smrg    </listitem>
1260d17cd367Smrg  </varlistentry>
1261d17cd367Smrg  <varlistentry>
1262d17cd367Smrg    <term><emphasis remap='I'>values</emphasis>:</term>
1263d17cd367Smrg    <listitem>
1264d17cd367Smrg      <para>(none)</para>
1265d17cd367Smrg    </listitem>
1266d17cd367Smrg  </varlistentry>
1267d17cd367Smrg</variablelist>
1268d17cd367Smrg
1269d17cd367Smrg<para>None of the authentication protocols offered are available.</para>
1270d17cd367Smrg
1271d17cd367Smrg<para><function>NoVersion</function></para>
1272d17cd367Smrg
1273d17cd367Smrg<variablelist>
1274d17cd367Smrg  <varlistentry>
1275d17cd367Smrg    <term><emphasis remap='I'>offending-minor-opcode</emphasis>:</term>
1276d17cd367Smrg    <listitem>
1277d17cd367Smrg      <para>
1278d17cd367Smrg<function>ConnectionSetup</function>,
1279d17cd367Smrg<function>ProtocolSetup</function>
1280d17cd367Smrg      </para>
1281d17cd367Smrg    </listitem>
1282d17cd367Smrg  </varlistentry>
1283d17cd367Smrg  <varlistentry>
1284d17cd367Smrg    <term><emphasis remap='I'>severity</emphasis>:</term>
1285d17cd367Smrg    <listitem>
1286d17cd367Smrg      <para>
1287d17cd367Smrg<function>ConnectionSetup</function> \(-&gt;
1288d17cd367Smrg<function>FatalToConnection</function>
1289d17cd367Smrg<function>ProtocolSetup</function> \(-&gt;
1290d17cd367Smrg<function>FatalToProtocol</function>
1291d17cd367Smrg      </para>
1292d17cd367Smrg    </listitem>
1293d17cd367Smrg  </varlistentry>
1294d17cd367Smrg  <varlistentry>
1295d17cd367Smrg    <term><emphasis remap='I'>values</emphasis>:</term>
1296d17cd367Smrg    <listitem>
1297d17cd367Smrg      <para>(none)</para>
1298d17cd367Smrg    </listitem>
1299d17cd367Smrg  </varlistentry>
1300d17cd367Smrg</variablelist>
1301d17cd367Smrg
1302d17cd367Smrg<para>None of the protocol versions offered are available.</para>
1303d17cd367Smrg
1304d17cd367Smrg<para><function>SetupFailed</function></para>
1305d17cd367Smrg
1306d17cd367Smrg<variablelist>
1307d17cd367Smrg  <varlistentry>
1308d17cd367Smrg    <term><emphasis remap='I'>offending-minor-opcode</emphasis>:</term>
1309d17cd367Smrg    <listitem>
1310d17cd367Smrg      <para>
1311d17cd367Smrg<function>ConnectionSetup</function>,
1312d17cd367Smrg<function>ProtocolSetup</function>,
1313d17cd367Smrg<function>AuthenticationReply</function>
1314d17cd367Smrg      </para>
1315d17cd367Smrg    </listitem>
1316d17cd367Smrg  </varlistentry>
1317d17cd367Smrg  <varlistentry>
1318d17cd367Smrg    <term><emphasis remap='I'>severity</emphasis>:</term>
1319d17cd367Smrg    <listitem>
1320d17cd367Smrg      <para>
1321d17cd367Smrg<function>ConnectionSetup</function> \(-&gt;
1322d17cd367Smrg<function>FatalToConnection</function>
1323d17cd367Smrg<function>ProtocolSetup</function> \(-&gt;
1324d17cd367Smrg<function>FatalToProtocol</function>
1325d17cd367Smrg<function>AuthenticationReply</function> \(-&gt;
1326d17cd367Smrg<function>FatalToConnection</function> if authenticating a connection,
1327d17cd367Smrgotherwise <function>FatalToProtocol</function>
1328d17cd367Smrg      </para>
1329d17cd367Smrg    </listitem>
1330d17cd367Smrg  </varlistentry>
1331d17cd367Smrg  <varlistentry>
1332d17cd367Smrg    <term><emphasis remap='I'>values</emphasis>:</term>
1333d17cd367Smrg    <listitem>
1334d17cd367Smrg      <para>STRING reason</para>
1335d17cd367Smrg    </listitem>
1336d17cd367Smrg  </varlistentry>
1337d17cd367Smrg</variablelist>
1338d17cd367Smrg
1339d17cd367Smrg<para>
1340d17cd367SmrgThe sending side is unable to accept the
1341d17cd367Smrgnew connection or new protocol for a reason other than authentication
1342d17cd367Smrgfailure.  Typically this error will be a result of inability to allocate
1343d17cd367Smrgadditional resources on the sending side.  The reason field will give a
1344d17cd367Smrghuman-interpretable message providing further detail on the type of failure.
1345d17cd367Smrg</para>
1346d17cd367Smrg
1347d17cd367Smrg<para><function>AuthenticationRejected</function></para>
1348d17cd367Smrg<variablelist>
1349d17cd367Smrg  <varlistentry>
1350d17cd367Smrg    <term><emphasis remap='I'>offending-minor-opcode</emphasis>:</term>
1351d17cd367Smrg    <listitem>
1352d17cd367Smrg      <para>
1353d17cd367Smrg<function>AuthenticationReply</function>,
1354d17cd367Smrg<function>AuthenticationRequired</function>,
1355d17cd367Smrg<function>AuthenticationNextPhase</function>
1356d17cd367Smrg      </para>
1357d17cd367Smrg    </listitem>
1358d17cd367Smrg  </varlistentry>
1359d17cd367Smrg  <varlistentry>
1360d17cd367Smrg    <term><emphasis remap='I'>severity</emphasis>:</term>
1361d17cd367Smrg    <listitem>
1362d17cd367Smrg      <para><function>FatalToProtocol</function></para>
1363d17cd367Smrg    </listitem>
1364d17cd367Smrg  </varlistentry>
1365d17cd367Smrg  <varlistentry>
1366d17cd367Smrg    <term><emphasis remap='I'>values</emphasis>:</term>
1367d17cd367Smrg    <listitem>
1368d17cd367Smrg      <para>STRING reason</para>
1369d17cd367Smrg    </listitem>
1370d17cd367Smrg  </varlistentry>
1371d17cd367Smrg</variablelist>
1372d17cd367Smrg
1373d17cd367Smrg<para>
1374d17cd367SmrgAuthentication rejected.  The peer has failed to properly
1375d17cd367Smrgauthenticate itself.  The reason field will give a human-interpretable
1376d17cd367Smrgmessage providing further detail.
1377d17cd367Smrg</para>
1378d17cd367Smrg
1379d17cd367Smrg<para><function>AuthenticationFailed</function></para>
1380d17cd367Smrg<variablelist>
1381d17cd367Smrg  <varlistentry>
1382d17cd367Smrg    <term><emphasis remap='I'>offending-minor-opcode</emphasis>:</term>
1383d17cd367Smrg    <listitem>
1384d17cd367Smrg      <para>
1385d17cd367Smrg<function>AuthenticationReply</function>,
1386d17cd367Smrg<function>AuthenticationRequired</function>,
1387d17cd367Smrg<function>AuthenticationNextPhase</function>
1388d17cd367Smrg      </para>
1389d17cd367Smrg    </listitem>
1390d17cd367Smrg  </varlistentry>
1391d17cd367Smrg  <varlistentry>
1392d17cd367Smrg    <term><emphasis remap='I'>severity</emphasis>:</term>
1393d17cd367Smrg    <listitem>
1394d17cd367Smrg      <para><function>FatalToProtocol</function></para>
1395d17cd367Smrg    </listitem>
1396d17cd367Smrg  </varlistentry>
1397d17cd367Smrg  <varlistentry>
1398d17cd367Smrg    <term><emphasis remap='I'>values</emphasis>:</term>
1399d17cd367Smrg    <listitem>
1400d17cd367Smrg      <para>STRING reason</para>
1401d17cd367Smrg    </listitem>
1402d17cd367Smrg  </varlistentry>
1403d17cd367Smrg</variablelist>
1404d17cd367Smrg
1405d17cd367Smrg<para>
1406d17cd367SmrgAuthentication failed.  <function>AuthenticationFailed</function>
1407d17cd367Smrgdoes not imply that the authentication was rejected, as
1408d17cd367Smrg<function>AuthenticationRejected</function>
1409d17cd367Smrgdoes.  Instead it means that the sender was unable to complete
1410d17cd367Smrgthe authentication for some other reason.  (For instance, it
1411d17cd367Smrgmay have been unable to contact an authentication server.)
1412d17cd367SmrgThe reason field will give a human-interpretable message
1413d17cd367Smrgproviding further detail.
1414d17cd367Smrg</para>
1415d17cd367Smrg
1416d17cd367Smrg<para><function>ProtocolDuplicate</function></para>
1417d17cd367Smrg<variablelist>
1418d17cd367Smrg  <varlistentry>
1419d17cd367Smrg    <term><emphasis remap='I'>offending-minor-opcode</emphasis>:</term>
1420d17cd367Smrg    <listitem>
1421d17cd367Smrg      <para><function>ProtocolSetup</function></para>
1422d17cd367Smrg    </listitem>
1423d17cd367Smrg  </varlistentry>
1424d17cd367Smrg  <varlistentry>
1425d17cd367Smrg    <term><emphasis remap='I'>severity</emphasis>:</term>
1426d17cd367Smrg    <listitem>
1427d17cd367Smrg      <para><function>FatalToProtocol</function> (but see note)</para>
1428d17cd367Smrg    </listitem>
1429d17cd367Smrg  </varlistentry>
1430d17cd367Smrg  <varlistentry>
1431d17cd367Smrg    <term><emphasis remap='I'>values</emphasis>:</term>
1432d17cd367Smrg    <listitem>
1433d17cd367Smrg      <para>STRING protocol name</para>
1434d17cd367Smrg    </listitem>
1435d17cd367Smrg  </varlistentry>
1436d17cd367Smrg</variablelist>
1437d17cd367Smrg
1438d17cd367Smrg<para>
1439d17cd367SmrgThe protocol name was already registered.  This is fatal to
1440d17cd367Smrgthe "new" protocol being set up by <function>ProtocolSetup</function>
1441d17cd367Smrgbut it does not affect the existing registration.
1442d17cd367Smrg</para>
1443d17cd367Smrg
1444d17cd367Smrg<para><function>MajorOpcodeDuplicate</function></para>
1445d17cd367Smrg<variablelist>
1446d17cd367Smrg  <varlistentry>
1447d17cd367Smrg    <term><emphasis remap='I'>offending-minor-opcode</emphasis>:</term>
1448d17cd367Smrg    <listitem>
1449d17cd367Smrg      <para><function>ProtocolSetup</function></para>
1450d17cd367Smrg    </listitem>
1451d17cd367Smrg  </varlistentry>
1452d17cd367Smrg  <varlistentry>
1453d17cd367Smrg    <term><emphasis remap='I'>severity</emphasis>:</term>
1454d17cd367Smrg    <listitem>
1455d17cd367Smrg      <para><function>FatalToProtocol</function> (but see note)</para>
1456d17cd367Smrg  </listitem>
1457d17cd367Smrg  </varlistentry>
1458d17cd367Smrg  <varlistentry>
1459d17cd367Smrg    <term><emphasis remap='I'>values</emphasis>:</term>
1460d17cd367Smrg    <listitem>
1461d17cd367Smrg      <para>CARD8 opcode</para>
1462d17cd367Smrg    </listitem>
1463d17cd367Smrg  </varlistentry>
1464d17cd367Smrg</variablelist>
1465d17cd367Smrg
1466d17cd367Smrg<para>
1467d17cd367SmrgThe major opcode specified was already registered.  This is
1468a3129944Smrgfatal to the <quote>new</quote> protocol being set up by
1469d17cd367Smrg<function>ProtocolSetup</function> but it does not affect the
1470d17cd367Smrgexisting registration.
1471d17cd367Smrg</para>
1472d17cd367Smrg
1473d17cd367Smrg<para><function>UnknownProtocol</function></para>
1474d17cd367Smrg<variablelist>
1475d17cd367Smrg  <varlistentry>
1476d17cd367Smrg    <term><emphasis remap='I'>offending-minor-opcode</emphasis>:</term>
1477d17cd367Smrg    <listitem>
1478d17cd367Smrg      <para><function>ProtocolSetup</function></para>
1479d17cd367Smrg    </listitem>
1480d17cd367Smrg  </varlistentry>
1481d17cd367Smrg  <varlistentry>
1482d17cd367Smrg    <term><emphasis remap='I'>severity</emphasis>:</term>
1483d17cd367Smrg    <listitem>
1484d17cd367Smrg      <para><function>FatalToProtocol</function></para>
1485d17cd367Smrg    </listitem>
1486d17cd367Smrg  </varlistentry>
1487d17cd367Smrg  <varlistentry>
1488d17cd367Smrg    <term><emphasis remap='I'>values</emphasis>:</term>
1489d17cd367Smrg    <listitem>
1490d17cd367Smrg      <para>STRING protocol name</para>
1491d17cd367Smrg    </listitem>
1492d17cd367Smrg  </varlistentry>
1493d17cd367Smrg</variablelist>
1494d17cd367Smrg
1495d17cd367Smrg<para>The protocol specified is not supported.</para>
1496d17cd367Smrg
1497d17cd367Smrg</sect1>
1498d17cd367Smrg</chapter>
1499d17cd367Smrg
15009ef0b394Smrg<chapter id='State_Diagrams'>
1501d17cd367Smrg<title>State Diagrams</title>
1502d17cd367Smrg
1503d17cd367Smrg<para>
1504d17cd367SmrgHere are the state diagrams for the party that initiates the connection:
1505d17cd367Smrg</para>
1506d17cd367Smrg
1507d17cd367Smrg<literallayout>
1508d17cd367Smrg<emphasis remap='C'>start</emphasis>:
1509d17cd367Smrg     connect to other end, send <function>ByteOrder</function> <function>ConnectionSetup</function> -&gt; <emphasis remap='C'>conn_wait</emphasis>
1510d17cd367Smrg
1511d17cd367Smrg<emphasis remap='C'>conn_wait</emphasis>:
1512d17cd367Smrg     receive <function>ConnectionReply</function> -&gt; <emphasis remap='C'>stasis</emphasis>
1513d17cd367Smrg     receive <function>AuthenticationRequired</function> -&gt; <emphasis remap='C'>conn_auth1</emphasis>
1514d17cd367Smrg     receive <function>Error</function> -&gt; <emphasis remap='C'>quit</emphasis>
1515d17cd367Smrg     receive &lt;other&gt;, send <function>Error</function> -&gt; <emphasis remap='C'>quit</emphasis>
1516d17cd367Smrg
1517d17cd367Smrg<emphasis remap='C'>conn_auth1</emphasis>:
1518d17cd367Smrg     if good auth data, send <function>AuthenticationReply</function> -&gt; <emphasis remap='C'>conn_auth2</emphasis>
1519d17cd367Smrg     if bad auth data, send <function>Error</function> -&gt; <emphasis remap='C'>quit</emphasis>
1520d17cd367Smrg
1521d17cd367Smrg<emphasis remap='C'>conn_auth2</emphasis>:
1522d17cd367Smrg     receive <function>ConnectionReply</function> -&gt; <emphasis remap='C'>stasis</emphasis>
1523d17cd367Smrg     receive <function>AuthenticationNextPhase</function> -&gt; <emphasis remap='C'>conn_auth1</emphasis>
1524d17cd367Smrg     receive <function>Error</function> -&gt; <emphasis remap='C'>quit</emphasis>
1525d17cd367Smrg     receive &lt;other&gt;, send <function>Error</function> -&gt; <emphasis remap='C'>quit</emphasis>
1526d17cd367Smrg</literallayout>
1527d17cd367Smrg
1528d17cd367Smrg<para>
1529d17cd367SmrgHere are top-level state transitions for the party
1530d17cd367Smrgthat accepts connections.
1531d17cd367Smrg</para>
1532d17cd367Smrg
1533d17cd367Smrg<literallayout>
1534d17cd367Smrg<emphasis remap='C'>listener</emphasis>:
1535d17cd367Smrg     accept connection -&gt; <emphasis remap='C'>init_wait</emphasis>
1536d17cd367Smrg
1537d17cd367Smrg<emphasis remap='C'>init_wait</emphasis>:
1538d17cd367Smrg     receive <function>ByteOrder</function> <function>ConnectionSetup</function> -&gt; <emphasis remap='C'>auth_ask</emphasis>
1539d17cd367Smrg     receive &lt;other&gt;, send <function>Error</function> -&gt; <emphasis remap='C'>quit</emphasis>
1540d17cd367Smrg
1541d17cd367Smrg<emphasis remap='C'>auth_ask</emphasis>:
1542d17cd367Smrg     send <function>ByteOrder</function> <function>ConnectionReply</function>
1543d17cd367Smrg-&gt; <emphasis remap='C'>stasis</emphasis>
1544d17cd367Smrg
1545d17cd367Smrg     send <function>AuthenticationRequired</function> -&gt; <emphasis remap='C'>auth_wait</emphasis>
1546d17cd367Smrg
1547d17cd367Smrg     send <function>Error</function> -&gt; <emphasis remap='C'>quit</emphasis>
1548d17cd367Smrg
1549d17cd367Smrg<emphasis remap='C'>auth_wait</emphasis>:
1550d17cd367Smrg     receive <function>AuthenticationReply</function> -&gt; <emphasis remap='C'>auth_check</emphasis>
1551d17cd367Smrg
1552d17cd367Smrg     receive &lt;other&gt;, send <function>Error</function> -&gt; <emphasis remap='C'>quit</emphasis>
1553d17cd367Smrg
1554d17cd367Smrg<emphasis remap='C'>auth_check</emphasis>:
1555d17cd367Smrg     if no more auth needed, send <function>ConnectionReply</function> -&gt; <emphasis remap='C'>stasis</emphasis>
1556d17cd367Smrg     if good auth data, send <function>AuthenticationNextPhase</function> -&gt; <emphasis remap='C'>auth_wait</emphasis>
1557d17cd367Smrg     if bad auth data, send <function>Error</function> -&gt; <emphasis remap='C'>quit</emphasis>
1558d17cd367Smrg</literallayout>
1559d17cd367Smrg
1560d17cd367Smrg<para>
1561d17cd367SmrgHere are the top-level state transitions for all parties after the initial
1562d17cd367Smrgconnection establishment subprotocol.
1563d17cd367Smrg</para>
1564d17cd367Smrg
1565d17cd367Smrg<note>
1566d17cd367Smrg<para>
1567d17cd367SmrgNote:  this is not quite the truth for branches out from stasis, in
1568d17cd367Smrgthat multiple conversations can be interleaved on the connection.
1569d17cd367Smrg</para>
1570d17cd367Smrg</note>
1571d17cd367Smrg
1572d17cd367Smrg<literallayout>
1573d17cd367Smrg<emphasis remap='C'>stasis</emphasis>:
1574d17cd367Smrg     send <function>ProtocolSetup</function> -&gt; <emphasis remap='C'>proto_wait</emphasis>
1575d17cd367Smrg     receive <function>ProtocolSetup</function> -&gt; <emphasis remap='C'>proto_reply</emphasis>
1576d17cd367Smrg     send <function>Ping</function> -&gt; <emphasis remap='C'>ping_wait</emphasis>
1577d17cd367Smrg     receive <function>Ping</function> send <function>PingReply</function> -&gt; <emphasis remap='C'>stasis</emphasis>
1578d17cd367Smrg     receive <function>WantToClose</function> -&gt; <emphasis remap='C'>shutdown_attempt</emphasis>
1579d17cd367Smrg     receive &lt;other&gt;, send <function>Error</function> -&gt; <emphasis remap='C'>stasis</emphasis>
1580d17cd367Smrg     all protocols shut down, send <function>WantToClose</function> -&gt; <emphasis remap='C'>close_wait</emphasis>
1581d17cd367Smrg
1582d17cd367Smrg<emphasis remap='C'>proto_wait</emphasis>:
1583d17cd367Smrg     receive <function>ProtocolReply</function> -&gt; <emphasis remap='C'>stasis</emphasis>
1584d17cd367Smrg     receive <function>AuthenticationRequired</function> -&gt; <emphasis remap='C'>give_auth1</emphasis>
1585d17cd367Smrg     receive <function>Error</function> give up on this protocol -&gt; <emphasis remap='C'>stasis</emphasis>
1586d17cd367Smrg     receive <function>WantToClose</function> -&gt; <emphasis remap='C'>proto_wait</emphasis>
1587d17cd367Smrg
1588d17cd367Smrg<emphasis remap='C'>give_auth1</emphasis>:
1589d17cd367Smrg     if good auth data, send <function>AuthenticationReply</function> -&gt; <emphasis remap='C'>give_auth2</emphasis>
1590d17cd367Smrg     if bad auth data, send <function>Error</function> give up on this protocol -&gt; <emphasis remap='C'>stasis</emphasis>
1591d17cd367Smrg     receive <function>WantToClose</function> -&gt; <emphasis remap='C'>give_auth1</emphasis>
1592d17cd367Smrg
1593d17cd367Smrg<emphasis remap='C'>give_auth2</emphasis>:
1594d17cd367Smrg     receive <function>ProtocolReply</function> -&gt; <emphasis remap='C'>stasis</emphasis>
1595d17cd367Smrg     receive <function>AuthenticationNextPhase</function> -&gt; <emphasis remap='C'>give_auth1</emphasis>
1596d17cd367Smrg     receive <function>Error</function> give up on this protocol -&gt; <emphasis remap='C'>stasis</emphasis>
1597d17cd367Smrg     receive <function>WantToClose</function> -&gt; <emphasis remap='C'>give_auth2</emphasis>
1598d17cd367Smrg
1599d17cd367Smrg<emphasis remap='C'>proto_reply</emphasis>:
1600d17cd367Smrg     send <function>ProtocolReply</function> -&gt; <emphasis remap='C'>stasis</emphasis>
1601d17cd367Smrg     send <function>AuthenticationRequired</function> -&gt; <emphasis remap='C'>take_auth1</emphasis>
1602d17cd367Smrg     send <function>Error</function> give up on this protocol -&gt; <emphasis remap='C'>stasis</emphasis>
1603d17cd367Smrg
1604d17cd367Smrg<emphasis remap='C'>take_auth1</emphasis>:
1605d17cd367Smrg     receive <function>AuthenticationReply</function> -&gt; <emphasis remap='C'>take_auth2</emphasis>
1606d17cd367Smrg     receive <function>Error</function> give up on this protocol -&gt; <emphasis remap='C'>stasis</emphasis>
1607d17cd367Smrg
1608d17cd367Smrg<emphasis remap='C'>take_auth2</emphasis>:
1609d17cd367Smrg     if good auth data \(-&gt; <emphasis remap='C'>take_auth3</emphasis>
1610d17cd367Smrg     if bad auth data, send <function>Error</function> give up on this protocol -&gt; <emphasis remap='C'>stasis</emphasis>
1611d17cd367Smrg
1612d17cd367Smrg<emphasis remap='C'>take_auth3</emphasis>:
1613d17cd367Smrg     if no more auth needed, send <function>ProtocolReply</function> -&gt; <emphasis remap='C'>stasis</emphasis>
1614d17cd367Smrg     if good auth data, send <function>AuthenticationNextPhase</function> -&gt; <emphasis remap='C'>take_auth1</emphasis>
1615d17cd367Smrg     if bad auth data, send <function>Error</function> give up on this protocol -&gt; <emphasis remap='C'>stasis</emphasis>
1616d17cd367Smrg
1617d17cd367Smrg<emphasis remap='C'>ping_wait</emphasis>:
1618d17cd367Smrg     receive <function>PingReply</function> -&gt; <emphasis remap='C'>stasis</emphasis>
1619d17cd367Smrg
1620d17cd367Smrg<emphasis remap='C'>quit</emphasis>:
1621d17cd367Smrg     -&gt; close connection
1622d17cd367Smrg</literallayout>
1623d17cd367Smrg
1624d17cd367Smrg<para>
1625d17cd367SmrgHere are the state transitions for shutting down the connection:
1626d17cd367Smrg</para>
1627d17cd367Smrg
1628d17cd367Smrg<literallayout>
1629d17cd367Smrg<emphasis remap='C'>shutdown_attempt</emphasis>:
1630d17cd367Smrg     if want to stay alive anyway, send <function>NoClose</function> -&gt; <emphasis remap='C'>stasis</emphasis>
1631d17cd367Smrg     else -&gt; <emphasis remap='C'>quit</emphasis>
1632d17cd367Smrg
1633d17cd367Smrg<emphasis remap='C'>close_wait</emphasis>:
1634d17cd367Smrg     receive <function>ProtocolSetup</function> -&gt; <emphasis remap='C'>proto_reply</emphasis>
1635d17cd367Smrg     receive <function>NoClose</function> -&gt; <emphasis remap='C'>stasis</emphasis>
1636d17cd367Smrg     receive <function>WantToClose</function> -&gt; <emphasis remap='C'>quit</emphasis>
1637d17cd367Smrg     connection close -&gt; <emphasis remap='C'>quit</emphasis>
1638d17cd367Smrg</literallayout>
1639d17cd367Smrg</chapter>
16409ef0b394Smrg<chapter id='Protocol_Encoding'>
1641d17cd367Smrg<title>Protocol Encoding</title>
1642d17cd367Smrg
1643d17cd367Smrg<para>
1644d17cd367SmrgIn the encodings below, the first column is the number of bytes occupied.
1645d17cd367SmrgThe second column is either the type (if the value is variable) or the
1646d17cd367Smrgactual value.  The third column is the description of the value (e.g.,
1647d17cd367Smrgthe parameter name).  Receivers must ignore bytes that are designated
1648d17cd367Smrgas unused or pad bytes.
1649d17cd367Smrg</para>
1650d17cd367Smrg
1651d17cd367Smrg<para>
1652d17cd367SmrgThis document describes major version 1, minor version 0
1653d17cd367Smrgof the ICE protocol.
1654d17cd367Smrg</para>
1655d17cd367Smrg
1656d17cd367Smrg<para>
1657d17cd367SmrgLISTof&lt;type&gt; indicates some number of repetitions of
1658d17cd367Smrg&lt;type&gt;, with no
1659d17cd367Smrgadditional padding.  The number of repetitions must be specified elsewhere
1660d17cd367Smrgin the message.
1661d17cd367Smrg</para>
1662d17cd367Smrg
16639ef0b394Smrg<sect1 id='Primitives'>
1664d17cd367Smrg<title>Primitives</title>
1665d17cd367Smrg
16669ef0b394Smrg<informaltable frame='topbot'>
16679ef0b394Smrg  <?dbfo keep-together="always" ?>
16689ef0b394Smrg  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
16699ef0b394Smrg    <colspec colname='c1' colwidth='1.0*'/>
16709ef0b394Smrg    <colspec colname='c2' colwidth='1.0*'/>
16719ef0b394Smrg    <colspec colname='c3' colwidth='3.0*'/>
1672d17cd367Smrg    <thead>
16739ef0b394Smrg      <row rowsep='1'>
16749ef0b394Smrg        <entry>Type Name</entry>
16759ef0b394Smrg        <entry>Length (bytes)</entry>
16769ef0b394Smrg        <entry>Description</entry>
1677d17cd367Smrg      </row>
1678d17cd367Smrg    </thead>
1679d17cd367Smrg    <tbody>
1680d17cd367Smrg      <row>
16819ef0b394Smrg        <entry>CARD8</entry>
16829ef0b394Smrg        <entry>1</entry>
16839ef0b394Smrg        <entry>8-bit unsigned integer</entry>
1684d17cd367Smrg      </row>
1685d17cd367Smrg      <row>
16869ef0b394Smrg        <entry>CARD16</entry>
16879ef0b394Smrg        <entry>2</entry>
16889ef0b394Smrg        <entry>16-bit unsigned integer</entry>
1689d17cd367Smrg      </row>
1690d17cd367Smrg      <row>
16919ef0b394Smrg        <entry>CARD32</entry>
16929ef0b394Smrg        <entry>4</entry>
16939ef0b394Smrg        <entry>32-bit unsigned integer</entry>
1694d17cd367Smrg      </row>
1695d17cd367Smrg      <row>
16969ef0b394Smrg        <entry>LPCE</entry>
16979ef0b394Smrg        <entry>1</entry>
16989ef0b394Smrg        <entry><para>A character from the X Portable Character Set in Latin Portable Character
1699d17cd367SmrgEncoding</para></entry>
1700d17cd367Smrg      </row>
1701d17cd367Smrg    </tbody>
1702d17cd367Smrg  </tgroup>
1703d17cd367Smrg</informaltable>
1704d17cd367Smrg
1705d17cd367Smrg</sect1>
1706d17cd367Smrg
17079ef0b394Smrg<sect1 id='Enumerations'>
1708d17cd367Smrg<title>Enumerations</title>
1709d17cd367Smrg
1710d17cd367Smrg
17119ef0b394Smrg<informaltable frame='topbot'>
17129ef0b394Smrg  <?dbfo keep-together="always" ?>
17139ef0b394Smrg  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
17149ef0b394Smrg    <colspec colname='c1' colwidth='1.0*'/>
17159ef0b394Smrg    <colspec colname='c2' colwidth='1.0*'/>
17169ef0b394Smrg    <colspec colname='c3' colwidth='3.0*'/>
1717d17cd367Smrg    <thead>
17189ef0b394Smrg      <row rowsep='1'>
17199ef0b394Smrg        <entry>Type Name</entry>
17209ef0b394Smrg        <entry>Value</entry>
17219ef0b394Smrg        <entry>Description</entry>
1722d17cd367Smrg      </row>
1723d17cd367Smrg    </thead>
1724d17cd367Smrg    <tbody>
1725d17cd367Smrg      <row>
17269ef0b394Smrg        <entry>BOOL</entry>
17279ef0b394Smrg        <entry>0</entry>
17289ef0b394Smrg        <entry>False</entry>
1729d17cd367Smrg      </row>
1730d17cd367Smrg      <row>
17319ef0b394Smrg        <entry></entry>
17329ef0b394Smrg        <entry>1</entry>
17339ef0b394Smrg        <entry>True</entry>
1734d17cd367Smrg      </row>
1735d17cd367Smrg    </tbody>
1736d17cd367Smrg  </tgroup>
1737d17cd367Smrg</informaltable>
1738d17cd367Smrg
1739d17cd367Smrg</sect1>
1740d17cd367Smrg
17419ef0b394Smrg<sect1 id='Compound_Types'>
1742d17cd367Smrg<title>Compound Types</title>
1743d17cd367Smrg
17449ef0b394Smrg<informaltable frame='topbot'>
17459ef0b394Smrg  <?dbfo keep-together="always" ?>
17469ef0b394Smrg  <tgroup cols='4' align='left' colsep='0' rowsep='0'>
17479ef0b394Smrg    <colspec colname='c1' colwidth='1.0*'/>
17489ef0b394Smrg    <colspec colname='c2' colwidth='1.0*'/>
17499ef0b394Smrg    <colspec colname='c3' colwidth='1.0*'/>
17509ef0b394Smrg    <colspec colname='c4' colwidth='2.0*'/>
1751d17cd367Smrg    <thead>
17529ef0b394Smrg      <row rowsep='1'>
17539ef0b394Smrg        <entry>Type Name</entry>
17549ef0b394Smrg        <entry>Length (bytes)</entry>
17559ef0b394Smrg        <entry>Type</entry>
17569ef0b394Smrg        <entry>Description</entry>
1757d17cd367Smrg      </row>
1758d17cd367Smrg    </thead>
1759d17cd367Smrg    <tbody>
1760d17cd367Smrg      <row>
17619ef0b394Smrg        <entry>VERSION</entry>
17629ef0b394Smrg        <entry></entry>
17639ef0b394Smrg        <entry></entry>
17649ef0b394Smrg        <entry></entry>
1765d17cd367Smrg      </row>
1766d17cd367Smrg      <row>
17679ef0b394Smrg        <entry></entry>
17689ef0b394Smrg        <entry>2</entry>
17699ef0b394Smrg        <entry>CARD16</entry>
17709ef0b394Smrg        <entry>Major version number</entry>
1771d17cd367Smrg      </row>
1772d17cd367Smrg      <row>
17739ef0b394Smrg        <entry></entry>
17749ef0b394Smrg        <entry>2</entry>
17759ef0b394Smrg        <entry>CARD16</entry>
17769ef0b394Smrg        <entry>Minor version number</entry>
1777d17cd367Smrg      </row>
1778d17cd367Smrg      <row>
17799ef0b394Smrg        <entry>STRING</entry>
17809ef0b394Smrg        <entry></entry>
17819ef0b394Smrg        <entry></entry>
17829ef0b394Smrg        <entry></entry>
1783d17cd367Smrg      </row>
1784d17cd367Smrg      <row>
17859ef0b394Smrg        <entry></entry>
17869ef0b394Smrg        <entry>2</entry>
17879ef0b394Smrg        <entry>CARD16</entry>
17889ef0b394Smrg        <entry>length of string in bytes</entry>
1789d17cd367Smrg      </row>
1790d17cd367Smrg      <row>
17919ef0b394Smrg        <entry></entry>
17929ef0b394Smrg        <entry>n</entry>
17939ef0b394Smrg        <entry>LISTofLPCE</entry>
17949ef0b394Smrg        <entry>string</entry>
1795d17cd367Smrg      </row>
1796d17cd367Smrg      <row>
17979ef0b394Smrg        <entry></entry>
17989ef0b394Smrg        <entry>p</entry>
17999ef0b394Smrg        <entry></entry>
18009ef0b394Smrg        <entry>unused, p = pad(n+2, 4)</entry>
1801d17cd367Smrg      </row>
1802d17cd367Smrg    </tbody>
1803d17cd367Smrg  </tgroup>
1804d17cd367Smrg</informaltable>
1805d17cd367Smrg
1806d17cd367Smrg</sect1>
1807d17cd367Smrg
18089ef0b394Smrg<sect1 id='ICE_Minor_opcodes'>
1809d17cd367Smrg<title>ICE Minor opcodes</title>
1810d17cd367Smrg
18119ef0b394Smrg<informaltable frame='topbot'>
18129ef0b394Smrg  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
18139ef0b394Smrg    <colspec colname='c1' colwidth='1.0*'/>
18149ef0b394Smrg    <colspec colname='c2' colwidth='1.0*'/>
1815d17cd367Smrg    <thead>
18169ef0b394Smrg      <row rowsep='1'>
18179ef0b394Smrg        <entry>Message Name</entry>
18189ef0b394Smrg        <entry>Encoding</entry>
1819d17cd367Smrg      </row>
1820d17cd367Smrg    </thead>
1821d17cd367Smrg    <tbody>
1822d17cd367Smrg      <row>
18239ef0b394Smrg        <entry>Error</entry>
18249ef0b394Smrg        <entry>0</entry>
1825d17cd367Smrg      </row>
1826d17cd367Smrg      <row>
18279ef0b394Smrg        <entry>ByteOrder</entry>
18289ef0b394Smrg        <entry>1</entry>
1829d17cd367Smrg      </row>
1830d17cd367Smrg      <row>
18319ef0b394Smrg        <entry>ConnectionSetup</entry>
18329ef0b394Smrg        <entry>2</entry>
1833d17cd367Smrg      </row>
1834d17cd367Smrg      <row>
18359ef0b394Smrg        <entry>AuthenticationRequired</entry>
18369ef0b394Smrg        <entry>3</entry>
1837d17cd367Smrg      </row>
1838d17cd367Smrg      <row>
18399ef0b394Smrg        <entry>AuthenticationReply</entry>
18409ef0b394Smrg        <entry>4</entry>
1841d17cd367Smrg      </row>
1842d17cd367Smrg      <row>
18439ef0b394Smrg        <entry>AuthenticationNextPhase</entry>
18449ef0b394Smrg        <entry>5</entry>
1845d17cd367Smrg      </row>
1846d17cd367Smrg      <row>
18479ef0b394Smrg        <entry>ConnectionReply</entry>
18489ef0b394Smrg        <entry>6</entry>
1849d17cd367Smrg      </row>
1850d17cd367Smrg      <row>
18519ef0b394Smrg        <entry>ProtocolSetup</entry>
18529ef0b394Smrg        <entry>7</entry>
1853d17cd367Smrg      </row>
1854d17cd367Smrg      <row>
18559ef0b394Smrg        <entry>ProtocolReply</entry>
18569ef0b394Smrg        <entry>8</entry>
1857d17cd367Smrg      </row>
1858d17cd367Smrg      <row>
18599ef0b394Smrg        <entry>Ping</entry>
18609ef0b394Smrg        <entry>9</entry>
1861d17cd367Smrg      </row>
1862d17cd367Smrg      <row>
18639ef0b394Smrg        <entry>PingReply</entry>
18649ef0b394Smrg        <entry>10</entry>
1865d17cd367Smrg      </row>
1866d17cd367Smrg      <row>
18679ef0b394Smrg        <entry>WantToClose</entry>
18689ef0b394Smrg        <entry>11</entry>
1869d17cd367Smrg      </row>
1870d17cd367Smrg      <row>
18719ef0b394Smrg        <entry>NoClose</entry>
18729ef0b394Smrg        <entry>12</entry>
1873d17cd367Smrg      </row>
1874d17cd367Smrg    </tbody>
1875d17cd367Smrg  </tgroup>
1876d17cd367Smrg</informaltable>
1877d17cd367Smrg
1878d17cd367Smrg</sect1>
1879d17cd367Smrg
18809ef0b394Smrg<sect1 id='Message_Encoding'>
1881d17cd367Smrg<title>Message Encoding</title>
1882d17cd367Smrg
1883d17cd367Smrg<literallayout class="monospaced">
1884d17cd367Smrg<function>Error</function>
1885d17cd367Smrg     1     CARD8         major-opcode
1886d17cd367Smrg     1     0             Error
1887d17cd367Smrg     2     CARD16        class
1888d17cd367Smrg     4     (n+p)/8+1     length
1889d17cd367Smrg     1     CARD8         offending-minor-opcode
1890d17cd367Smrg     1                   severity:
1891d17cd367Smrg           0               CanContinue
1892d17cd367Smrg           1               FatalToProtocol
1893d17cd367Smrg           2               FatalToConnection
1894d17cd367Smrg     2                   unused
1895d17cd367Smrg     4     CARD32        sequence number of erroneous message
1896d17cd367Smrg     n     &lt;varies&gt;     value(s)
1897d17cd367Smrg     p                   pad, p = pad(n,8)
1898d17cd367Smrg</literallayout>
1899d17cd367Smrg
1900d17cd367Smrg
1901d17cd367Smrg<literallayout class="monospaced">
1902d17cd367Smrg<function>ByteOrder</function>
1903d17cd367Smrg     1     0     ICE
1904d17cd367Smrg     1     1     ByteOrder
1905d17cd367Smrg     1           byte-order:
1906d17cd367Smrg           0        LSBfirst
1907d17cd367Smrg           1        MSBfirst
1908d17cd367Smrg     1           unused
1909d17cd367Smrg     4     0     length
1910d17cd367Smrg</literallayout>
1911d17cd367Smrg
1912d17cd367Smrg<literallayout class="monospaced">
1913d17cd367Smrg<function>ConnectionSetup</function>
1914d17cd367Smrg     1     0                   ICE
1915d17cd367Smrg     1     2                   ConnectionSetup
1916d17cd367Smrg     1     CARD8               Number of versions offered
1917d17cd367Smrg     1     CARD8               Number of authentication protocol names offered
1918d17cd367Smrg     4     (i+j+k+m+p)/8+1     length
1919d17cd367Smrg     1     BOOL                must-authenticate
1920d17cd367Smrg     7                         unused
1921d17cd367Smrg     i     STRING              vendor
1922d17cd367Smrg     j     STRING              release
1923d17cd367Smrg     k     LISTofSTRING        authentication-protocol-names
1924d17cd367Smrg     m     LISTofVERSION       version-list
1925d17cd367Smrg     p                         unused, p = pad(i+j+k+m,8)
1926d17cd367Smrg</literallayout>
1927d17cd367Smrg
1928d17cd367Smrg<literallayout class="monospaced">
1929d17cd367Smrg<function>AuthenticationRequired</function>
1930d17cd367Smrg     1     0             ICE
1931d17cd367Smrg     1     3             AuthenticationRequired
1932d17cd367Smrg     1     CARD8         authentication-protocol-index
1933d17cd367Smrg     1                   unused
1934d17cd367Smrg     4     (n+p)/8+1     length
1935d17cd367Smrg     2     n             length of authentication data
1936d17cd367Smrg     6          unused
1937d17cd367Smrg     n     &lt;varies&gt;     data
1938d17cd367Smrg     p                   unused, p = pad(n,8)
1939d17cd367Smrg</literallayout>
1940d17cd367Smrg
1941d17cd367Smrg<literallayout class="monospaced">
1942d17cd367Smrg<function>AuthenticationReply</function>
1943d17cd367Smrg     1     0             ICE
1944d17cd367Smrg     1     4             AuthenticationReply
1945d17cd367Smrg     2                   unused
1946d17cd367Smrg     4     (n+p)/8+1     length
1947d17cd367Smrg     2     n             length of authentication data
1948d17cd367Smrg     6                   unused
1949d17cd367Smrg     n     &lt;varies&gt;     data
1950d17cd367Smrg     p                   unused, p = pad(n,8)
1951d17cd367Smrg</literallayout>
1952d17cd367Smrg
1953d17cd367Smrg<literallayout class="monospaced">
1954d17cd367Smrg<function>AuthenticationNextPhase</function>
1955d17cd367Smrg     1     0             ICE
1956d17cd367Smrg     1     5             AuthenticationNextPhase
1957d17cd367Smrg     2                   unused
1958d17cd367Smrg     4     (n+p)/8+1     length
1959d17cd367Smrg     2     n             length of authentication data
1960d17cd367Smrg     6                   unused
1961d17cd367Smrg     n     &lt;varies&gt;     data
1962d17cd367Smrg     p                   unused, p = pad(n,8)
1963d17cd367Smrg</literallayout>
1964d17cd367Smrg
1965d17cd367Smrg<literallayout class="monospaced">
1966d17cd367Smrg<function>ConnectionReply</function>
1967d17cd367Smrg     1     0             ICE
1968d17cd367Smrg     1     6             ConnectionReply
1969d17cd367Smrg     1     CARD8         version-index
1970d17cd367Smrg     1                   unused
1971d17cd367Smrg     4     (i+j+p)/8     length
1972d17cd367Smrg     i     STRING        vendor
1973d17cd367Smrg     j     STRING        release
1974d17cd367Smrg     p                   unused, p = pad(i+j,8)
1975d17cd367Smrg</literallayout>
1976d17cd367Smrg
1977d17cd367Smrg<literallayout class="monospaced">
1978d17cd367Smrg<function>ProtocolSetup</function>
1979d17cd367Smrg     1     0                     ICE
1980d17cd367Smrg     1     7                     ProtocolSetup
1981d17cd367Smrg     1     CARD8                 major-opcode
1982d17cd367Smrg     1     BOOL                  must-authenticate
1983d17cd367Smrg     4     (i+j+k+m+n+p)/8+1     length
1984d17cd367Smrg     1     CARD8                 Number of versions offered
1985d17cd367Smrg     1     CARD8                 Number of authentication protocol names offered
1986d17cd367Smrg     6                           unused
1987d17cd367Smrg     i     STRING                protocol-name
1988d17cd367Smrg     j     STRING                vendor
1989d17cd367Smrg     k     STRING                release
1990d17cd367Smrg     m     LISTofSTRING          authentication-protocol-names
1991d17cd367Smrg     n     LISTofVERSION         version-list
1992d17cd367Smrg     p                           unused, p = pad(i+j+k+m+n,8)
1993d17cd367Smrg</literallayout>
1994d17cd367Smrg
1995d17cd367Smrg<literallayout class="monospaced">
1996d17cd367Smrg<function>ProtocolReply</function>
1997d17cd367Smrg     1     0             ICE
1998d17cd367Smrg     1     8             ProtocolReply
1999d17cd367Smrg     1     CARD8         version-index
2000d17cd367Smrg     1     CARD8         major-opcode
2001d17cd367Smrg     4     (i+j+p)/8     length
2002d17cd367Smrg     i     STRING        vendor
2003d17cd367Smrg     j     STRING        release
2004d17cd367Smrg     p                   unused, p = pad(i+j, 8)
2005d17cd367Smrg</literallayout>
2006d17cd367Smrg
2007d17cd367Smrg<literallayout class="monospaced">
2008d17cd367Smrg<function>Ping</function>
2009d17cd367Smrg     1     0     ICE
2010d17cd367Smrg     1     9     Ping
2011d17cd367Smrg     2     0     unused
2012d17cd367Smrg     4     0     length
2013d17cd367Smrg</literallayout>
2014d17cd367Smrg
2015d17cd367Smrg<literallayout class="monospaced">
2016d17cd367Smrg<function>PingReply</function>
2017d17cd367Smrg     1     0     ICE
2018d17cd367Smrg     1     10    PingReply
2019d17cd367Smrg     2     0     unused
2020d17cd367Smrg     4     0     length
2021d17cd367Smrg</literallayout>
2022d17cd367Smrg
2023d17cd367Smrg<literallayout class="monospaced">
2024d17cd367Smrg<function>WantToClose</function>
2025d17cd367Smrg     1     0     ICE
2026d17cd367Smrg     1     11    WantToClose
2027d17cd367Smrg     2     0     unused
2028d17cd367Smrg     4     0     length
2029d17cd367Smrg</literallayout>
2030d17cd367Smrg
2031d17cd367Smrg<literallayout class="monospaced">
2032d17cd367Smrg<function>NoClose</function>
2033d17cd367Smrg     1     0     ICE
2034d17cd367Smrg     1     12    NoClose
2035d17cd367Smrg     2     0     unused
2036d17cd367Smrg     4     0     length
2037d17cd367Smrg</literallayout>
2038d17cd367Smrg
2039d17cd367Smrg</sect1>
2040d17cd367Smrg
20419ef0b394Smrg<sect1 id='Error_Class_Encoding'>
2042d17cd367Smrg<title>Error Class Encoding</title>
2043d17cd367Smrg
2044d17cd367Smrg<para>
2045d17cd367SmrgGeneric errors have classes in the range 0x8000-0xFFFF, and
2046d17cd367Smrgsubprotocol-specific errors are in the range 0x0000-0x7FFF.
2047d17cd367Smrg</para>
2048d17cd367Smrg
20499ef0b394Smrg<sect2 id='Generic_Error_Class_Encoding'>
2050d17cd367Smrg<title>Generic Error Class Encoding</title>
2051d17cd367Smrg
20529ef0b394Smrg<informaltable frame='topbot'>
20539ef0b394Smrg  <?dbfo keep-together="always" ?>
20549ef0b394Smrg  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
20559ef0b394Smrg    <colspec colname='c1' colwidth='1.0*'/>
20569ef0b394Smrg    <colspec colname='c2' colwidth='3.0*'/>
2057d17cd367Smrg    <thead>
20589ef0b394Smrg      <row rowsep='1'>
20599ef0b394Smrg        <entry>Class</entry>
20609ef0b394Smrg        <entry>Encoding</entry>
2061d17cd367Smrg      </row>
2062d17cd367Smrg    </thead>
2063d17cd367Smrg    <tbody>
2064d17cd367Smrg      <row>
20659ef0b394Smrg        <entry>BadMinor</entry>
20669ef0b394Smrg        <entry>0x8000</entry>
2067d17cd367Smrg      </row>
2068d17cd367Smrg      <row>
20699ef0b394Smrg        <entry>BadState</entry>
20709ef0b394Smrg        <entry>0x8001</entry>
2071d17cd367Smrg      </row>
2072d17cd367Smrg      <row>
20739ef0b394Smrg        <entry>BadLength</entry>
20749ef0b394Smrg        <entry>0x8002</entry>
2075d17cd367Smrg      </row>
2076d17cd367Smrg      <row>
20779ef0b394Smrg        <entry>BadValue</entry>
20789ef0b394Smrg        <entry>0x8003</entry>
2079d17cd367Smrg      </row>
2080d17cd367Smrg    </tbody>
2081d17cd367Smrg  </tgroup>
2082d17cd367Smrg</informaltable>
2083d17cd367Smrg
2084d17cd367Smrg</sect2>
20859ef0b394Smrg<sect2 id='ICE_specific_Error_Class_Encoding'>
2086d17cd367Smrg<title>ICE-specific Error Class Encoding</title>
2087d17cd367Smrg
20889ef0b394Smrg<informaltable frame='topbot'>
20899ef0b394Smrg  <?dbfo keep-together="always" ?>
20909ef0b394Smrg  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
20919ef0b394Smrg    <colspec colname='c1' colwidth='1.0*'/>
20929ef0b394Smrg    <colspec colname='c2' colwidth='3.0*'/>
2093d17cd367Smrg    <thead>
20949ef0b394Smrg      <row rowsep='1'>
20959ef0b394Smrg        <entry>Class</entry>
20969ef0b394Smrg        <entry>Encoding</entry>
2097d17cd367Smrg      </row>
2098d17cd367Smrg    </thead>
2099d17cd367Smrg    <tbody>
2100d17cd367Smrg      <row>
21019ef0b394Smrg        <entry>BadMajor</entry>
21029ef0b394Smrg        <entry>0</entry>
2103d17cd367Smrg      </row>
2104d17cd367Smrg      <row>
21059ef0b394Smrg        <entry>NoAuthentication</entry>
21069ef0b394Smrg        <entry>1</entry>
2107d17cd367Smrg      </row>
2108d17cd367Smrg      <row>
21099ef0b394Smrg        <entry>NoVersion</entry>
21109ef0b394Smrg        <entry>2</entry>
2111d17cd367Smrg      </row>
2112d17cd367Smrg      <row>
21139ef0b394Smrg        <entry>SetupFailed</entry>
21149ef0b394Smrg        <entry>3</entry>
2115d17cd367Smrg      </row>
2116d17cd367Smrg      <row>
21179ef0b394Smrg        <entry>AuthenticationRejected</entry>
21189ef0b394Smrg        <entry>4</entry>
2119d17cd367Smrg      </row>
2120d17cd367Smrg      <row>
21219ef0b394Smrg        <entry>AuthenticationFailed</entry>
21229ef0b394Smrg        <entry>5</entry>
2123d17cd367Smrg      </row>
2124d17cd367Smrg      <row>
21259ef0b394Smrg        <entry>ProtocolDuplicate</entry>
21269ef0b394Smrg        <entry>6</entry>
2127d17cd367Smrg      </row>
2128d17cd367Smrg      <row>
21299ef0b394Smrg        <entry>MajorOpcodeDuplicate</entry>
21309ef0b394Smrg        <entry>7</entry>
2131d17cd367Smrg      </row>
2132d17cd367Smrg      <row>
21339ef0b394Smrg        <entry>UnknownProtocol</entry>
21349ef0b394Smrg        <entry>8</entry>
2135d17cd367Smrg      </row>
2136d17cd367Smrg    </tbody>
2137d17cd367Smrg  </tgroup>
2138d17cd367Smrg</informaltable>
2139d17cd367Smrg
2140d17cd367Smrg</sect2>
2141d17cd367Smrg</sect1>
2142d17cd367Smrg</chapter>
2143d17cd367Smrg
2144d17cd367Smrg<appendix id="modification_history">
2145d17cd367Smrg
2146d17cd367Smrg<title>Modification History</title>
2147d17cd367Smrg
21489ef0b394Smrg<sect1 id='Release_6_to_Release_61_1'>
2149d17cd367Smrg<title>Release 6 to Release 6.1</title>
2150d17cd367Smrg<para>
2151d17cd367SmrgRelease 6.1 added the ICE X rendezvous protocol (Appendix B) and
2152d17cd367Smrgupdated the document version to 1.1.
2153d17cd367Smrg</para>
2154d17cd367Smrg</sect1>
2155d17cd367Smrg
21569ef0b394Smrg<sect1 id='Release_61_to_Release_63_3'>
2157d17cd367Smrg<title>Release 6.1 to Release 6.3</title>
2158d17cd367Smrg<para>Release 6.3 added the listen on well known ports feature.</para>
2159d17cd367Smrg</sect1>
2160d17cd367Smrg
2161d17cd367Smrg</appendix>
2162d17cd367Smrg
2163d17cd367Smrg<appendix id="ice_x_rendezvous_protocol">
2164d17cd367Smrg<title>ICE X Rendezvous Protocol</title>
2165d17cd367Smrg
21669ef0b394Smrg<sect1 id='Introduction'>
2167d17cd367Smrg<title>Introduction</title>
2168d17cd367Smrg<para>
2169d17cd367SmrgThe ICE X rendezvous protocol is designed to answer the need posed
2170d17cd367Smrgin Section 2 for one mechanism by which two clients interested in
2171d17cd367Smrgcommunicating via ICE are able to exchange the necessary information.
2172d17cd367SmrgThis protocol is appropriate for any two ICE clients who also have X
2173d17cd367Smrgconnections to the same X server.
2174d17cd367Smrg</para>
2175d17cd367Smrg</sect1>
2176d17cd367Smrg
21779ef0b394Smrg<sect1 id='Overview_of_ICE_X_Rendezvous'>
2178d17cd367Smrg<title>Overview of ICE X Rendezvous</title>
2179d17cd367Smrg
2180d17cd367Smrg<para>
2181d17cd367SmrgThe ICE X Rendezvous Mechanism requires clients willing to act as ICE
2182d17cd367Smrgoriginating parties to pre-register the ICE subprotocols they support in an
2183d17cd367SmrgICE_PROTOCOLS property on their top-level window.  Clients willing to
2184d17cd367Smrgact as ICE answering parties then send an ICE_PROTOCOLS X
2185d17cd367Smrg<function>ClientMessage</function>
2186d17cd367Smrgevent to the ICE originating parties.  This
2187d17cd367Smrg<function>ClientMessage</function>
2188d17cd367Smrgevent identifies
2189d17cd367Smrgthe ICE network IDs of the ICE answering party as well as the ICE
2190d17cd367Smrgsubprotocol it wishes to speak.  Upon receipt of this message the ICE
2191d17cd367Smrgoriginating party uses the information to establish an ICE connection
2192d17cd367Smrgwith the ICE answering party.
2193d17cd367Smrg</para>
2194d17cd367Smrg</sect1>
2195d17cd367Smrg
21969ef0b394Smrg<sect1 id='Registering_Known_Protocols'>
2197d17cd367Smrg<title>Registering Known Protocols</title>
2198d17cd367Smrg
2199d17cd367Smrg<para>
2200d17cd367SmrgClients willing to act as ICE originating parties preregister
2201d17cd367Smrgthe ICE subprotocols they support in a list of atoms held by an
2202d17cd367SmrgICE_PROTOCOLS property on their top-level window.  The name of each
2203d17cd367Smrgatom listed in ICE_PROTOCOLS must be of the form
2204d17cd367SmrgICE_INITIATE_<emphasis remap='I'>pname</emphasis> where
2205d17cd367Smrg<emphasis remap='I'>pname</emphasis> is the name of the ICE
2206d17cd367Smrgsubprotocol the ICE originating party is willing to speak, as would be
2207d17cd367Smrgspecified in an ICE
2208d17cd367Smrg<function>ProtocolSetup</function>
2209d17cd367Smrgmessage.
2210d17cd367Smrg</para>
2211d17cd367Smrg
2212d17cd367Smrg<para>
2213d17cd367SmrgClients with an ICE_INITIATE_<emphasis remap='I'>pname</emphasis> atom
2214d17cd367Smrgin the ICE_PROTOCOLS property on their top-level windows must respond to
2215d17cd367Smrg<function>ClientMessage</function> events of
2216d17cd367Smrgtype ICE_PROTOCOLS specifying ICE_INITIATE_
2217d17cd367Smrg<emphasis remap='I'>pname</emphasis>.  If a client does not
2218d17cd367Smrgwant to respond to these client message events, it should
2219d17cd367Smrgremove the ICE_INITIATE_<emphasis remap='I'>pname</emphasis>
2220d17cd367Smrgatom from its ICE_PROTOCOLS property
2221d17cd367Smrgor remove the ICE_PROTOCOLS property entirely.
2222d17cd367Smrg</para>
2223d17cd367Smrg</sect1>
2224d17cd367Smrg
22259ef0b394Smrg<sect1 id='Initiating_the_Rendezvous'>
2226d17cd367Smrg<title>Initiating the Rendezvous</title>
2227d17cd367Smrg
2228d17cd367Smrg<para>
2229d17cd367SmrgTo initiate the rendezvous a client acting as an ICE answering
2230d17cd367Smrgparty sends an X
2231d17cd367Smrg<function>ClientMessage</function>
2232d17cd367Smrgevent of type ICE_PROTOCOLS to an ICE
2233d17cd367Smrgoriginating party.  This ICE_PROTOCOLS client message contains the
2234d17cd367Smrginformation the ICE originating party needs to identify the ICE
2235d17cd367Smrgsubprotocol the two parties will use as well as the ICE network
2236d17cd367Smrgidentification string of the ICE answering party.
2237d17cd367Smrg</para>
2238d17cd367Smrg
2239d17cd367Smrg<para>
2240d17cd367SmrgBefore the ICE answering party sends the client message event it must
2241d17cd367Smrgdefine a text property on one of its windows.  This text property
2242d17cd367Smrgcontains the ICE answering party's ICE network identification string
2243d17cd367Smrgand will be used by ICE originating parties to determine the ICE
2244d17cd367Smrganswering party's list of ICE network IDs.
2245d17cd367Smrg</para>
2246d17cd367Smrg
2247d17cd367Smrg<para>
2248d17cd367SmrgThe property name will normally be ICE_NETWORK_IDS, but may be any
2249d17cd367Smrgname of the ICE answering party's choosing.  The format for this text
2250d17cd367Smrgproperty is as follows:
2251d17cd367Smrg</para>
2252d17cd367Smrg
22539ef0b394Smrg<informaltable frame='topbot'>
22549ef0b394Smrg  <?dbfo keep-together="always" ?>
22559ef0b394Smrg  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
22569ef0b394Smrg    <colspec colname='c1' colwidth='1.0*'/>
22579ef0b394Smrg    <colspec colname='c2' colwidth='3.0*'/>
2258d17cd367Smrg    <thead>
22599ef0b394Smrg      <row rowsep='1'>
22609ef0b394Smrg        <entry>Field</entry>
22619ef0b394Smrg        <entry>Value</entry>
2262d17cd367Smrg      </row>
2263d17cd367Smrg    </thead>
2264d17cd367Smrg    <tbody>
2265d17cd367Smrg      <row>
22669ef0b394Smrg        <entry>type</entry>
22679ef0b394Smrg        <entry>XA_STRING</entry>
2268d17cd367Smrg      </row>
2269d17cd367Smrg      <row>
22709ef0b394Smrg        <entry>format</entry>
22719ef0b394Smrg        <entry>8</entry>
2272d17cd367Smrg      </row>
2273d17cd367Smrg      <row>
22749ef0b394Smrg        <entry>value</entry>
22759ef0b394Smrg        <entry>comma-separated list of ICE network IDs</entry>
2276d17cd367Smrg      </row>
2277d17cd367Smrg    </tbody>
2278d17cd367Smrg  </tgroup>
2279d17cd367Smrg</informaltable>
2280d17cd367Smrg
2281d17cd367Smrg
2282d17cd367Smrg
2283d17cd367Smrg<para>
2284d17cd367SmrgOnce the ICE answering party has established this text property on one
2285d17cd367Smrgof its windows, it initiates the rendezvous by sending an
2286d17cd367SmrgICE_PROTOCOLS
2287d17cd367Smrg<function>ClientMessage</function>
2288d17cd367Smrgevent to an ICE originating party's
2289d17cd367Smrgtop-level window.  This event has the following format
2290d17cd367Smrgand must only be sent to windows that have pre-registered the ICE
2291d17cd367Smrgsubprotocol in an ICE_PROTOCOLS property on their top-level window.
2292d17cd367Smrg</para>
2293d17cd367Smrg
22949ef0b394Smrg<informaltable frame='topbot'>
22959ef0b394Smrg  <?dbfo keep-together="always" ?>
22969ef0b394Smrg  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
22979ef0b394Smrg    <colspec colname='c1' colwidth='1.0*'/>
22989ef0b394Smrg    <colspec colname='c2' colwidth='3.0*'/>
2299d17cd367Smrg    <thead>
23009ef0b394Smrg      <row rowsep='1'>
23019ef0b394Smrg        <entry>Field</entry>
23029ef0b394Smrg        <entry>Value</entry>
2303d17cd367Smrg      </row>
2304d17cd367Smrg    </thead>
2305d17cd367Smrg    <tbody>
2306d17cd367Smrg      <row>
23079ef0b394Smrg        <entry>message_type</entry>
23089ef0b394Smrg        <entry>Atom = "ICE_PROTOCOLS"</entry>
2309d17cd367Smrg      </row>
2310d17cd367Smrg      <row>
23119ef0b394Smrg        <entry>format</entry>
23129ef0b394Smrg        <entry>32</entry>
2313d17cd367Smrg      </row>
2314d17cd367Smrg      <row>
23159ef0b394Smrg        <entry>data.l[0]</entry>
23169ef0b394Smrg        <entry>Atom identifying the ICE subprotocol to speak</entry>
2317d17cd367Smrg      </row>
2318d17cd367Smrg      <row>
23199ef0b394Smrg        <entry>data.l[1]</entry>
23209ef0b394Smrg        <entry>Timestamp</entry>
2321d17cd367Smrg      </row>
2322d17cd367Smrg      <row>
23239ef0b394Smrg        <entry>data.l[2]</entry>
23249ef0b394Smrg        <entry><para>ICE answering party's window ID with
2325d17cd367SmrgICE network IDs text property</para></entry>
2326d17cd367Smrg      </row>
2327d17cd367Smrg      <row>
23289ef0b394Smrg        <entry>data.l[3]</entry>
23299ef0b394Smrg        <entry>Atom naming text property containing the ICE
2330d17cd367Smrganswering party's ICE network IDs</entry>
2331d17cd367Smrg      </row>
2332d17cd367Smrg      <row>
23339ef0b394Smrg        <entry>data.l[4]</entry>
23349ef0b394Smrg        <entry>Reserved.  Must be 0.</entry>
2335d17cd367Smrg      </row>
2336d17cd367Smrg    </tbody>
2337d17cd367Smrg  </tgroup>
2338d17cd367Smrg</informaltable>
2339d17cd367Smrg
2340d17cd367Smrg
2341d17cd367Smrg<para>
2342d17cd367SmrgThe name of the atom in data.l[0] must be of the form
2343d17cd367SmrgICE_INITIATE_<emphasis remap='I'>pname</emphasis>, where
2344d17cd367Smrg<emphasis remap='I'>pname</emphasis> is the name of the ICE
2345d17cd367Smrgsubprotocol the ICE answering party wishes to speak.
2346d17cd367Smrg</para>
2347d17cd367Smrg
2348d17cd367Smrg<para>
2349d17cd367SmrgWhen an ICE originating party receives a
2350d17cd367Smrg<function>ClientMessage</function>
2351d17cd367Smrgevent of type
2352d17cd367SmrgICE_PROTOCOLS specifying ICE_INITIATE_<emphasis remap='I'>pname</emphasis>
2353d17cd367Smrgit can initiate an ICE connection with the ICE answering party.
2354d17cd367SmrgTo open this connection the client retrieves the ICE answering
2355d17cd367Smrgparty's ICE network IDs from the window specified in data.l[2] using
2356d17cd367Smrgthe text property specified in data.l[3].
2357d17cd367Smrg</para>
2358d17cd367Smrg
2359d17cd367Smrg<para>
2360d17cd367SmrgIf the connection attempt fails for any reason, the client must
2361d17cd367Smrgrespond to the client message event by sending a return
2362d17cd367Smrg<function>ClientMessage</function>
2363d17cd367Smrgevent to the window specified in data.l[2].  This return
2364d17cd367Smrgevent has the following format:
2365d17cd367Smrg</para>
2366d17cd367Smrg
23679ef0b394Smrg<informaltable frame='topbot'>
23689ef0b394Smrg  <?dbfo keep-together="always" ?>
23699ef0b394Smrg  <tgroup cols='2' align='left' colsep='0' rowsep='0'>
23709ef0b394Smrg    <colspec colname='c1' colwidth='1.0*'/>
23719ef0b394Smrg    <colspec colname='c2' colwidth='3.0*'/>
2372d17cd367Smrg    <thead>
23739ef0b394Smrg      <row rowsep='1'>
23749ef0b394Smrg        <entry>Field</entry>
23759ef0b394Smrg        <entry>Value</entry>
2376d17cd367Smrg      </row>
2377d17cd367Smrg    </thead>
2378d17cd367Smrg    <tbody>
2379d17cd367Smrg      <row>
23809ef0b394Smrg        <entry>message_type</entry>
23819ef0b394Smrg        <entry>Atom = "ICE_INITIATE_FAILED"</entry>
2382d17cd367Smrg      </row>
2383d17cd367Smrg      <row>
23849ef0b394Smrg        <entry>format</entry>
23859ef0b394Smrg        <entry>32</entry>
2386d17cd367Smrg      </row>
2387d17cd367Smrg      <row>
23889ef0b394Smrg        <entry>data.l[0]</entry>
23899ef0b394Smrg        <entry>Atom identifying the ICE subprotocol requested</entry>
2390d17cd367Smrg      </row>
2391d17cd367Smrg      <row>
23929ef0b394Smrg        <entry>data.l[1]</entry>
23939ef0b394Smrg        <entry>Timestamp</entry>
2394d17cd367Smrg      </row>
2395d17cd367Smrg      <row>
23969ef0b394Smrg        <entry>data.l[2]</entry>
23979ef0b394Smrg        <entry><para>Initiating party's window ID
2398d17cd367Smrg(holding ICE_PROTOCOLS)</para></entry>
2399d17cd367Smrg      </row>
2400d17cd367Smrg      <row>
24019ef0b394Smrg        <entry>data.l[3]</entry>
24029ef0b394Smrg        <entry>int: reason for failure</entry>
2403d17cd367Smrg      </row>
2404d17cd367Smrg      <row>
24059ef0b394Smrg        <entry>data.l[4]</entry>
24069ef0b394Smrg        <entry>Reserved, must be 0</entry>
2407d17cd367Smrg      </row>
2408d17cd367Smrg    </tbody>
2409d17cd367Smrg  </tgroup>
2410d17cd367Smrg</informaltable>
2411d17cd367Smrg
2412d17cd367Smrg
2413d17cd367Smrg<para>
2414d17cd367SmrgThe values of data.l[0] and data.l[1] are copied directly from the
2415d17cd367Smrgclient message event the client received.
2416d17cd367Smrg</para>
2417d17cd367Smrg
2418d17cd367Smrg<para>
2419d17cd367SmrgThe value in data.l[2] is
2420d17cd367Smrgthe id of the window to which the
2421d17cd367SmrgICE_PROTOCOLS.ICE_INITIATE_<emphasis remap='I'>pname</emphasis>
2422d17cd367Smrgclient message event was sent.
2423d17cd367Smrg</para>
2424d17cd367Smrg
2425d17cd367Smrg<para>Data.l[3] has one of the following values:</para>
2426d17cd367Smrg
2427d17cd367Smrg<!-- .ne 21 -->
2428d17cd367Smrg
24299ef0b394Smrg<informaltable frame='topbot'>
24309ef0b394Smrg  <tgroup cols='3' align='left' colsep='0' rowsep='0'>
24319ef0b394Smrg    <colspec colname='c1' colwidth='1.5*'/>
24329ef0b394Smrg    <colspec colname='c2' colwidth='1.0*'/>
24339ef0b394Smrg    <colspec colname='c3' colwidth='3.0*'/>
2434d17cd367Smrg    <thead>
24359ef0b394Smrg      <row rowsep='1'>
24369ef0b394Smrg        <entry>Value</entry>
24379ef0b394Smrg        <entry>Encoding</entry>
24389ef0b394Smrg        <entry>Description</entry>
2439d17cd367Smrg      </row>
2440d17cd367Smrg    </thead>
2441d17cd367Smrg    <tbody>
2442d17cd367Smrg      <row>
24439ef0b394Smrg        <entry>OpenFailed</entry>
24449ef0b394Smrg        <entry>1</entry>
24459ef0b394Smrg        <entry>
2446d17cd367SmrgThe client was unable to open the connection
2447d17cd367Smrg(e.g. a call to IceOpenConnection() failed).  If the
2448d17cd367Smrgclient is able to distinguish authentication or
2449d17cd367Smrgauthorization errors from general errors, then
2450d17cd367Smrgthe preferred reply is <function>AuthenticationFailed</function>
2451d17cd367Smrgfor authorization errors.
2452d17cd367Smrg          </entry>
2453d17cd367Smrg      </row>
2454d17cd367Smrg      <row>
24559ef0b394Smrg        <entry>AuthenticationFailed</entry>
24569ef0b394Smrg        <entry>2</entry>
24579ef0b394Smrg        <entry>Authentication or authorization of the
2458d17cd367Smrgconnection or protocol setup was refused.
2459d17cd367SmrgThis reply will be given only if the client is
2460d17cd367Smrgable to distinguish it from
2461d17cd367Smrg<function>OpenFailed</function>
2462d17cd367Smrgotherwise
2463d17cd367Smrg<function>OpenFailed</function>
2464d17cd367Smrgwill be returned.</entry>
2465d17cd367Smrg      </row>
2466d17cd367Smrg      <row>
24679ef0b394Smrg        <entry>SetupFailed</entry>
24689ef0b394Smrg        <entry>3</entry>
24699ef0b394Smrg        <entry>The client was unable to initiate the specified
2470d17cd367Smrgprotocol on the connection (e.g. a call to
2471d17cd367SmrgIceProtocolSetup() failed).</entry>
2472d17cd367Smrg      </row>
2473d17cd367Smrg      <row>
24749ef0b394Smrg        <entry>UnknownProtocol</entry>
24759ef0b394Smrg        <entry>4</entry>
24769ef0b394Smrg        <entry>The client does not recognize the requested
2477d17cd367Smrgprotocol.  (This represents a semantic error
2478d17cd367Smrgon the part of the answering party.)</entry>
2479d17cd367Smrg      </row>
2480d17cd367Smrg      <row>
24819ef0b394Smrg        <entry>Refused</entry>
24829ef0b394Smrg        <entry>5</entry>
24839ef0b394Smrg        <entry>
2484d17cd367SmrgThe client was in the process of removing
2485d17cd367SmrgICE_INITIATE_<emphasis remap='I'>pname</emphasis>
2486d17cd367Smrgfrom its ICE_PROTOCOLS list
2487d17cd367Smrgwhen the client message was sent; the client no
2488d17cd367Smrglonger is willing to establish the specified ICE
2489d17cd367Smrgcommunication.</entry>
2490d17cd367Smrg      </row>
2491d17cd367Smrg    </tbody>
2492d17cd367Smrg  </tgroup>
2493d17cd367Smrg</informaltable>
2494d17cd367Smrg
2495d17cd367Smrg
2496d17cd367Smrg<note>
2497d17cd367Smrg<para>
2498d17cd367SmrgClients willing to act as ICE originating parties must update the
2499d17cd367SmrgICE_PROTOCOLS property on their top-level windows to include the
2500d17cd367SmrgICE_INITIATE_<emphasis remap='I'>pname</emphasis> atom(s) identifying
2501d17cd367Smrgthe ICE subprotocols they
2502d17cd367Smrgspeak.  The method a client uses to update the ICE_PROTOCOLS property
2503d17cd367Smrgto include ICE_INITIATE_<emphasis remap='I'>pname</emphasis> atoms is
2504d17cd367Smrgimplementation dependent, but
2505d17cd367Smrgthe client must ensure the integrity of the list to prevent the
2506d17cd367Smrgaccidental omission of any atoms previously in the list.
2507d17cd367Smrg</para>
2508d17cd367Smrg
2509d17cd367Smrg<para>
2510d17cd367SmrgWhen setting up the ICE network IDs text property on one of its
2511d17cd367Smrgwindows, the ICE answering party can determine its comma-separated
2512d17cd367Smrglist of ICE network IDs by calling IceComposeNetworkIdList() after
2513d17cd367Smrgmaking a call to IceListenForConnections().  The method an ICE
2514d17cd367Smrganswering party uses to find the top-level windows of clients willing
2515d17cd367Smrgto act as ICE originating parties is dependent upon the nature of the
2516d17cd367Smrganswering party.  Some may wish to use the approach of requiring the
2517d17cd367Smrguser to click on a client's window.  Others wishing to find existing
2518d17cd367Smrgclients without requiring user interaction might use something similar
2519d17cd367Smrgto the XQueryTree() method used by several freely-available
2520d17cd367Smrgapplications.  In order for the ICE answering party to become
2521d17cd367Smrgautomatically aware of new clients willing to originate ICE
2522d17cd367Smrgconnections, the ICE answering party might register for
2523d17cd367SmrgSubstructureNotify events on the root window of the display.  When it
2524d17cd367Smrgreceives a SubstructureNotify event, the ICE answering party can check
2525d17cd367Smrgto see if it was the result of the creation of a new client top-level
2526d17cd367Smrgwindow with an ICE_PROTOCOLS property.
2527d17cd367Smrg</para>
2528d17cd367Smrg
2529d17cd367Smrg<para>
2530d17cd367SmrgIn any case, before attempting to use this ICE X Rendezvous Mechanism
2531d17cd367SmrgICE answering parties wishing to speak ICE subprotocol
2532d17cd367Smrg<emphasis remap='I'>pname</emphasis> should
2533d17cd367Smrgcheck for the ICE_INITIATE_<emphasis remap='I'>pname</emphasis> atom
2534d17cd367Smrgin the ICE_PROTOCOLS property on
2535d17cd367Smrga client's top-level window.  A client that does not include an
2536d17cd367SmrgICE_INITIATE_<emphasis remap='I'>pname</emphasis> atom in a
2537d17cd367SmrgICE_PROTOCOLS property on some top-level window should be assumed to ignore
2538d17cd367Smrg<function>ClientMessage</function>
2539d17cd367Smrgevents of type
2540d17cd367SmrgICE_PROTOCOLS specifying ICE_INITIATE_<emphasis remap='I'>pname</emphasis>
2541d17cd367Smrgfor ICE subprotocol <emphasis remap='I'>pname</emphasis>.
2542d17cd367Smrg</para>
2543d17cd367Smrg</note>
2544d17cd367Smrg</sect1>
2545d17cd367Smrg
25469ef0b394Smrg<sect1 id='ICE_Subprotocol_Versioning'>
2547d17cd367Smrg<title>ICE Subprotocol Versioning</title>
2548d17cd367Smrg
2549d17cd367Smrg<para>
2550d17cd367SmrgAlthough the version of the ICE subprotocol could be passed in the
2551d17cd367Smrgclient message event, ICE provides more a flexible version negotiation
2552d17cd367Smrgmechanism than will fit within a single
2553d17cd367Smrg<function>ClientMessage</function>
2554d17cd367Smrgevent.  Because
2555d17cd367Smrgof this, ICE subprotocol versioning is handled within the ICE protocol
2556d17cd367Smrgsetup phase.</para>
2557d17cd367Smrg<note remap='NT'>
2558d17cd367Smrg<para>Clients wish to communicate with each other via an ICE subprotocol
2559d17cd367Smrgknown as "RAP V1.0".  In RAP terminology one party, the "agent",
2560d17cd367Smrgcommunicates with other RAP-enabled applications on demand.  The
2561d17cd367Smrguser may direct the agent to establish communication with a specific
2562d17cd367Smrgapplication by clicking on the application's window, or the agent may
2563d17cd367Smrgwatch for new application windows to be created and automatically
2564d17cd367Smrgestablish communication.
2565d17cd367Smrg</para>
2566d17cd367Smrg
2567d17cd367Smrg<para>
2568d17cd367SmrgDuring startup the ICE answering party (the agent) first calls
2569d17cd367SmrgIceRegisterForProtocolReply() with a list of
2570d17cd367Smrgthe versions (i.e., 1.0) of RAP the agent can speak.  The answering
2571d17cd367Smrgparty then calls IceListenForConnections() followed by
2572d17cd367SmrgIceComposeNetworkIdList() and stores the resulting ICE network IDs
2573d17cd367Smrgstring in a text property on one of its windows.
2574d17cd367Smrg</para>
2575d17cd367Smrg
2576d17cd367Smrg<para>
2577d17cd367SmrgWhen the answering party (agent) finds a client with which it wishes to
2578d17cd367Smrgspeak, it checks to see if the ICE_INITIATE_RAP atom is in the ICE_PROTOCOLS
2579d17cd367Smrgproperty on the client's top-level window.  If it is present the agent
2580d17cd367Smrgsends the client's top-level window an ICE_PROTOCOLS client
2581d17cd367Smrgmessage event as described above.  When the client receives the client
2582d17cd367Smrgmessage event and is willing to originate an ICE connection using RAP,
2583d17cd367Smrgit performs an IceRegisterForProtocolSetup() with a list of the
2584d17cd367Smrgversions of RAP the client can speak.  The client then retrieves
2585d17cd367Smrgthe agent's ICE network ID from the property and window specified by
2586d17cd367Smrgthe agent in the client message event and calls IceOpenConnection().
2587d17cd367SmrgAfter this call succeeds the client calls IceProtocolSetup() specifying
2588d17cd367Smrgthe RAP protocol.  During this
2589d17cd367Smrgprocess, ICE calls the RAP protocol routines that handle the version
2590d17cd367Smrgnegotiation.
2591d17cd367Smrg</para>
2592d17cd367Smrg
2593d17cd367Smrg<para>
2594d17cd367SmrgNote that it is not necessary for purposes of this rendezvous that
2595d17cd367Smrgthe client application call any ICElib functions prior to receipt
2596d17cd367Smrgof the client message event.
2597d17cd367Smrg</para>
2598d17cd367Smrg</note>
2599d17cd367Smrg</sect1>
2600d17cd367Smrg</appendix>
2601d17cd367Smrg</book>
2602