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 “Software”), 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 “AS IS”, 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<type> denotes a counted collection of <type>. 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><dependent on major/minor opcode and class></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><specific to authentication protocol></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><specific to authentication protocol></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><specific to authentication protocol></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><any></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><any></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><any></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><any></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<varies> 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><any></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> \(-> 1255d17cd367Smrg<function>FatalToConnection</function> 1256d17cd367Smrg<function>ProtocolSetup</function> \(-> 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> \(-> 1288d17cd367Smrg<function>FatalToConnection</function> 1289d17cd367Smrg<function>ProtocolSetup</function> \(-> 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> \(-> 1322d17cd367Smrg<function>FatalToConnection</function> 1323d17cd367Smrg<function>ProtocolSetup</function> \(-> 1324d17cd367Smrg<function>FatalToProtocol</function> 1325d17cd367Smrg<function>AuthenticationReply</function> \(-> 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> -> <emphasis remap='C'>conn_wait</emphasis> 1510d17cd367Smrg 1511d17cd367Smrg<emphasis remap='C'>conn_wait</emphasis>: 1512d17cd367Smrg receive <function>ConnectionReply</function> -> <emphasis remap='C'>stasis</emphasis> 1513d17cd367Smrg receive <function>AuthenticationRequired</function> -> <emphasis remap='C'>conn_auth1</emphasis> 1514d17cd367Smrg receive <function>Error</function> -> <emphasis remap='C'>quit</emphasis> 1515d17cd367Smrg receive <other>, send <function>Error</function> -> <emphasis remap='C'>quit</emphasis> 1516d17cd367Smrg 1517d17cd367Smrg<emphasis remap='C'>conn_auth1</emphasis>: 1518d17cd367Smrg if good auth data, send <function>AuthenticationReply</function> -> <emphasis remap='C'>conn_auth2</emphasis> 1519d17cd367Smrg if bad auth data, send <function>Error</function> -> <emphasis remap='C'>quit</emphasis> 1520d17cd367Smrg 1521d17cd367Smrg<emphasis remap='C'>conn_auth2</emphasis>: 1522d17cd367Smrg receive <function>ConnectionReply</function> -> <emphasis remap='C'>stasis</emphasis> 1523d17cd367Smrg receive <function>AuthenticationNextPhase</function> -> <emphasis remap='C'>conn_auth1</emphasis> 1524d17cd367Smrg receive <function>Error</function> -> <emphasis remap='C'>quit</emphasis> 1525d17cd367Smrg receive <other>, send <function>Error</function> -> <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 -> <emphasis remap='C'>init_wait</emphasis> 1536d17cd367Smrg 1537d17cd367Smrg<emphasis remap='C'>init_wait</emphasis>: 1538d17cd367Smrg receive <function>ByteOrder</function> <function>ConnectionSetup</function> -> <emphasis remap='C'>auth_ask</emphasis> 1539d17cd367Smrg receive <other>, send <function>Error</function> -> <emphasis remap='C'>quit</emphasis> 1540d17cd367Smrg 1541d17cd367Smrg<emphasis remap='C'>auth_ask</emphasis>: 1542d17cd367Smrg send <function>ByteOrder</function> <function>ConnectionReply</function> 1543d17cd367Smrg-> <emphasis remap='C'>stasis</emphasis> 1544d17cd367Smrg 1545d17cd367Smrg send <function>AuthenticationRequired</function> -> <emphasis remap='C'>auth_wait</emphasis> 1546d17cd367Smrg 1547d17cd367Smrg send <function>Error</function> -> <emphasis remap='C'>quit</emphasis> 1548d17cd367Smrg 1549d17cd367Smrg<emphasis remap='C'>auth_wait</emphasis>: 1550d17cd367Smrg receive <function>AuthenticationReply</function> -> <emphasis remap='C'>auth_check</emphasis> 1551d17cd367Smrg 1552d17cd367Smrg receive <other>, send <function>Error</function> -> <emphasis remap='C'>quit</emphasis> 1553d17cd367Smrg 1554d17cd367Smrg<emphasis remap='C'>auth_check</emphasis>: 1555d17cd367Smrg if no more auth needed, send <function>ConnectionReply</function> -> <emphasis remap='C'>stasis</emphasis> 1556d17cd367Smrg if good auth data, send <function>AuthenticationNextPhase</function> -> <emphasis remap='C'>auth_wait</emphasis> 1557d17cd367Smrg if bad auth data, send <function>Error</function> -> <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> -> <emphasis remap='C'>proto_wait</emphasis> 1575d17cd367Smrg receive <function>ProtocolSetup</function> -> <emphasis remap='C'>proto_reply</emphasis> 1576d17cd367Smrg send <function>Ping</function> -> <emphasis remap='C'>ping_wait</emphasis> 1577d17cd367Smrg receive <function>Ping</function> send <function>PingReply</function> -> <emphasis remap='C'>stasis</emphasis> 1578d17cd367Smrg receive <function>WantToClose</function> -> <emphasis remap='C'>shutdown_attempt</emphasis> 1579d17cd367Smrg receive <other>, send <function>Error</function> -> <emphasis remap='C'>stasis</emphasis> 1580d17cd367Smrg all protocols shut down, send <function>WantToClose</function> -> <emphasis remap='C'>close_wait</emphasis> 1581d17cd367Smrg 1582d17cd367Smrg<emphasis remap='C'>proto_wait</emphasis>: 1583d17cd367Smrg receive <function>ProtocolReply</function> -> <emphasis remap='C'>stasis</emphasis> 1584d17cd367Smrg receive <function>AuthenticationRequired</function> -> <emphasis remap='C'>give_auth1</emphasis> 1585d17cd367Smrg receive <function>Error</function> give up on this protocol -> <emphasis remap='C'>stasis</emphasis> 1586d17cd367Smrg receive <function>WantToClose</function> -> <emphasis remap='C'>proto_wait</emphasis> 1587d17cd367Smrg 1588d17cd367Smrg<emphasis remap='C'>give_auth1</emphasis>: 1589d17cd367Smrg if good auth data, send <function>AuthenticationReply</function> -> <emphasis remap='C'>give_auth2</emphasis> 1590d17cd367Smrg if bad auth data, send <function>Error</function> give up on this protocol -> <emphasis remap='C'>stasis</emphasis> 1591d17cd367Smrg receive <function>WantToClose</function> -> <emphasis remap='C'>give_auth1</emphasis> 1592d17cd367Smrg 1593d17cd367Smrg<emphasis remap='C'>give_auth2</emphasis>: 1594d17cd367Smrg receive <function>ProtocolReply</function> -> <emphasis remap='C'>stasis</emphasis> 1595d17cd367Smrg receive <function>AuthenticationNextPhase</function> -> <emphasis remap='C'>give_auth1</emphasis> 1596d17cd367Smrg receive <function>Error</function> give up on this protocol -> <emphasis remap='C'>stasis</emphasis> 1597d17cd367Smrg receive <function>WantToClose</function> -> <emphasis remap='C'>give_auth2</emphasis> 1598d17cd367Smrg 1599d17cd367Smrg<emphasis remap='C'>proto_reply</emphasis>: 1600d17cd367Smrg send <function>ProtocolReply</function> -> <emphasis remap='C'>stasis</emphasis> 1601d17cd367Smrg send <function>AuthenticationRequired</function> -> <emphasis remap='C'>take_auth1</emphasis> 1602d17cd367Smrg send <function>Error</function> give up on this protocol -> <emphasis remap='C'>stasis</emphasis> 1603d17cd367Smrg 1604d17cd367Smrg<emphasis remap='C'>take_auth1</emphasis>: 1605d17cd367Smrg receive <function>AuthenticationReply</function> -> <emphasis remap='C'>take_auth2</emphasis> 1606d17cd367Smrg receive <function>Error</function> give up on this protocol -> <emphasis remap='C'>stasis</emphasis> 1607d17cd367Smrg 1608d17cd367Smrg<emphasis remap='C'>take_auth2</emphasis>: 1609d17cd367Smrg if good auth data \(-> <emphasis remap='C'>take_auth3</emphasis> 1610d17cd367Smrg if bad auth data, send <function>Error</function> give up on this protocol -> <emphasis remap='C'>stasis</emphasis> 1611d17cd367Smrg 1612d17cd367Smrg<emphasis remap='C'>take_auth3</emphasis>: 1613d17cd367Smrg if no more auth needed, send <function>ProtocolReply</function> -> <emphasis remap='C'>stasis</emphasis> 1614d17cd367Smrg if good auth data, send <function>AuthenticationNextPhase</function> -> <emphasis remap='C'>take_auth1</emphasis> 1615d17cd367Smrg if bad auth data, send <function>Error</function> give up on this protocol -> <emphasis remap='C'>stasis</emphasis> 1616d17cd367Smrg 1617d17cd367Smrg<emphasis remap='C'>ping_wait</emphasis>: 1618d17cd367Smrg receive <function>PingReply</function> -> <emphasis remap='C'>stasis</emphasis> 1619d17cd367Smrg 1620d17cd367Smrg<emphasis remap='C'>quit</emphasis>: 1621d17cd367Smrg -> 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> -> <emphasis remap='C'>stasis</emphasis> 1631d17cd367Smrg else -> <emphasis remap='C'>quit</emphasis> 1632d17cd367Smrg 1633d17cd367Smrg<emphasis remap='C'>close_wait</emphasis>: 1634d17cd367Smrg receive <function>ProtocolSetup</function> -> <emphasis remap='C'>proto_reply</emphasis> 1635d17cd367Smrg receive <function>NoClose</function> -> <emphasis remap='C'>stasis</emphasis> 1636d17cd367Smrg receive <function>WantToClose</function> -> <emphasis remap='C'>quit</emphasis> 1637d17cd367Smrg connection close -> <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<type> indicates some number of repetitions of 1658d17cd367Smrg<type>, 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 <varies> 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 <varies> 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 <varies> 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 <varies> 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