isphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget5/translations/zh_CN/networking/devlink/devlink-healthmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget5/translations/zh_TW/networking/devlink/devlink-healthmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget5/translations/it_IT/networking/devlink/devlink-healthmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget5/translations/ja_JP/networking/devlink/devlink-healthmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget5/translations/ko_KR/networking/devlink/devlink-healthmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget5/translations/sp_SP/networking/devlink/devlink-healthmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhcomment)}(h SPDX-License-Identifier: GPL-2.0h]h SPDX-License-Identifier: GPL-2.0}hhsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1hhhhhhO/var/lib/git/docbuild/linux/Documentation/networking/devlink/devlink-health.rsthKubhsection)}(hhh](htitle)}(hDevlink Healthh]hDevlink Health}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h Backgroundh]h Background}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hThe ``devlink`` health mechanism is targeted for Real Time Alerting, in order to know when something bad happened to a PCI device.h](hThe }(hhhhhNhNubhliteral)}(h ``devlink``h]hdevlink}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhubhs health mechanism is targeted for Real Time Alerting, in order to know when something bad happened to a PCI device.}(hhhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh block_quote)}(h* Provide alert debug information. * Self healing. * If problem needs vendor support, provide a way to gather all needed debugging information. h]h bullet_list)}(hhh](h list_item)}(h Provide alert debug information.h]h)}(hj h]h Provide alert debug information.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hj ubah}(h]h ]h"]h$]h&]uh1j hjubj )}(h Self healing.h]h)}(hj$h]h Self healing.}(hj&hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj"ubah}(h]h ]h"]h$]h&]uh1j hjubj )}(h[If problem needs vendor support, provide a way to gather all needed debugging information. h]h)}(hZIf problem needs vendor support, provide a way to gather all needed debugging information.h]hZIf problem needs vendor support, provide a way to gather all needed debugging information.}(hj=hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj9ubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]bullet*uh1jhhhK hjubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubeh}(h] backgroundah ]h"] backgroundah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hOverviewh]hOverview}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjghhhhhKubh)}(hThe main idea is to unify and centralize driver health reports in the generic ``devlink`` instance and allow the user to set different attributes of the health reporting and recovery procedures.h](hNThe main idea is to unify and centralize driver health reports in the generic }(hjxhhhNhNubh)}(h ``devlink``h]hdevlink}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjxubhi instance and allow the user to set different attributes of the health reporting and recovery procedures.}(hjxhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjghhubh)}(hXThe ``devlink`` health reporter: Device driver creates a "health reporter" per each error/health type. Error/Health type can be a known/generic (e.g. PCI error, fw error, rx/tx error) or unknown (driver specific). For each registered health reporter a driver can issue error/health reports asynchronously. All health reports handling is done by ``devlink``. Device driver can provide specific callbacks for each "health reporter", e.g.:h](hThe }(hjhhhNhNubh)}(h ``devlink``h]hdevlink}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubhXN health reporter: Device driver creates a “health reporter” per each error/health type. Error/Health type can be a known/generic (e.g. PCI error, fw error, rx/tx error) or unknown (driver specific). For each registered health reporter a driver can issue error/health reports asynchronously. All health reports handling is done by }(hjhhhNhNubh)}(h ``devlink``h]hdevlink}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubhT. Device driver can provide specific callbacks for each “health reporter”, e.g.:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjghhubh)}(hh* Recovery procedures * Diagnostics procedures * Object dump procedures * Out Of Box initial parameters h]j)}(hhh](j )}(hRecovery proceduresh]h)}(hjh]hRecovery procedures}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK!hjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hDiagnostics proceduresh]h)}(hjh]hDiagnostics procedures}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK"hjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hObject dump proceduresh]h)}(hjh]hObject dump procedures}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK#hjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hOut Of Box initial parameters h]h)}(hOut Of Box initial parametersh]hOut Of Box initial parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK$hjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]jWjXuh1jhhhK!hjubah}(h]h ]h"]h$]h&]uh1hhhhK!hjghhubh)}(hgDifferent parts of the driver can register different types of health reporters with different handlers.h]hgDifferent parts of the driver can register different types of health reporters with different handlers.}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK&hjghhubeh}(h]overviewah ]h"]overviewah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hActionsh]hActions}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhjPhhhhhK*ubh)}(hMOnce an error is reported, devlink health will perform the following actions:h]hMOnce an error is reported, devlink health will perform the following actions:}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK,hjPhhubh)}(hX* A log is being send to the kernel trace events buffer * Health status and statistics are being updated for the reporter instance * Object dump is being taken and saved at the reporter instance (as long as auto-dump is set and there is no other dump which is already stored) * Auto recovery attempt is being done. Depends on: - Auto-recovery configuration - Grace period vs. time passed since last recover h]j)}(hhh](j )}(h5A log is being send to the kernel trace events bufferh]h)}(hjxh]h5A log is being send to the kernel trace events buffer}(hjzhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK.hjvubah}(h]h ]h"]h$]h&]uh1j hjsubj )}(hHHealth status and statistics are being updated for the reporter instanceh]h)}(hjh]hHHealth status and statistics are being updated for the reporter instance}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK/hjubah}(h]h ]h"]h$]h&]uh1j hjsubj )}(hObject dump is being taken and saved at the reporter instance (as long as auto-dump is set and there is no other dump which is already stored)h]h)}(hObject dump is being taken and saved at the reporter instance (as long as auto-dump is set and there is no other dump which is already stored)h]hObject dump is being taken and saved at the reporter instance (as long as auto-dump is set and there is no other dump which is already stored)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK0hjubah}(h]h ]h"]h$]h&]uh1j hjsubj )}(hAuto recovery attempt is being done. Depends on: - Auto-recovery configuration - Grace period vs. time passed since last recover h](h)}(h0Auto recovery attempt is being done. Depends on:h]h0Auto recovery attempt is being done. Depends on:}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK2hjubj)}(hhh](j )}(hAuto-recovery configurationh]h)}(hjh]hAuto-recovery configuration}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK4hjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(h0Grace period vs. time passed since last recover h]h)}(h/Grace period vs. time passed since last recoverh]h/Grace period vs. time passed since last recover}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK5hjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]jW-uh1jhhhK4hjubeh}(h]h ]h"]h$]h&]uh1j hjsubeh}(h]h ]h"]h$]h&]jWjXuh1jhhhK.hjoubah}(h]h ]h"]h$]h&]uh1hhhhK.hjPhhubeh}(h]actionsah ]h"]actionsah$]h&]uh1hhhhhhhhK*ubh)}(hhh](h)}(hDevlink formatted messageh]hDevlink formatted message}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj!hhhhhK8ubh)}(hTo handle devlink health diagnose and health dump requests, devlink creates a formatted message structure ``devlink_fmsg`` and send it to the driver's callback to fill the data in using the devlink fmsg API.h](hjTo handle devlink health diagnose and health dump requests, devlink creates a formatted message structure }(hj2hhhNhNubh)}(h``devlink_fmsg``h]h devlink_fmsg}(hj:hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj2ubhW and send it to the driver’s callback to fill the data in using the devlink fmsg API.}(hj2hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhK:hj!hhubh)}(hDevlink fmsg is a mechanism to pass descriptors between drivers and devlink, in json-like format. The API allows the driver to add nested attributes such as object, object pair and value array, in addition to attributes such as name and value.h]hDevlink fmsg is a mechanism to pass descriptors between drivers and devlink, in json-like format. The API allows the driver to add nested attributes such as object, object pair and value array, in addition to attributes such as name and value.}(hjRhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK>hj!hhubh)}(hXDriver should use this API to fill the fmsg context in a format which will be translated by the devlink to the netlink message later. When it needs to send the data using SKBs to the netlink layer, it fragments the data between different SKBs. In order to do this fragmentation, it uses virtual nests attributes, to avoid actual nesting use which cannot be divided between different SKBs.h]hXDriver should use this API to fill the fmsg context in a format which will be translated by the devlink to the netlink message later. When it needs to send the data using SKBs to the netlink layer, it fragments the data between different SKBs. In order to do this fragmentation, it uses virtual nests attributes, to avoid actual nesting use which cannot be divided between different SKBs.}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKChj!hhubeh}(h]devlink-formatted-messageah ]h"]devlink formatted messageah$]h&]uh1hhhhhhhhK8ubh)}(hhh](h)}(hUser Interfaceh]hUser Interface}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjvhhhhhKKubh)}(hUser can access/change each reporter's parameters and driver specific callbacks via ``devlink``, e.g per error type (per health reporter):h](hVUser can access/change each reporter’s parameters and driver specific callbacks via }(hjhhhNhNubh)}(h ``devlink``h]hdevlink}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubh+, e.g per error type (per health reporter):}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKMhjvhhubh)}(h* Configure reporter's generic parameters (like: disable/enable auto recovery) * Invoke recovery procedure * Run diagnostics * Object dump h]j)}(hhh](j )}(hLConfigure reporter's generic parameters (like: disable/enable auto recovery)h]h)}(hjh]hNConfigure reporter’s generic parameters (like: disable/enable auto recovery)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKPhjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hInvoke recovery procedureh]h)}(hjh]hInvoke recovery procedure}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKQhjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(hRun diagnosticsh]h)}(hjh]hRun diagnostics}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKRhjubah}(h]h ]h"]h$]h&]uh1j hjubj )}(h Object dump h]h)}(h Object dumph]h Object dump}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKShjubah}(h]h ]h"]h$]h&]uh1j hjubeh}(h]h ]h"]h$]h&]jWjXuh1jhhhKPhjubah}(h]h ]h"]h$]h&]uh1hhhhKPhjvhhubhtable)}(hhh](h)}(h!List of devlink health interfacesh]h!List of devlink health interfaces}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKUhjubhtgroup)}(hhh](hcolspec)}(hhh]h}(h]h ]h"]h$]h&]colwidthK uh1j/hj,ubj0)}(hhh]h}(h]h ]h"]h$]h&]j:KZuh1j/hj,ubhtbody)}(hhh](hrow)}(hhh](hentry)}(hhh]h)}(hNameh]hName}(hjShhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKXhjPubah}(h]h ]h"]h$]h&]uh1jNhjKubjO)}(hhh]h)}(h Descriptionh]h Description}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKYhjgubah}(h]h ]h"]h$]h&]uh1jNhjKubeh}(h]h ]h"]h$]h&]uh1jIhjFubjJ)}(hhh](jO)}(hhh]h)}(h#``DEVLINK_CMD_HEALTH_REPORTER_GET``h]h)}(hjh]hDEVLINK_CMD_HEALTH_REPORTER_GET}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1hhhhKZhjubah}(h]h ]h"]h$]h&]uh1jNhjubjO)}(hhh]h)}(h=Retrieves status and configuration info per DEV and reporter.h]h=Retrieves status and configuration info per DEV and reporter.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK[hjubah}(h]h ]h"]h$]h&]uh1jNhjubeh}(h]h ]h"]h$]h&]uh1jIhjFubjJ)}(hhh](jO)}(hhh]h)}(h#``DEVLINK_CMD_HEALTH_REPORTER_SET``h]h)}(hjh]hDEVLINK_CMD_HEALTH_REPORTER_SET}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1hhhhK\hjubah}(h]h ]h"]h$]h&]uh1jNhjubjO)}(hhh]h)}(h.Allows reporter-related configuration setting.h]h.Allows reporter-related configuration setting.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK]hjubah}(h]h ]h"]h$]h&]uh1jNhjubeh}(h]h ]h"]h$]h&]uh1jIhjFubjJ)}(hhh](jO)}(hhh]h)}(h'``DEVLINK_CMD_HEALTH_REPORTER_RECOVER``h]h)}(hj h]h#DEVLINK_CMD_HEALTH_REPORTER_RECOVER}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj ubah}(h]h ]h"]h$]h&]uh1hhhhK^hjubah}(h]h ]h"]h$]h&]uh1jNhjubjO)}(hhh]h)}(h'Triggers reporter's recovery procedure.h]h)Triggers reporter’s recovery procedure.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK_hj'ubah}(h]h ]h"]h$]h&]uh1jNhjubeh}(h]h ]h"]h$]h&]uh1jIhjFubjJ)}(hhh](jO)}(hhh]h)}(h$``DEVLINK_CMD_HEALTH_REPORTER_TEST``h]h)}(hjLh]h DEVLINK_CMD_HEALTH_REPORTER_TEST}(hjNhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjJubah}(h]h ]h"]h$]h&]uh1hhhhK`hjGubah}(h]h ]h"]h$]h&]uh1jNhjDubjO)}(hhh]h)}(hTriggers a fake health event on the reporter. The effects of the test event in terms of recovery flow should follow closely that of a real event.h]hTriggers a fake health event on the reporter. The effects of the test event in terms of recovery flow should follow closely that of a real event.}(hjjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKahjgubah}(h]h ]h"]h$]h&]uh1jNhjDubeh}(h]h ]h"]h$]h&]uh1jIhjFubjJ)}(hhh](jO)}(hhh]h)}(h(``DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE``h]h)}(hjh]h$DEVLINK_CMD_HEALTH_REPORTER_DIAGNOSE}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1hhhhKdhjubah}(h]h ]h"]h$]h&]uh1jNhjubjO)}(hhh]h)}(h7Retrieves current device state related to the reporter.h]h7Retrieves current device state related to the reporter.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKehjubah}(h]h ]h"]h$]h&]uh1jNhjubeh}(h]h ]h"]h$]h&]uh1jIhjFubjJ)}(hhh](jO)}(hhh]h)}(h(``DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET``h]h)}(hjh]h$DEVLINK_CMD_HEALTH_REPORTER_DUMP_GET}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjubah}(h]h ]h"]h$]h&]uh1hhhhKfhjubah}(h]h ]h"]h$]h&]uh1jNhjubjO)}(hhh]h)}(hRetrieves the last stored dump. Devlink health saves a single dump. If an dump is not already stored by devlink for this reporter, devlink generates a new dump. Dump output is defined by the reporter.h]hRetrieves the last stored dump. Devlink health saves a single dump. If an dump is not already stored by devlink for this reporter, devlink generates a new dump. Dump output is defined by the reporter.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKghjubah}(h]h ]h"]h$]h&]uh1jNhjubeh}(h]h ]h"]h$]h&]uh1jIhjFubjJ)}(hhh](jO)}(hhh]h)}(h*``DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR``h]h)}(hj h]h&DEVLINK_CMD_HEALTH_REPORTER_DUMP_CLEAR}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhj ubah}(h]h ]h"]h$]h&]uh1hhhhKkhjubah}(h]h ]h"]h$]h&]uh1jNhjubjO)}(hhh]h)}(h;Clears the last saved dump file for the specified reporter.h]h;Clears the last saved dump file for the specified reporter.}(hj*hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKlhj'ubah}(h]h ]h"]h$]h&]uh1jNhjubeh}(h]h ]h"]h$]h&]uh1jIhjFubeh}(h]h ]h"]h$]h&]uh1jDhj,ubeh}(h]h ]h"]h$]h&]colsKuh1j*hjubeh}(h]id1ah ]colwidths-givenah"]h$]h&]uh1jhjvhhhNhNubh)}(hIThe following diagram provides a general overview of ``devlink-health``::h](h5The following diagram provides a general overview of }(hjYhhhNhNubh)}(h``devlink-health``h]hdevlink-health}(hjahhhNhNubah}(h]h ]h"]h$]h&]uh1hhjYubh:}(hjYhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKnhjvhhubh literal_block)}(hX netlink +--------------------------+ | | | + | | | | +--------------------------+ |request for ops |(diagnose, driver devlink |recover, |dump) +--------+ +--------------------------+ | | | reporter| | | | | +---------v----------+ | | | ops execution | | | | | <----------------------------------+ | | | | | | | | | | | + ^------------------+ | | | | | request for ops | | | | | (recover, dump) | | | | | | | | | +-+------------------+ | | | health report | | health handler | | | +-------------------------------> | | | | | +--------------------+ | | | health reporter create | | | +----------------------------> | +--------+ +--------------------------+h]hX netlink +--------------------------+ | | | + | | | | +--------------------------+ |request for ops |(diagnose, driver devlink |recover, |dump) +--------+ +--------------------------+ | | | reporter| | | | | +---------v----------+ | | | ops execution | | | | | <----------------------------------+ | | | | | | | | | | | + ^------------------+ | | | | | request for ops | | | | | (recover, dump) | | | | | | | | | +-+------------------+ | | | health report | | health handler | | | +-------------------------------> | | | | | +--------------------+ | | | health reporter create | | | +----------------------------> | +--------+ +--------------------------+}hj{sbah}(h]h ]h"]h$]h&]hhuh1jyhhhKphjvhhubeh}(h]user-interfaceah ]h"]user interfaceah$]h&]uh1hhhhhhhhKKubeh}(h]devlink-healthah ]h"]devlink healthah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksjNfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerjerror_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourceh _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jjjdjajMjJjjjsjpjju nametypes}(jjdjMjjsjuh}(jhjahjJjgjjPjpj!jjvjSju footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}jKsRparse_messages]transform_messages] transformerN include_log] decorationNhhub.