deploy: 9bac6f771d30ae898f4312af18b460fdbe4047df

This commit is contained in:
rklaehn
2026-01-15 10:14:12 +00:00
parent 6735b7e579
commit ea46fda1dd
26 changed files with 493 additions and 486 deletions
+1 -1
View File
@@ -1 +1 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Documentation for Rustdoc"><title>Help</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="./static.files/${f}">`).join(""))</script><link rel="stylesheet" href="./static.files/normalize-9960930a.css"><link rel="stylesheet" href="./static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="./" data-static-root-path="./static.files/" data-current-crate="data_transfer" data-themes="" data-resource-suffix="" data-rustdoc-version="1.92.0-nightly (b6f0945e4 2025-10-08)" data-channel="nightly" data-search-js="search-8d3311b9.js" data-stringdex-js="stringdex-828709d0.js" data-settings-js="settings-c38705f0.js" ><script src="./static.files/storage-e2aeef58.js"></script><script defer src="./static.files/main-ce535bd0.js"></script><noscript><link rel="stylesheet" href="./static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="./static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="./static.files/favicon-044be391.svg"></head><body class="rustdoc mod sys"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">All</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><a class="logo-container" href="./index.html"><img class="rust-logo" src="./static.files/rust-logo-9a9549ea.svg" alt="logo"></a><h2><a href="./index.html">Rustdoc</a><span class="version">1.92.0-nightly</span></h2></div><div class="version">(b6f0945e4 2025-10-08)</div><h2 class="location">Help</h2><div class="sidebar-elems"></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><h1>Rustdoc help</h1><span class="out-of-band"><a id="back" href="javascript:void(0)" onclick="history.back();">Back</a></span></div><noscript><section><p>You need to enable JavaScript to use keyboard commands or search.</p><p>For more information, browse the <a href="https://doc.rust-lang.org/nightly/rustdoc/">rustdoc handbook</a>.</p></section></noscript></section></div></main></body></html>
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Documentation for Rustdoc"><title>Help</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="./static.files/${f}">`).join(""))</script><link rel="stylesheet" href="./static.files/normalize-9960930a.css"><link rel="stylesheet" href="./static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="./" data-static-root-path="./static.files/" data-current-crate="quinn_perf" data-themes="" data-resource-suffix="" data-rustdoc-version="1.92.0-nightly (b6f0945e4 2025-10-08)" data-channel="nightly" data-search-js="search-8d3311b9.js" data-stringdex-js="stringdex-828709d0.js" data-settings-js="settings-c38705f0.js" ><script src="./static.files/storage-e2aeef58.js"></script><script defer src="./static.files/main-ce535bd0.js"></script><noscript><link rel="stylesheet" href="./static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="./static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="./static.files/favicon-044be391.svg"></head><body class="rustdoc mod sys"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">All</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><a class="logo-container" href="./index.html"><img class="rust-logo" src="./static.files/rust-logo-9a9549ea.svg" alt="logo"></a><h2><a href="./index.html">Rustdoc</a><span class="version">1.92.0-nightly</span></h2></div><div class="version">(b6f0945e4 2025-10-08)</div><h2 class="location">Help</h2><div class="sidebar-elems"></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><h1>Rustdoc help</h1><span class="out-of-band"><a id="back" href="javascript:void(0)" onclick="history.back();">Back</a></span></div><noscript><section><p>You need to enable JavaScript to use keyboard commands or search.</p><p>For more information, browse the <a href="https://doc.rust-lang.org/nightly/rustdoc/">rustdoc handbook</a>.</p></section></noscript></section></div></main></body></html>
+1 -1
View File
@@ -1,2 +1,2 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Logic for controlling the rate at which data is sent"><title>iroh_quinn::congestion - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="iroh_quinn" data-themes="" data-resource-suffix="" data-rustdoc-version="1.92.0-nightly (b6f0945e4 2025-10-08)" data-channel="nightly" data-search-js="search-8d3311b9.js" data-stringdex-js="stringdex-828709d0.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="../sidebar-items.js"></script><script defer src="../../static.files/main-ce535bd0.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-044be391.svg"></head><body class="rustdoc mod"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">Module congestion</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../iroh_quinn/index.html">iroh_<wbr>quinn</a><span class="version">0.15.0</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module congestion</a></h2><h3><a href="#structs">Module Items</a></h3><ul class="block"><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#traits" title="Traits">Traits</a></li></ul></section><div id="rustdoc-modnav"><h2 class="in-crate"><a href="../index.html">In crate iroh_<wbr>quinn</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../index.html">iroh_quinn</a></div><h1>Module <span>congestion</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../src/iroh_quinn_proto/lib.rs.html#95">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Logic for controlling the rate at which data is sent</p>
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Logic for controlling the rate at which data is sent"><title>iroh_quinn::congestion - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="iroh_quinn" data-themes="" data-resource-suffix="" data-rustdoc-version="1.92.0-nightly (b6f0945e4 2025-10-08)" data-channel="nightly" data-search-js="search-8d3311b9.js" data-stringdex-js="stringdex-828709d0.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="../sidebar-items.js"></script><script defer src="../../static.files/main-ce535bd0.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-044be391.svg"></head><body class="rustdoc mod"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">Module congestion</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../iroh_quinn/index.html">iroh_<wbr>quinn</a><span class="version">0.15.0</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module congestion</a></h2><h3><a href="#structs">Module Items</a></h3><ul class="block"><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#traits" title="Traits">Traits</a></li></ul></section><div id="rustdoc-modnav"><h2 class="in-crate"><a href="../index.html">In crate iroh_<wbr>quinn</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../index.html">iroh_quinn</a></div><h1>Module <span>congestion</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../src/iroh_quinn_proto/lib.rs.html#102">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Logic for controlling the rate at which data is sent</p>
</div></details><h2 id="structs" class="section-header">Structs<a href="#structs" class="anchor">§</a></h2><dl class="item-table"><dt><a class="struct" href="struct.Bbr.html" title="struct iroh_quinn::congestion::Bbr">Bbr</a></dt><dd>Experimental! Use at your own risk.</dd><dt><a class="struct" href="struct.BbrConfig.html" title="struct iroh_quinn::congestion::BbrConfig">BbrConfig</a></dt><dd>Configuration for the <a href="struct.Bbr.html" title="struct iroh_quinn::congestion::Bbr"><code>Bbr</code></a> congestion controller</dd><dt><a class="struct" href="struct.ControllerMetrics.html" title="struct iroh_quinn::congestion::ControllerMetrics">Controller<wbr>Metrics</a></dt><dd>Common congestion controller metrics</dd><dt><a class="struct" href="struct.Cubic.html" title="struct iroh_quinn::congestion::Cubic">Cubic</a></dt><dd>The RFC8312 congestion controller, as widely used for TCP</dd><dt><a class="struct" href="struct.CubicConfig.html" title="struct iroh_quinn::congestion::CubicConfig">Cubic<wbr>Config</a></dt><dd>Configuration for the <code>Cubic</code> congestion controller</dd><dt><a class="struct" href="struct.NewReno.html" title="struct iroh_quinn::congestion::NewReno">NewReno</a></dt><dd>A simple, standard congestion controller</dd><dt><a class="struct" href="struct.NewRenoConfig.html" title="struct iroh_quinn::congestion::NewRenoConfig">NewReno<wbr>Config</a></dt><dd>Configuration for the <code>NewReno</code> congestion controller</dd></dl><h2 id="traits" class="section-header">Traits<a href="#traits" class="anchor">§</a></h2><dl class="item-table"><dt><a class="trait" href="trait.Controller.html" title="trait iroh_quinn::congestion::Controller">Controller</a></dt><dd>Common interface for different congestion controllers</dd><dt><a class="trait" href="trait.ControllerFactory.html" title="trait iroh_quinn::congestion::ControllerFactory">Controller<wbr>Factory</a></dt><dd>Constructs controllers on demand</dd></dl></section></div></main></body></html>
+1 -1
View File
@@ -1,4 +1,4 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Traits and implementations for the QUIC cryptography protocol"><title>iroh_quinn::crypto - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="iroh_quinn" data-themes="" data-resource-suffix="" data-rustdoc-version="1.92.0-nightly (b6f0945e4 2025-10-08)" data-channel="nightly" data-search-js="search-8d3311b9.js" data-stringdex-js="stringdex-828709d0.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="../sidebar-items.js"></script><script defer src="../../static.files/main-ce535bd0.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-044be391.svg"></head><body class="rustdoc mod"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">Module crypto</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../iroh_quinn/index.html">iroh_<wbr>quinn</a><span class="version">0.15.0</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module crypto</a></h2><h3><a href="#modules">Module Items</a></h3><ul class="block"><li><a href="#modules" title="Modules">Modules</a></li><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#traits" title="Traits">Traits</a></li></ul></section><div id="rustdoc-modnav"><h2 class="in-crate"><a href="../index.html">In crate iroh_<wbr>quinn</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../index.html">iroh_quinn</a></div><h1>Module <span>crypto</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../src/iroh_quinn_proto/lib.rs.html#66">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Traits and implementations for the QUIC cryptography protocol</p>
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Traits and implementations for the QUIC cryptography protocol"><title>iroh_quinn::crypto - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="iroh_quinn" data-themes="" data-resource-suffix="" data-rustdoc-version="1.92.0-nightly (b6f0945e4 2025-10-08)" data-channel="nightly" data-search-js="search-8d3311b9.js" data-stringdex-js="stringdex-828709d0.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="../sidebar-items.js"></script><script defer src="../../static.files/main-ce535bd0.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-044be391.svg"></head><body class="rustdoc mod"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">Module crypto</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../iroh_quinn/index.html">iroh_<wbr>quinn</a><span class="version">0.15.0</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module crypto</a></h2><h3><a href="#modules">Module Items</a></h3><ul class="block"><li><a href="#modules" title="Modules">Modules</a></li><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#traits" title="Traits">Traits</a></li></ul></section><div id="rustdoc-modnav"><h2 class="in-crate"><a href="../index.html">In crate iroh_<wbr>quinn</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../index.html">iroh_quinn</a></div><h1>Module <span>crypto</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../src/iroh_quinn_proto/lib.rs.html#73">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Traits and implementations for the QUIC cryptography protocol</p>
<p>The protocol logic in Quinn is contained in types that abstract over the actual
cryptographic protocol used. This module contains the traits used for this
abstraction layer as well as a single implementation of these traits that uses
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,2 +1,2 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Exports for benchmarks"><title>iroh_quinn_proto::bench_exports - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="iroh_quinn_proto" data-themes="" data-resource-suffix="" data-rustdoc-version="1.92.0-nightly (b6f0945e4 2025-10-08)" data-channel="nightly" data-search-js="search-8d3311b9.js" data-stringdex-js="stringdex-828709d0.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="../sidebar-items.js"></script><script defer src="../../static.files/main-ce535bd0.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-044be391.svg"></head><body class="rustdoc mod"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">Module bench_exports</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../iroh_quinn_proto/index.html">iroh_<wbr>quinn_<wbr>proto</a><span class="version">0.14.0</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module bench_<wbr>exports</a></h2><h3><a href="#modules">Module Items</a></h3><ul class="block"><li><a href="#modules" title="Modules">Modules</a></li></ul></section><div id="rustdoc-modnav"><h2 class="in-crate"><a href="../index.html">In crate iroh_<wbr>quinn_<wbr>proto</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../index.html">iroh_quinn_proto</a></div><h1>Module <span>bench_<wbr>exports</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../src/iroh_quinn_proto/lib.rs.html#123">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Exports for benchmarks</p>
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Exports for benchmarks"><title>iroh_quinn_proto::bench_exports - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../../" data-static-root-path="../../static.files/" data-current-crate="iroh_quinn_proto" data-themes="" data-resource-suffix="" data-rustdoc-version="1.92.0-nightly (b6f0945e4 2025-10-08)" data-channel="nightly" data-search-js="search-8d3311b9.js" data-stringdex-js="stringdex-828709d0.js" data-settings-js="settings-c38705f0.js" ><script src="../../static.files/storage-e2aeef58.js"></script><script defer src="../sidebar-items.js"></script><script defer src="../../static.files/main-ce535bd0.js"></script><noscript><link rel="stylesheet" href="../../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../../static.files/favicon-044be391.svg"></head><body class="rustdoc mod"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">Module bench_exports</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../../iroh_quinn_proto/index.html">iroh_<wbr>quinn_<wbr>proto</a><span class="version">0.14.0</span></h2></div><div class="sidebar-elems"><section id="rustdoc-toc"><h2 class="location"><a href="#">Module bench_<wbr>exports</a></h2><h3><a href="#modules">Module Items</a></h3><ul class="block"><li><a href="#modules" title="Modules">Modules</a></li></ul></section><div id="rustdoc-modnav"><h2 class="in-crate"><a href="../index.html">In crate iroh_<wbr>quinn_<wbr>proto</a></h2></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="../index.html">iroh_quinn_proto</a></div><h1>Module <span>bench_<wbr>exports</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../../src/iroh_quinn_proto/lib.rs.html#130">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Exports for benchmarks</p>
</div></details><h2 id="modules" class="section-header">Modules<a href="#modules" class="anchor">§</a></h2><dl class="item-table"><dt><a class="mod" href="send_buffer_benches/index.html" title="mod iroh_quinn_proto::bench_exports::send_buffer_benches">send_<wbr>buffer_<wbr>benches</a></dt><dd>Bench fns for SendBuffer</dd></dl></section></div></main></body></html>
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -1,2 +1,2 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="The QUIC protocol version implemented."><title>DEFAULT_SUPPORTED_VERSIONS in iroh_quinn_proto - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../" data-static-root-path="../static.files/" data-current-crate="iroh_quinn_proto" data-themes="" data-resource-suffix="" data-rustdoc-version="1.92.0-nightly (b6f0945e4 2025-10-08)" data-channel="nightly" data-search-js="search-8d3311b9.js" data-stringdex-js="stringdex-828709d0.js" data-settings-js="settings-c38705f0.js" ><script src="../static.files/storage-e2aeef58.js"></script><script defer src="sidebar-items.js"></script><script defer src="../static.files/main-ce535bd0.js"></script><noscript><link rel="stylesheet" href="../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../static.files/favicon-044be391.svg"></head><body class="rustdoc constant"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">DEFAULT_SUPPORTED_VERSIONS</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../iroh_quinn_proto/index.html">iroh_<wbr>quinn_<wbr>proto</a><span class="version">0.14.0</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="index.html">iroh_quinn_proto</a></div><h1>Constant <span class="constant">DEFAULT_<wbr>SUPPORTED_<wbr>VERSIONS</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../src/iroh_quinn_proto/lib.rs.html#176-184">Source</a> </span></div><pre class="rust item-decl"><code>pub const DEFAULT_SUPPORTED_VERSIONS: &amp;[<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html">u32</a>];</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>The QUIC protocol version implemented.</p>
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="The QUIC protocol version implemented."><title>DEFAULT_SUPPORTED_VERSIONS in iroh_quinn_proto - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../" data-static-root-path="../static.files/" data-current-crate="iroh_quinn_proto" data-themes="" data-resource-suffix="" data-rustdoc-version="1.92.0-nightly (b6f0945e4 2025-10-08)" data-channel="nightly" data-search-js="search-8d3311b9.js" data-stringdex-js="stringdex-828709d0.js" data-settings-js="settings-c38705f0.js" ><script src="../static.files/storage-e2aeef58.js"></script><script defer src="sidebar-items.js"></script><script defer src="../static.files/main-ce535bd0.js"></script><noscript><link rel="stylesheet" href="../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../static.files/favicon-044be391.svg"></head><body class="rustdoc constant"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">DEFAULT_SUPPORTED_VERSIONS</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../iroh_quinn_proto/index.html">iroh_<wbr>quinn_<wbr>proto</a><span class="version">0.14.0</span></h2></div><div class="sidebar-elems"><div id="rustdoc-modnav"></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><div class="rustdoc-breadcrumbs"><a href="index.html">iroh_quinn_proto</a></div><h1>Constant <span class="constant">DEFAULT_<wbr>SUPPORTED_<wbr>VERSIONS</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../src/iroh_quinn_proto/lib.rs.html#183-191">Source</a> </span></div><pre class="rust item-decl"><code>pub const DEFAULT_SUPPORTED_VERSIONS: &amp;[<a class="primitive" href="https://doc.rust-lang.org/nightly/std/primitive.u32.html">u32</a>];</code></pre><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>The QUIC protocol version implemented.</p>
</div></details></section></div></main></body></html>
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1,4 +1,4 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Low-level protocol logic for the QUIC protoocol"><title>iroh_quinn_proto - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../" data-static-root-path="../static.files/" data-current-crate="iroh_quinn_proto" data-themes="" data-resource-suffix="" data-rustdoc-version="1.92.0-nightly (b6f0945e4 2025-10-08)" data-channel="nightly" data-search-js="search-8d3311b9.js" data-stringdex-js="stringdex-828709d0.js" data-settings-js="settings-c38705f0.js" ><script src="../static.files/storage-e2aeef58.js"></script><script defer src="../crates.js"></script><script defer src="../static.files/main-ce535bd0.js"></script><noscript><link rel="stylesheet" href="../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../static.files/favicon-044be391.svg"></head><body class="rustdoc mod crate"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">Crate iroh_quinn_proto</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../iroh_quinn_proto/index.html">iroh_<wbr>quinn_<wbr>proto</a><span class="version">0.14.0</span></h2></div><div class="sidebar-elems"><ul class="block"><li><a id="all-types" href="all.html">All Items</a></li></ul><section id="rustdoc-toc"><h3><a href="#reexports">Crate Items</a></h3><ul class="block"><li><a href="#reexports" title="Re-exports">Re-exports</a></li><li><a href="#modules" title="Modules">Modules</a></li><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#enums" title="Enums">Enums</a></li><li><a href="#constants" title="Constants">Constants</a></li><li><a href="#traits" title="Traits">Traits</a></li></ul></section><div id="rustdoc-modnav"></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><h1>Crate <span>iroh_<wbr>quinn_<wbr>proto</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../src/iroh_quinn_proto/lib.rs.html#1-430">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Low-level protocol logic for the QUIC protoocol</p>
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Low-level protocol logic for the QUIC protoocol"><title>iroh_quinn_proto - Rust</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="../static.files/${f}">`).join(""))</script><link rel="stylesheet" href="../static.files/normalize-9960930a.css"><link rel="stylesheet" href="../static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="../" data-static-root-path="../static.files/" data-current-crate="iroh_quinn_proto" data-themes="" data-resource-suffix="" data-rustdoc-version="1.92.0-nightly (b6f0945e4 2025-10-08)" data-channel="nightly" data-search-js="search-8d3311b9.js" data-stringdex-js="stringdex-828709d0.js" data-settings-js="settings-c38705f0.js" ><script src="../static.files/storage-e2aeef58.js"></script><script defer src="../crates.js"></script><script defer src="../static.files/main-ce535bd0.js"></script><noscript><link rel="stylesheet" href="../static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="../static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="../static.files/favicon-044be391.svg"></head><body class="rustdoc mod crate"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">Crate iroh_quinn_proto</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><h2><a href="../iroh_quinn_proto/index.html">iroh_<wbr>quinn_<wbr>proto</a><span class="version">0.14.0</span></h2></div><div class="sidebar-elems"><ul class="block"><li><a id="all-types" href="all.html">All Items</a></li></ul><section id="rustdoc-toc"><h3><a href="#reexports">Crate Items</a></h3><ul class="block"><li><a href="#reexports" title="Re-exports">Re-exports</a></li><li><a href="#modules" title="Modules">Modules</a></li><li><a href="#structs" title="Structs">Structs</a></li><li><a href="#enums" title="Enums">Enums</a></li><li><a href="#constants" title="Constants">Constants</a></li><li><a href="#traits" title="Traits">Traits</a></li></ul></section><div id="rustdoc-modnav"></div></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><h1>Crate <span>iroh_<wbr>quinn_<wbr>proto</span>&nbsp;<button id="copy-path" title="Copy item path to clipboard">Copy item path</button></h1><rustdoc-toolbar></rustdoc-toolbar><span class="sub-heading"><a class="src" href="../src/iroh_quinn_proto/lib.rs.html#1-437">Source</a> </span></div><details class="toggle top-doc" open><summary class="hideme"><span>Expand description</span></summary><div class="docblock"><p>Low-level protocol logic for the QUIC protoocol</p>
<p>quinn-proto contains a fully deterministic implementation of QUIC protocol logic. It contains
no networking code and does not get any relevant timestamps from the operating system. Most
users may want to use the futures-based quinn API instead.</p>
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -1 +1 @@
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Settings of Rustdoc"><title>Settings</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="./static.files/${f}">`).join(""))</script><link rel="stylesheet" href="./static.files/normalize-9960930a.css"><link rel="stylesheet" href="./static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="./" data-static-root-path="./static.files/" data-current-crate="data_transfer" data-themes="" data-resource-suffix="" data-rustdoc-version="1.92.0-nightly (b6f0945e4 2025-10-08)" data-channel="nightly" data-search-js="search-8d3311b9.js" data-stringdex-js="stringdex-828709d0.js" data-settings-js="settings-c38705f0.js" ><script src="./static.files/storage-e2aeef58.js"></script><script defer src="./static.files/main-ce535bd0.js"></script><noscript><link rel="stylesheet" href="./static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="./static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="./static.files/favicon-044be391.svg"></head><body class="rustdoc mod sys"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">All</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><a class="logo-container" href="./index.html"><img class="rust-logo" src="./static.files/rust-logo-9a9549ea.svg" alt="logo"></a><h2><a href="./index.html">Rustdoc</a><span class="version">1.92.0-nightly</span></h2></div><div class="version">(b6f0945e4 2025-10-08)</div><h2 class="location">Settings</h2><div class="sidebar-elems"></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><h1>Rustdoc settings</h1><span class="out-of-band"><a id="back" href="javascript:void(0)" onclick="history.back();">Back</a></span></div><noscript><section>You need to enable JavaScript be able to update your settings.</section></noscript><script defer src="./static.files/settings-c38705f0.js"></script></section></div></main></body></html>
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta name="generator" content="rustdoc"><meta name="description" content="Settings of Rustdoc"><title>Settings</title><script>if(window.location.protocol!=="file:")document.head.insertAdjacentHTML("beforeend","SourceSerif4-Regular-6b053e98.ttf.woff2,FiraSans-Italic-81dc35de.woff2,FiraSans-Regular-0fe48ade.woff2,FiraSans-MediumItalic-ccf7e434.woff2,FiraSans-Medium-e1aa3f0a.woff2,SourceCodePro-Regular-8badfe75.ttf.woff2,SourceCodePro-Semibold-aa29a496.ttf.woff2".split(",").map(f=>`<link rel="preload" as="font" type="font/woff2"href="./static.files/${f}">`).join(""))</script><link rel="stylesheet" href="./static.files/normalize-9960930a.css"><link rel="stylesheet" href="./static.files/rustdoc-ca0dd0c4.css"><meta name="rustdoc-vars" data-root-path="./" data-static-root-path="./static.files/" data-current-crate="quinn_perf" data-themes="" data-resource-suffix="" data-rustdoc-version="1.92.0-nightly (b6f0945e4 2025-10-08)" data-channel="nightly" data-search-js="search-8d3311b9.js" data-stringdex-js="stringdex-828709d0.js" data-settings-js="settings-c38705f0.js" ><script src="./static.files/storage-e2aeef58.js"></script><script defer src="./static.files/main-ce535bd0.js"></script><noscript><link rel="stylesheet" href="./static.files/noscript-263c88ec.css"></noscript><link rel="alternate icon" type="image/png" href="./static.files/favicon-32x32-eab170b8.png"><link rel="icon" type="image/svg+xml" href="./static.files/favicon-044be391.svg"></head><body class="rustdoc mod sys"><!--[if lte IE 11]><div class="warning">This old browser is unsupported and will most likely display funky things.</div><![endif]--><rustdoc-topbar><h2><a href="#">All</a></h2></rustdoc-topbar><nav class="sidebar"><div class="sidebar-crate"><a class="logo-container" href="./index.html"><img class="rust-logo" src="./static.files/rust-logo-9a9549ea.svg" alt="logo"></a><h2><a href="./index.html">Rustdoc</a><span class="version">1.92.0-nightly</span></h2></div><div class="version">(b6f0945e4 2025-10-08)</div><h2 class="location">Settings</h2><div class="sidebar-elems"></div></nav><div class="sidebar-resizer" title="Drag to resize sidebar"></div><main><div class="width-limiter"><section id="main-content" class="content"><div class="main-heading"><h1>Rustdoc settings</h1><span class="out-of-band"><a id="back" href="javascript:void(0)" onclick="history.back();">Back</a></span></div><noscript><section>You need to enable JavaScript be able to update your settings.</section></noscript><script defer src="./static.files/settings-c38705f0.js"></script></section></div></main></body></html>
+395 -388
View File
@@ -29,402 +29,409 @@
<a href=#29 id=29 data-nosnippet>29</a><span class="kw">pub mod </span>coding;
<a href=#30 id=30 data-nosnippet>30</a><span class="kw">mod </span>constant_time;
<a href=#31 id=31 data-nosnippet>31</a><span class="kw">mod </span>range_set;
<a href=#32 id=32 data-nosnippet>32</a><span class="attr">#[cfg(all(test, any(feature = <span class="string">"rustls-aws-lc-rs"</span>, feature = <span class="string">"rustls-ring"</span>, feature = <span class="string">"proptest"</span>)))]
<a href=#33 id=33 data-nosnippet>33</a></span><span class="kw">mod </span>tests;
<a href=#34 id=34 data-nosnippet>34</a><span class="kw">pub mod </span>transport_parameters;
<a href=#35 id=35 data-nosnippet>35</a><span class="kw">mod </span>varint;
<a href=#36 id=36 data-nosnippet>36</a>
<a href=#37 id=37 data-nosnippet>37</a><span class="kw">pub use </span>varint::{VarInt, VarIntBoundsExceeded};
<a href=#38 id=38 data-nosnippet>38</a>
<a href=#39 id=39 data-nosnippet>39</a><span class="attr">#[cfg(feature = <span class="string">"bloom"</span>)]
<a href=#40 id=40 data-nosnippet>40</a></span><span class="kw">mod </span>bloom_token_log;
<a href=#41 id=41 data-nosnippet>41</a><span class="attr">#[cfg(feature = <span class="string">"bloom"</span>)]
<a href=#42 id=42 data-nosnippet>42</a></span><span class="kw">pub use </span>bloom_token_log::BloomTokenLog;
<a href=#32 id=32 data-nosnippet>32</a><span class="attr">#[cfg(all(
<a href=#33 id=33 data-nosnippet>33</a> test,
<a href=#34 id=34 data-nosnippet>34</a> any(
<a href=#35 id=35 data-nosnippet>35</a> feature = <span class="string">"rustls-aws-lc-rs"</span>,
<a href=#36 id=36 data-nosnippet>36</a> feature = <span class="string">"rustls-ring"</span>,
<a href=#37 id=37 data-nosnippet>37</a> feature = <span class="string">"proptest"
<a href=#38 id=38 data-nosnippet>38</a> </span>)
<a href=#39 id=39 data-nosnippet>39</a>))]
<a href=#40 id=40 data-nosnippet>40</a></span><span class="kw">mod </span>tests;
<a href=#41 id=41 data-nosnippet>41</a><span class="kw">pub mod </span>transport_parameters;
<a href=#42 id=42 data-nosnippet>42</a><span class="kw">mod </span>varint;
<a href=#43 id=43 data-nosnippet>43</a>
<a href=#44 id=44 data-nosnippet>44</a><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">mod </span>connection;
<a href=#45 id=45 data-nosnippet>45</a><span class="kw">pub use </span><span class="kw">crate</span>::connection::{
<a href=#46 id=46 data-nosnippet>46</a> Chunk, Chunks, ClosePathError, ClosedPath, ClosedStream, Connection, ConnectionError,
<a href=#47 id=47 data-nosnippet>47</a> ConnectionStats, Datagrams, Event, FinishError, FrameStats, MultipathNotNegotiated, PathError,
<a href=#48 id=48 data-nosnippet>48</a> PathEvent, PathId, PathStats, PathStatus, ReadError, ReadableError, RecvStream, RttEstimator,
<a href=#49 id=49 data-nosnippet>49</a> SendDatagramError, SendStream, SetPathStatusError, ShouldTransmit, StreamEvent, Streams,
<a href=#50 id=50 data-nosnippet>50</a> UdpStats, WriteError, Written,
<a href=#51 id=51 data-nosnippet>51</a>};
<a href=#52 id=52 data-nosnippet>52</a>
<a href=#53 id=53 data-nosnippet>53</a><span class="attr">#[cfg(feature = <span class="string">"rustls"</span>)]
<a href=#54 id=54 data-nosnippet>54</a></span><span class="kw">pub use </span>rustls;
<a href=#55 id=55 data-nosnippet>55</a>
<a href=#56 id=56 data-nosnippet>56</a><span class="kw">mod </span>config;
<a href=#57 id=57 data-nosnippet>57</a><span class="attr">#[cfg(doc)]
<a href=#58 id=58 data-nosnippet>58</a></span><span class="kw">pub use </span>config::DEFAULT_CONCURRENT_MULTIPATH_PATHS_WHEN_ENABLED;
<a href=#59 id=59 data-nosnippet>59</a><span class="kw">pub use </span>config::{
<a href=#60 id=60 data-nosnippet>60</a> AckFrequencyConfig, ClientConfig, ConfigError, EndpointConfig, IdleTimeout, MtuDiscoveryConfig,
<a href=#61 id=61 data-nosnippet>61</a> ServerConfig, StdSystemTime, TimeSource, TransportConfig, ValidationTokenConfig,
<a href=#62 id=62 data-nosnippet>62</a>};
<a href=#63 id=63 data-nosnippet>63</a><span class="attr">#[cfg(feature = <span class="string">"qlog"</span>)]
<a href=#64 id=64 data-nosnippet>64</a></span><span class="kw">pub use </span>config::{QlogConfig, QlogFactory, QlogFileFactory};
<a href=#65 id=65 data-nosnippet>65</a>
<a href=#66 id=66 data-nosnippet>66</a><span class="kw">pub mod </span>crypto;
<a href=#67 id=67 data-nosnippet>67</a>
<a href=#68 id=68 data-nosnippet>68</a><span class="kw">mod </span>frame;
<a href=#69 id=69 data-nosnippet>69</a><span class="kw">pub use </span><span class="kw">crate</span>::frame::{
<a href=#70 id=70 data-nosnippet>70</a> ApplicationClose, ConnectionClose, Datagram, DatagramInfo, FrameType, InvalidFrameId,
<a href=#71 id=71 data-nosnippet>71</a> MaybeFrame, StreamInfo,
<a href=#72 id=72 data-nosnippet>72</a>};
<a href=#73 id=73 data-nosnippet>73</a><span class="kw">use crate</span>::{
<a href=#74 id=74 data-nosnippet>74</a> coding::{Decodable, Encodable},
<a href=#75 id=75 data-nosnippet>75</a> frame::Frame,
<a href=#76 id=76 data-nosnippet>76</a>};
<a href=#77 id=77 data-nosnippet>77</a>
<a href=#78 id=78 data-nosnippet>78</a><span class="kw">mod </span>endpoint;
<a href=#79 id=79 data-nosnippet>79</a><span class="kw">pub use </span><span class="kw">crate</span>::endpoint::{
<a href=#80 id=80 data-nosnippet>80</a> AcceptError, ConnectError, ConnectionHandle, DatagramEvent, Endpoint, Incoming, RetryError,
<a href=#81 id=81 data-nosnippet>81</a>};
<a href=#82 id=82 data-nosnippet>82</a>
<a href=#83 id=83 data-nosnippet>83</a><span class="kw">mod </span>packet;
<a href=#84 id=84 data-nosnippet>84</a><span class="kw">pub use </span>packet::{
<a href=#85 id=85 data-nosnippet>85</a> ConnectionIdParser, FixedLengthConnectionIdParser, LongType, PacketDecodeError, PartialDecode,
<a href=#86 id=86 data-nosnippet>86</a> ProtectedHeader, ProtectedInitialHeader,
<a href=#87 id=87 data-nosnippet>87</a>};
<a href=#88 id=88 data-nosnippet>88</a>
<a href=#89 id=89 data-nosnippet>89</a><span class="kw">mod </span>shared;
<a href=#90 id=90 data-nosnippet>90</a><span class="kw">pub use </span><span class="kw">crate</span>::shared::{ConnectionEvent, ConnectionId, EcnCodepoint, EndpointEvent};
<a href=#91 id=91 data-nosnippet>91</a>
<a href=#92 id=92 data-nosnippet>92</a><span class="kw">mod </span>transport_error;
<a href=#93 id=93 data-nosnippet>93</a><span class="kw">pub use </span><span class="kw">crate</span>::transport_error::{Code <span class="kw">as </span>TransportErrorCode, Error <span class="kw">as </span>TransportError};
<a href=#94 id=94 data-nosnippet>94</a>
<a href=#95 id=95 data-nosnippet>95</a><span class="kw">pub mod </span>congestion;
<a href=#96 id=96 data-nosnippet>96</a>
<a href=#97 id=97 data-nosnippet>97</a><span class="kw">mod </span>cid_generator;
<a href=#98 id=98 data-nosnippet>98</a><span class="kw">pub use </span><span class="kw">crate</span>::cid_generator::{
<a href=#99 id=99 data-nosnippet>99</a> ConnectionIdGenerator, HashedConnectionIdGenerator, InvalidCid, RandomConnectionIdGenerator,
<a href=#100 id=100 data-nosnippet>100</a>};
<a href=#44 id=44 data-nosnippet>44</a><span class="kw">pub use </span>varint::{VarInt, VarIntBoundsExceeded};
<a href=#45 id=45 data-nosnippet>45</a>
<a href=#46 id=46 data-nosnippet>46</a><span class="attr">#[cfg(feature = <span class="string">"bloom"</span>)]
<a href=#47 id=47 data-nosnippet>47</a></span><span class="kw">mod </span>bloom_token_log;
<a href=#48 id=48 data-nosnippet>48</a><span class="attr">#[cfg(feature = <span class="string">"bloom"</span>)]
<a href=#49 id=49 data-nosnippet>49</a></span><span class="kw">pub use </span>bloom_token_log::BloomTokenLog;
<a href=#50 id=50 data-nosnippet>50</a>
<a href=#51 id=51 data-nosnippet>51</a><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">mod </span>connection;
<a href=#52 id=52 data-nosnippet>52</a><span class="kw">pub use </span><span class="kw">crate</span>::connection::{
<a href=#53 id=53 data-nosnippet>53</a> Chunk, Chunks, ClosePathError, ClosedPath, ClosedStream, Connection, ConnectionError,
<a href=#54 id=54 data-nosnippet>54</a> ConnectionStats, Datagrams, Event, FinishError, FrameStats, MultipathNotNegotiated, PathError,
<a href=#55 id=55 data-nosnippet>55</a> PathEvent, PathId, PathStats, PathStatus, ReadError, ReadableError, RecvStream, RttEstimator,
<a href=#56 id=56 data-nosnippet>56</a> SendDatagramError, SendStream, SetPathStatusError, ShouldTransmit, StreamEvent, Streams,
<a href=#57 id=57 data-nosnippet>57</a> UdpStats, WriteError, Written,
<a href=#58 id=58 data-nosnippet>58</a>};
<a href=#59 id=59 data-nosnippet>59</a>
<a href=#60 id=60 data-nosnippet>60</a><span class="attr">#[cfg(feature = <span class="string">"rustls"</span>)]
<a href=#61 id=61 data-nosnippet>61</a></span><span class="kw">pub use </span>rustls;
<a href=#62 id=62 data-nosnippet>62</a>
<a href=#63 id=63 data-nosnippet>63</a><span class="kw">mod </span>config;
<a href=#64 id=64 data-nosnippet>64</a><span class="attr">#[cfg(doc)]
<a href=#65 id=65 data-nosnippet>65</a></span><span class="kw">pub use </span>config::DEFAULT_CONCURRENT_MULTIPATH_PATHS_WHEN_ENABLED;
<a href=#66 id=66 data-nosnippet>66</a><span class="kw">pub use </span>config::{
<a href=#67 id=67 data-nosnippet>67</a> AckFrequencyConfig, ClientConfig, ConfigError, EndpointConfig, IdleTimeout, MtuDiscoveryConfig,
<a href=#68 id=68 data-nosnippet>68</a> ServerConfig, StdSystemTime, TimeSource, TransportConfig, ValidationTokenConfig,
<a href=#69 id=69 data-nosnippet>69</a>};
<a href=#70 id=70 data-nosnippet>70</a><span class="attr">#[cfg(feature = <span class="string">"qlog"</span>)]
<a href=#71 id=71 data-nosnippet>71</a></span><span class="kw">pub use </span>config::{QlogConfig, QlogFactory, QlogFileFactory};
<a href=#72 id=72 data-nosnippet>72</a>
<a href=#73 id=73 data-nosnippet>73</a><span class="kw">pub mod </span>crypto;
<a href=#74 id=74 data-nosnippet>74</a>
<a href=#75 id=75 data-nosnippet>75</a><span class="kw">mod </span>frame;
<a href=#76 id=76 data-nosnippet>76</a><span class="kw">pub use </span><span class="kw">crate</span>::frame::{
<a href=#77 id=77 data-nosnippet>77</a> ApplicationClose, ConnectionClose, Datagram, DatagramInfo, FrameType, InvalidFrameId,
<a href=#78 id=78 data-nosnippet>78</a> MaybeFrame, StreamInfo,
<a href=#79 id=79 data-nosnippet>79</a>};
<a href=#80 id=80 data-nosnippet>80</a><span class="kw">use crate</span>::{
<a href=#81 id=81 data-nosnippet>81</a> coding::{Decodable, Encodable},
<a href=#82 id=82 data-nosnippet>82</a> frame::Frame,
<a href=#83 id=83 data-nosnippet>83</a>};
<a href=#84 id=84 data-nosnippet>84</a>
<a href=#85 id=85 data-nosnippet>85</a><span class="kw">mod </span>endpoint;
<a href=#86 id=86 data-nosnippet>86</a><span class="kw">pub use </span><span class="kw">crate</span>::endpoint::{
<a href=#87 id=87 data-nosnippet>87</a> AcceptError, ConnectError, ConnectionHandle, DatagramEvent, Endpoint, Incoming, RetryError,
<a href=#88 id=88 data-nosnippet>88</a>};
<a href=#89 id=89 data-nosnippet>89</a>
<a href=#90 id=90 data-nosnippet>90</a><span class="kw">mod </span>packet;
<a href=#91 id=91 data-nosnippet>91</a><span class="kw">pub use </span>packet::{
<a href=#92 id=92 data-nosnippet>92</a> ConnectionIdParser, FixedLengthConnectionIdParser, LongType, PacketDecodeError, PartialDecode,
<a href=#93 id=93 data-nosnippet>93</a> ProtectedHeader, ProtectedInitialHeader,
<a href=#94 id=94 data-nosnippet>94</a>};
<a href=#95 id=95 data-nosnippet>95</a>
<a href=#96 id=96 data-nosnippet>96</a><span class="kw">mod </span>shared;
<a href=#97 id=97 data-nosnippet>97</a><span class="kw">pub use </span><span class="kw">crate</span>::shared::{ConnectionEvent, ConnectionId, EcnCodepoint, EndpointEvent};
<a href=#98 id=98 data-nosnippet>98</a>
<a href=#99 id=99 data-nosnippet>99</a><span class="kw">mod </span>transport_error;
<a href=#100 id=100 data-nosnippet>100</a><span class="kw">pub use </span><span class="kw">crate</span>::transport_error::{Code <span class="kw">as </span>TransportErrorCode, Error <span class="kw">as </span>TransportError};
<a href=#101 id=101 data-nosnippet>101</a>
<a href=#102 id=102 data-nosnippet>102</a><span class="kw">mod </span>token;
<a href=#103 id=103 data-nosnippet>103</a><span class="kw">use </span>token::ResetToken;
<a href=#104 id=104 data-nosnippet>104</a><span class="kw">pub use </span>token::{NoneTokenLog, NoneTokenStore, TokenLog, TokenReuseError, TokenStore};
<a href=#105 id=105 data-nosnippet>105</a>
<a href=#106 id=106 data-nosnippet>106</a><span class="kw">mod </span>address_discovery;
<a href=#107 id=107 data-nosnippet>107</a>
<a href=#108 id=108 data-nosnippet>108</a><span class="kw">mod </span>token_memory_cache;
<a href=#109 id=109 data-nosnippet>109</a><span class="kw">pub use </span>token_memory_cache::TokenMemoryCache;
<a href=#110 id=110 data-nosnippet>110</a>
<a href=#111 id=111 data-nosnippet>111</a><span class="kw">pub mod </span>iroh_hp;
<a href=#102 id=102 data-nosnippet>102</a><span class="kw">pub mod </span>congestion;
<a href=#103 id=103 data-nosnippet>103</a>
<a href=#104 id=104 data-nosnippet>104</a><span class="kw">mod </span>cid_generator;
<a href=#105 id=105 data-nosnippet>105</a><span class="kw">pub use </span><span class="kw">crate</span>::cid_generator::{
<a href=#106 id=106 data-nosnippet>106</a> ConnectionIdGenerator, HashedConnectionIdGenerator, InvalidCid, RandomConnectionIdGenerator,
<a href=#107 id=107 data-nosnippet>107</a>};
<a href=#108 id=108 data-nosnippet>108</a>
<a href=#109 id=109 data-nosnippet>109</a><span class="kw">mod </span>token;
<a href=#110 id=110 data-nosnippet>110</a><span class="kw">use </span>token::ResetToken;
<a href=#111 id=111 data-nosnippet>111</a><span class="kw">pub use </span>token::{NoneTokenLog, NoneTokenStore, TokenLog, TokenReuseError, TokenStore};
<a href=#112 id=112 data-nosnippet>112</a>
<a href=#113 id=113 data-nosnippet>113</a><span class="attr">#[cfg(feature = <span class="string">"arbitrary"</span>)]
<a href=#114 id=114 data-nosnippet>114</a></span><span class="kw">use </span>arbitrary::Arbitrary;
<a href=#115 id=115 data-nosnippet>115</a>
<a href=#116 id=116 data-nosnippet>116</a><span class="comment">// Deal with time
<a href=#117 id=117 data-nosnippet>117</a></span><span class="attr">#[cfg(not(all(target_family = <span class="string">"wasm"</span>, target_os = <span class="string">"unknown"</span>)))]
<a href=#118 id=118 data-nosnippet>118</a></span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">use </span>std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};
<a href=#119 id=119 data-nosnippet>119</a><span class="attr">#[cfg(all(target_family = <span class="string">"wasm"</span>, target_os = <span class="string">"unknown"</span>))]
<a href=#120 id=120 data-nosnippet>120</a></span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">use </span>web_time::{Duration, Instant, SystemTime, UNIX_EPOCH};
<a href=#121 id=121 data-nosnippet>121</a>
<a href=#122 id=122 data-nosnippet>122</a><span class="attr">#[cfg(feature = <span class="string">"bench"</span>)]
<a href=#123 id=123 data-nosnippet>123</a></span><span class="kw">pub mod </span>bench_exports {
<a href=#124 id=124 data-nosnippet>124</a> <span class="doccomment">//! Exports for benchmarks
<a href=#125 id=125 data-nosnippet>125</a> </span><span class="kw">pub use </span><span class="kw">crate</span>::connection::send_buffer::send_buffer_benches;
<a href=#126 id=126 data-nosnippet>126</a>}
<a href=#127 id=127 data-nosnippet>127</a>
<a href=#128 id=128 data-nosnippet>128</a><span class="attr">#[cfg(fuzzing)]
<a href=#129 id=129 data-nosnippet>129</a></span><span class="kw">pub mod </span>fuzzing {
<a href=#130 id=130 data-nosnippet>130</a> <span class="kw">pub use </span><span class="kw">crate</span>::connection::{Retransmits, State <span class="kw">as </span>ConnectionState, StreamsState};
<a href=#131 id=131 data-nosnippet>131</a> <span class="kw">pub use </span><span class="kw">crate</span>::frame::ResetStream;
<a href=#132 id=132 data-nosnippet>132</a> <span class="kw">pub use </span><span class="kw">crate</span>::packet::PartialDecode;
<a href=#133 id=133 data-nosnippet>133</a> <span class="kw">pub use </span><span class="kw">crate</span>::transport_parameters::TransportParameters;
<a href=#134 id=134 data-nosnippet>134</a> <span class="kw">pub use </span>bytes::{BufMut, BytesMut};
<a href=#135 id=135 data-nosnippet>135</a>
<a href=#136 id=136 data-nosnippet>136</a> <span class="attr">#[cfg(feature = <span class="string">"arbitrary"</span>)]
<a href=#137 id=137 data-nosnippet>137</a> </span><span class="kw">use </span>arbitrary::{Arbitrary, <span class="prelude-ty">Result</span>, Unstructured};
<a href=#138 id=138 data-nosnippet>138</a>
<a href=#139 id=139 data-nosnippet>139</a> <span class="attr">#[cfg(feature = <span class="string">"arbitrary"</span>)]
<a href=#140 id=140 data-nosnippet>140</a> </span><span class="kw">impl</span>&lt;<span class="lifetime">'arbitrary</span>&gt; Arbitrary&lt;<span class="lifetime">'arbitrary</span>&gt; <span class="kw">for </span>TransportParameters {
<a href=#141 id=141 data-nosnippet>141</a> <span class="kw">fn </span>arbitrary(u: <span class="kw-2">&amp;mut </span>Unstructured&lt;<span class="lifetime">'arbitrary</span>&gt;) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="self">Self</span>&gt; {
<a href=#142 id=142 data-nosnippet>142</a> <span class="prelude-val">Ok</span>(<span class="self">Self </span>{
<a href=#143 id=143 data-nosnippet>143</a> initial_max_streams_bidi: u.arbitrary()<span class="question-mark">?</span>,
<a href=#144 id=144 data-nosnippet>144</a> initial_max_streams_uni: u.arbitrary()<span class="question-mark">?</span>,
<a href=#145 id=145 data-nosnippet>145</a> ack_delay_exponent: u.arbitrary()<span class="question-mark">?</span>,
<a href=#146 id=146 data-nosnippet>146</a> max_udp_payload_size: u.arbitrary()<span class="question-mark">?</span>,
<a href=#147 id=147 data-nosnippet>147</a> ..<span class="self">Self</span>::default()
<a href=#148 id=148 data-nosnippet>148</a> })
<a href=#149 id=149 data-nosnippet>149</a> }
<a href=#150 id=150 data-nosnippet>150</a> }
<a href=#151 id=151 data-nosnippet>151</a>
<a href=#152 id=152 data-nosnippet>152</a> <span class="attr">#[derive(Debug)]
<a href=#153 id=153 data-nosnippet>153</a> </span><span class="kw">pub struct </span>PacketParams {
<a href=#154 id=154 data-nosnippet>154</a> <span class="kw">pub </span>local_cid_len: usize,
<a href=#155 id=155 data-nosnippet>155</a> <span class="kw">pub </span>buf: BytesMut,
<a href=#156 id=156 data-nosnippet>156</a> <span class="kw">pub </span>grease_quic_bit: bool,
<a href=#113 id=113 data-nosnippet>113</a><span class="kw">mod </span>address_discovery;
<a href=#114 id=114 data-nosnippet>114</a>
<a href=#115 id=115 data-nosnippet>115</a><span class="kw">mod </span>token_memory_cache;
<a href=#116 id=116 data-nosnippet>116</a><span class="kw">pub use </span>token_memory_cache::TokenMemoryCache;
<a href=#117 id=117 data-nosnippet>117</a>
<a href=#118 id=118 data-nosnippet>118</a><span class="kw">pub mod </span>iroh_hp;
<a href=#119 id=119 data-nosnippet>119</a>
<a href=#120 id=120 data-nosnippet>120</a><span class="attr">#[cfg(feature = <span class="string">"arbitrary"</span>)]
<a href=#121 id=121 data-nosnippet>121</a></span><span class="kw">use </span>arbitrary::Arbitrary;
<a href=#122 id=122 data-nosnippet>122</a>
<a href=#123 id=123 data-nosnippet>123</a><span class="comment">// Deal with time
<a href=#124 id=124 data-nosnippet>124</a></span><span class="attr">#[cfg(not(all(target_family = <span class="string">"wasm"</span>, target_os = <span class="string">"unknown"</span>)))]
<a href=#125 id=125 data-nosnippet>125</a></span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">use </span>std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};
<a href=#126 id=126 data-nosnippet>126</a><span class="attr">#[cfg(all(target_family = <span class="string">"wasm"</span>, target_os = <span class="string">"unknown"</span>))]
<a href=#127 id=127 data-nosnippet>127</a></span><span class="kw">pub</span>(<span class="kw">crate</span>) <span class="kw">use </span>web_time::{Duration, Instant, SystemTime, UNIX_EPOCH};
<a href=#128 id=128 data-nosnippet>128</a>
<a href=#129 id=129 data-nosnippet>129</a><span class="attr">#[cfg(feature = <span class="string">"bench"</span>)]
<a href=#130 id=130 data-nosnippet>130</a></span><span class="kw">pub mod </span>bench_exports {
<a href=#131 id=131 data-nosnippet>131</a> <span class="doccomment">//! Exports for benchmarks
<a href=#132 id=132 data-nosnippet>132</a> </span><span class="kw">pub use </span><span class="kw">crate</span>::connection::send_buffer::send_buffer_benches;
<a href=#133 id=133 data-nosnippet>133</a>}
<a href=#134 id=134 data-nosnippet>134</a>
<a href=#135 id=135 data-nosnippet>135</a><span class="attr">#[cfg(fuzzing)]
<a href=#136 id=136 data-nosnippet>136</a></span><span class="kw">pub mod </span>fuzzing {
<a href=#137 id=137 data-nosnippet>137</a> <span class="kw">pub use </span><span class="kw">crate</span>::connection::{Retransmits, State <span class="kw">as </span>ConnectionState, StreamsState};
<a href=#138 id=138 data-nosnippet>138</a> <span class="kw">pub use </span><span class="kw">crate</span>::frame::ResetStream;
<a href=#139 id=139 data-nosnippet>139</a> <span class="kw">pub use </span><span class="kw">crate</span>::packet::PartialDecode;
<a href=#140 id=140 data-nosnippet>140</a> <span class="kw">pub use </span><span class="kw">crate</span>::transport_parameters::TransportParameters;
<a href=#141 id=141 data-nosnippet>141</a> <span class="kw">pub use </span>bytes::{BufMut, BytesMut};
<a href=#142 id=142 data-nosnippet>142</a>
<a href=#143 id=143 data-nosnippet>143</a> <span class="attr">#[cfg(feature = <span class="string">"arbitrary"</span>)]
<a href=#144 id=144 data-nosnippet>144</a> </span><span class="kw">use </span>arbitrary::{Arbitrary, <span class="prelude-ty">Result</span>, Unstructured};
<a href=#145 id=145 data-nosnippet>145</a>
<a href=#146 id=146 data-nosnippet>146</a> <span class="attr">#[cfg(feature = <span class="string">"arbitrary"</span>)]
<a href=#147 id=147 data-nosnippet>147</a> </span><span class="kw">impl</span>&lt;<span class="lifetime">'arbitrary</span>&gt; Arbitrary&lt;<span class="lifetime">'arbitrary</span>&gt; <span class="kw">for </span>TransportParameters {
<a href=#148 id=148 data-nosnippet>148</a> <span class="kw">fn </span>arbitrary(u: <span class="kw-2">&amp;mut </span>Unstructured&lt;<span class="lifetime">'arbitrary</span>&gt;) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="self">Self</span>&gt; {
<a href=#149 id=149 data-nosnippet>149</a> <span class="prelude-val">Ok</span>(<span class="self">Self </span>{
<a href=#150 id=150 data-nosnippet>150</a> initial_max_streams_bidi: u.arbitrary()<span class="question-mark">?</span>,
<a href=#151 id=151 data-nosnippet>151</a> initial_max_streams_uni: u.arbitrary()<span class="question-mark">?</span>,
<a href=#152 id=152 data-nosnippet>152</a> ack_delay_exponent: u.arbitrary()<span class="question-mark">?</span>,
<a href=#153 id=153 data-nosnippet>153</a> max_udp_payload_size: u.arbitrary()<span class="question-mark">?</span>,
<a href=#154 id=154 data-nosnippet>154</a> ..<span class="self">Self</span>::default()
<a href=#155 id=155 data-nosnippet>155</a> })
<a href=#156 id=156 data-nosnippet>156</a> }
<a href=#157 id=157 data-nosnippet>157</a> }
<a href=#158 id=158 data-nosnippet>158</a>
<a href=#159 id=159 data-nosnippet>159</a> <span class="attr">#[cfg(feature = <span class="string">"arbitrary"</span>)]
<a href=#160 id=160 data-nosnippet>160</a> </span><span class="kw">impl</span>&lt;<span class="lifetime">'arbitrary</span>&gt; Arbitrary&lt;<span class="lifetime">'arbitrary</span>&gt; <span class="kw">for </span>PacketParams {
<a href=#161 id=161 data-nosnippet>161</a> <span class="kw">fn </span>arbitrary(u: <span class="kw-2">&amp;mut </span>Unstructured&lt;<span class="lifetime">'arbitrary</span>&gt;) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="self">Self</span>&gt; {
<a href=#162 id=162 data-nosnippet>162</a> <span class="kw">let </span>local_cid_len: usize = u.int_in_range(<span class="number">0</span>..=<span class="kw">crate</span>::MAX_CID_SIZE)<span class="question-mark">?</span>;
<a href=#163 id=163 data-nosnippet>163</a> <span class="kw">let </span>bytes: Vec&lt;u8&gt; = Vec::arbitrary(u)<span class="question-mark">?</span>;
<a href=#164 id=164 data-nosnippet>164</a> <span class="kw">let </span><span class="kw-2">mut </span>buf = BytesMut::new();
<a href=#165 id=165 data-nosnippet>165</a> buf.put_slice(<span class="kw-2">&amp;</span>bytes[..]);
<a href=#166 id=166 data-nosnippet>166</a> <span class="prelude-val">Ok</span>(<span class="self">Self </span>{
<a href=#167 id=167 data-nosnippet>167</a> local_cid_len,
<a href=#168 id=168 data-nosnippet>168</a> buf,
<a href=#169 id=169 data-nosnippet>169</a> grease_quic_bit: bool::arbitrary(u)<span class="question-mark">?</span>,
<a href=#170 id=170 data-nosnippet>170</a> })
<a href=#171 id=171 data-nosnippet>171</a> }
<a href=#172 id=172 data-nosnippet>172</a> }
<a href=#173 id=173 data-nosnippet>173</a>}
<a href=#174 id=174 data-nosnippet>174</a>
<a href=#175 id=175 data-nosnippet>175</a><span class="doccomment">/// The QUIC protocol version implemented.
<a href=#176 id=176 data-nosnippet>176</a></span><span class="kw">pub const </span>DEFAULT_SUPPORTED_VERSIONS: <span class="kw-2">&amp;</span>[u32] = <span class="kw-2">&amp;</span>[
<a href=#177 id=177 data-nosnippet>177</a> <span class="number">0x00000001</span>,
<a href=#178 id=178 data-nosnippet>178</a> <span class="number">0xff00_001d</span>,
<a href=#179 id=179 data-nosnippet>179</a> <span class="number">0xff00_001e</span>,
<a href=#180 id=180 data-nosnippet>180</a> <span class="number">0xff00_001f</span>,
<a href=#181 id=181 data-nosnippet>181</a> <span class="number">0xff00_0020</span>,
<a href=#182 id=182 data-nosnippet>182</a> <span class="number">0xff00_0021</span>,
<a href=#183 id=183 data-nosnippet>183</a> <span class="number">0xff00_0022</span>,
<a href=#184 id=184 data-nosnippet>184</a>];
<a href=#185 id=185 data-nosnippet>185</a>
<a href=#186 id=186 data-nosnippet>186</a><span class="doccomment">/// Whether an endpoint was the initiator of a connection
<a href=#187 id=187 data-nosnippet>187</a></span><span class="attr">#[cfg_attr(feature = <span class="string">"arbitrary"</span>, derive(arbitrary::Arbitrary))]
<a href=#188 id=188 data-nosnippet>188</a>#[cfg_attr(feature = <span class="string">"proptest"</span>, derive(test_strategy::Arbitrary))]
<a href=#189 id=189 data-nosnippet>189</a>#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
<a href=#190 id=190 data-nosnippet>190</a></span><span class="kw">pub enum </span>Side {
<a href=#191 id=191 data-nosnippet>191</a> <span class="doccomment">/// The initiator of a connection
<a href=#192 id=192 data-nosnippet>192</a> </span>Client = <span class="number">0</span>,
<a href=#193 id=193 data-nosnippet>193</a> <span class="doccomment">/// The acceptor of a connection
<a href=#194 id=194 data-nosnippet>194</a> </span>Server = <span class="number">1</span>,
<a href=#195 id=195 data-nosnippet>195</a>}
<a href=#196 id=196 data-nosnippet>196</a>
<a href=#197 id=197 data-nosnippet>197</a><span class="kw">impl </span>Side {
<a href=#198 id=198 data-nosnippet>198</a> <span class="attr">#[inline]
<a href=#199 id=199 data-nosnippet>199</a> </span><span class="doccomment">/// Shorthand for `self == Side::Client`
<a href=#200 id=200 data-nosnippet>200</a> </span><span class="kw">pub fn </span>is_client(<span class="self">self</span>) -&gt; bool {
<a href=#201 id=201 data-nosnippet>201</a> <span class="self">self </span>== <span class="self">Self</span>::Client
<a href=#202 id=202 data-nosnippet>202</a> }
<a href=#159 id=159 data-nosnippet>159</a> <span class="attr">#[derive(Debug)]
<a href=#160 id=160 data-nosnippet>160</a> </span><span class="kw">pub struct </span>PacketParams {
<a href=#161 id=161 data-nosnippet>161</a> <span class="kw">pub </span>local_cid_len: usize,
<a href=#162 id=162 data-nosnippet>162</a> <span class="kw">pub </span>buf: BytesMut,
<a href=#163 id=163 data-nosnippet>163</a> <span class="kw">pub </span>grease_quic_bit: bool,
<a href=#164 id=164 data-nosnippet>164</a> }
<a href=#165 id=165 data-nosnippet>165</a>
<a href=#166 id=166 data-nosnippet>166</a> <span class="attr">#[cfg(feature = <span class="string">"arbitrary"</span>)]
<a href=#167 id=167 data-nosnippet>167</a> </span><span class="kw">impl</span>&lt;<span class="lifetime">'arbitrary</span>&gt; Arbitrary&lt;<span class="lifetime">'arbitrary</span>&gt; <span class="kw">for </span>PacketParams {
<a href=#168 id=168 data-nosnippet>168</a> <span class="kw">fn </span>arbitrary(u: <span class="kw-2">&amp;mut </span>Unstructured&lt;<span class="lifetime">'arbitrary</span>&gt;) -&gt; <span class="prelude-ty">Result</span>&lt;<span class="self">Self</span>&gt; {
<a href=#169 id=169 data-nosnippet>169</a> <span class="kw">let </span>local_cid_len: usize = u.int_in_range(<span class="number">0</span>..=<span class="kw">crate</span>::MAX_CID_SIZE)<span class="question-mark">?</span>;
<a href=#170 id=170 data-nosnippet>170</a> <span class="kw">let </span>bytes: Vec&lt;u8&gt; = Vec::arbitrary(u)<span class="question-mark">?</span>;
<a href=#171 id=171 data-nosnippet>171</a> <span class="kw">let </span><span class="kw-2">mut </span>buf = BytesMut::new();
<a href=#172 id=172 data-nosnippet>172</a> buf.put_slice(<span class="kw-2">&amp;</span>bytes[..]);
<a href=#173 id=173 data-nosnippet>173</a> <span class="prelude-val">Ok</span>(<span class="self">Self </span>{
<a href=#174 id=174 data-nosnippet>174</a> local_cid_len,
<a href=#175 id=175 data-nosnippet>175</a> buf,
<a href=#176 id=176 data-nosnippet>176</a> grease_quic_bit: bool::arbitrary(u)<span class="question-mark">?</span>,
<a href=#177 id=177 data-nosnippet>177</a> })
<a href=#178 id=178 data-nosnippet>178</a> }
<a href=#179 id=179 data-nosnippet>179</a> }
<a href=#180 id=180 data-nosnippet>180</a>}
<a href=#181 id=181 data-nosnippet>181</a>
<a href=#182 id=182 data-nosnippet>182</a><span class="doccomment">/// The QUIC protocol version implemented.
<a href=#183 id=183 data-nosnippet>183</a></span><span class="kw">pub const </span>DEFAULT_SUPPORTED_VERSIONS: <span class="kw-2">&amp;</span>[u32] = <span class="kw-2">&amp;</span>[
<a href=#184 id=184 data-nosnippet>184</a> <span class="number">0x00000001</span>,
<a href=#185 id=185 data-nosnippet>185</a> <span class="number">0xff00_001d</span>,
<a href=#186 id=186 data-nosnippet>186</a> <span class="number">0xff00_001e</span>,
<a href=#187 id=187 data-nosnippet>187</a> <span class="number">0xff00_001f</span>,
<a href=#188 id=188 data-nosnippet>188</a> <span class="number">0xff00_0020</span>,
<a href=#189 id=189 data-nosnippet>189</a> <span class="number">0xff00_0021</span>,
<a href=#190 id=190 data-nosnippet>190</a> <span class="number">0xff00_0022</span>,
<a href=#191 id=191 data-nosnippet>191</a>];
<a href=#192 id=192 data-nosnippet>192</a>
<a href=#193 id=193 data-nosnippet>193</a><span class="doccomment">/// Whether an endpoint was the initiator of a connection
<a href=#194 id=194 data-nosnippet>194</a></span><span class="attr">#[cfg_attr(feature = <span class="string">"arbitrary"</span>, derive(arbitrary::Arbitrary))]
<a href=#195 id=195 data-nosnippet>195</a>#[cfg_attr(feature = <span class="string">"proptest"</span>, derive(test_strategy::Arbitrary))]
<a href=#196 id=196 data-nosnippet>196</a>#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
<a href=#197 id=197 data-nosnippet>197</a></span><span class="kw">pub enum </span>Side {
<a href=#198 id=198 data-nosnippet>198</a> <span class="doccomment">/// The initiator of a connection
<a href=#199 id=199 data-nosnippet>199</a> </span>Client = <span class="number">0</span>,
<a href=#200 id=200 data-nosnippet>200</a> <span class="doccomment">/// The acceptor of a connection
<a href=#201 id=201 data-nosnippet>201</a> </span>Server = <span class="number">1</span>,
<a href=#202 id=202 data-nosnippet>202</a>}
<a href=#203 id=203 data-nosnippet>203</a>
<a href=#204 id=204 data-nosnippet>204</a> <span class="attr">#[inline]
<a href=#205 id=205 data-nosnippet>205</a> </span><span class="doccomment">/// Shorthand for `self == Side::Server`
<a href=#206 id=206 data-nosnippet>206</a> </span><span class="kw">pub fn </span>is_server(<span class="self">self</span>) -&gt; bool {
<a href=#207 id=207 data-nosnippet>207</a> <span class="self">self </span>== <span class="self">Self</span>::Server
<a href=#208 id=208 data-nosnippet>208</a> }
<a href=#209 id=209 data-nosnippet>209</a>}
<a href=#204 id=204 data-nosnippet>204</a><span class="kw">impl </span>Side {
<a href=#205 id=205 data-nosnippet>205</a> <span class="attr">#[inline]
<a href=#206 id=206 data-nosnippet>206</a> </span><span class="doccomment">/// Shorthand for `self == Side::Client`
<a href=#207 id=207 data-nosnippet>207</a> </span><span class="kw">pub fn </span>is_client(<span class="self">self</span>) -&gt; bool {
<a href=#208 id=208 data-nosnippet>208</a> <span class="self">self </span>== <span class="self">Self</span>::Client
<a href=#209 id=209 data-nosnippet>209</a> }
<a href=#210 id=210 data-nosnippet>210</a>
<a href=#211 id=211 data-nosnippet>211</a><span class="kw">impl </span>ops::Not <span class="kw">for </span>Side {
<a href=#212 id=212 data-nosnippet>212</a> <span class="kw">type </span>Output = <span class="self">Self</span>;
<a href=#213 id=213 data-nosnippet>213</a> <span class="kw">fn </span>not(<span class="self">self</span>) -&gt; <span class="self">Self </span>{
<a href=#214 id=214 data-nosnippet>214</a> <span class="kw">match </span><span class="self">self </span>{
<a href=#215 id=215 data-nosnippet>215</a> <span class="self">Self</span>::Client =&gt; <span class="self">Self</span>::Server,
<a href=#216 id=216 data-nosnippet>216</a> <span class="self">Self</span>::Server =&gt; <span class="self">Self</span>::Client,
<a href=#217 id=217 data-nosnippet>217</a> }
<a href=#218 id=218 data-nosnippet>218</a> }
<a href=#219 id=219 data-nosnippet>219</a>}
<a href=#220 id=220 data-nosnippet>220</a>
<a href=#221 id=221 data-nosnippet>221</a><span class="doccomment">/// Whether a stream communicates data in both directions or only from the initiator
<a href=#222 id=222 data-nosnippet>222</a></span><span class="attr">#[cfg_attr(feature = <span class="string">"arbitrary"</span>, derive(arbitrary::Arbitrary))]
<a href=#223 id=223 data-nosnippet>223</a>#[cfg_attr(feature = <span class="string">"proptest"</span>, derive(test_strategy::Arbitrary))]
<a href=#224 id=224 data-nosnippet>224</a>#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
<a href=#225 id=225 data-nosnippet>225</a></span><span class="kw">pub enum </span>Dir {
<a href=#226 id=226 data-nosnippet>226</a> <span class="doccomment">/// Data flows in both directions
<a href=#227 id=227 data-nosnippet>227</a> </span>Bi = <span class="number">0</span>,
<a href=#228 id=228 data-nosnippet>228</a> <span class="doccomment">/// Data flows only from the stream's initiator
<a href=#229 id=229 data-nosnippet>229</a> </span>Uni = <span class="number">1</span>,
<a href=#230 id=230 data-nosnippet>230</a>}
<a href=#231 id=231 data-nosnippet>231</a>
<a href=#232 id=232 data-nosnippet>232</a><span class="kw">impl </span>Dir {
<a href=#233 id=233 data-nosnippet>233</a> <span class="kw">fn </span>iter() -&gt; <span class="kw">impl </span>Iterator&lt;Item = <span class="self">Self</span>&gt; {
<a href=#234 id=234 data-nosnippet>234</a> [<span class="self">Self</span>::Bi, <span class="self">Self</span>::Uni].iter().cloned()
<a href=#235 id=235 data-nosnippet>235</a> }
<a href=#236 id=236 data-nosnippet>236</a>}
<a href=#237 id=237 data-nosnippet>237</a>
<a href=#238 id=238 data-nosnippet>238</a><span class="kw">impl </span>fmt::Display <span class="kw">for </span>Dir {
<a href=#239 id=239 data-nosnippet>239</a> <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter&lt;<span class="lifetime">'_</span>&gt;) -&gt; fmt::Result {
<a href=#240 id=240 data-nosnippet>240</a> <span class="kw">use </span>Dir::<span class="kw-2">*</span>;
<a href=#241 id=241 data-nosnippet>241</a> f.pad(<span class="kw">match </span><span class="kw-2">*</span><span class="self">self </span>{
<a href=#242 id=242 data-nosnippet>242</a> Bi =&gt; <span class="string">"bidirectional"</span>,
<a href=#243 id=243 data-nosnippet>243</a> Uni =&gt; <span class="string">"unidirectional"</span>,
<a href=#244 id=244 data-nosnippet>244</a> })
<a href=#245 id=245 data-nosnippet>245</a> }
<a href=#246 id=246 data-nosnippet>246</a>}
<a href=#247 id=247 data-nosnippet>247</a>
<a href=#248 id=248 data-nosnippet>248</a><span class="doccomment">/// Identifier for a stream within a particular connection
<a href=#249 id=249 data-nosnippet>249</a></span><span class="attr">#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
<a href=#250 id=250 data-nosnippet>250</a>#[cfg_attr(feature = <span class="string">"proptest"</span>, derive(test_strategy::Arbitrary))]
<a href=#251 id=251 data-nosnippet>251</a></span><span class="kw">pub struct </span>StreamId(<span class="attr">#[cfg_attr(feature = <span class="string">"proptest"</span>, strategy(<span class="number">0u64</span>..(<span class="number">1u64 </span>&lt;&lt; <span class="number">62</span>)))] </span>u64);
<a href=#252 id=252 data-nosnippet>252</a>
<a href=#253 id=253 data-nosnippet>253</a><span class="kw">impl </span>fmt::Display <span class="kw">for </span>StreamId {
<a href=#254 id=254 data-nosnippet>254</a> <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter&lt;<span class="lifetime">'_</span>&gt;) -&gt; fmt::Result {
<a href=#255 id=255 data-nosnippet>255</a> <span class="kw">let </span>initiator = <span class="kw">match </span><span class="self">self</span>.initiator() {
<a href=#256 id=256 data-nosnippet>256</a> Side::Client =&gt; <span class="string">"client"</span>,
<a href=#257 id=257 data-nosnippet>257</a> Side::Server =&gt; <span class="string">"server"</span>,
<a href=#258 id=258 data-nosnippet>258</a> };
<a href=#259 id=259 data-nosnippet>259</a> <span class="kw">let </span>dir = <span class="kw">match </span><span class="self">self</span>.dir() {
<a href=#260 id=260 data-nosnippet>260</a> Dir::Uni =&gt; <span class="string">"uni"</span>,
<a href=#261 id=261 data-nosnippet>261</a> Dir::Bi =&gt; <span class="string">"bi"</span>,
<a href=#262 id=262 data-nosnippet>262</a> };
<a href=#263 id=263 data-nosnippet>263</a> <span class="macro">write!</span>(
<a href=#264 id=264 data-nosnippet>264</a> f,
<a href=#265 id=265 data-nosnippet>265</a> <span class="string">"{} {}directional stream {}"</span>,
<a href=#266 id=266 data-nosnippet>266</a> initiator,
<a href=#267 id=267 data-nosnippet>267</a> dir,
<a href=#268 id=268 data-nosnippet>268</a> <span class="self">self</span>.index()
<a href=#269 id=269 data-nosnippet>269</a> )
<a href=#270 id=270 data-nosnippet>270</a> }
<a href=#271 id=271 data-nosnippet>271</a>}
<a href=#272 id=272 data-nosnippet>272</a>
<a href=#273 id=273 data-nosnippet>273</a><span class="kw">impl </span>StreamId {
<a href=#274 id=274 data-nosnippet>274</a> <span class="doccomment">/// Create a new StreamId
<a href=#275 id=275 data-nosnippet>275</a> </span><span class="kw">pub fn </span>new(initiator: Side, dir: Dir, index: u64) -&gt; <span class="self">Self </span>{
<a href=#276 id=276 data-nosnippet>276</a> <span class="self">Self</span>((index &lt;&lt; <span class="number">2</span>) | ((dir <span class="kw">as </span>u64) &lt;&lt; <span class="number">1</span>) | initiator <span class="kw">as </span>u64)
<a href=#211 id=211 data-nosnippet>211</a> <span class="attr">#[inline]
<a href=#212 id=212 data-nosnippet>212</a> </span><span class="doccomment">/// Shorthand for `self == Side::Server`
<a href=#213 id=213 data-nosnippet>213</a> </span><span class="kw">pub fn </span>is_server(<span class="self">self</span>) -&gt; bool {
<a href=#214 id=214 data-nosnippet>214</a> <span class="self">self </span>== <span class="self">Self</span>::Server
<a href=#215 id=215 data-nosnippet>215</a> }
<a href=#216 id=216 data-nosnippet>216</a>}
<a href=#217 id=217 data-nosnippet>217</a>
<a href=#218 id=218 data-nosnippet>218</a><span class="kw">impl </span>ops::Not <span class="kw">for </span>Side {
<a href=#219 id=219 data-nosnippet>219</a> <span class="kw">type </span>Output = <span class="self">Self</span>;
<a href=#220 id=220 data-nosnippet>220</a> <span class="kw">fn </span>not(<span class="self">self</span>) -&gt; <span class="self">Self </span>{
<a href=#221 id=221 data-nosnippet>221</a> <span class="kw">match </span><span class="self">self </span>{
<a href=#222 id=222 data-nosnippet>222</a> <span class="self">Self</span>::Client =&gt; <span class="self">Self</span>::Server,
<a href=#223 id=223 data-nosnippet>223</a> <span class="self">Self</span>::Server =&gt; <span class="self">Self</span>::Client,
<a href=#224 id=224 data-nosnippet>224</a> }
<a href=#225 id=225 data-nosnippet>225</a> }
<a href=#226 id=226 data-nosnippet>226</a>}
<a href=#227 id=227 data-nosnippet>227</a>
<a href=#228 id=228 data-nosnippet>228</a><span class="doccomment">/// Whether a stream communicates data in both directions or only from the initiator
<a href=#229 id=229 data-nosnippet>229</a></span><span class="attr">#[cfg_attr(feature = <span class="string">"arbitrary"</span>, derive(arbitrary::Arbitrary))]
<a href=#230 id=230 data-nosnippet>230</a>#[cfg_attr(feature = <span class="string">"proptest"</span>, derive(test_strategy::Arbitrary))]
<a href=#231 id=231 data-nosnippet>231</a>#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
<a href=#232 id=232 data-nosnippet>232</a></span><span class="kw">pub enum </span>Dir {
<a href=#233 id=233 data-nosnippet>233</a> <span class="doccomment">/// Data flows in both directions
<a href=#234 id=234 data-nosnippet>234</a> </span>Bi = <span class="number">0</span>,
<a href=#235 id=235 data-nosnippet>235</a> <span class="doccomment">/// Data flows only from the stream's initiator
<a href=#236 id=236 data-nosnippet>236</a> </span>Uni = <span class="number">1</span>,
<a href=#237 id=237 data-nosnippet>237</a>}
<a href=#238 id=238 data-nosnippet>238</a>
<a href=#239 id=239 data-nosnippet>239</a><span class="kw">impl </span>Dir {
<a href=#240 id=240 data-nosnippet>240</a> <span class="kw">fn </span>iter() -&gt; <span class="kw">impl </span>Iterator&lt;Item = <span class="self">Self</span>&gt; {
<a href=#241 id=241 data-nosnippet>241</a> [<span class="self">Self</span>::Bi, <span class="self">Self</span>::Uni].iter().cloned()
<a href=#242 id=242 data-nosnippet>242</a> }
<a href=#243 id=243 data-nosnippet>243</a>}
<a href=#244 id=244 data-nosnippet>244</a>
<a href=#245 id=245 data-nosnippet>245</a><span class="kw">impl </span>fmt::Display <span class="kw">for </span>Dir {
<a href=#246 id=246 data-nosnippet>246</a> <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter&lt;<span class="lifetime">'_</span>&gt;) -&gt; fmt::Result {
<a href=#247 id=247 data-nosnippet>247</a> <span class="kw">use </span>Dir::<span class="kw-2">*</span>;
<a href=#248 id=248 data-nosnippet>248</a> f.pad(<span class="kw">match </span><span class="kw-2">*</span><span class="self">self </span>{
<a href=#249 id=249 data-nosnippet>249</a> Bi =&gt; <span class="string">"bidirectional"</span>,
<a href=#250 id=250 data-nosnippet>250</a> Uni =&gt; <span class="string">"unidirectional"</span>,
<a href=#251 id=251 data-nosnippet>251</a> })
<a href=#252 id=252 data-nosnippet>252</a> }
<a href=#253 id=253 data-nosnippet>253</a>}
<a href=#254 id=254 data-nosnippet>254</a>
<a href=#255 id=255 data-nosnippet>255</a><span class="doccomment">/// Identifier for a stream within a particular connection
<a href=#256 id=256 data-nosnippet>256</a></span><span class="attr">#[derive(Debug, Copy, Clone, Eq, PartialEq, Ord, PartialOrd, Hash)]
<a href=#257 id=257 data-nosnippet>257</a>#[cfg_attr(feature = <span class="string">"proptest"</span>, derive(test_strategy::Arbitrary))]
<a href=#258 id=258 data-nosnippet>258</a></span><span class="kw">pub struct </span>StreamId(<span class="attr">#[cfg_attr(feature = <span class="string">"proptest"</span>, strategy(<span class="number">0u64</span>..(<span class="number">1u64 </span>&lt;&lt; <span class="number">62</span>)))] </span>u64);
<a href=#259 id=259 data-nosnippet>259</a>
<a href=#260 id=260 data-nosnippet>260</a><span class="kw">impl </span>fmt::Display <span class="kw">for </span>StreamId {
<a href=#261 id=261 data-nosnippet>261</a> <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter&lt;<span class="lifetime">'_</span>&gt;) -&gt; fmt::Result {
<a href=#262 id=262 data-nosnippet>262</a> <span class="kw">let </span>initiator = <span class="kw">match </span><span class="self">self</span>.initiator() {
<a href=#263 id=263 data-nosnippet>263</a> Side::Client =&gt; <span class="string">"client"</span>,
<a href=#264 id=264 data-nosnippet>264</a> Side::Server =&gt; <span class="string">"server"</span>,
<a href=#265 id=265 data-nosnippet>265</a> };
<a href=#266 id=266 data-nosnippet>266</a> <span class="kw">let </span>dir = <span class="kw">match </span><span class="self">self</span>.dir() {
<a href=#267 id=267 data-nosnippet>267</a> Dir::Uni =&gt; <span class="string">"uni"</span>,
<a href=#268 id=268 data-nosnippet>268</a> Dir::Bi =&gt; <span class="string">"bi"</span>,
<a href=#269 id=269 data-nosnippet>269</a> };
<a href=#270 id=270 data-nosnippet>270</a> <span class="macro">write!</span>(
<a href=#271 id=271 data-nosnippet>271</a> f,
<a href=#272 id=272 data-nosnippet>272</a> <span class="string">"{} {}directional stream {}"</span>,
<a href=#273 id=273 data-nosnippet>273</a> initiator,
<a href=#274 id=274 data-nosnippet>274</a> dir,
<a href=#275 id=275 data-nosnippet>275</a> <span class="self">self</span>.index()
<a href=#276 id=276 data-nosnippet>276</a> )
<a href=#277 id=277 data-nosnippet>277</a> }
<a href=#278 id=278 data-nosnippet>278</a> <span class="doccomment">/// Which side of a connection initiated the stream
<a href=#279 id=279 data-nosnippet>279</a> </span><span class="kw">pub fn </span>initiator(<span class="self">self</span>) -&gt; Side {
<a href=#280 id=280 data-nosnippet>280</a> <span class="kw">if </span><span class="self">self</span>.<span class="number">0 </span>&amp; <span class="number">0x1 </span>== <span class="number">0 </span>{
<a href=#281 id=281 data-nosnippet>281</a> Side::Client
<a href=#282 id=282 data-nosnippet>282</a> } <span class="kw">else </span>{
<a href=#283 id=283 data-nosnippet>283</a> Side::Server
<a href=#284 id=284 data-nosnippet>284</a> }
<a href=#285 id=285 data-nosnippet>285</a> }
<a href=#286 id=286 data-nosnippet>286</a> <span class="doccomment">/// Which directions data flows in
<a href=#287 id=287 data-nosnippet>287</a> </span><span class="kw">pub fn </span>dir(<span class="self">self</span>) -&gt; Dir {
<a href=#288 id=288 data-nosnippet>288</a> <span class="kw">if </span><span class="self">self</span>.<span class="number">0 </span>&amp; <span class="number">0x2 </span>== <span class="number">0 </span>{ Dir::Bi } <span class="kw">else </span>{ Dir::Uni }
<a href=#289 id=289 data-nosnippet>289</a> }
<a href=#290 id=290 data-nosnippet>290</a> <span class="doccomment">/// Distinguishes streams of the same initiator and directionality
<a href=#291 id=291 data-nosnippet>291</a> </span><span class="kw">pub fn </span>index(<span class="self">self</span>) -&gt; u64 {
<a href=#292 id=292 data-nosnippet>292</a> <span class="self">self</span>.<span class="number">0 </span>&gt;&gt; <span class="number">2
<a href=#293 id=293 data-nosnippet>293</a> </span>}
<a href=#294 id=294 data-nosnippet>294</a>}
<a href=#295 id=295 data-nosnippet>295</a>
<a href=#296 id=296 data-nosnippet>296</a><span class="kw">impl </span>From&lt;StreamId&gt; <span class="kw">for </span>VarInt {
<a href=#297 id=297 data-nosnippet>297</a> <span class="kw">fn </span>from(x: StreamId) -&gt; <span class="self">Self </span>{
<a href=#298 id=298 data-nosnippet>298</a> <span class="kw">unsafe </span>{ <span class="self">Self</span>::from_u64_unchecked(x.<span class="number">0</span>) }
<a href=#299 id=299 data-nosnippet>299</a> }
<a href=#300 id=300 data-nosnippet>300</a>}
<a href=#301 id=301 data-nosnippet>301</a>
<a href=#302 id=302 data-nosnippet>302</a><span class="kw">impl </span>From&lt;VarInt&gt; <span class="kw">for </span>StreamId {
<a href=#303 id=303 data-nosnippet>303</a> <span class="kw">fn </span>from(v: VarInt) -&gt; <span class="self">Self </span>{
<a href=#304 id=304 data-nosnippet>304</a> <span class="self">Self</span>(v.<span class="number">0</span>)
<a href=#305 id=305 data-nosnippet>305</a> }
<a href=#306 id=306 data-nosnippet>306</a>}
<a href=#307 id=307 data-nosnippet>307</a>
<a href=#308 id=308 data-nosnippet>308</a><span class="kw">impl </span>From&lt;StreamId&gt; <span class="kw">for </span>u64 {
<a href=#309 id=309 data-nosnippet>309</a> <span class="kw">fn </span>from(x: StreamId) -&gt; <span class="self">Self </span>{
<a href=#310 id=310 data-nosnippet>310</a> x.<span class="number">0
<a href=#311 id=311 data-nosnippet>311</a> </span>}
<a href=#312 id=312 data-nosnippet>312</a>}
<a href=#313 id=313 data-nosnippet>313</a>
<a href=#314 id=314 data-nosnippet>314</a><span class="kw">impl </span>Decodable <span class="kw">for </span>StreamId {
<a href=#315 id=315 data-nosnippet>315</a> <span class="kw">fn </span>decode&lt;B: bytes::Buf&gt;(buf: <span class="kw-2">&amp;mut </span>B) -&gt; coding::Result&lt;<span class="self">Self</span>&gt; {
<a href=#316 id=316 data-nosnippet>316</a> VarInt::decode(buf).map(|x| <span class="self">Self</span>(x.into_inner()))
<a href=#317 id=317 data-nosnippet>317</a> }
<a href=#318 id=318 data-nosnippet>318</a>}
<a href=#319 id=319 data-nosnippet>319</a>
<a href=#320 id=320 data-nosnippet>320</a><span class="kw">impl </span>Encodable <span class="kw">for </span>StreamId {
<a href=#321 id=321 data-nosnippet>321</a> <span class="kw">fn </span>encode&lt;B: bytes::BufMut&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span>B) {
<a href=#322 id=322 data-nosnippet>322</a> VarInt::from_u64(<span class="self">self</span>.<span class="number">0</span>).unwrap().encode(buf);
<a href=#323 id=323 data-nosnippet>323</a> }
<a href=#324 id=324 data-nosnippet>324</a>}
<a href=#325 id=325 data-nosnippet>325</a>
<a href=#326 id=326 data-nosnippet>326</a><span class="attr">#[cfg(feature = <span class="string">"arbitrary"</span>)]
<a href=#327 id=327 data-nosnippet>327</a></span><span class="kw">impl</span>&lt;<span class="lifetime">'arbitrary</span>&gt; Arbitrary&lt;<span class="lifetime">'arbitrary</span>&gt; <span class="kw">for </span>StreamId {
<a href=#328 id=328 data-nosnippet>328</a> <span class="kw">fn </span>arbitrary(u: <span class="kw-2">&amp;mut </span>arbitrary::Unstructured&lt;<span class="lifetime">'arbitrary</span>&gt;) -&gt; arbitrary::Result&lt;<span class="self">Self</span>&gt; {
<a href=#329 id=329 data-nosnippet>329</a> <span class="prelude-val">Ok</span>(VarInt::arbitrary(u)<span class="question-mark">?</span>.into())
<a href=#278 id=278 data-nosnippet>278</a>}
<a href=#279 id=279 data-nosnippet>279</a>
<a href=#280 id=280 data-nosnippet>280</a><span class="kw">impl </span>StreamId {
<a href=#281 id=281 data-nosnippet>281</a> <span class="doccomment">/// Create a new StreamId
<a href=#282 id=282 data-nosnippet>282</a> </span><span class="kw">pub fn </span>new(initiator: Side, dir: Dir, index: u64) -&gt; <span class="self">Self </span>{
<a href=#283 id=283 data-nosnippet>283</a> <span class="self">Self</span>((index &lt;&lt; <span class="number">2</span>) | ((dir <span class="kw">as </span>u64) &lt;&lt; <span class="number">1</span>) | initiator <span class="kw">as </span>u64)
<a href=#284 id=284 data-nosnippet>284</a> }
<a href=#285 id=285 data-nosnippet>285</a> <span class="doccomment">/// Which side of a connection initiated the stream
<a href=#286 id=286 data-nosnippet>286</a> </span><span class="kw">pub fn </span>initiator(<span class="self">self</span>) -&gt; Side {
<a href=#287 id=287 data-nosnippet>287</a> <span class="kw">if </span><span class="self">self</span>.<span class="number">0 </span>&amp; <span class="number">0x1 </span>== <span class="number">0 </span>{
<a href=#288 id=288 data-nosnippet>288</a> Side::Client
<a href=#289 id=289 data-nosnippet>289</a> } <span class="kw">else </span>{
<a href=#290 id=290 data-nosnippet>290</a> Side::Server
<a href=#291 id=291 data-nosnippet>291</a> }
<a href=#292 id=292 data-nosnippet>292</a> }
<a href=#293 id=293 data-nosnippet>293</a> <span class="doccomment">/// Which directions data flows in
<a href=#294 id=294 data-nosnippet>294</a> </span><span class="kw">pub fn </span>dir(<span class="self">self</span>) -&gt; Dir {
<a href=#295 id=295 data-nosnippet>295</a> <span class="kw">if </span><span class="self">self</span>.<span class="number">0 </span>&amp; <span class="number">0x2 </span>== <span class="number">0 </span>{ Dir::Bi } <span class="kw">else </span>{ Dir::Uni }
<a href=#296 id=296 data-nosnippet>296</a> }
<a href=#297 id=297 data-nosnippet>297</a> <span class="doccomment">/// Distinguishes streams of the same initiator and directionality
<a href=#298 id=298 data-nosnippet>298</a> </span><span class="kw">pub fn </span>index(<span class="self">self</span>) -&gt; u64 {
<a href=#299 id=299 data-nosnippet>299</a> <span class="self">self</span>.<span class="number">0 </span>&gt;&gt; <span class="number">2
<a href=#300 id=300 data-nosnippet>300</a> </span>}
<a href=#301 id=301 data-nosnippet>301</a>}
<a href=#302 id=302 data-nosnippet>302</a>
<a href=#303 id=303 data-nosnippet>303</a><span class="kw">impl </span>From&lt;StreamId&gt; <span class="kw">for </span>VarInt {
<a href=#304 id=304 data-nosnippet>304</a> <span class="kw">fn </span>from(x: StreamId) -&gt; <span class="self">Self </span>{
<a href=#305 id=305 data-nosnippet>305</a> <span class="kw">unsafe </span>{ <span class="self">Self</span>::from_u64_unchecked(x.<span class="number">0</span>) }
<a href=#306 id=306 data-nosnippet>306</a> }
<a href=#307 id=307 data-nosnippet>307</a>}
<a href=#308 id=308 data-nosnippet>308</a>
<a href=#309 id=309 data-nosnippet>309</a><span class="kw">impl </span>From&lt;VarInt&gt; <span class="kw">for </span>StreamId {
<a href=#310 id=310 data-nosnippet>310</a> <span class="kw">fn </span>from(v: VarInt) -&gt; <span class="self">Self </span>{
<a href=#311 id=311 data-nosnippet>311</a> <span class="self">Self</span>(v.<span class="number">0</span>)
<a href=#312 id=312 data-nosnippet>312</a> }
<a href=#313 id=313 data-nosnippet>313</a>}
<a href=#314 id=314 data-nosnippet>314</a>
<a href=#315 id=315 data-nosnippet>315</a><span class="kw">impl </span>From&lt;StreamId&gt; <span class="kw">for </span>u64 {
<a href=#316 id=316 data-nosnippet>316</a> <span class="kw">fn </span>from(x: StreamId) -&gt; <span class="self">Self </span>{
<a href=#317 id=317 data-nosnippet>317</a> x.<span class="number">0
<a href=#318 id=318 data-nosnippet>318</a> </span>}
<a href=#319 id=319 data-nosnippet>319</a>}
<a href=#320 id=320 data-nosnippet>320</a>
<a href=#321 id=321 data-nosnippet>321</a><span class="kw">impl </span>Decodable <span class="kw">for </span>StreamId {
<a href=#322 id=322 data-nosnippet>322</a> <span class="kw">fn </span>decode&lt;B: bytes::Buf&gt;(buf: <span class="kw-2">&amp;mut </span>B) -&gt; coding::Result&lt;<span class="self">Self</span>&gt; {
<a href=#323 id=323 data-nosnippet>323</a> VarInt::decode(buf).map(|x| <span class="self">Self</span>(x.into_inner()))
<a href=#324 id=324 data-nosnippet>324</a> }
<a href=#325 id=325 data-nosnippet>325</a>}
<a href=#326 id=326 data-nosnippet>326</a>
<a href=#327 id=327 data-nosnippet>327</a><span class="kw">impl </span>Encodable <span class="kw">for </span>StreamId {
<a href=#328 id=328 data-nosnippet>328</a> <span class="kw">fn </span>encode&lt;B: bytes::BufMut&gt;(<span class="kw-2">&amp;</span><span class="self">self</span>, buf: <span class="kw-2">&amp;mut </span>B) {
<a href=#329 id=329 data-nosnippet>329</a> VarInt::from_u64(<span class="self">self</span>.<span class="number">0</span>).unwrap().encode(buf);
<a href=#330 id=330 data-nosnippet>330</a> }
<a href=#331 id=331 data-nosnippet>331</a>}
<a href=#332 id=332 data-nosnippet>332</a>
<a href=#333 id=333 data-nosnippet>333</a><span class="doccomment">/// An outgoing packet
<a href=#334 id=334 data-nosnippet>334</a></span><span class="attr">#[derive(Debug)]
<a href=#335 id=335 data-nosnippet>335</a>#[must_use]
<a href=#336 id=336 data-nosnippet>336</a></span><span class="kw">pub struct </span>Transmit {
<a href=#337 id=337 data-nosnippet>337</a> <span class="doccomment">/// The socket this datagram should be sent to
<a href=#338 id=338 data-nosnippet>338</a> </span><span class="kw">pub </span>destination: SocketAddr,
<a href=#339 id=339 data-nosnippet>339</a> <span class="doccomment">/// Explicit congestion notification bits to set on the packet
<a href=#340 id=340 data-nosnippet>340</a> </span><span class="kw">pub </span>ecn: <span class="prelude-ty">Option</span>&lt;EcnCodepoint&gt;,
<a href=#341 id=341 data-nosnippet>341</a> <span class="doccomment">/// Amount of data written to the caller-supplied buffer
<a href=#342 id=342 data-nosnippet>342</a> </span><span class="kw">pub </span>size: usize,
<a href=#343 id=343 data-nosnippet>343</a> <span class="doccomment">/// The segment size if this transmission contains multiple datagrams.
<a href=#344 id=344 data-nosnippet>344</a> /// This is `None` if the transmit only contains a single datagram
<a href=#345 id=345 data-nosnippet>345</a> </span><span class="kw">pub </span>segment_size: <span class="prelude-ty">Option</span>&lt;usize&gt;,
<a href=#346 id=346 data-nosnippet>346</a> <span class="doccomment">/// Optional source IP address for the datagram
<a href=#347 id=347 data-nosnippet>347</a> </span><span class="kw">pub </span>src_ip: <span class="prelude-ty">Option</span>&lt;IpAddr&gt;,
<a href=#348 id=348 data-nosnippet>348</a>}
<a href=#349 id=349 data-nosnippet>349</a>
<a href=#350 id=350 data-nosnippet>350</a><span class="comment">//
<a href=#351 id=351 data-nosnippet>351</a>// Useful internal constants
<a href=#352 id=352 data-nosnippet>352</a>//
<a href=#353 id=353 data-nosnippet>353</a>
<a href=#354 id=354 data-nosnippet>354</a></span><span class="doccomment">/// The maximum number of CIDs we bother to issue per path
<a href=#355 id=355 data-nosnippet>355</a></span><span class="kw">const </span>LOC_CID_COUNT: u64 = <span class="number">12</span>;
<a href=#356 id=356 data-nosnippet>356</a><span class="kw">const </span>RESET_TOKEN_SIZE: usize = <span class="number">16</span>;
<a href=#357 id=357 data-nosnippet>357</a><span class="kw">const </span>MAX_CID_SIZE: usize = <span class="number">20</span>;
<a href=#358 id=358 data-nosnippet>358</a><span class="kw">const </span>MIN_INITIAL_SIZE: u16 = <span class="number">1200</span>;
<a href=#359 id=359 data-nosnippet>359</a><span class="doccomment">/// &lt;https://www.rfc-editor.org/rfc/rfc9000.html#name-datagram-size&gt;
<a href=#360 id=360 data-nosnippet>360</a></span><span class="kw">const </span>INITIAL_MTU: u16 = <span class="number">1200</span>;
<a href=#361 id=361 data-nosnippet>361</a><span class="kw">const </span>MAX_UDP_PAYLOAD: u16 = <span class="number">65527</span>;
<a href=#362 id=362 data-nosnippet>362</a><span class="kw">const </span>TIMER_GRANULARITY: Duration = Duration::from_millis(<span class="number">1</span>);
<a href=#363 id=363 data-nosnippet>363</a><span class="doccomment">/// Maximum number of streams that can be uniquely identified by a stream ID
<a href=#364 id=364 data-nosnippet>364</a></span><span class="kw">const </span>MAX_STREAM_COUNT: u64 = <span class="number">1 </span>&lt;&lt; <span class="number">60</span>;
<a href=#365 id=365 data-nosnippet>365</a>
<a href=#366 id=366 data-nosnippet>366</a><span class="doccomment">/// Identifies a network path by the combination of remote and local addresses
<a href=#367 id=367 data-nosnippet>367</a>///
<a href=#368 id=368 data-nosnippet>368</a>/// Including the local ensures good behavior when the host has multiple IP addresses on the same
<a href=#369 id=369 data-nosnippet>369</a>/// subnet and zero-length connection IDs are in use or when multipath is enabled and multiple
<a href=#370 id=370 data-nosnippet>370</a>/// paths exist with the same remote, but different local IP interfaces.
<a href=#371 id=371 data-nosnippet>371</a></span><span class="attr">#[derive(Hash, Eq, PartialEq, Copy, Clone)]
<a href=#372 id=372 data-nosnippet>372</a></span><span class="kw">pub struct </span>FourTuple {
<a href=#373 id=373 data-nosnippet>373</a> <span class="doccomment">/// The remote side of this tuple
<a href=#374 id=374 data-nosnippet>374</a> </span><span class="kw">pub </span>remote: SocketAddr,
<a href=#375 id=375 data-nosnippet>375</a> <span class="doccomment">/// The local side of this tuple.
<a href=#376 id=376 data-nosnippet>376</a> ///
<a href=#377 id=377 data-nosnippet>377</a> /// The socket is irrelevant for our intents and purposes:
<a href=#378 id=378 data-nosnippet>378</a> /// When we send, we can only specify the `src_ip`, not the source port.
<a href=#379 id=379 data-nosnippet>379</a> /// So even if we track the port, we won't be able to make use of it.
<a href=#380 id=380 data-nosnippet>380</a> </span><span class="kw">pub </span>local_ip: <span class="prelude-ty">Option</span>&lt;IpAddr&gt;,
<a href=#381 id=381 data-nosnippet>381</a>}
<a href=#382 id=382 data-nosnippet>382</a>
<a href=#383 id=383 data-nosnippet>383</a><span class="kw">impl </span>FourTuple {
<a href=#384 id=384 data-nosnippet>384</a> <span class="doccomment">/// Returns whether we think the other address probably represents the same path
<a href=#385 id=385 data-nosnippet>385</a> /// as ours.
<a href=#386 id=386 data-nosnippet>386</a> ///
<a href=#387 id=387 data-nosnippet>387</a> /// If we have a local IP set, then we're exact and only match if the 4-tuples are
<a href=#388 id=388 data-nosnippet>388</a> /// exactly equal.
<a href=#389 id=389 data-nosnippet>389</a> /// If we don't have a local IP set, then we only check the remote addresses for equality.
<a href=#390 id=390 data-nosnippet>390</a> </span><span class="kw">pub fn </span>is_probably_same_path(<span class="kw-2">&amp;</span><span class="self">self</span>, other: <span class="kw-2">&amp;</span><span class="self">Self</span>) -&gt; bool {
<a href=#391 id=391 data-nosnippet>391</a> <span class="self">self</span>.remote == other.remote &amp;&amp; (<span class="self">self</span>.local_ip.is_none() || <span class="self">self</span>.local_ip == other.local_ip)
<a href=#392 id=392 data-nosnippet>392</a> }
<a href=#393 id=393 data-nosnippet>393</a>
<a href=#394 id=394 data-nosnippet>394</a> <span class="doccomment">/// Updates this tuple's local address iff
<a href=#395 id=395 data-nosnippet>395</a> /// - it was unset before,
<a href=#396 id=396 data-nosnippet>396</a> /// - the other tuple has the same remote, and
<a href=#397 id=397 data-nosnippet>397</a> /// - the other tuple has a local address set.
<a href=#398 id=398 data-nosnippet>398</a> ///
<a href=#399 id=399 data-nosnippet>399</a> /// Returns whether this and the other remote are now fully equal.
<a href=#400 id=400 data-nosnippet>400</a> </span><span class="kw">pub fn </span>update_local_if_same_remote(<span class="kw-2">&amp;mut </span><span class="self">self</span>, other: <span class="kw-2">&amp;</span><span class="self">Self</span>) -&gt; bool {
<a href=#401 id=401 data-nosnippet>401</a> <span class="kw">if </span><span class="self">self</span>.remote != other.remote {
<a href=#402 id=402 data-nosnippet>402</a> <span class="kw">return </span><span class="bool-val">false</span>;
<a href=#403 id=403 data-nosnippet>403</a> }
<a href=#404 id=404 data-nosnippet>404</a> <span class="kw">if </span><span class="self">self</span>.local_ip.is_some() &amp;&amp; <span class="self">self</span>.local_ip != other.local_ip {
<a href=#405 id=405 data-nosnippet>405</a> <span class="kw">return </span><span class="bool-val">false</span>;
<a href=#406 id=406 data-nosnippet>406</a> }
<a href=#407 id=407 data-nosnippet>407</a> <span class="self">self</span>.local_ip = other.local_ip;
<a href=#408 id=408 data-nosnippet>408</a> <span class="bool-val">true
<a href=#409 id=409 data-nosnippet>409</a> </span>}
<a href=#410 id=410 data-nosnippet>410</a>}
<a href=#411 id=411 data-nosnippet>411</a>
<a href=#412 id=412 data-nosnippet>412</a><span class="kw">impl </span>fmt::Display <span class="kw">for </span>FourTuple {
<a href=#413 id=413 data-nosnippet>413</a> <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter&lt;<span class="lifetime">'_</span>&gt;) -&gt; fmt::Result {
<a href=#414 id=414 data-nosnippet>414</a> f.write_str(<span class="string">"("</span>)<span class="question-mark">?</span>;
<a href=#415 id=415 data-nosnippet>415</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(local_ip) = <span class="kw-2">&amp;</span><span class="self">self</span>.local_ip {
<a href=#416 id=416 data-nosnippet>416</a> local_ip.fmt(f)<span class="question-mark">?</span>;
<a href=#417 id=417 data-nosnippet>417</a> f.write_str(<span class="string">", "</span>)<span class="question-mark">?</span>;
<a href=#418 id=418 data-nosnippet>418</a> } <span class="kw">else </span>{
<a href=#419 id=419 data-nosnippet>419</a> f.write_str(<span class="string">"&lt;unknown&gt;, "</span>)<span class="question-mark">?</span>;
<a href=#420 id=420 data-nosnippet>420</a> }
<a href=#421 id=421 data-nosnippet>421</a> <span class="self">self</span>.remote.fmt(f)<span class="question-mark">?</span>;
<a href=#422 id=422 data-nosnippet>422</a> f.write_str(<span class="string">")"</span>)
<a href=#423 id=423 data-nosnippet>423</a> }
<a href=#424 id=424 data-nosnippet>424</a>}
<a href=#425 id=425 data-nosnippet>425</a>
<a href=#426 id=426 data-nosnippet>426</a><span class="kw">impl </span>fmt::Debug <span class="kw">for </span>FourTuple {
<a href=#427 id=427 data-nosnippet>427</a> <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter&lt;<span class="lifetime">'_</span>&gt;) -&gt; fmt::Result {
<a href=#428 id=428 data-nosnippet>428</a> fmt::Display::fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f)
<a href=#429 id=429 data-nosnippet>429</a> }
<a href=#430 id=430 data-nosnippet>430</a>}</code></pre></div></section></main></body></html>
<a href=#333 id=333 data-nosnippet>333</a><span class="attr">#[cfg(feature = <span class="string">"arbitrary"</span>)]
<a href=#334 id=334 data-nosnippet>334</a></span><span class="kw">impl</span>&lt;<span class="lifetime">'arbitrary</span>&gt; Arbitrary&lt;<span class="lifetime">'arbitrary</span>&gt; <span class="kw">for </span>StreamId {
<a href=#335 id=335 data-nosnippet>335</a> <span class="kw">fn </span>arbitrary(u: <span class="kw-2">&amp;mut </span>arbitrary::Unstructured&lt;<span class="lifetime">'arbitrary</span>&gt;) -&gt; arbitrary::Result&lt;<span class="self">Self</span>&gt; {
<a href=#336 id=336 data-nosnippet>336</a> <span class="prelude-val">Ok</span>(VarInt::arbitrary(u)<span class="question-mark">?</span>.into())
<a href=#337 id=337 data-nosnippet>337</a> }
<a href=#338 id=338 data-nosnippet>338</a>}
<a href=#339 id=339 data-nosnippet>339</a>
<a href=#340 id=340 data-nosnippet>340</a><span class="doccomment">/// An outgoing packet
<a href=#341 id=341 data-nosnippet>341</a></span><span class="attr">#[derive(Debug)]
<a href=#342 id=342 data-nosnippet>342</a>#[must_use]
<a href=#343 id=343 data-nosnippet>343</a></span><span class="kw">pub struct </span>Transmit {
<a href=#344 id=344 data-nosnippet>344</a> <span class="doccomment">/// The socket this datagram should be sent to
<a href=#345 id=345 data-nosnippet>345</a> </span><span class="kw">pub </span>destination: SocketAddr,
<a href=#346 id=346 data-nosnippet>346</a> <span class="doccomment">/// Explicit congestion notification bits to set on the packet
<a href=#347 id=347 data-nosnippet>347</a> </span><span class="kw">pub </span>ecn: <span class="prelude-ty">Option</span>&lt;EcnCodepoint&gt;,
<a href=#348 id=348 data-nosnippet>348</a> <span class="doccomment">/// Amount of data written to the caller-supplied buffer
<a href=#349 id=349 data-nosnippet>349</a> </span><span class="kw">pub </span>size: usize,
<a href=#350 id=350 data-nosnippet>350</a> <span class="doccomment">/// The segment size if this transmission contains multiple datagrams.
<a href=#351 id=351 data-nosnippet>351</a> /// This is `None` if the transmit only contains a single datagram
<a href=#352 id=352 data-nosnippet>352</a> </span><span class="kw">pub </span>segment_size: <span class="prelude-ty">Option</span>&lt;usize&gt;,
<a href=#353 id=353 data-nosnippet>353</a> <span class="doccomment">/// Optional source IP address for the datagram
<a href=#354 id=354 data-nosnippet>354</a> </span><span class="kw">pub </span>src_ip: <span class="prelude-ty">Option</span>&lt;IpAddr&gt;,
<a href=#355 id=355 data-nosnippet>355</a>}
<a href=#356 id=356 data-nosnippet>356</a>
<a href=#357 id=357 data-nosnippet>357</a><span class="comment">//
<a href=#358 id=358 data-nosnippet>358</a>// Useful internal constants
<a href=#359 id=359 data-nosnippet>359</a>//
<a href=#360 id=360 data-nosnippet>360</a>
<a href=#361 id=361 data-nosnippet>361</a></span><span class="doccomment">/// The maximum number of CIDs we bother to issue per path
<a href=#362 id=362 data-nosnippet>362</a></span><span class="kw">const </span>LOC_CID_COUNT: u64 = <span class="number">12</span>;
<a href=#363 id=363 data-nosnippet>363</a><span class="kw">const </span>RESET_TOKEN_SIZE: usize = <span class="number">16</span>;
<a href=#364 id=364 data-nosnippet>364</a><span class="kw">const </span>MAX_CID_SIZE: usize = <span class="number">20</span>;
<a href=#365 id=365 data-nosnippet>365</a><span class="kw">const </span>MIN_INITIAL_SIZE: u16 = <span class="number">1200</span>;
<a href=#366 id=366 data-nosnippet>366</a><span class="doccomment">/// &lt;https://www.rfc-editor.org/rfc/rfc9000.html#name-datagram-size&gt;
<a href=#367 id=367 data-nosnippet>367</a></span><span class="kw">const </span>INITIAL_MTU: u16 = <span class="number">1200</span>;
<a href=#368 id=368 data-nosnippet>368</a><span class="kw">const </span>MAX_UDP_PAYLOAD: u16 = <span class="number">65527</span>;
<a href=#369 id=369 data-nosnippet>369</a><span class="kw">const </span>TIMER_GRANULARITY: Duration = Duration::from_millis(<span class="number">1</span>);
<a href=#370 id=370 data-nosnippet>370</a><span class="doccomment">/// Maximum number of streams that can be uniquely identified by a stream ID
<a href=#371 id=371 data-nosnippet>371</a></span><span class="kw">const </span>MAX_STREAM_COUNT: u64 = <span class="number">1 </span>&lt;&lt; <span class="number">60</span>;
<a href=#372 id=372 data-nosnippet>372</a>
<a href=#373 id=373 data-nosnippet>373</a><span class="doccomment">/// Identifies a network path by the combination of remote and local addresses
<a href=#374 id=374 data-nosnippet>374</a>///
<a href=#375 id=375 data-nosnippet>375</a>/// Including the local ensures good behavior when the host has multiple IP addresses on the same
<a href=#376 id=376 data-nosnippet>376</a>/// subnet and zero-length connection IDs are in use or when multipath is enabled and multiple
<a href=#377 id=377 data-nosnippet>377</a>/// paths exist with the same remote, but different local IP interfaces.
<a href=#378 id=378 data-nosnippet>378</a></span><span class="attr">#[derive(Hash, Eq, PartialEq, Copy, Clone)]
<a href=#379 id=379 data-nosnippet>379</a></span><span class="kw">pub struct </span>FourTuple {
<a href=#380 id=380 data-nosnippet>380</a> <span class="doccomment">/// The remote side of this tuple
<a href=#381 id=381 data-nosnippet>381</a> </span><span class="kw">pub </span>remote: SocketAddr,
<a href=#382 id=382 data-nosnippet>382</a> <span class="doccomment">/// The local side of this tuple.
<a href=#383 id=383 data-nosnippet>383</a> ///
<a href=#384 id=384 data-nosnippet>384</a> /// The socket is irrelevant for our intents and purposes:
<a href=#385 id=385 data-nosnippet>385</a> /// When we send, we can only specify the `src_ip`, not the source port.
<a href=#386 id=386 data-nosnippet>386</a> /// So even if we track the port, we won't be able to make use of it.
<a href=#387 id=387 data-nosnippet>387</a> </span><span class="kw">pub </span>local_ip: <span class="prelude-ty">Option</span>&lt;IpAddr&gt;,
<a href=#388 id=388 data-nosnippet>388</a>}
<a href=#389 id=389 data-nosnippet>389</a>
<a href=#390 id=390 data-nosnippet>390</a><span class="kw">impl </span>FourTuple {
<a href=#391 id=391 data-nosnippet>391</a> <span class="doccomment">/// Returns whether we think the other address probably represents the same path
<a href=#392 id=392 data-nosnippet>392</a> /// as ours.
<a href=#393 id=393 data-nosnippet>393</a> ///
<a href=#394 id=394 data-nosnippet>394</a> /// If we have a local IP set, then we're exact and only match if the 4-tuples are
<a href=#395 id=395 data-nosnippet>395</a> /// exactly equal.
<a href=#396 id=396 data-nosnippet>396</a> /// If we don't have a local IP set, then we only check the remote addresses for equality.
<a href=#397 id=397 data-nosnippet>397</a> </span><span class="kw">pub fn </span>is_probably_same_path(<span class="kw-2">&amp;</span><span class="self">self</span>, other: <span class="kw-2">&amp;</span><span class="self">Self</span>) -&gt; bool {
<a href=#398 id=398 data-nosnippet>398</a> <span class="self">self</span>.remote == other.remote &amp;&amp; (<span class="self">self</span>.local_ip.is_none() || <span class="self">self</span>.local_ip == other.local_ip)
<a href=#399 id=399 data-nosnippet>399</a> }
<a href=#400 id=400 data-nosnippet>400</a>
<a href=#401 id=401 data-nosnippet>401</a> <span class="doccomment">/// Updates this tuple's local address iff
<a href=#402 id=402 data-nosnippet>402</a> /// - it was unset before,
<a href=#403 id=403 data-nosnippet>403</a> /// - the other tuple has the same remote, and
<a href=#404 id=404 data-nosnippet>404</a> /// - the other tuple has a local address set.
<a href=#405 id=405 data-nosnippet>405</a> ///
<a href=#406 id=406 data-nosnippet>406</a> /// Returns whether this and the other remote are now fully equal.
<a href=#407 id=407 data-nosnippet>407</a> </span><span class="kw">pub fn </span>update_local_if_same_remote(<span class="kw-2">&amp;mut </span><span class="self">self</span>, other: <span class="kw-2">&amp;</span><span class="self">Self</span>) -&gt; bool {
<a href=#408 id=408 data-nosnippet>408</a> <span class="kw">if </span><span class="self">self</span>.remote != other.remote {
<a href=#409 id=409 data-nosnippet>409</a> <span class="kw">return </span><span class="bool-val">false</span>;
<a href=#410 id=410 data-nosnippet>410</a> }
<a href=#411 id=411 data-nosnippet>411</a> <span class="kw">if </span><span class="self">self</span>.local_ip.is_some() &amp;&amp; <span class="self">self</span>.local_ip != other.local_ip {
<a href=#412 id=412 data-nosnippet>412</a> <span class="kw">return </span><span class="bool-val">false</span>;
<a href=#413 id=413 data-nosnippet>413</a> }
<a href=#414 id=414 data-nosnippet>414</a> <span class="self">self</span>.local_ip = other.local_ip;
<a href=#415 id=415 data-nosnippet>415</a> <span class="bool-val">true
<a href=#416 id=416 data-nosnippet>416</a> </span>}
<a href=#417 id=417 data-nosnippet>417</a>}
<a href=#418 id=418 data-nosnippet>418</a>
<a href=#419 id=419 data-nosnippet>419</a><span class="kw">impl </span>fmt::Display <span class="kw">for </span>FourTuple {
<a href=#420 id=420 data-nosnippet>420</a> <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter&lt;<span class="lifetime">'_</span>&gt;) -&gt; fmt::Result {
<a href=#421 id=421 data-nosnippet>421</a> f.write_str(<span class="string">"("</span>)<span class="question-mark">?</span>;
<a href=#422 id=422 data-nosnippet>422</a> <span class="kw">if let </span><span class="prelude-val">Some</span>(local_ip) = <span class="kw-2">&amp;</span><span class="self">self</span>.local_ip {
<a href=#423 id=423 data-nosnippet>423</a> local_ip.fmt(f)<span class="question-mark">?</span>;
<a href=#424 id=424 data-nosnippet>424</a> f.write_str(<span class="string">", "</span>)<span class="question-mark">?</span>;
<a href=#425 id=425 data-nosnippet>425</a> } <span class="kw">else </span>{
<a href=#426 id=426 data-nosnippet>426</a> f.write_str(<span class="string">"&lt;unknown&gt;, "</span>)<span class="question-mark">?</span>;
<a href=#427 id=427 data-nosnippet>427</a> }
<a href=#428 id=428 data-nosnippet>428</a> <span class="self">self</span>.remote.fmt(f)<span class="question-mark">?</span>;
<a href=#429 id=429 data-nosnippet>429</a> f.write_str(<span class="string">")"</span>)
<a href=#430 id=430 data-nosnippet>430</a> }
<a href=#431 id=431 data-nosnippet>431</a>}
<a href=#432 id=432 data-nosnippet>432</a>
<a href=#433 id=433 data-nosnippet>433</a><span class="kw">impl </span>fmt::Debug <span class="kw">for </span>FourTuple {
<a href=#434 id=434 data-nosnippet>434</a> <span class="kw">fn </span>fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f: <span class="kw-2">&amp;mut </span>fmt::Formatter&lt;<span class="lifetime">'_</span>&gt;) -&gt; fmt::Result {
<a href=#435 id=435 data-nosnippet>435</a> fmt::Display::fmt(<span class="kw-2">&amp;</span><span class="self">self</span>, f)
<a href=#436 id=436 data-nosnippet>436</a> }
<a href=#437 id=437 data-nosnippet>437</a>}</code></pre></div></section></main></body></html>