€•Œsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ5/translations/zh_CN/driver-api/surface_aggregator/ssh”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/zh_TW/driver-api/surface_aggregator/ssh”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/it_IT/driver-api/surface_aggregator/ssh”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/ja_JP/driver-api/surface_aggregator/ssh”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/ko_KR/driver-api/surface_aggregator/ssh”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/pt_BR/driver-api/surface_aggregator/ssh”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/sp_SP/driver-api/surface_aggregator/ssh”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒ!SPDX-License-Identifier: GPL-2.0+”h]”hŒ!SPDX-License-Identifier: GPL-2.0+”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒO/var/lib/git/docbuild/linux/Documentation/driver-api/surface_aggregator/ssh.rst”h´KubhŒsubstitution_definition”“”)�”}”(hŒ#.. |u8| replace:: :c:type:`u8 `”h]”h)�”}”(hŒ:c:type:`u8 `”h]”hŒliteral”“”)�”}”(hhÐh]”hŒu8”…”�”}”(hhÔh²hh³Nh´Nubah}”(h]”h ]”(Œxref”Œc”Œc-type”eh"]”h$]”h&]”uh1hÒhhÎubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”Œ!driver-api/surface_aggregator/ssh”Œ refdomain”hߌreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰Œ reftarget”Œu8”uh1hh³hÇh´KhhÊubah}”(h]”h ]”h"]”Œu8”ah$]”h&]”uh1hÈh³hÇh´Khhh²hubhÉ)�”}”(hŒ&.. |u16| replace:: :c:type:`u16 `”h]”h)�”}”(hŒ:c:type:`u16 `”h]”hÓ)�”}”(hjh]”hŒu16”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”(hÞhߌc-type”eh"]”h$]”h&]”uh1hÒhhþubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰hñŒu16”uh1hh³hÇh´Khhúubah}”(h]”h ]”h"]”Œu16”ah$]”h&]”uh1hÈh³hÇh´Khhh²hubhÉ)�”}”(hŒ.. |TYPE| replace:: ``TYPE``”h]”hÓ)�”}”(hŒ``TYPE``”h]”hŒTYPE”…”�”}”hj(sbah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj$ubah}”(h]”h ]”h"]”ŒTYPE”ah$]”h&]”uh1hÈh³hÇh´Khhh²hubhÉ)�”}”(hŒ.. |LEN| replace:: ``LEN``”h]”hÓ)�”}”(hŒ``LEN``”h]”hŒLEN”…”�”}”hjAsbah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj=ubah}”(h]”h ]”h"]”ŒLEN”ah$]”h&]”uh1hÈh³hÇh´Khhh²hubhÉ)�”}”(hŒ.. |SEQ| replace:: ``SEQ``”h]”hÓ)�”}”(hŒ``SEQ``”h]”hŒSEQ”…”�”}”hjZsbah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjVubah}”(h]”h ]”h"]”ŒSEQ”ah$]”h&]”uh1hÈh³hÇh´Khhh²hubhÉ)�”}”(hŒ.. |SYN| replace:: ``SYN``”h]”hÓ)�”}”(hŒ``SYN``”h]”hŒSYN”…”�”}”hjssbah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjoubah}”(h]”h ]”h"]”ŒSYN”ah$]”h&]”uh1hÈh³hÇh´Khhh²hubhÉ)�”}”(hŒ.. |NAK| replace:: ``NAK``”h]”hÓ)�”}”(hŒ``NAK``”h]”hŒNAK”…”�”}”hjŒsbah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjˆubah}”(h]”h ]”h"]”ŒNAK”ah$]”h&]”uh1hÈh³hÇh´K hhh²hubhÉ)�”}”(hŒ.. |ACK| replace:: ``ACK``”h]”hÓ)�”}”(hŒ``ACK``”h]”hŒACK”…”�”}”hj¥sbah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj¡ubah}”(h]”h ]”h"]”ŒACK”ah$]”h&]”uh1hÈh³hÇh´K hhh²hubhÉ)�”}”(hŒ.. |DATA| replace:: ``DATA``”h]”hÓ)�”}”(hŒ``DATA``”h]”hŒDATA”…”�”}”hj¾sbah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjºubah}”(h]”h ]”h"]”ŒDATA”ah$]”h&]”uh1hÈh³hÇh´K hhh²hubhÉ)�”}”(hŒ$.. |DATA_SEQ| replace:: ``DATA_SEQ``”h]”hÓ)�”}”(hŒ ``DATA_SEQ``”h]”hŒDATA_SEQ”…”�”}”hj×sbah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjÓubah}”(h]”h ]”h"]”ŒDATA_SEQ”ah$]”h&]”uh1hÈh³hÇh´K hhh²hubhÉ)�”}”(hŒ$.. |DATA_NSQ| replace:: ``DATA_NSQ``”h]”hÓ)�”}”(hŒ ``DATA_NSQ``”h]”hŒDATA_NSQ”…”�”}”hjðsbah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjìubah}”(h]”h ]”h"]”ŒDATA_NSQ”ah$]”h&]”uh1hÈh³hÇh´K hhh²hubhÉ)�”}”(hŒ.. |TC| replace:: ``TC``”h]”hÓ)�”}”(hŒ``TC``”h]”hŒTC”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjubah}”(h]”h ]”h"]”ŒTC”ah$]”h&]”uh1hÈh³hÇh´Khhh²hubhÉ)�”}”(hŒ.. |TID| replace:: ``TID``”h]”hÓ)�”}”(hŒ``TID``”h]”hŒTID”…”�”}”hj"sbah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjubah}”(h]”h ]”h"]”ŒTID”ah$]”h&]”uh1hÈh³hÇh´Khhh²hubhÉ)�”}”(hŒ.. |SID| replace:: ``SID``”h]”hÓ)�”}”(hŒ``SID``”h]”hŒSID”…”�”}”hj;sbah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj7ubah}”(h]”h ]”h"]”ŒSID”ah$]”h&]”uh1hÈh³hÇh´Khhh²hubhÉ)�”}”(hŒ.. |IID| replace:: ``IID``”h]”hÓ)�”}”(hŒ``IID``”h]”hŒIID”…”�”}”hjTsbah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjPubah}”(h]”h ]”h"]”ŒIID”ah$]”h&]”uh1hÈh³hÇh´Khhh²hubhÉ)�”}”(hŒ.. |RQID| replace:: ``RQID``”h]”hÓ)�”}”(hŒ``RQID``”h]”hŒRQID”…”�”}”hjmsbah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjiubah}”(h]”h ]”h"]”ŒRQID”ah$]”h&]”uh1hÈh³hÇh´Khhh²hubhÉ)�”}”(hŒ.. |CID| replace:: ``CID`` ”h]”hÓ)�”}”(hŒ``CID``”h]”hŒCID”…”�”}”hj†sbah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj‚ubah}”(h]”h ]”h"]”ŒCID”ah$]”h&]”uh1hÈh³hÇh´Khhh²hubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒSurface Serial Hub Protocol”h]”hŒSurface Serial Hub Protocol”…”�”}”(hj¢h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj�h²hh³hÇh´KubhŒ paragraph”“”)�”}”(hXThe Surface Serial Hub (SSH) is the central communication interface for the embedded Surface Aggregator Module controller (SAM or EC), found on newer Surface generations. We will refer to this protocol and interface as SAM-over-SSH, as opposed to SAM-over-HID for the older generations.”h]”hXThe Surface Serial Hub (SSH) is the central communication interface for the embedded Surface Aggregator Module controller (SAM or EC), found on newer Surface generations. We will refer to this protocol and interface as SAM-over-SSH, as opposed to SAM-over-HID for the older generations.”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Khj�h²hubj±)�”}”(hXÆOn Surface devices with SAM-over-SSH, SAM is connected to the host via UART and defined in ACPI as device with ID ``MSHW0084``. On these devices, significant functionality is provided via SAM, including access to battery and power information and events, thermal read-outs and events, and many more. For Surface Laptops, keyboard input is handled via HID directed through SAM, on the Surface Laptop 3 and Surface Book 3 this also includes touchpad input.”h]”(hŒrOn Surface devices with SAM-over-SSH, SAM is connected to the host via UART and defined in ACPI as device with ID ”…”�”}”(hjÀh²hh³Nh´NubhÓ)�”}”(hŒ ``MSHW0084``”h]”hŒMSHW0084”…”�”}”(hjÈh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjÀubhXH. On these devices, significant functionality is provided via SAM, including access to battery and power information and events, thermal read-outs and events, and many more. For Surface Laptops, keyboard input is handled via HID directed through SAM, on the Surface Laptop 3 and Surface Book 3 this also includes touchpad input.”…”�”}”(hjÀh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Khj�h²hubj±)�”}”(hŒ¨Note that the standard disclaimer for this subsystem also applies to this document: All of this has been reverse-engineered and may thus be erroneous and/or incomplete.”h]”hŒ¨Note that the standard disclaimer for this subsystem also applies to this document: All of this has been reverse-engineered and may thus be erroneous and/or incomplete.”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K&hj�h²hubj±)�”}”(hŒ�All CRCs used in the following are two-byte ``crc_itu_t(0xffff, ...)``. All multi-byte values are little-endian, there is no implicit padding between values.”h]”(hŒ,All CRCs used in the following are two-byte ”…”�”}”(hjîh²hh³Nh´NubhÓ)�”}”(hŒ``crc_itu_t(0xffff, ...)``”h]”hŒcrc_itu_t(0xffff, ...)”…”�”}”(hjöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjîubhŒW. All multi-byte values are little-endian, there is no implicit padding between values.”…”�”}”(hjîh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K*hj�h²hubjœ)�”}”(hhh]”(j¡)�”}”(hŒ SSH Packet Protocol: Definitions”h]”hŒ SSH Packet Protocol: Definitions”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjh²hh³hÇh´K0ubj±)�”}”(hŒ³The fundamental communication unit of the SSH protocol is a frame (:c:type:`struct ssh_frame `). A frame consists of the following fields, packed together and in order:”h]”(hŒCThe fundamental communication unit of the SSH protocol is a frame (”…”�”}”(hjh²hh³Nh´Nubh)�”}”(hŒ&:c:type:`struct ssh_frame `”h]”hÓ)�”}”(hj)h]”hŒstruct ssh_frame”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”(hÞhߌc-type”eh"]”h$]”h&]”uh1hÒhj'ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰hñŒ ssh_frame”uh1hh³hÇh´K2hjubhŒJ). A frame consists of the following fields, packed together and in order:”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K2hjh²hubhŒtable”“”)�”}”(hhh]”(j¡)�”}”(hŒ SSH Frame”h]”hŒ SSH Frame”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´K6hjRubhŒtgroup”“”)�”}”(hhh]”(hŒcolspec”“”)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jhhjeubji)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jhhjeubji)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jhhjeubhŒthead”“”)�”}”(hhh]”hŒrow”“”)�”}”(hhh]”(hŒentry”“”)�”}”(hhh]”j±)�”}”(hŒField”h]”hŒField”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K:hj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj�ubj“)�”}”(hhh]”j±)�”}”(hŒType”h]”hŒType”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K;hj«ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj�ubj“)�”}”(hhh]”j±)�”}”(hŒ Description”h]”hŒ Description”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Khjíubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjêubj“)�”}”(hhh]”j±)�”}”(hŒ|u8|”h]”h)�”}”(hhÐh]”hÓ)�”}”(hhÐh]”hŒu8”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”(hÞhßhàeh"]”h$]”h&]”uh1hÒh³Nh´Nhjubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”hîŒ refexplicit”ˆŒrefwarn”‰Œ reftarget”hòuh1hh³hÇh´Khjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K?hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjêubj“)�”}”(hhh]”j±)�”}”(hŒType identifier of the frame.”h]”hŒType identifier of the frame.”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K@hj<ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjêubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hjçubjŽ)�”}”(hhh]”(j“)�”}”(hhh]”j±)�”}”(hŒ|LEN|”h]”hÓ)�”}”(hjCh]”hŒLEN”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj_h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KBhj\ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjYubj“)�”}”(hhh]”j±)�”}”(hŒ|u16|”h]”h)�”}”(hjh]”hÓ)�”}”(hjh]”hŒu16”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”(hÞhßj eh"]”h$]”h&]”uh1hÒh³Nh´Nhjƒubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”jŒ refexplicit”ˆŒrefwarn”‰Œ reftarget”juh1hh³hÇh´Khjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KChj|ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjYubj“)�”}”(hhh]”j±)�”}”(hŒ0Length of the payload associated with the frame.”h]”hŒ0Length of the payload associated with the frame.”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KDhj«ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjYubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hjçubjŽ)�”}”(hhh]”(j“)�”}”(hhh]”j±)�”}”(hŒ|SEQ|”h]”hÓ)�”}”(hj\h]”hŒSEQ”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´NhjÎh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KFhjËubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÈubj“)�”}”(hhh]”j±)�”}”(hŒ|u8|”h]”h)�”}”(hhÐh]”hÓ)�”}”(hhÐh]”hŒu8”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”(hÞhßhàeh"]”h$]”h&]”uh1hÒh³Nh´Nhjòubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”hîŒ refexplicit”ˆŒrefwarn”‰Œ reftarget”hòuh1hh³hÇh´Khjîh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KGhjëubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÈubj“)�”}”(hhh]”j±)�”}”(hŒ$Sequence ID (see explanation below).”h]”hŒ$Sequence ID (see explanation below).”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KHhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÈubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hjçubeh}”(h]”h ]”h"]”h$]”h&]”uh1jåhjeubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1jchjRubeh}”(h]”Œid1”ah ]”h"]”h$]”h&]”uh1jPhjh²hh³Nh´Nubj±)�”}”(hXEach frame structure is followed by a CRC over this structure. The CRC over the frame structure (|TYPE|, |LEN|, and |SEQ| fields) is placed directly after the frame structure and before the payload. The payload is followed by its own CRC (over all payload bytes). If the payload is not present (i.e. the frame has ``LEN=0``), the CRC of the payload is still present and will evaluate to ``0xffff``. The |LEN| field does not include any of the CRCs, it equals the number of bytes between the CRC of the frame and the CRC of the payload.”h]”(hŒaEach frame structure is followed by a CRC over this structure. The CRC over the frame structure (”…”�”}”(hjKh²hh³Nh´NubhÓ)�”}”(hj*h]”hŒTYPE”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´NhjKh²hubhŒ, ”…”�”}”(hjKh²hh³Nh´NubhÓ)�”}”(hjCh]”hŒLEN”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´NhjKh²hubhŒ, and ”…”�”}”(hjKh²hh³Nh´NubhÓ)�”}”(hj\h]”hŒSEQ”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´NhjKh²hubhŒÁ fields) is placed directly after the frame structure and before the payload. The payload is followed by its own CRC (over all payload bytes). If the payload is not present (i.e. the frame has ”…”�”}”(hjKh²hh³Nh´NubhÓ)�”}”(hŒ ``LEN=0``”h]”hŒLEN=0”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjKubhŒ@), the CRC of the payload is still present and will evaluate to ”…”�”}”(hjKh²hh³Nh´NubhÓ)�”}”(hŒ ``0xffff``”h]”hŒ0xffff”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjKubhŒ. The ”…”�”}”(hjKh²hh³Nh´NubhÓ)�”}”(hjCh]”hŒLEN”…”�”}”(hjªh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´NhjKh²hubhŒ field does not include any of the CRCs, it equals the number of bytes between the CRC of the frame and the CRC of the payload.”…”�”}”(hjKh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KJhjh²hubj±)�”}”(hŒ>Additionally, the following fixed two-byte sequences are used:”h]”hŒ>Additionally, the following fixed two-byte sequences are used:”…”�”}”(hjÁh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KShjh²hubjQ)�”}”(hhh]”(j¡)�”}”(hŒSSH Byte Sequences”h]”hŒSSH Byte Sequences”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´KUhjÏubjd)�”}”(hhh]”(ji)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jhhjàubji)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jhhjàubji)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jhhjàubj‰)�”}”(hhh]”jŽ)�”}”(hhh]”(j“)�”}”(hhh]”j±)�”}”(hŒName”h]”hŒName”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KYhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjubj“)�”}”(hhh]”j±)�”}”(hŒValue”h]”hŒValue”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KZhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjubj“)�”}”(hhh]”j±)�”}”(hŒ Description”h]”hŒ Description”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K[hj5ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hjubah}”(h]”h ]”h"]”h$]”h&]”uh1jˆhjàubjæ)�”}”(hhh]”jŽ)�”}”(hhh]”(j“)�”}”(hhh]”j±)�”}”(hŒ|SYN|”h]”hÓ)�”}”(hjuh]”hŒSYN”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhjah²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K]hj^ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj[ubj“)�”}”(hhh]”j±)�”}”(hŒ``[0xAA, 0x55]``”h]”hÓ)�”}”(hjƒh]”hŒ [0xAA, 0x55]”…”�”}”(hj…h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K^hj~ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj[ubj“)�”}”(hhh]”j±)�”}”(hŒSynchronization bytes.”h]”hŒSynchronization bytes.”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K_hjžubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj[ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hjXubah}”(h]”h ]”h"]”h$]”h&]”uh1jåhjàubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1jchjÏubeh}”(h]”Œid2”ah ]”h"]”h$]”h&]”uh1jPhjh²hh³Nh´Nubj±)�”}”(hXªA message consists of |SYN|, followed by the frame (|TYPE|, |LEN|, |SEQ| and CRC) and, if specified in the frame (i.e. ``LEN > 0``), payload bytes, followed finally, regardless if the payload is present, the payload CRC. The messages corresponding to an exchange are, in part, identified by having the same sequence ID (|SEQ|), stored inside the frame (more on this in the next section). The sequence ID is a wrapping counter.”h]”(hŒA message consists of ”…”�”}”(hjÏh²hh³Nh´NubhÓ)�”}”(hjuh]”hŒSYN”…”�”}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´NhjÏh²hubhŒ, followed by the frame (”…”�”}”(hjÏh²hh³Nh´NubhÓ)�”}”(hj*h]”hŒTYPE”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´NhjÏh²hubhŒ, ”…”�”}”(hjÏh²hh³Nh´NubhÓ)�”}”(hjCh]”hŒLEN”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´NhjÏh²hubhŒ, ”…”�”}”hjÏsbhÓ)�”}”(hj\h]”hŒSEQ”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´NhjÏh²hubhŒ/ and CRC) and, if specified in the frame (i.e. ”…”�”}”(hjÏh²hh³Nh´NubhÓ)�”}”(hŒ ``LEN > 0``”h]”hŒLEN > 0”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjÏubhŒ¾), payload bytes, followed finally, regardless if the payload is present, the payload CRC. The messages corresponding to an exchange are, in part, identified by having the same sequence ID (”…”�”}”(hjÏh²hh³Nh´NubhÓ)�”}”(hj\h]”hŒSEQ”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´NhjÏh²hubhŒe), stored inside the frame (more on this in the next section). The sequence ID is a wrapping counter.”…”�”}”(hjÏh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Kahjh²hubj±)�”}”(hŒVA frame can have the following types (:c:type:`enum ssh_frame_type `):”h]”(hŒ&A frame can have the following types (”…”�”}”(hjDh²hh³Nh´Nubh)�”}”(hŒ.:c:type:`enum ssh_frame_type `”h]”hÓ)�”}”(hjNh]”hŒenum ssh_frame_type”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”(hÞhߌc-type”eh"]”h$]”h&]”uh1hÒhjLubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰hñŒssh_frame_type”uh1hh³hÇh´KhhjDubhŒ):”…”�”}”(hjDh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Khhjh²hubjQ)�”}”(hhh]”(j¡)�”}”(hŒSSH Frame Types”h]”hŒSSH Frame Types”…”�”}”(hjxh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´Kkhjuubjd)�”}”(hhh]”(ji)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jhhj†ubji)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jhhj†ubji)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jhhj†ubj‰)�”}”(hhh]”jŽ)�”}”(hhh]”(j“)�”}”(hhh]”j±)�”}”(hŒName”h]”hŒName”…”�”}”(hj°h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Kohj­ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjªubj“)�”}”(hhh]”j±)�”}”(hŒValue”h]”hŒValue”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KphjÄubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjªubj“)�”}”(hhh]”j±)�”}”(hŒShort Description”h]”hŒShort Description”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KqhjÛubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjªubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj§ubah}”(h]”h ]”h"]”h$]”h&]”uh1jˆhj†ubjæ)�”}”(hhh]”(jŽ)�”}”(hhh]”(j“)�”}”(hhh]”j±)�”}”(hŒ|NAK|”h]”hÓ)�”}”(hjŽh]”hŒNAK”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Kshjubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjubj“)�”}”(hhh]”j±)�”}”(hŒ``0x04``”h]”hÓ)�”}”(hj)h]”hŒ0x04”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj'ubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Kthj$ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjubj“)�”}”(hhh]”j±)�”}”(hŒ-Sent on error in previously received message.”h]”hŒ-Sent on error in previously received message.”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KuhjDubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hjþubjŽ)�”}”(hhh]”(j“)�”}”(hhh]”j±)�”}”(hŒ|ACK|”h]”hÓ)�”}”(hj§h]”hŒACK”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhjgh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Kwhjdubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjaubj“)�”}”(hhh]”j±)�”}”(hŒ``0x40``”h]”hÓ)�”}”(hj‰h]”hŒ0x40”…”�”}”(hj‹h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj‡ubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Kxhj„ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjaubj“)�”}”(hhh]”j±)�”}”(hŒ-Sent to acknowledge receival of |DATA| frame.”h]”(hŒ Sent to acknowledge receival of ”…”�”}”(hj§h²hh³Nh´NubhÓ)�”}”(hjÀh]”hŒDATA”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj§h²hubhŒ frame.”…”�”}”(hj§h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Kyhj¤ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjaubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hjþubjŽ)�”}”(hhh]”(j“)�”}”(hhh]”j±)�”}”(hŒ |DATA_SEQ|”h]”hÓ)�”}”(hjÙh]”hŒDATA_SEQ”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´NhjØh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K{hjÕubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÒubj“)�”}”(hhh]”j±)�”}”(hŒ``0x80``”h]”hÓ)�”}”(hjúh]”hŒ0x80”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjøubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K|hjõubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÒubj“)�”}”(hhh]”j±)�”}”(hŒ!Sent to transfer data. Sequenced.”h]”hŒ!Sent to transfer data. Sequenced.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K}hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÒubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hjþubjŽ)�”}”(hhh]”(j“)�”}”(hhh]”j±)�”}”(hŒ |DATA_NSQ|”h]”hÓ)�”}”(hjòh]”hŒDATA_NSQ”…”�”}”(hj< h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj8 h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Khj5 ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj2 ubj“)�”}”(hhh]”j±)�”}”(hŒ``0x00``”h]”hÓ)�”}”(hjZ h]”hŒ0x00”…”�”}”(hj\ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjX ubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K€hjU ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj2 ubj“)�”}”(hhh]”j±)�”}”(hŒ2Same as |DATA_SEQ|, but does not need to be ACKed.”h]”(hŒSame as ”…”�”}”(hjx h²hh³Nh´NubhÓ)�”}”(hjÙh]”hŒDATA_SEQ”…”�”}”(hj€ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhjx h²hubhŒ , but does not need to be ACKed.”…”�”}”(hjx h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K�hju ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj2 ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hjþubeh}”(h]”h ]”h"]”h$]”h&]”uh1jåhj†ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1jchjuubeh}”(h]”Œid3”ah ]”h"]”h$]”h&]”uh1jPhjh²hh³Nh´Nubj±)�”}”(hX&Both |NAK|- and |ACK|-type frames are used to control flow of messages and thus do not carry a payload. |DATA_SEQ|- and |DATA_NSQ|-type frames on the other hand must carry a payload. The flow sequence and interaction of different frame types will be described in more depth in the next section.”h]”(hŒBoth ”…”�”}”(hj· h²hh³Nh´NubhÓ)�”}”(hjŽh]”hŒNAK”…”�”}”(hj¿ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj· h²hubhŒ- and ”…”�”}”(hj· h²hh³Nh´NubhÓ)�”}”(hj§h]”hŒACK”…”�”}”(hjÐ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj· h²hubhŒS-type frames are used to control flow of messages and thus do not carry a payload. ”…”�”}”(hj· h²hh³Nh´NubhÓ)�”}”(hjÙh]”hŒDATA_SEQ”…”�”}”(hjá h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj· h²hubhŒ- and ”…”�”}”hj· sbhÓ)�”}”(hjòh]”hŒDATA_NSQ”…”�”}”(hjò h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj· h²hubhŒ¤-type frames on the other hand must carry a payload. The flow sequence and interaction of different frame types will be described in more depth in the next section.”…”�”}”(hj· h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Kƒhjh²hubeh}”(h]”Œssh-packet-protocol-definitions”ah ]”h"]”Œ ssh packet protocol: definitions”ah$]”h&]”uh1j›hj�h²hh³hÇh´K0ubjœ)�”}”(hhh]”(j¡)�”}”(hŒ"SSH Packet Protocol: Flow Sequence”h]”hŒ"SSH Packet Protocol: Flow Sequence”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj h²hh³hÇh´KŠubj±)�”}”(hX˜Each exchange begins with |SYN|, followed by a |DATA_SEQ|- or |DATA_NSQ|-type frame, followed by its CRC, payload, and payload CRC. In case of a |DATA_NSQ|-type frame, the exchange is then finished. In case of a |DATA_SEQ|-type frame, the receiving party has to acknowledge receival of the frame by responding with a message containing an |ACK|-type frame with the same sequence ID of the |DATA| frame. In other words, the sequence ID of the |ACK| frame specifies the |DATA| frame to be acknowledged. In case of an error, e.g. an invalid CRC, the receiving party responds with a message containing an |NAK|-type frame. As the sequence ID of the previous data frame, for which an error is indicated via the |NAK| frame, cannot be relied upon, the sequence ID of the |NAK| frame should not be used and is set to zero. After receival of an |NAK| frame, the sending party should re-send all outstanding (non-ACKed) messages.”h]”(hŒEach exchange begins with ”…”�”}”(hj" h²hh³Nh´NubhÓ)�”}”(hjuh]”hŒSYN”…”�”}”(hj* h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj" h²hubhŒ, followed by a ”…”�”}”(hj" h²hh³Nh´NubhÓ)�”}”(hjÙh]”hŒDATA_SEQ”…”�”}”(hj; h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj" h²hubhŒ- or ”…”�”}”(hj" h²hh³Nh´NubhÓ)�”}”(hjòh]”hŒDATA_NSQ”…”�”}”(hjL h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj" h²hubhŒI-type frame, followed by its CRC, payload, and payload CRC. In case of a ”…”�”}”(hj" h²hh³Nh´NubhÓ)�”}”(hjòh]”hŒDATA_NSQ”…”�”}”(hj] h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj" h²hubhŒ9-type frame, the exchange is then finished. In case of a ”…”�”}”(hj" h²hh³Nh´NubhÓ)�”}”(hjÙh]”hŒDATA_SEQ”…”�”}”(hjn h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj" h²hubhŒu-type frame, the receiving party has to acknowledge receival of the frame by responding with a message containing an ”…”�”}”(hj" h²hh³Nh´NubhÓ)�”}”(hj§h]”hŒACK”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj" h²hubhŒ--type frame with the same sequence ID of the ”…”�”}”(hj" h²hh³Nh´NubhÓ)�”}”(hjÀh]”hŒDATA”…”�”}”(hj� h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj" h²hubhŒ/ frame. In other words, the sequence ID of the ”…”�”}”(hj" h²hh³Nh´NubhÓ)�”}”(hj§h]”hŒACK”…”�”}”(hj¡ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj" h²hubhŒ frame specifies the ”…”�”}”(hj" h²hh³Nh´NubhÓ)�”}”(hjÀh]”hŒDATA”…”�”}”(hj² h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj" h²hubhŒ frame to be acknowledged. In case of an error, e.g. an invalid CRC, the receiving party responds with a message containing an ”…”�”}”(hj" h²hh³Nh´NubhÓ)�”}”(hjŽh]”hŒNAK”…”�”}”(hjà h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj" h²hubhŒd-type frame. As the sequence ID of the previous data frame, for which an error is indicated via the ”…”�”}”(hj" h²hh³Nh´NubhÓ)�”}”(hjŽh]”hŒNAK”…”�”}”(hjÔ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj" h²hubhŒ6 frame, cannot be relied upon, the sequence ID of the ”…”�”}”(hj" h²hh³Nh´NubhÓ)�”}”(hjŽh]”hŒNAK”…”�”}”(hjå h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj" h²hubhŒC frame should not be used and is set to zero. After receival of an ”…”�”}”(hj" h²hh³Nh´NubhÓ)�”}”(hjŽh]”hŒNAK”…”�”}”(hjö h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj" h²hubhŒN frame, the sending party should re-send all outstanding (non-ACKed) messages.”…”�”}”(hj" h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KŒhj h²hubj±)�”}”(hXºSequence IDs are not synchronized between the two parties, meaning that they are managed independently for each party. Identifying the messages corresponding to a single exchange thus relies on the sequence ID as well as the type of the message, and the context. Specifically, the sequence ID is used to associate an ``ACK`` with its ``DATA_SEQ``-type frame, but not ``DATA_SEQ``- or ``DATA_NSQ``-type frames with other ``DATA``- type frames.”h]”(hX=Sequence IDs are not synchronized between the two parties, meaning that they are managed independently for each party. Identifying the messages corresponding to a single exchange thus relies on the sequence ID as well as the type of the message, and the context. Specifically, the sequence ID is used to associate an ”…”�”}”(hj h²hh³Nh´NubhÓ)�”}”(hŒ``ACK``”h]”hŒACK”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj ubhŒ with its ”…”�”}”(hj h²hh³Nh´NubhÓ)�”}”(hŒ ``DATA_SEQ``”h]”hŒDATA_SEQ”…”�”}”(hj' h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj ubhŒ-type frame, but not ”…”�”}”(hj h²hh³Nh´NubhÓ)�”}”(hŒ ``DATA_SEQ``”h]”hŒDATA_SEQ”…”�”}”(hj9 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj ubhŒ- or ”…”�”}”(hj h²hh³Nh´NubhÓ)�”}”(hŒ ``DATA_NSQ``”h]”hŒDATA_NSQ”…”�”}”(hjK h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj ubhŒ-type frames with other ”…”�”}”(hj h²hh³Nh´NubhÓ)�”}”(hŒ``DATA``”h]”hŒDATA”…”�”}”(hj] h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj ubhŒ- type frames.”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Kšhj h²hubj±)�”}”(hŒ)An example exchange might look like this:”h]”hŒ)An example exchange might look like this:”…”�”}”(hju h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K¡hj h²hubhŒ literal_block”“”)�”}”(hŒ�tx: -- SYN FRAME(D) CRC(F) PAYLOAD CRC(P) ----------------------------- rx: ------------------------------------- SYN FRAME(A) CRC(F) CRC(P) --”h]”hŒ�tx: -- SYN FRAME(D) CRC(F) PAYLOAD CRC(P) ----------------------------- rx: ------------------------------------- SYN FRAME(A) CRC(F) CRC(P) --”…”�”}”hj… sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jƒ h³hÇh´K¥hj h²hubj±)�”}”(hX"where both frames have the same sequence ID (``SEQ``). Here, ``FRAME(D)`` indicates a |DATA_SEQ|-type frame, ``FRAME(A)`` an ``ACK``-type frame, ``CRC(F)`` the CRC over the previous frame, ``CRC(P)`` the CRC over the previous payload. In case of an error, the exchange would look like this:”h]”(hŒ-where both frames have the same sequence ID (”…”�”}”(hj“ h²hh³Nh´NubhÓ)�”}”(hŒ``SEQ``”h]”hŒSEQ”…”�”}”(hj› h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj“ ubhŒ ). Here, ”…”�”}”(hj“ h²hh³Nh´NubhÓ)�”}”(hŒ ``FRAME(D)``”h]”hŒFRAME(D)”…”�”}”(hj­ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj“ ubhŒ indicates a ”…”�”}”(hj“ h²hh³Nh´NubhÓ)�”}”(hjÙh]”hŒDATA_SEQ”…”�”}”(hj¿ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj“ h²hubhŒ -type frame, ”…”�”}”(hj“ h²hh³Nh´NubhÓ)�”}”(hŒ ``FRAME(A)``”h]”hŒFRAME(A)”…”�”}”(hjÐ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj“ ubhŒ an ”…”�”}”(hj“ h²hh³Nh´NubhÓ)�”}”(hŒ``ACK``”h]”hŒACK”…”�”}”(hjâ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj“ ubhŒ -type frame, ”…”�”}”(hj“ h²hh³Nh´NubhÓ)�”}”(hŒ ``CRC(F)``”h]”hŒCRC(F)”…”�”}”(hjô h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj“ ubhŒ" the CRC over the previous frame, ”…”�”}”(hj“ h²hh³Nh´NubhÓ)�”}”(hŒ ``CRC(P)``”h]”hŒCRC(P)”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj“ ubhŒ[ the CRC over the previous payload. In case of an error, the exchange would look like this:”…”�”}”(hj“ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K¨hj h²hubj„ )�”}”(hŒ�tx: -- SYN FRAME(D) CRC(F) PAYLOAD CRC(P) ----------------------------- rx: ------------------------------------- SYN FRAME(N) CRC(F) CRC(P) --”h]”hŒ�tx: -- SYN FRAME(D) CRC(F) PAYLOAD CRC(P) ----------------------------- rx: ------------------------------------- SYN FRAME(N) CRC(F) CRC(P) --”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jƒ h³hÇh´K¯hj h²hubj±)�”}”(hŒÚupon which the sender should re-send the message. ``FRAME(N)`` indicates an |NAK|-type frame. Note that the sequence ID of the |NAK|-type frame is fixed to zero. For |DATA_NSQ|-type frames, both exchanges are the same:”h]”(hŒ2upon which the sender should re-send the message. ”…”�”}”(hj, h²hh³Nh´NubhÓ)�”}”(hŒ ``FRAME(N)``”h]”hŒFRAME(N)”…”�”}”(hj4 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj, ubhŒ indicates an ”…”�”}”(hj, h²hh³Nh´NubhÓ)�”}”(hjŽh]”hŒNAK”…”�”}”(hjF h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj, h²hubhŒ.-type frame. Note that the sequence ID of the ”…”�”}”(hj, h²hh³Nh´NubhÓ)�”}”(hjŽh]”hŒNAK”…”�”}”(hjW h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj, h²hubhŒ"-type frame is fixed to zero. For ”…”�”}”(hj, h²hh³Nh´NubhÓ)�”}”(hjòh]”hŒDATA_NSQ”…”�”}”(hjh h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj, h²hubhŒ*-type frames, both exchanges are the same:”…”�”}”(hj, h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K²hj h²hubj„ )�”}”(hŒ�tx: -- SYN FRAME(DATA_NSQ) CRC(F) PAYLOAD CRC(P) ---------------------- rx: -------------------------------------------------------------------”h]”hŒ�tx: -- SYN FRAME(DATA_NSQ) CRC(F) PAYLOAD CRC(P) ---------------------- rx: -------------------------------------------------------------------”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jƒ h³hÇh´K¸hj h²hubj±)�”}”(hŒáHere, an error can be detected, but not corrected or indicated to the sending party. These exchanges are symmetric, i.e. switching ``rx`` and ``tx`` results again in a valid exchange. Currently, no longer exchanges are known.”h]”(hŒƒHere, an error can be detected, but not corrected or indicated to the sending party. These exchanges are symmetric, i.e. switching ”…”�”}”(hj� h²hh³Nh´NubhÓ)�”}”(hŒ``rx``”h]”hŒrx”…”�”}”(hj• h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj� ubhŒ and ”…”�”}”(hj� h²hh³Nh´NubhÓ)�”}”(hŒ``tx``”h]”hŒtx”…”�”}”(hj§ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj� ubhŒM results again in a valid exchange. Currently, no longer exchanges are known.”…”�”}”(hj� h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K»hj h²hubeh}”(h]”Œ!ssh-packet-protocol-flow-sequence”ah ]”h"]”Œ"ssh packet protocol: flow sequence”ah$]”h&]”uh1j›hj�h²hh³hÇh´KŠubjœ)�”}”(hhh]”(j¡)�”}”(hŒ)Commands: Requests, Responses, and Events”h]”hŒ)Commands: Requests, Responses, and Events”…”�”}”(hjÊ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjÇ h²hh³hÇh´KÂubj±)�”}”(hŒÉCommands are sent as payload inside a data frame. Currently, this is the only known payload type of |DATA| frames, with a payload-type value of ``0x80`` (:c:type:`SSH_PLD_TYPE_CMD `).”h]”(hŒdCommands are sent as payload inside a data frame. Currently, this is the only known payload type of ”…”�”}”(hjØ h²hh³Nh´NubhÓ)�”}”(hjÀh]”hŒDATA”…”�”}”(hjà h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´NhjØ h²hubhŒ& frames, with a payload-type value of ”…”�”}”(hjØ h²hh³Nh´NubhÓ)�”}”(hŒ``0x80``”h]”hŒ0x80”…”�”}”(hjñ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjØ ubhŒ (”…”�”}”(hjØ h²hh³Nh´Nubh)�”}”(hŒ-:c:type:`SSH_PLD_TYPE_CMD `”h]”hÓ)�”}”(hj h]”hŒSSH_PLD_TYPE_CMD”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”(hÞhߌc-type”eh"]”h$]”h&]”uh1hÒhj ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰hñŒssh_payload_type”uh1hh³hÇh´KÄhjØ ubhŒ).”…”�”}”(hjØ h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KÄhjÇ h²hubj±)�”}”(hXœThe command-type payload (:c:type:`struct ssh_command `) consists of an eight-byte command structure, followed by optional and variable length command data. The length of this optional data is derived from the frame payload length given in the corresponding frame, i.e. it is ``frame.len - sizeof(struct ssh_command)``. The command struct contains the following fields, packed together and in order:”h]”(hŒThe command-type payload (”…”�”}”(hj, h²hh³Nh´Nubh)�”}”(hŒ*:c:type:`struct ssh_command `”h]”hÓ)�”}”(hj6 h]”hŒstruct ssh_command”…”�”}”(hj8 h²hh³Nh´Nubah}”(h]”h ]”(hÞhߌc-type”eh"]”h$]”h&]”uh1hÒhj4 ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰hñŒ ssh_command”uh1hh³hÇh´KÈhj, ubhŒÝ) consists of an eight-byte command structure, followed by optional and variable length command data. The length of this optional data is derived from the frame payload length given in the corresponding frame, i.e. it is ”…”�”}”(hj, h²hh³Nh´NubhÓ)�”}”(hŒ*``frame.len - sizeof(struct ssh_command)``”h]”hŒ&frame.len - sizeof(struct ssh_command)”…”�”}”(hjW h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj, ubhŒQ. The command struct contains the following fields, packed together and in order:”…”�”}”(hj, h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KÈhjÇ h²hubjQ)�”}”(hhh]”(j¡)�”}”(hŒ SSH Command”h]”hŒ SSH Command”…”�”}”(hjr h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j h³hÇh´KÏhjo ubjd)�”}”(hhh]”(ji)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jhhj€ ubji)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jhhj€ ubji)�”}”(hhh]”h}”(h]”h ]”h"]”h$]”h&]”Œcolwidth”Kuh1jhhj€ ubj‰)�”}”(hhh]”jŽ)�”}”(hhh]”(j“)�”}”(hhh]”j±)�”}”(hŒField”h]”hŒField”…”�”}”(hjª h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KÓhj§ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj¤ ubj“)�”}”(hhh]”j±)�”}”(hŒType”h]”hŒType”…”�”}”(hjÁ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KÔhj¾ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj¤ ubj“)�”}”(hhh]”j±)�”}”(hŒ Description”h]”hŒ Description”…”�”}”(hjØ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KÕhjÕ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj¤ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hj¡ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jˆhj€ ubjæ)�”}”(hhh]”(jŽ)�”}”(hhh]”(j“)�”}”(hhh]”j±)�”}”(hŒ|TYPE|”h]”hÓ)�”}”(hj*h]”hŒTYPE”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´K×hjþ ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjû ubj“)�”}”(hhh]”j±)�”}”(hŒ|u8|”h]”h)�”}”(hhÐh]”hÓ)�”}”(hhÐh]”hŒu8”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”(hÞhßhàeh"]”h$]”h&]”uh1hÒh³Nh´Nhj%ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”hîŒ refexplicit”ˆŒrefwarn”‰Œ reftarget”hòuh1hh³hÇh´Khj!h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KØhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjû ubj“)�”}”(hhh]”j±)�”}”(hŒ2Type of the payload. For commands always ``0x80``.”h]”(hŒ)Type of the payload. For commands always ”…”�”}”(hjPh²hh³Nh´NubhÓ)�”}”(hŒ``0x80``”h]”hŒ0x80”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjPubhŒ.”…”�”}”(hjPh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KÙhjMubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjû ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hjø ubjŽ)�”}”(hhh]”(j“)�”}”(hhh]”j±)�”}”(hŒ|TC|”h]”hÓ)�”}”(hj h]”hŒTC”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj‚h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KÛhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj|ubj“)�”}”(hhh]”j±)�”}”(hŒ|u8|”h]”h)�”}”(hhÐh]”hÓ)�”}”(hhÐh]”hŒu8”…”�”}”(hj©h²hh³Nh´Nubah}”(h]”h ]”(hÞhßhàeh"]”h$]”h&]”uh1hÒh³Nh´Nhj¦ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”hîŒ refexplicit”ˆŒrefwarn”‰Œ reftarget”hòuh1hh³hÇh´Khj¢h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KÜhjŸubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj|ubj“)�”}”(hhh]”j±)�”}”(hŒTarget category.”h]”hŒTarget category.”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KÝhjÎubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj|ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hjø ubjŽ)�”}”(hhh]”(j“)�”}”(hhh]”j±)�”}”(hŒ|TID|”h]”hÓ)�”}”(hj$h]”hŒTID”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhjñh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Kßhjîubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjëubj“)�”}”(hhh]”j±)�”}”(hŒ|u8|”h]”h)�”}”(hhÐh]”hÓ)�”}”(hhÐh]”hŒu8”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”(hÞhßhàeh"]”h$]”h&]”uh1hÒh³Nh´Nhjubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”hîŒ refexplicit”ˆŒrefwarn”‰Œ reftarget”hòuh1hh³hÇh´Khjh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Kàhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjëubj“)�”}”(hhh]”j±)�”}”(hŒ Target ID for commands/messages.”h]”hŒ Target ID for commands/messages.”…”�”}”(hj@h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Káhj=ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjëubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hjø ubjŽ)�”}”(hhh]”(j“)�”}”(hhh]”j±)�”}”(hŒ|SID|”h]”hÓ)�”}”(hj=h]”hŒSID”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj`h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Kãhj]ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjZubj“)�”}”(hhh]”j±)�”}”(hŒ|u8|”h]”h)�”}”(hhÐh]”hÓ)�”}”(hhÐh]”hŒu8”…”�”}”(hj‡h²hh³Nh´Nubah}”(h]”h ]”(hÞhßhàeh"]”h$]”h&]”uh1hÒh³Nh´Nhj„ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”hîŒ refexplicit”ˆŒrefwarn”‰Œ reftarget”hòuh1hh³hÇh´Khj€h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Kähj}ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjZubj“)�”}”(hhh]”j±)�”}”(hŒ Source ID for commands/messages.”h]”hŒ Source ID for commands/messages.”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Kåhj¬ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjZubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hjø ubjŽ)�”}”(hhh]”(j“)�”}”(hhh]”j±)�”}”(hŒ|IID|”h]”hÓ)�”}”(hjVh]”hŒIID”…”�”}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´NhjÏh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KçhjÌubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÉubj“)�”}”(hhh]”j±)�”}”(hŒ|u8|”h]”h)�”}”(hhÐh]”hÓ)�”}”(hhÐh]”hŒu8”…”�”}”(hjöh²hh³Nh´Nubah}”(h]”h ]”(hÞhßhàeh"]”h$]”h&]”uh1hÒh³Nh´Nhjóubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”hîŒ refexplicit”ˆŒrefwarn”‰Œ reftarget”hòuh1hh³hÇh´Khjïh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Kèhjìubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÉubj“)�”}”(hhh]”j±)�”}”(hŒ Instance ID.”h]”hŒ Instance ID.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Kéhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hjÉubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hjø ubjŽ)�”}”(hhh]”(j“)�”}”(hhh]”j±)�”}”(hŒ|RQID|”h]”hÓ)�”}”(hjoh]”hŒRQID”…”�”}”(hjBh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj>h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Këhj;ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj8ubj“)�”}”(hhh]”j±)�”}”(hŒ|u16|”h]”h)�”}”(hjh]”hÓ)�”}”(hjh]”hŒu16”…”�”}”(hjeh²hh³Nh´Nubah}”(h]”h ]”(hÞhßj eh"]”h$]”h&]”uh1hÒh³Nh´Nhjbubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”jŒ refexplicit”ˆŒrefwarn”‰Œ reftarget”juh1hh³hÇh´Khj^h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Kìhj[ubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj8ubj“)�”}”(hhh]”j±)�”}”(hŒ Request ID.”h]”hŒ Request ID.”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KíhjŠubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj8ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hjø ubjŽ)�”}”(hhh]”(j“)�”}”(hhh]”j±)�”}”(hŒ|CID|”h]”hÓ)�”}”(hjˆh]”hŒCID”…”�”}”(hj±h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhj­h²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Kïhjªubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj§ubj“)�”}”(hhh]”j±)�”}”(hŒ|u8|”h]”h)�”}”(hhÐh]”hÓ)�”}”(hhÐh]”hŒu8”…”�”}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”(hÞhßhàeh"]”h$]”h&]”uh1hÒh³Nh´NhjÑubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”hîŒ refexplicit”ˆŒrefwarn”‰Œ reftarget”hòuh1hh³hÇh´KhjÍh²hubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KðhjÊubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj§ubj“)�”}”(hhh]”j±)�”}”(hŒ Command ID.”h]”hŒ Command ID.”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´Kñhjùubah}”(h]”h ]”h"]”h$]”h&]”uh1j’hj§ubeh}”(h]”h ]”h"]”h$]”h&]”uh1j�hjø ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jåhj€ ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1jchjo ubeh}”(h]”Œid4”ah ]”h"]”h$]”h&]”uh1jPhjÇ h²hh³Nh´Nubj±)�”}”(hŒŽThe command struct and data, in general, does not contain any failure detection mechanism (e.g. CRCs), this is solely done on the frame level.”h]”hŒŽThe command struct and data, in general, does not contain any failure detection mechanism (e.g. CRCs), this is solely done on the frame level.”…”�”}”(hj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KóhjÇ h²hubj±)�”}”(hX:Command-type payloads are used by the host to send commands and requests to the EC as well as by the EC to send responses and events back to the host. We differentiate between requests (sent by the host), responses (sent by the EC in response to a request), and events (sent by the EC without a preceding request).”h]”hX:Command-type payloads are used by the host to send commands and requests to the EC as well as by the EC to send responses and events back to the host. We differentiate between requests (sent by the host), responses (sent by the EC in response to a request), and events (sent by the EC without a preceding request).”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KöhjÇ h²hubj±)�”}”(hXŸCommands and events are uniquely identified by their target category (``TC``) and command ID (``CID``). The target category specifies a general category for the command (e.g. system in general, vs. battery and AC, vs. temperature, and so on), while the command ID specifies the command inside that category. Only the combination of |TC| + |CID| is unique. Additionally, commands have an instance ID (``IID``), which is used to differentiate between different sub-devices. For example ``TC=3`` ``CID=1`` is a request to get the temperature on a thermal sensor, where |IID| specifies the respective sensor. If the instance ID is not used, it should be set to zero. If instance IDs are used, they, in general, start with a value of one, whereas zero may be used for instance independent queries, if applicable. A response to a request should have the same target category, command ID, and instance ID as the corresponding request.”h]”(hŒFCommands and events are uniquely identified by their target category (”…”�”}”(hjFh²hh³Nh´NubhÓ)�”}”(hŒ``TC``”h]”hŒTC”…”�”}”(hjNh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjFubhŒ) and command ID (”…”�”}”(hjFh²hh³Nh´NubhÓ)�”}”(hŒ``CID``”h]”hŒCID”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjFubhŒç). The target category specifies a general category for the command (e.g. system in general, vs. battery and AC, vs. temperature, and so on), while the command ID specifies the command inside that category. Only the combination of ”…”�”}”(hjFh²hh³Nh´NubhÓ)�”}”(hj h]”hŒTC”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´NhjFh²hubhŒ + ”…”�”}”(hjFh²hh³Nh´NubhÓ)�”}”(hjˆh]”hŒCID”…”�”}”(hjƒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´NhjFh²hubhŒ8 is unique. Additionally, commands have an instance ID (”…”�”}”(hjFh²hh³Nh´NubhÓ)�”}”(hŒ``IID``”h]”hŒIID”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjFubhŒM), which is used to differentiate between different sub-devices. For example ”…”�”}”(hjFh²hh³Nh´NubhÓ)�”}”(hŒ``TC=3``”h]”hŒTC=3”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjFubhŒ ”…”�”}”(hjFh²hh³Nh´NubhÓ)�”}”(hŒ ``CID=1``”h]”hŒCID=1”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjFubhŒ@ is a request to get the temperature on a thermal sensor, where ”…”�”}”(hjFh²hh³Nh´NubhÓ)�”}”(hjVh]”hŒIID”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´NhjFh²hubhXd specifies the respective sensor. If the instance ID is not used, it should be set to zero. If instance IDs are used, they, in general, start with a value of one, whereas zero may be used for instance independent queries, if applicable. A response to a request should have the same target category, command ID, and instance ID as the corresponding request.”…”�”}”(hjFh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´KühjÇ h²hubj±)�”}”(hX§Responses are matched to their corresponding request via the request ID (``RQID``) field. This is a 16 bit wrapping counter similar to the sequence ID on the frames. Note that the sequence ID of the frames for a request-response pair does not match. Only the request ID has to match. Frame-protocol wise these are two separate exchanges, and may even be separated, e.g. by an event being sent after the request but before the response. Not all commands produce a response, and this is not detectable by |TC| + |CID|. It is the responsibility of the issuing party to wait for a response (or signal this to the communication framework, as is done in SAN/ACPI via the ``SNC`` flag).”h]”(hŒIResponses are matched to their corresponding request via the request ID (”…”�”}”(hjáh²hh³Nh´NubhÓ)�”}”(hŒ``RQID``”h]”hŒRQID”…”�”}”(hjéh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjáubhX¦) field. This is a 16 bit wrapping counter similar to the sequence ID on the frames. Note that the sequence ID of the frames for a request-response pair does not match. Only the request ID has to match. Frame-protocol wise these are two separate exchanges, and may even be separated, e.g. by an event being sent after the request but before the response. Not all commands produce a response, and this is not detectable by ”…”�”}”(hjáh²hh³Nh´NubhÓ)�”}”(hj h]”hŒTC”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhjáh²hubhŒ + ”…”�”}”(hjáh²hh³Nh´NubhÓ)�”}”(hjˆh]”hŒCID”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´Nhjáh²hubhŒ–. It is the responsibility of the issuing party to wait for a response (or signal this to the communication framework, as is done in SAN/ACPI via the ”…”�”}”(hjáh²hh³Nh´NubhÓ)�”}”(hŒ``SNC``”h]”hŒSNC”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjáubhŒ flag).”…”�”}”(hjáh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´M hjÇ h²hubj±)�”}”(hXîEvents are identified by unique and reserved request IDs. These IDs should not be used by the host when sending a new request. They are used on the host to, first, detect events and, second, match them with a registered event handler. Request IDs for events are chosen by the host and directed to the EC when setting up and enabling an event source (via the enable-event-source request). The EC then uses the specified request ID for events sent from the respective source. Note that an event should still be identified by its target category, command ID, and, if applicable, instance ID, as a single event source can send multiple different event types. In general, however, a single target category should map to a single reserved event request ID.”h]”hXîEvents are identified by unique and reserved request IDs. These IDs should not be used by the host when sending a new request. They are used on the host to, first, detect events and, second, match them with a registered event handler. Request IDs for events are chosen by the host and directed to the EC when setting up and enabling an event source (via the enable-event-source request). The EC then uses the specified request ID for events sent from the respective source. Note that an event should still be identified by its target category, command ID, and, if applicable, instance ID, as a single event source can send multiple different event types. In general, however, a single target category should map to a single reserved event request ID.”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´MhjÇ h²hubj±)�”}”(hXFurthermore, requests, responses, and events have an associated target ID (``TID``) and source ID (``SID``). These two fields indicate where a message originates from (``SID``) and what the intended target of the message is (``TID``). Note that a response to a specific request therefore has the source and target IDs swapped when compared to the original request (i.e. the request target is the response source and the request source is the response target). See (:c:type:`enum ssh_request_id `) for possible values of both.”h]”(hŒKFurthermore, requests, responses, and events have an associated target ID (”…”�”}”(hjCh²hh³Nh´NubhÓ)�”}”(hŒ``TID``”h]”hŒTID”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjCubhŒ) and source ID (”…”�”}”(hjCh²hh³Nh´NubhÓ)�”}”(hŒ``SID``”h]”hŒSID”…”�”}”(hj]h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjCubhŒ>). These two fields indicate where a message originates from (”…”�”}”(hjCh²hh³Nh´NubhÓ)�”}”(hŒ``SID``”h]”hŒSID”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjCubhŒ2) and what the intended target of the message is (”…”�”}”(hjCh²hh³Nh´NubhÓ)�”}”(hŒ``TID``”h]”hŒTID”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjCubhŒé). Note that a response to a specific request therefore has the source and target IDs swapped when compared to the original request (i.e. the request target is the response source and the request source is the response target). See (”…”�”}”(hjCh²hh³Nh´Nubh)�”}”(hŒ.:c:type:`enum ssh_request_id `”h]”hÓ)�”}”(hj•h]”hŒenum ssh_request_id”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”h ]”(hÞhߌc-type”eh"]”h$]”h&]”uh1hÒhj“ubah}”(h]”h ]”h"]”h$]”h&]”Œrefdoc”hëŒ refdomain”hߌreftype”Œtype”Œ refexplicit”ˆŒrefwarn”‰hñŒssh_request_id”uh1hh³hÇh´M!hjCubhŒ) for possible values of both.”…”�”}”(hjCh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´M!hjÇ h²hubj±)�”}”(hXÑNote that, even though requests and events should be uniquely identifiable by target category and command ID alone, the EC may require specific target ID and instance ID values to accept a command. A command that is accepted for ``TID=1``, for example, may not be accepted for ``TID=2`` and vice versa. While this may not always hold in reality, you can think of different target/source IDs indicating different physical ECs with potentially different feature sets.”h]”(hŒåNote that, even though requests and events should be uniquely identifiable by target category and command ID alone, the EC may require specific target ID and instance ID values to accept a command. A command that is accepted for ”…”�”}”(hj¼h²hh³Nh´NubhÓ)�”}”(hŒ ``TID=1``”h]”hŒTID=1”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj¼ubhŒ', for example, may not be accepted for ”…”�”}”(hj¼h²hh³Nh´NubhÓ)�”}”(hŒ ``TID=2``”h]”hŒTID=2”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhj¼ubhŒ³ and vice versa. While this may not always hold in reality, you can think of different target/source IDs indicating different physical ECs with potentially different feature sets.”…”�”}”(hj¼h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´M*hjÇ h²hubeh}”(h]”Œ&commands-requests-responses-and-events”ah ]”h"]”Œ)commands: requests, responses, and events”ah$]”h&]”uh1j›hj�h²hh³hÇh´KÂubjœ)�”}”(hhh]”(j¡)�”}”(hŒLimitations and Observations”h]”hŒLimitations and Observations”…”�”}”(hjùh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjöh²hh³hÇh´M3ubj±)�”}”(hXsThe protocol can, in theory, handle up to ``U8_MAX`` frames in parallel, with up to ``U16_MAX`` pending requests (neglecting request IDs reserved for events). In practice, however, this is more limited. From our testing (although via a python and thus a user-space program), it seems that the EC can handle up to four requests (mostly) reliably in parallel at a certain time. With five or more requests in parallel, consistent discarding of commands (ACKed frame but no command response) has been observed. For five simultaneous commands, this reproducibly resulted in one command being dropped and four commands being handled.”h]”(hŒ*The protocol can, in theory, handle up to ”…”�”}”(hjh²hh³Nh´NubhÓ)�”}”(hŒ ``U8_MAX``”h]”hŒU8_MAX”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjubhŒ frames in parallel, with up to ”…”�”}”(hjh²hh³Nh´NubhÓ)�”}”(hŒ ``U16_MAX``”h]”hŒU16_MAX”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjubhX pending requests (neglecting request IDs reserved for events). In practice, however, this is more limited. From our testing (although via a python and thus a user-space program), it seems that the EC can handle up to four requests (mostly) reliably in parallel at a certain time. With five or more requests in parallel, consistent discarding of commands (ACKed frame but no command response) has been observed. For five simultaneous commands, this reproducibly resulted in one command being dropped and four commands being handled.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´M5hjöh²hubj±)�”}”(hXwHowever, it has also been noted that, even with three requests in parallel, occasional frame drops happen. Apart from this, with a limit of three pending requests, no dropped commands (i.e. command being dropped but frame carrying command being ACKed) have been observed. In any case, frames (and possibly also commands) should be re-sent by the host if a certain timeout is exceeded. This is done by the EC for frames with a timeout of one second, up to two re-tries (i.e. three transmissions in total). The limit of re-tries also applies to received NAKs, and, in a worst case scenario, can lead to entire messages being dropped.”h]”hXwHowever, it has also been noted that, even with three requests in parallel, occasional frame drops happen. Apart from this, with a limit of three pending requests, no dropped commands (i.e. command being dropped but frame carrying command being ACKed) have been observed. In any case, frames (and possibly also commands) should be re-sent by the host if a certain timeout is exceeded. This is done by the EC for frames with a timeout of one second, up to two re-tries (i.e. three transmissions in total). The limit of re-tries also applies to received NAKs, and, in a worst case scenario, can lead to entire messages being dropped.”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´M?hjöh²hubj±)�”}”(hXÐWhile this also seems to work fine for pending data frames as long as no transmission failures occur, implementation and handling of these seems to depend on the assumption that there is only one non-acknowledged data frame. In particular, the detection of repeated frames relies on the last sequence number. This means that, if a frame that has been successfully received by the EC is sent again, e.g. due to the host not receiving an |ACK|, the EC will only detect this if it has the sequence ID of the last frame received by the EC. As an example: Sending two frames with ``SEQ=0`` and ``SEQ=1`` followed by a repetition of ``SEQ=0`` will not detect the second ``SEQ=0`` frame as such, and thus execute the command in this frame each time it has been received, i.e. twice in this example. Sending ``SEQ=0``, ``SEQ=1`` and then repeating ``SEQ=1`` will detect the second ``SEQ=1`` as repetition of the first one and ignore it, thus executing the contained command only once.”h]”(hX´While this also seems to work fine for pending data frames as long as no transmission failures occur, implementation and handling of these seems to depend on the assumption that there is only one non-acknowledged data frame. In particular, the detection of repeated frames relies on the last sequence number. This means that, if a frame that has been successfully received by the EC is sent again, e.g. due to the host not receiving an ”…”�”}”(hjGh²hh³Nh´NubhÓ)�”}”(hj§h]”hŒACK”…”�”}”(hjOh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒh³Nh´NhjGh²hubhŒ†, the EC will only detect this if it has the sequence ID of the last frame received by the EC. As an example: Sending two frames with ”…”�”}”(hjGh²hh³Nh´NubhÓ)�”}”(hŒ ``SEQ=0``”h]”hŒSEQ=0”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjGubhŒ and ”…”�”}”(hjGh²hh³Nh´NubhÓ)�”}”(hŒ ``SEQ=1``”h]”hŒSEQ=1”…”�”}”(hjrh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjGubhŒ followed by a repetition of ”…”�”}”(hjGh²hh³Nh´NubhÓ)�”}”(hŒ ``SEQ=0``”h]”hŒSEQ=0”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjGubhŒ will not detect the second ”…”�”}”(hjGh²hh³Nh´NubhÓ)�”}”(hŒ ``SEQ=0``”h]”hŒSEQ=0”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjGubhŒ frame as such, and thus execute the command in this frame each time it has been received, i.e. twice in this example. Sending ”…”�”}”(hjGh²hh³Nh´NubhÓ)�”}”(hŒ ``SEQ=0``”h]”hŒSEQ=0”…”�”}”(hj¨h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjGubhŒ, ”…”�”}”(hjGh²hh³Nh´NubhÓ)�”}”(hŒ ``SEQ=1``”h]”hŒSEQ=1”…”�”}”(hjºh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjGubhŒ and then repeating ”…”�”}”(hjGh²hh³Nh´NubhÓ)�”}”(hŒ ``SEQ=1``”h]”hŒSEQ=1”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjGubhŒ will detect the second ”…”�”}”(hjGh²hh³Nh´NubhÓ)�”}”(hŒ ``SEQ=1``”h]”hŒSEQ=1”…”�”}”(hjÞh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÒhjGubhŒ^ as repetition of the first one and ignore it, thus executing the contained command only once.”…”�”}”(hjGh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´MIhjöh²hubj±)�”}”(hX In conclusion, this suggests a limit of at most one pending un-ACKed frame (per party, effectively leading to synchronous communication regarding frames) and at most three pending commands. The limit to synchronous frame transfers seems to be consistent with behavior observed on Windows.”h]”hX In conclusion, this suggests a limit of at most one pending un-ACKed frame (per party, effectively leading to synchronous communication regarding frames) and at most three pending commands. The limit to synchronous frame transfers seems to be consistent with behavior observed on Windows.”…”�”}”(hjöh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j°h³hÇh´MWhjöh²hubeh}”(h]”Œlimitations-and-observations”ah ]”h"]”Œlimitations and observations”ah$]”h&]”uh1j›hj�h²hh³hÇh´M3ubeh}”(h]”Œsurface-serial-hub-protocol”ah ]”h"]”Œsurface serial hub protocol”ah$]”h&]”uh1j›hhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(j NŒ generator”•+ NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”j’Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j6Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”(h÷hÊj!húj:j$jSj=jljVj…jojžjˆj·j¡jÐjºjéjÓjjìjjj4jjMj7jfjPjjij˜j‚uŒsubstitution_names”}”(Œu8”h÷Œu16”j!Œtype”j:Œlen”jSŒseq”jlŒsyn”j…Œnak”jžŒack”j·Œdata”jÐŒdata_seq”jéŒdata_nsq”jŒtc”jŒtid”j4Œsid”jMŒiid”jfŒrqid”jŒcid”j˜uŒrefnames”}”Œrefids”}”Œnameids”}”(jjj j jÄ jÁ jójðj juŒ nametypes”}”(j‰j ‰jÄ ‰jó‰j ‰uh}”(jj�j jjÁ j jðjÇ jjöjFjRjÊjÏj² juj%jo uŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”jDKs…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.