Bug 1996290 - update to neqo v0.18.0 r=necko-reviewers,supply-chain-reviewers,sunil

Differential Revision: https://phabricator.services.mozilla.com/D270189
This commit is contained in:
Max Leonard Inden
2025-10-29 13:25:15 +00:00
committed by mail@max-inden.de
parent 76ecbc0e47
commit 2b8042eb00
27 changed files with 265 additions and 107 deletions
+2 -2
View File
@@ -110,9 +110,9 @@ git = "https://github.com/mozilla/mp4parse-rust"
rev = "f955be5d2a04a631c0f1777d6f35370ea1a99e2d"
replace-with = "vendored-sources"
[source."git+https://github.com/mozilla/neqo?tag=v0.17.0"]
[source."git+https://github.com/mozilla/neqo?tag=v0.18.0"]
git = "https://github.com/mozilla/neqo"
tag = "v0.17.0"
tag = "v0.18.0"
replace-with = "vendored-sources"
[source."git+https://github.com/rust-lang/rust-bindgen?rev=9366e0af8da529c958b4cd4fcbe492d951c86f5c"]
Generated
+15 -15
View File
@@ -4714,7 +4714,7 @@ dependencies = [
[[package]]
name = "mtu"
version = "0.2.9"
source = "git+https://github.com/mozilla/neqo?tag=v0.17.0#0f8a822da1766cd397a4b0687f23da096d762733"
source = "git+https://github.com/mozilla/neqo?tag=v0.18.0#57ef3bd8f67023a168734a154e0ef273e9ddc7f1"
dependencies = [
"bindgen 0.69.999",
"cfg_aliases",
@@ -4758,8 +4758,8 @@ dependencies = [
[[package]]
name = "neqo-bin"
version = "0.17.0"
source = "git+https://github.com/mozilla/neqo?tag=v0.17.0#0f8a822da1766cd397a4b0687f23da096d762733"
version = "0.18.0"
source = "git+https://github.com/mozilla/neqo?tag=v0.18.0#57ef3bd8f67023a168734a154e0ef273e9ddc7f1"
dependencies = [
"clap",
"clap-verbosity-flag",
@@ -4782,8 +4782,8 @@ dependencies = [
[[package]]
name = "neqo-common"
version = "0.17.0"
source = "git+https://github.com/mozilla/neqo?tag=v0.17.0#0f8a822da1766cd397a4b0687f23da096d762733"
version = "0.18.0"
source = "git+https://github.com/mozilla/neqo?tag=v0.18.0#57ef3bd8f67023a168734a154e0ef273e9ddc7f1"
dependencies = [
"enum-map",
"env_logger",
@@ -4796,8 +4796,8 @@ dependencies = [
[[package]]
name = "neqo-crypto"
version = "0.17.0"
source = "git+https://github.com/mozilla/neqo?tag=v0.17.0#0f8a822da1766cd397a4b0687f23da096d762733"
version = "0.18.0"
source = "git+https://github.com/mozilla/neqo?tag=v0.18.0#57ef3bd8f67023a168734a154e0ef273e9ddc7f1"
dependencies = [
"bindgen 0.69.999",
"enum-map",
@@ -4814,8 +4814,8 @@ dependencies = [
[[package]]
name = "neqo-http3"
version = "0.17.0"
source = "git+https://github.com/mozilla/neqo?tag=v0.17.0#0f8a822da1766cd397a4b0687f23da096d762733"
version = "0.18.0"
source = "git+https://github.com/mozilla/neqo?tag=v0.18.0#57ef3bd8f67023a168734a154e0ef273e9ddc7f1"
dependencies = [
"enumset",
"log",
@@ -4833,8 +4833,8 @@ dependencies = [
[[package]]
name = "neqo-qpack"
version = "0.17.0"
source = "git+https://github.com/mozilla/neqo?tag=v0.17.0#0f8a822da1766cd397a4b0687f23da096d762733"
version = "0.18.0"
source = "git+https://github.com/mozilla/neqo?tag=v0.18.0#57ef3bd8f67023a168734a154e0ef273e9ddc7f1"
dependencies = [
"log",
"neqo-common",
@@ -4847,8 +4847,8 @@ dependencies = [
[[package]]
name = "neqo-transport"
version = "0.17.0"
source = "git+https://github.com/mozilla/neqo?tag=v0.17.0#0f8a822da1766cd397a4b0687f23da096d762733"
version = "0.18.0"
source = "git+https://github.com/mozilla/neqo?tag=v0.18.0#57ef3bd8f67023a168734a154e0ef273e9ddc7f1"
dependencies = [
"enum-map",
"enumset",
@@ -4867,8 +4867,8 @@ dependencies = [
[[package]]
name = "neqo-udp"
version = "0.17.0"
source = "git+https://github.com/mozilla/neqo?tag=v0.17.0#0f8a822da1766cd397a4b0687f23da096d762733"
version = "0.18.0"
source = "git+https://github.com/mozilla/neqo?tag=v0.18.0#57ef3bd8f67023a168734a154e0ef273e9ddc7f1"
dependencies = [
"cfg_aliases",
"libc",
+6 -6
View File
@@ -10,11 +10,11 @@ name = "neqo_glue"
[dependencies]
firefox-on-glean = { path = "../../../toolkit/components/glean/api" }
neqo-udp = { tag= "v0.17.0", git = "https://github.com/mozilla/neqo" }
neqo-http3 = { tag= "v0.17.0", git = "https://github.com/mozilla/neqo" }
neqo-transport = { tag= "v0.17.0", git = "https://github.com/mozilla/neqo", features = ["gecko"] }
neqo-common = { tag= "v0.17.0", git = "https://github.com/mozilla/neqo" }
neqo-qpack = { tag= "v0.17.0", git = "https://github.com/mozilla/neqo" }
neqo-udp = { tag = "v0.18.0", git = "https://github.com/mozilla/neqo" }
neqo-http3 = { tag = "v0.18.0", git = "https://github.com/mozilla/neqo" }
neqo-transport = { tag = "v0.18.0", git = "https://github.com/mozilla/neqo", features = ["gecko"] }
neqo-common = { tag = "v0.18.0", git = "https://github.com/mozilla/neqo" }
neqo-qpack = { tag = "v0.18.0", git = "https://github.com/mozilla/neqo" }
nserror = { path = "../../../xpcom/rust/nserror" }
nsstring = { path = "../../../xpcom/rust/nsstring" }
xpcom = { path = "../../../xpcom/rust/xpcom" }
@@ -31,7 +31,7 @@ zlib-rs = "0.4.2"
winapi = {version = "0.3", features = ["ws2def"] }
[dependencies.neqo-crypto]
tag= "v0.17.0"
tag = "v0.18.0"
git = "https://github.com/mozilla/neqo"
default-features = false
features = ["gecko"]
+9 -8
View File
@@ -1082,15 +1082,16 @@ pub extern "C" fn neqo_http3conn_process_output_and_send(
conn.datagram_size_sent.accumulate(dg.data().len() as u64);
conn.datagram_segments_sent
.accumulate(dg.num_datagrams() as u64);
if dg.datagram_size() > 0 {
for _ in 0..(dg.data().len() / dg.datagram_size()) {
conn.datagram_segment_size_sent
.accumulate(dg.datagram_size() as u64);
}
if let Some(remainder) = dg.data().len().checked_rem(dg.datagram_size()) {
conn.datagram_segment_size_sent.accumulate(remainder as u64);
}
for _ in 0..(dg.data().len() / dg.datagram_size()) {
conn.datagram_segment_size_sent
.accumulate(dg.datagram_size().get() as u64);
}
conn.datagram_segment_size_sent.accumulate(
dg.data()
.len()
.checked_rem(dg.datagram_size().get())
.expect("datagram_size is a NonZeroUsize") as u64,
);
}
OutputBatch::Callback(to) => {
let timeout = if to.is_zero() {
+6 -6
View File
@@ -6,11 +6,11 @@ edition = "2021"
license = "MPL-2.0"
[dependencies]
neqo-bin = { tag= "v0.17.0", git = "https://github.com/mozilla/neqo" }
neqo-transport = { tag= "v0.17.0", git = "https://github.com/mozilla/neqo", features = ["gecko"] }
neqo-common = { tag= "v0.17.0", git = "https://github.com/mozilla/neqo" }
neqo-http3 = { tag= "v0.17.0", git = "https://github.com/mozilla/neqo" }
neqo-qpack = { tag= "v0.17.0", git = "https://github.com/mozilla/neqo" }
neqo-bin = { tag = "v0.18.0", git = "https://github.com/mozilla/neqo" }
neqo-transport = { tag = "v0.18.0", git = "https://github.com/mozilla/neqo", features = ["gecko"] }
neqo-common = { tag = "v0.18.0", git = "https://github.com/mozilla/neqo" }
neqo-http3 = { tag = "v0.18.0", git = "https://github.com/mozilla/neqo" }
neqo-qpack = { tag = "v0.18.0", git = "https://github.com/mozilla/neqo" }
log = "0.4.0"
base64 = "0.22"
cfg-if = "1.0"
@@ -21,7 +21,7 @@ tokio = { version = "1", features = ["rt-multi-thread"] }
mozilla-central-workspace-hack = { version = "0.1", features = ["http3server"], optional = true }
[dependencies.neqo-crypto]
tag= "v0.17.0"
tag = "v0.18.0"
git = "https://github.com/mozilla/neqo"
default-features = false
features = ["gecko"]
+1 -1
View File
@@ -4227,7 +4227,7 @@ delta = "0.2.6 -> 0.2.9"
[[audits.mtu]]
who = "Max Leonard Inden <mail@max-inden.de>"
criteria = "safe-to-deploy"
delta = "0.2.9 -> 0.2.9@git:0f8a822da1766cd397a4b0687f23da096d762733"
delta = "0.2.9 -> 0.2.9@git:57ef3bd8f67023a168734a154e0ef273e9ddc7f1"
importable = false
[[audits.naga]]
+1 -1
View File
@@ -1 +1 @@
{"files":{"Cargo.toml":"ecd47a2455990f50241cd928d64830bd8d5d292e96107008f91af81f430db7e4","benches/main.rs":"6b7bd05c718020f9180a630a2fe1a13066245ad90ee9b9bf72b7aa9f74709764","src/bin/client.rs":"9df4af3b25159adccfca36d6001443cf295993351fec51f833827d91ebb67fd4","src/bin/server.rs":"f55f26c8f0a34de415ede8c4865b845b3d755c3f5fe4f5574b5ee7f3a3601598","src/client/http09.rs":"7ee588c1a8317f70f8a45cdaf0fdfc49419340dd4b41700de1219e8f5ab6c097","src/client/http3.rs":"0084e2671e761cc46ce18e856f193ebe875386d6bbc4f2dc88f2bd563ca865c9","src/client/mod.rs":"ab34c80769e4996d02f930c136c9c832d130209f435845b68d7ab89fe789fe29","src/lib.rs":"ef20c29297d978a192011371e6af12be26d57063b616d3e21fb3d2750987ce88","src/send_data.rs":"ef8ad949e8b787f77f091a4705672b9801dc79c863d9d54a5296e0839789802e","src/server/http09.rs":"6f8f9bec9c2b8d524f2c331fc0db81c17f71c8c8ac00d50e4b6670c3e226b2b2","src/server/http3.rs":"bc58cd9a11498d574d56e2f7aa80853ed5eca4828065f0841509fdb9bfb576c4","src/server/mod.rs":"3897044c5b690360cf1a872d90f467ff4e629e9283a56bdf633045c2a1a730b0","src/udp.rs":"a0f456178f353fcd91013b3fab46dac14863f979930305c9d5bd5471d953e144"},"package":null}
{"files":{"Cargo.toml":"0f352c3841d58a8621d52a11ff0d1d26b1c7d5f6b9a3f7a37a7e3f6afcfb2e89","benches/main.rs":"6b7bd05c718020f9180a630a2fe1a13066245ad90ee9b9bf72b7aa9f74709764","src/bin/client.rs":"9df4af3b25159adccfca36d6001443cf295993351fec51f833827d91ebb67fd4","src/bin/server.rs":"f55f26c8f0a34de415ede8c4865b845b3d755c3f5fe4f5574b5ee7f3a3601598","src/client/http09.rs":"7ee588c1a8317f70f8a45cdaf0fdfc49419340dd4b41700de1219e8f5ab6c097","src/client/http3.rs":"0084e2671e761cc46ce18e856f193ebe875386d6bbc4f2dc88f2bd563ca865c9","src/client/mod.rs":"ab34c80769e4996d02f930c136c9c832d130209f435845b68d7ab89fe789fe29","src/lib.rs":"ef20c29297d978a192011371e6af12be26d57063b616d3e21fb3d2750987ce88","src/send_data.rs":"ef8ad949e8b787f77f091a4705672b9801dc79c863d9d54a5296e0839789802e","src/server/http09.rs":"6f8f9bec9c2b8d524f2c331fc0db81c17f71c8c8ac00d50e4b6670c3e226b2b2","src/server/http3.rs":"e090c81154a39a7a77b69321cba782752796953f3db8a9685cb147874205d9de","src/server/mod.rs":"3897044c5b690360cf1a872d90f467ff4e629e9283a56bdf633045c2a1a730b0","src/udp.rs":"a0f456178f353fcd91013b3fab46dac14863f979930305c9d5bd5471d953e144"},"package":null}
+1 -1
View File
@@ -13,7 +13,7 @@
edition = "2021"
rust-version = "1.81.0"
name = "neqo-bin"
version = "0.17.0"
version = "0.18.0"
authors = ["The Neqo Authors <necko@mozilla.com>"]
build = false
autolib = false
+23 -8
View File
@@ -30,7 +30,8 @@ pub struct HttpServer {
server: Http3Server,
/// Progress writing to each stream.
remaining_data: HashMap<StreamId, SendData>,
posts: HashMap<Http3OrWebTransportStream, usize>,
/// Tracks POST requests: (bytes received, optional response size from path)
posts: HashMap<Http3OrWebTransportStream, (usize, Option<usize>)>,
is_qns_test: bool,
}
@@ -104,7 +105,10 @@ impl super::HttpServer for HttpServer {
qdebug!("Headers (request={stream} fin={fin}): {headers:?}");
if headers.contains_header(":method", "POST") {
self.posts.insert(stream, 0);
let response_size = headers
.find_header(":path")
.and_then(|path| path.value().trim_matches('/').parse::<usize>().ok());
self.posts.insert(stream, (0, response_size));
continue;
}
@@ -162,17 +166,28 @@ impl super::HttpServer for HttpServer {
}
Http3ServerEvent::Data { stream, data, fin } => {
if let Some(received) = self.posts.get_mut(&stream) {
if let Some((received, _)) = self.posts.get_mut(&stream) {
*received += data.len();
}
if fin {
if let Some(received) = self.posts.remove(&stream) {
let msg = received.to_string().as_bytes().to_vec();
if let Some((received, response_size)) = self.posts.remove(&stream) {
let mut response = response_size.map_or_else(
|| SendData::from(received.to_string().into_bytes()),
SendData::zeroes,
);
stream
.send_headers(&[Header::new(":status", "200")])
.send_headers(&[
Header::new(":status", "200"),
Header::new("content-length", response.len().to_string()),
])
.unwrap();
stream.send_data(&msg, now).unwrap();
stream.stream_close_send(now).unwrap();
let done = response.send(|chunk| stream.send_data(chunk, now).unwrap());
if done {
stream.stream_close_send(now).unwrap();
} else {
self.remaining_data.insert(stream.stream_id(), response);
}
}
}
}
+1 -1
View File
@@ -1 +1 @@
{"files":{"Cargo.toml":"5a8714e512c102e8bb9c212c67303bb5ab367e515b736328ce1162a281b1c4a6","benches/decoder.rs":"9a5e780ff68f180d7597e9d56b6d0ae609594a4558e4010babb2f33660ddddbe","build.rs":"d9accad1f92a1d82aff73a588269342db882918173e8d9b2b914c514e42e2839","src/bytes.rs":"b9ce44977af8d0731b51798fa9bd752fa4be437603a08446eb55889c2348281c","src/codec.rs":"1d5a036147a0bd4789eb4caa545f82ee0d18eca25ad1b6bdfd2fad58d99ae29e","src/datagram.rs":"b36bcfa4134aee3841e0210dc01aae410e1e6b4cf37163bb81a6276b7af007fd","src/event.rs":"289cf8e265c33e7cded58820ac81e5b575e3f84dd52fa18b0761f4094fb361c0","src/fuzz.rs":"9e0f2dca1832ef49b93b214e8d5f1ca2f5f8cb84a856fead344f62a722c370db","src/header.rs":"7f5d82577a5e1020ff237143e3aaa7e671403466a5a87f633b4c75f9d4e90aa9","src/hrtime.rs":"fd1fbf9ddd38c77e92abe25d7ab9e62872c1cd62ffae8743835bf94f76b6ddc8","src/incrdecoder.rs":"62f61d2600dafb1eec7d6cc85b3c7b07aba0ccd1149892b1dfa1a441f30927a3","src/lib.rs":"2bb6289a73dc07edfd2bc5bccda9542d403066656f41042116ed31f4fc4725ca","src/log.rs":"61a9b24bf6bf1493da67082bcf7fef8fe55f0a23d7f2a9ad13748982c54c85e2","src/qlog.rs":"2c072bb9ad31aad99c1f41421f162fbc48fbd4a17f4e554187b41267afef144b","src/tos.rs":"e09a69a20d54178a4c74b63596c607dbe8ace4ae0758a65f9878ea63d40e3c80","tests/log.rs":"c73187e390ee1a7c4a72266cb7ce5c326e862803dbcf86c2b9a892462fa22356"},"package":null}
{"files":{"Cargo.toml":"040088e3a044f56f5e39fb30a6e499743ed6a298f143a61c29e4502fa3273105","benches/decoder.rs":"9a5e780ff68f180d7597e9d56b6d0ae609594a4558e4010babb2f33660ddddbe","build.rs":"d9accad1f92a1d82aff73a588269342db882918173e8d9b2b914c514e42e2839","src/bytes.rs":"b9ce44977af8d0731b51798fa9bd752fa4be437603a08446eb55889c2348281c","src/codec.rs":"1d5a036147a0bd4789eb4caa545f82ee0d18eca25ad1b6bdfd2fad58d99ae29e","src/datagram.rs":"2ad1a6e1f8a157a0361b7b4e7c161d62c7bf742c4247190507b9d050d113a923","src/event.rs":"289cf8e265c33e7cded58820ac81e5b575e3f84dd52fa18b0761f4094fb361c0","src/fuzz.rs":"9e0f2dca1832ef49b93b214e8d5f1ca2f5f8cb84a856fead344f62a722c370db","src/header.rs":"7f5d82577a5e1020ff237143e3aaa7e671403466a5a87f633b4c75f9d4e90aa9","src/hrtime.rs":"fd1fbf9ddd38c77e92abe25d7ab9e62872c1cd62ffae8743835bf94f76b6ddc8","src/incrdecoder.rs":"62f61d2600dafb1eec7d6cc85b3c7b07aba0ccd1149892b1dfa1a441f30927a3","src/lib.rs":"2bb6289a73dc07edfd2bc5bccda9542d403066656f41042116ed31f4fc4725ca","src/log.rs":"61a9b24bf6bf1493da67082bcf7fef8fe55f0a23d7f2a9ad13748982c54c85e2","src/qlog.rs":"2c072bb9ad31aad99c1f41421f162fbc48fbd4a17f4e554187b41267afef144b","src/tos.rs":"e09a69a20d54178a4c74b63596c607dbe8ace4ae0758a65f9878ea63d40e3c80","tests/log.rs":"c73187e390ee1a7c4a72266cb7ce5c326e862803dbcf86c2b9a892462fa22356"},"package":null}
+1 -1
View File
@@ -13,7 +13,7 @@
edition = "2021"
rust-version = "1.81.0"
name = "neqo-common"
version = "0.17.0"
version = "0.18.0"
authors = ["The Neqo Authors <necko@mozilla.com>"]
build = "build.rs"
autolib = false
+74 -33
View File
@@ -7,11 +7,15 @@
use std::{
fmt::{self, Debug, Formatter},
net::SocketAddr,
num::NonZeroUsize,
ops::{Deref, DerefMut},
};
use crate::{hex_with_len, Bytes, Tos};
/// A UDP datagram.
///
/// Guaranteed to not be empty.
#[derive(Clone, PartialEq, Eq)]
pub struct Datagram<D = Vec<u8>> {
src: SocketAddr,
@@ -86,14 +90,14 @@ impl<D: AsMut<[u8]> + AsRef<[u8]>> AsMut<[u8]> for Datagram<D> {
}
impl Datagram<Vec<u8>> {
/// # Panics
///
/// Panics if `d` converts to an empty vector.
#[must_use]
pub fn new<V: Into<Vec<u8>>>(src: SocketAddr, dst: SocketAddr, tos: Tos, d: V) -> Self {
Self {
src,
dst,
tos,
d: d.into(),
}
let d = d.into();
assert!(!d.is_empty(), "Datagram data cannot be empty");
Self { src, dst, tos, d }
}
}
@@ -124,15 +128,23 @@ impl<D: AsRef<[u8]>> Debug for Datagram<D> {
}
impl<'a> Datagram<&'a mut [u8]> {
/// # Panics
///
/// Panics if the data is empty.
#[must_use]
pub fn from_slice(src: SocketAddr, dst: SocketAddr, tos: Tos, d: &'a mut [u8]) -> Self {
assert!(!d.is_empty(), "Datagram data cannot be empty");
Self { src, dst, tos, d }
}
}
impl Datagram<Bytes> {
/// # Panics
///
/// Panics if the data is empty.
#[must_use]
pub const fn from_bytes(src: SocketAddr, dst: SocketAddr, tos: Tos, d: Bytes) -> Self {
pub fn from_bytes(src: SocketAddr, dst: SocketAddr, tos: Tos, d: Bytes) -> Self {
assert!(!d.is_empty(), "Datagram data cannot be empty");
Self { src, dst, tos, d }
}
}
@@ -152,7 +164,7 @@ pub struct DatagramBatch {
src: SocketAddr,
dst: SocketAddr,
tos: Tos,
datagram_size: usize,
datagram_size: NonZeroUsize,
d: Vec<u8>,
}
@@ -176,7 +188,8 @@ impl From<Datagram<Vec<u8>>> for DatagramBatch {
src: d.src,
dst: d.dst,
tos: d.tos,
datagram_size: d.d.len(),
datagram_size: NonZeroUsize::new(d.d.len())
.expect("Datagram is guaranteed to be non-empty"),
d: d.d,
}
}
@@ -188,7 +201,7 @@ impl DatagramBatch {
src: SocketAddr,
dst: SocketAddr,
tos: Tos,
datagram_size: usize,
datagram_size: NonZeroUsize,
d: Vec<u8>,
) -> Self {
Self {
@@ -220,7 +233,7 @@ impl DatagramBatch {
}
#[must_use]
pub const fn datagram_size(&self) -> usize {
pub const fn datagram_size(&self) -> NonZeroUsize {
self.datagram_size
}
@@ -236,11 +249,11 @@ impl DatagramBatch {
#[must_use]
pub fn num_datagrams(&self) -> usize {
self.d.len().div_ceil(self.datagram_size)
self.d.len().div_ceil(self.datagram_size.get())
}
pub fn iter(&self) -> impl Iterator<Item = Datagram<&[u8]>> {
self.d.chunks(self.datagram_size).map(|d| Datagram {
self.d.chunks(self.datagram_size.get()).map(|d| Datagram {
src: self.src,
dst: self.dst,
tos: self.tos,
@@ -249,23 +262,28 @@ impl DatagramBatch {
}
pub fn iter_mut(&mut self) -> impl Iterator<Item = Datagram<&mut [u8]>> {
self.d.chunks_mut(self.datagram_size).map(|d| Datagram {
src: self.src,
dst: self.dst,
tos: self.tos,
d,
})
self.d
.chunks_mut(self.datagram_size.get())
.map(|d| Datagram {
src: self.src,
dst: self.dst,
tos: self.tos,
d,
})
}
}
#[cfg(test)]
#[cfg_attr(coverage_nightly, coverage(off))]
mod tests {
use std::net::{IpAddr, Ipv6Addr, SocketAddr};
use std::{
net::{IpAddr, Ipv6Addr, SocketAddr},
num::NonZeroUsize,
};
use test_fixture::datagram;
use test_fixture::{datagram, DEFAULT_ADDR};
use crate::{DatagramBatch, Ecn, Tos};
use crate::{Datagram, DatagramBatch, Ecn, Tos};
#[test]
fn fmt_datagram() {
@@ -277,10 +295,21 @@ mod tests {
}
#[test]
fn is_empty() {
let d = datagram(vec![]);
assert_eq!(d.len(), 0);
assert!(d.is_empty());
#[should_panic(expected = "Datagram data cannot be empty")]
fn new_empty() {
let _d = Datagram::new(DEFAULT_ADDR, DEFAULT_ADDR, Ecn::Ect0.into(), vec![]);
}
#[test]
#[should_panic(expected = "Datagram data cannot be empty")]
fn from_slice_empty() {
let _d = Datagram::from_slice(DEFAULT_ADDR, DEFAULT_ADDR, Ecn::Ect0.into(), &mut []);
}
#[test]
#[should_panic(expected = "Datagram data cannot be empty")]
fn from_bytes_empty() {
let _d = Datagram::from_bytes(DEFAULT_ADDR, DEFAULT_ADDR, Ecn::Ect0.into(), vec![].into());
}
#[test]
@@ -290,19 +319,19 @@ mod tests {
let tos = Tos::default();
// 10 bytes, segment size 4 -> 3 datagrams (4+4+2)
let batch = DatagramBatch::new(src, dst, tos, 4, vec![0u8; 10]);
let batch = DatagramBatch::new(src, dst, tos, NonZeroUsize::new(4).unwrap(), vec![0u8; 10]);
assert_eq!(batch.num_datagrams(), 3);
// 8 bytes, segment size 4 -> 2 datagrams (4+4)
let batch = DatagramBatch::new(src, dst, tos, 4, vec![0u8; 8]);
let batch = DatagramBatch::new(src, dst, tos, NonZeroUsize::new(4).unwrap(), vec![0u8; 8]);
assert_eq!(batch.num_datagrams(), 2);
// 5 bytes, segment size 5 -> 1 datagram
let batch = DatagramBatch::new(src, dst, tos, 5, vec![0u8; 5]);
let batch = DatagramBatch::new(src, dst, tos, NonZeroUsize::new(5).unwrap(), vec![0u8; 5]);
assert_eq!(batch.num_datagrams(), 1);
// 6 bytes, segment size 5 -> 2 datagrams (5+1)
let batch = DatagramBatch::new(src, dst, tos, 5, vec![0u8; 6]);
let batch = DatagramBatch::new(src, dst, tos, NonZeroUsize::new(5).unwrap(), vec![0u8; 6]);
assert_eq!(batch.num_datagrams(), 2);
}
@@ -312,7 +341,7 @@ mod tests {
SocketAddr::new(IpAddr::V6(Ipv6Addr::LOCALHOST), 1234),
SocketAddr::new(IpAddr::V6(Ipv6Addr::LOCALHOST), 5678),
Tos::default(),
4,
NonZeroUsize::new(4).unwrap(),
vec![0u8; 10],
);
batch.set_tos(Ecn::Ce.into());
@@ -324,7 +353,13 @@ mod tests {
let src = SocketAddr::new(IpAddr::V6(Ipv6Addr::LOCALHOST), 1234);
let dst = SocketAddr::new(IpAddr::V6(Ipv6Addr::LOCALHOST), 5678);
let tos = Tos::default();
let batch = DatagramBatch::new(src, dst, tos, 4, vec![1, 2, 3, 4, 5, 6, 7, 8, 9]);
let batch = DatagramBatch::new(
src,
dst,
tos,
NonZeroUsize::new(4).unwrap(),
vec![1, 2, 3, 4, 5, 6, 7, 8, 9],
);
let datagrams: Vec<_> = batch.iter().collect();
assert_eq!(datagrams.len(), 3);
assert_eq!(datagrams[0].d, &[1, 2, 3, 4]);
@@ -343,7 +378,13 @@ mod tests {
let src = SocketAddr::new(IpAddr::V6(Ipv6Addr::LOCALHOST), 1234);
let dst = SocketAddr::new(IpAddr::V6(Ipv6Addr::LOCALHOST), 5678);
let tos = Tos::default();
let mut batch = DatagramBatch::new(src, dst, tos, 3, vec![10, 20, 30, 40, 50, 60, 70]);
let mut batch = DatagramBatch::new(
src,
dst,
tos,
NonZeroUsize::new(3).unwrap(),
vec![10, 20, 30, 40, 50, 60, 70],
);
for datagram in batch.iter_mut() {
assert_eq!(datagram.source(), src);
assert_eq!(datagram.destination(), dst);
+1 -1
View File
@@ -1 +1 @@
{"files":{"Cargo.toml":"d3fd943b240ab7c2514f82362cc972619bbc5f03787ee5430ee02d7582a7f9d3","bindings/bindings.toml":"edffd81bae5081805f92fd527fd1fb474abf07a96c7b1536629ed0b2a328b638","bindings/nspr_err.h":"2d5205d017b536c2d838bcf9bc4ec79f96dd50e7bb9b73892328781f1ee6629d","bindings/nspr_error.h":"e41c03c77b8c22046f8618832c9569fbcc7b26d8b9bbc35eea7168f35e346889","bindings/nspr_io.h":"085b289849ef0e77f88512a27b4d9bdc28252bd4d39c6a17303204e46ef45f72","bindings/nspr_time.h":"2e637fd338a5cf0fd3fb0070a47f474a34c2a7f4447f31b6875f5a9928d0a261","bindings/nss_ciphers.h":"95ec6344a607558b3c5ba8510f463b6295f3a2fb3f538a01410531045a5f62d1","bindings/nss_init.h":"ef49045063782fb612aff459172cc6a89340f15005808608ade5320ca9974310","bindings/nss_p11.h":"0b81e64fe6db49b2ecff94edd850be111ef99ec11220e88ceb1c67be90143a78","bindings/nss_secerr.h":"713e8368bdae5159af7893cfa517dabfe5103cede051dee9c9557c850a2defc6","bindings/nss_ssl.h":"af222fb957b989e392e762fa2125c82608a0053aff4fb97e556691646c88c335","bindings/nss_sslerr.h":"24b97f092183d8486f774cdaef5030d0249221c78343570d83a4ee5b594210ae","bindings/nss_sslopt.h":"b7807eb7abdad14db6ad7bc51048a46b065a0ea65a4508c95a12ce90e59d1eea","build.rs":"7b121a109b0c2e32ecb04768d6d6d2f8a04a081aaafce765c4632253239ce44a","min_version.txt":"0f9ddf9ddaeb5137a5ab3d238d06286822f9579b1f46ba76312a8c6d76176500","src/aead.rs":"7f627f7dcb08444891b4898a8ab8c0bc4984c035212572547323046ec46e4bb1","src/aead_null.rs":"e8946edbff657763885dd52ccc5516726f316286b6e0c84671458d02a3c7e44a","src/agent.rs":"69e2d99c47c12bf24d4659e723fb85096d6286d134ced65054c40631e88c7c0c","src/agentio.rs":"eb13376f2aed4b0b822784d43d341709b3a33f6ba52560ff48ca3e339d1e86da","src/auth.rs":"bbba836237b0c5d079f1348a96bc46b5bb6fb3cd34ca568581c9f7f8800444d1","src/cert.rs":"afecc277b918e9123d6099fc2b7f5a4ef58c9c3c1b3ca9d4790bda0a46665fe3","src/constants.rs":"83606aeb646b2833a8094f9d980c266ecc3e8cb40c93a4820da221988319dd1a","src/ech.rs":"cf6670ce7ceaaa67c8b0f93b5063cf4a0b92a0b176bbbb664b0a58f1b922b710","src/err.rs":"40658d015ac45cdd29b3bc34540c93b80a20baf5d470e0c59754fc45ce6af204","src/exp.rs":"70549c53ce8df99d62d3343697abd2a177d67ff56703a3d26048bdcdc8b87a0d","src/ext.rs":"7082cd7b44ba97275a8aefe0c31c2419d750f9621486c9c017864c82a7580423","src/hkdf.rs":"76c5abc8b2d6ee12d8a86cd730af2cf47a59b2fbfd3b8a635a1826636156794d","src/hp.rs":"04a461676c02d308f1f851b975846f83daa50ee08de9e573b4136ce4d54b4473","src/lib.rs":"42bdd28c9cd22178e2a0ab1736a0ea49cb240c78cc924d26296086d469a1f2fe","src/min_version.rs":"c6e1f98b9f56db0622ac38c1be131c55acf4a0f09ed0d6283f4d6308e2d1301a","src/p11.rs":"dda7025c61987caffbb9acd38c3e4169a45692a96c3f23025612a4ef4a035157","src/prio.rs":"1858088afd2668e8fbff56959765b7d4df09342371b9282ade27bb4d7bd6ce69","src/replay.rs":"7bf84ce1964658e69d81a810f3b8d71d36d5a7fc336d83c04fb585a6a98e6d33","src/result.rs":"27067d9aba61e8162fb92bca03f9a462cf4fe2f0a259d52696b63e1f6a959a5c","src/secrets.rs":"b021c91b9c1b63373474c39e817a7d9083681be13b5466c4d2b776db9a65b9f8","src/selfencrypt.rs":"2cdca9ec879057ef76bbef168fea0750c34eeaea8dd370e8c192469b377168ad","src/ssl.rs":"49f4339e665959bd3a0fbd0e192611928fdeab986c4f539a4be2ab9cb6d60b8b","src/time.rs":"c4c9987bfe273f19a2f5ef09920ccfe384ab1c1eaf2b2281eb4b02aa8d3b9970","tests/aead.rs":"2e99fba2f155aa8442709c4847f171f0cdfc179b2a7cd2afd853b550d02f7792","tests/agent.rs":"81266b780a40f1d8d31edbe1f43a37fd641f2cb44f75365c67b068c0d3442bb3","tests/ext.rs":"40e3bb0e5ea00fe411cfaf1a006fd4b11a22503f66d3738423361a8b7f80fe13","tests/handshake.rs":"7c6dbdf1b2ae74d15f0a3242d9969abf04ea9839eddcf1aae73379142f33a433","tests/hkdf.rs":"1d2098dc8398395864baf13e4886cfd1da6d36118727c3b264f457ee3da6b048","tests/hp.rs":"dab2631fb5a4f47227e05f508eaca4b4aa225bafced60e703e6fd1c329ac6ab1","tests/init.rs":"3cfe8411ca31ad7dfb23822bb1570e1a5b2b334857173bdd7df086b65b81d95a","tests/selfencrypt.rs":"2e0b548fc84f388b0b2367fb8d9e3e0bd25c4814a1e997b13b7849a54a529703"},"package":null}
{"files":{"Cargo.toml":"cb62a951b24da13ea265aeb73a74066c71e2464f2e153805ed4a28280784c84d","bindings/bindings.toml":"edffd81bae5081805f92fd527fd1fb474abf07a96c7b1536629ed0b2a328b638","bindings/nspr_err.h":"2d5205d017b536c2d838bcf9bc4ec79f96dd50e7bb9b73892328781f1ee6629d","bindings/nspr_error.h":"e41c03c77b8c22046f8618832c9569fbcc7b26d8b9bbc35eea7168f35e346889","bindings/nspr_io.h":"085b289849ef0e77f88512a27b4d9bdc28252bd4d39c6a17303204e46ef45f72","bindings/nspr_time.h":"2e637fd338a5cf0fd3fb0070a47f474a34c2a7f4447f31b6875f5a9928d0a261","bindings/nss_ciphers.h":"95ec6344a607558b3c5ba8510f463b6295f3a2fb3f538a01410531045a5f62d1","bindings/nss_init.h":"ef49045063782fb612aff459172cc6a89340f15005808608ade5320ca9974310","bindings/nss_p11.h":"0b81e64fe6db49b2ecff94edd850be111ef99ec11220e88ceb1c67be90143a78","bindings/nss_secerr.h":"713e8368bdae5159af7893cfa517dabfe5103cede051dee9c9557c850a2defc6","bindings/nss_ssl.h":"af222fb957b989e392e762fa2125c82608a0053aff4fb97e556691646c88c335","bindings/nss_sslerr.h":"24b97f092183d8486f774cdaef5030d0249221c78343570d83a4ee5b594210ae","bindings/nss_sslopt.h":"b7807eb7abdad14db6ad7bc51048a46b065a0ea65a4508c95a12ce90e59d1eea","build.rs":"7b121a109b0c2e32ecb04768d6d6d2f8a04a081aaafce765c4632253239ce44a","min_version.txt":"0f9ddf9ddaeb5137a5ab3d238d06286822f9579b1f46ba76312a8c6d76176500","src/aead.rs":"7f627f7dcb08444891b4898a8ab8c0bc4984c035212572547323046ec46e4bb1","src/aead_null.rs":"e8946edbff657763885dd52ccc5516726f316286b6e0c84671458d02a3c7e44a","src/agent.rs":"69e2d99c47c12bf24d4659e723fb85096d6286d134ced65054c40631e88c7c0c","src/agentio.rs":"eb13376f2aed4b0b822784d43d341709b3a33f6ba52560ff48ca3e339d1e86da","src/auth.rs":"bbba836237b0c5d079f1348a96bc46b5bb6fb3cd34ca568581c9f7f8800444d1","src/cert.rs":"afecc277b918e9123d6099fc2b7f5a4ef58c9c3c1b3ca9d4790bda0a46665fe3","src/constants.rs":"83606aeb646b2833a8094f9d980c266ecc3e8cb40c93a4820da221988319dd1a","src/ech.rs":"cf6670ce7ceaaa67c8b0f93b5063cf4a0b92a0b176bbbb664b0a58f1b922b710","src/err.rs":"40658d015ac45cdd29b3bc34540c93b80a20baf5d470e0c59754fc45ce6af204","src/exp.rs":"70549c53ce8df99d62d3343697abd2a177d67ff56703a3d26048bdcdc8b87a0d","src/ext.rs":"7082cd7b44ba97275a8aefe0c31c2419d750f9621486c9c017864c82a7580423","src/hkdf.rs":"76c5abc8b2d6ee12d8a86cd730af2cf47a59b2fbfd3b8a635a1826636156794d","src/hp.rs":"04a461676c02d308f1f851b975846f83daa50ee08de9e573b4136ce4d54b4473","src/lib.rs":"42bdd28c9cd22178e2a0ab1736a0ea49cb240c78cc924d26296086d469a1f2fe","src/min_version.rs":"c6e1f98b9f56db0622ac38c1be131c55acf4a0f09ed0d6283f4d6308e2d1301a","src/p11.rs":"dda7025c61987caffbb9acd38c3e4169a45692a96c3f23025612a4ef4a035157","src/prio.rs":"1858088afd2668e8fbff56959765b7d4df09342371b9282ade27bb4d7bd6ce69","src/replay.rs":"7bf84ce1964658e69d81a810f3b8d71d36d5a7fc336d83c04fb585a6a98e6d33","src/result.rs":"27067d9aba61e8162fb92bca03f9a462cf4fe2f0a259d52696b63e1f6a959a5c","src/secrets.rs":"b021c91b9c1b63373474c39e817a7d9083681be13b5466c4d2b776db9a65b9f8","src/selfencrypt.rs":"2cdca9ec879057ef76bbef168fea0750c34eeaea8dd370e8c192469b377168ad","src/ssl.rs":"49f4339e665959bd3a0fbd0e192611928fdeab986c4f539a4be2ab9cb6d60b8b","src/time.rs":"c4c9987bfe273f19a2f5ef09920ccfe384ab1c1eaf2b2281eb4b02aa8d3b9970","tests/aead.rs":"2e99fba2f155aa8442709c4847f171f0cdfc179b2a7cd2afd853b550d02f7792","tests/agent.rs":"81266b780a40f1d8d31edbe1f43a37fd641f2cb44f75365c67b068c0d3442bb3","tests/ext.rs":"40e3bb0e5ea00fe411cfaf1a006fd4b11a22503f66d3738423361a8b7f80fe13","tests/handshake.rs":"7c6dbdf1b2ae74d15f0a3242d9969abf04ea9839eddcf1aae73379142f33a433","tests/hkdf.rs":"1d2098dc8398395864baf13e4886cfd1da6d36118727c3b264f457ee3da6b048","tests/hp.rs":"dab2631fb5a4f47227e05f508eaca4b4aa225bafced60e703e6fd1c329ac6ab1","tests/init.rs":"3cfe8411ca31ad7dfb23822bb1570e1a5b2b334857173bdd7df086b65b81d95a","tests/selfencrypt.rs":"2e0b548fc84f388b0b2367fb8d9e3e0bd25c4814a1e997b13b7849a54a529703"},"package":null}
+1 -1
View File
@@ -13,7 +13,7 @@
edition = "2021"
rust-version = "1.81.0"
name = "neqo-crypto"
version = "0.17.0"
version = "0.18.0"
authors = ["The Neqo Authors <necko@mozilla.com>"]
build = "build.rs"
autolib = false
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -13,7 +13,7 @@
edition = "2021"
rust-version = "1.81.0"
name = "neqo-http3"
version = "0.17.0"
version = "0.18.0"
authors = ["The Neqo Authors <necko@mozilla.com>"]
build = false
autolib = false
+1 -1
View File
@@ -1 +1 @@
{"files":{"Cargo.toml":"01d72f086015ac3fad0dd8e9e601551413adac9bea5b91151aa6d73446cd6eb8","src/decoder.rs":"1c5321b14c250bb53dc5435f0cb1b6e3c27029f3bcb149f00e1146702bc1e9ca","src/decoder_instructions.rs":"6b36eea01fdf92088ddac6b6988a239c28ddeb3cc7ecb16abf302f5d1ca8191a","src/encoder.rs":"f3e8002fdf690e820a850013fe288ba9c3279aa0034992a3547e060af8bd4f17","src/encoder_instructions.rs":"1cf1ba5ab2bbfc8f77ecfbc2bc59e40f77e12f85af5c10d0db2652000a8ff102","src/header_block.rs":"6c25b488a72864d8e0ad756af56607020b80bade8e660f701b3271d2e9d4a75f","src/huffman.rs":"c3740084c71580a5270c73cae4b7c5035fae913f533474f4a9cbc39b1f29adb7","src/huffman_decode_helper.rs":"c799b85c7738cdf6a1f6ea039062d2ea5ce0b4f08789d64e90a8712d57040d2b","src/huffman_table.rs":"aaa9ee17b8bceb47877d41fdf12fd29d49662a12db183acdb6b06c6e2ad182d9","src/lib.rs":"7b357e2ac248c392415f19b916373979272c33fa082d9158be4dd1ef5240cc1a","src/prefix.rs":"31bfb11d334a6df619bcc2720621e44a656be2514fad9033531a712d47dbe672","src/qlog.rs":"1ca9bdbc974024b32515af6b6529f5a69e80eae3f7d74445af304dc341a0eda1","src/qpack_send_buf.rs":"cec9b34cc0f2cd3a38eb15111c5f0418e31875d3ee20ecc1ed14f076da80979d","src/reader.rs":"6d698e21260d94c742b929c4112151b2ef6f2250f13564586e0ca0b9082115b5","src/static_table.rs":"6e5ec26e2b6bd63375d2d77e72748151d430d1629a8e497ec0d0ea21c078524a","src/stats.rs":"cb01723249f60e15a5cd7efd9cbab409fddc588d1df655ed06ba8c80e3d5d28e","src/table.rs":"f19b3016bffee54f8e3f52034e2eb36fc8f83a04b203074a8d4cec65367d3c32"},"package":null}
{"files":{"Cargo.toml":"8c35ea662ab6be4f72bb6d7e1c6e4a22611736ff9e95b4f765b5c9fc7f7046b5","src/decoder.rs":"1c5321b14c250bb53dc5435f0cb1b6e3c27029f3bcb149f00e1146702bc1e9ca","src/decoder_instructions.rs":"6b36eea01fdf92088ddac6b6988a239c28ddeb3cc7ecb16abf302f5d1ca8191a","src/encoder.rs":"f3e8002fdf690e820a850013fe288ba9c3279aa0034992a3547e060af8bd4f17","src/encoder_instructions.rs":"1cf1ba5ab2bbfc8f77ecfbc2bc59e40f77e12f85af5c10d0db2652000a8ff102","src/header_block.rs":"6c25b488a72864d8e0ad756af56607020b80bade8e660f701b3271d2e9d4a75f","src/huffman.rs":"c3740084c71580a5270c73cae4b7c5035fae913f533474f4a9cbc39b1f29adb7","src/huffman_decode_helper.rs":"c799b85c7738cdf6a1f6ea039062d2ea5ce0b4f08789d64e90a8712d57040d2b","src/huffman_table.rs":"aaa9ee17b8bceb47877d41fdf12fd29d49662a12db183acdb6b06c6e2ad182d9","src/lib.rs":"7b357e2ac248c392415f19b916373979272c33fa082d9158be4dd1ef5240cc1a","src/prefix.rs":"31bfb11d334a6df619bcc2720621e44a656be2514fad9033531a712d47dbe672","src/qlog.rs":"1ca9bdbc974024b32515af6b6529f5a69e80eae3f7d74445af304dc341a0eda1","src/qpack_send_buf.rs":"cec9b34cc0f2cd3a38eb15111c5f0418e31875d3ee20ecc1ed14f076da80979d","src/reader.rs":"6d698e21260d94c742b929c4112151b2ef6f2250f13564586e0ca0b9082115b5","src/static_table.rs":"6e5ec26e2b6bd63375d2d77e72748151d430d1629a8e497ec0d0ea21c078524a","src/stats.rs":"cb01723249f60e15a5cd7efd9cbab409fddc588d1df655ed06ba8c80e3d5d28e","src/table.rs":"f19b3016bffee54f8e3f52034e2eb36fc8f83a04b203074a8d4cec65367d3c32"},"package":null}
+1 -1
View File
@@ -13,7 +13,7 @@
edition = "2021"
rust-version = "1.81.0"
name = "neqo-qpack"
version = "0.17.0"
version = "0.18.0"
authors = ["The Neqo Authors <necko@mozilla.com>"]
build = false
autolib = false
File diff suppressed because one or more lines are too long
+1 -1
View File
@@ -13,7 +13,7 @@
edition = "2021"
rust-version = "1.81.0"
name = "neqo-transport"
version = "0.17.0"
version = "0.18.0"
authors = ["The Neqo Authors <necko@mozilla.com>"]
build = "build.rs"
autolib = false
@@ -44,11 +44,11 @@ fn gso_with_max_mtu() {
.process_multiple_output(now(), 2.try_into().unwrap())
.dgram()
.unwrap();
if pkts.datagram_size() == 65507 {
if pkts.datagram_size().get() == 65507 {
// Success. It reached the maximum IPv4 UDP MTU.
break;
}
assert!(pkts.datagram_size() < 65507);
assert!(pkts.datagram_size().get() < 65507);
server.process_multiple_input(pkts.iter_mut(), now());
let ack = server.process_output(now()).dgram();
+97 -5
View File
@@ -42,6 +42,8 @@ const PACKET_HP_MASK_SHORT: u8 = 0x1f;
const SAMPLE_SIZE: usize = 16;
const SAMPLE_OFFSET: usize = 4;
const MAX_PACKET_NUMBER_LEN: usize = 4;
/// The length of a long packet length field.
const LONG_PACKET_LENGTH_LEN: usize = 2;
pub mod metadata;
mod retry;
@@ -383,15 +385,20 @@ impl<B: Buffer> Builder<B> {
///
/// This will panic if the packet number length is too large.
pub fn pn(&mut self, pn: Number, pn_len: usize) {
if self.remaining() < 4 {
if self.remaining() < MAX_PACKET_NUMBER_LEN {
self.limit = 0;
return;
}
// Reserve space for a length in long headers.
if self.is_long() {
if self.remaining() < LONG_PACKET_LENGTH_LEN + MAX_PACKET_NUMBER_LEN {
self.limit = 0;
return;
}
self.offsets.len = self.encoder.len();
self.encoder.encode(&[0; 2]);
self.encoder.encode(&[0; LONG_PACKET_LENGTH_LEN]);
}
// This allows the input to be >4, which is absurd, but we can eat that.
@@ -411,7 +418,7 @@ impl<B: Buffer> Builder<B> {
#[expect(clippy::cast_possible_truncation, reason = "AND'ing makes this safe.")]
fn write_len(&mut self, expansion: usize) {
let len = self.encoder.len() - (self.offsets.len + 2) + expansion;
let len = self.encoder.len() - (self.offsets.len + LONG_PACKET_LENGTH_LEN) + expansion;
self.encoder.as_mut()[self.offsets.len] = 0x40 | ((len >> 8) & 0x3f) as u8;
self.encoder.as_mut()[self.offsets.len + 1] = (len & 0xff) as u8;
}
@@ -421,6 +428,14 @@ impl<B: Buffer> Builder<B> {
// The length of the packet number plus the payload length needs to
// be at least 4 (MAX_PACKET_NUMBER_LEN) plus any amount by which
// the header protection sample exceeds the AEAD expansion.
//
// > To ensure that sufficient data is available for sampling, packets
// > are padded so that the combined lengths of the encoded packet number
// > and protected payload is at least 4 bytes longer than the sample
// > required for header protection.
//
// <https://datatracker.ietf.org/doc/html/rfc9001#section-5.4.2>
let crypto_pad = crypto.extra_padding();
self.encoder.pad_to(
self.offsets.pn.start + MAX_PACKET_NUMBER_LEN + crypto_pad,
@@ -454,7 +469,12 @@ impl<B: Buffer> Builder<B> {
pub fn build(mut self, crypto: &mut CryptoDxState) -> Res<Encoder<B>> {
if self.len() > self.limit {
qwarn!("Packet contents are more than the limit");
debug_assert!(false);
debug_assert!(
false,
"Builder length ({}) is larger than limit ({}).",
self.len(),
self.limit
);
return Err(Error::Internal);
}
@@ -966,7 +986,7 @@ mod tests {
Builder, Public, Type, PACKET_BIT_FIXED_QUIC, PACKET_BIT_LONG, PACKET_BIT_SPIN,
PACKET_LIMIT,
},
ConnectionId, EmptyConnectionIdGenerator, RandomConnectionIdGenerator, Version,
ConnectionId, EmptyConnectionIdGenerator, Error, RandomConnectionIdGenerator, Version,
};
const CLIENT_CID: &[u8] = &[0x83, 0x94, 0xc8, 0xf0, 0x3e, 0x51, 0x57, 0x08];
@@ -1297,6 +1317,78 @@ mod tests {
assert_eq!(builder.abort(), encoder_copy);
}
/// Given an encoder that already contains some QUIC packet(s), i.e. is
/// filled close to the MTU, attempt to use the remaining insufficient space
/// for another QUIC packet.
///
/// Details in <https://github.com/mozilla/neqo/issues/3046>.
#[test]
fn build_insufficient_space_for_dummy_length_and_pn() {
const MTU: usize = 1280;
const FIRST_QUIC_PACKET: usize = 1236;
fixture_init();
let crypto = CryptoDxState::test_default();
let mut encoder = Encoder::new();
encoder.pad_to(FIRST_QUIC_PACKET, 0);
// Builder::long should add 1 (first byte) + 4 (version) + 2
// (dcid+scid length) + 8 (dcid) + 8 (scid) = 23 bytes.
let mut builder = Builder::long(
encoder,
Type::Initial,
Version::default(),
Some(SERVER_CID),
Some(CLIENT_CID),
MTU - crypto.expansion(),
);
assert_eq!(builder.len() - FIRST_QUIC_PACKET, 23);
// Given the FIRST_QUIC_PACKET and the partial header from
// Builder::long, the builder should have 5 bytes remaining.
assert_eq!(builder.remaining(), 5);
// Builder::pn needs 2 bytes for the dummy packet length and 4 bytes for
// the maximum packet number, but only 5 bytes remain. The builder
// should now be full and needs to be aborted.
builder.pn(0, 1);
assert!(builder.is_full());
}
#[test]
#[cfg_attr(
debug_assertions,
should_panic(expected = "Builder length (30) is larger than limit (20)")
)]
fn build_insufficient_space_error() {
const SMALL_LIMIT: usize = 20;
fixture_init();
// Set up a builder with a very small limit
let mut builder = Builder::short(
Encoder::new(),
false,
Some(ConnectionId::from(SERVER_CID)),
SMALL_LIMIT,
);
builder.pn(0, 1);
// Add more data than the limit allows. This will exceed the limit when
// combined with header.
let large_payload = vec![0u8; SMALL_LIMIT];
builder.encode(&large_payload);
// Verify that the length exceeds the limit.
assert!(builder.is_full());
// Building should trigger the debug_assert in debug mode, returning
// internal error in release mode.
assert_eq!(
builder.build(&mut CryptoDxState::test_default()),
Err(Error::Internal)
);
}
const SAMPLE_RETRY_V2: &[u8] = &[
0xcf, 0x6b, 0x33, 0x43, 0xcf, 0x00, 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5,
0x74, 0x6f, 0x6b, 0x65, 0x6e, 0xc8, 0x64, 0x6c, 0xe8, 0xbf, 0xe3, 0x39, 0x52, 0xd9, 0x55,
+8 -1
View File
@@ -8,6 +8,7 @@ use std::{
cell::RefCell,
fmt::{self, Display},
net::SocketAddr,
num::NonZeroUsize,
rc::Rc,
time::{Duration, Instant},
};
@@ -707,7 +708,13 @@ impl Path {
// update the ECN state and can hence change it - this packet should still be sent
// with the current value.
self.ecn_info.on_packet_sent(num_datagrams, stats);
DatagramBatch::new(self.local, self.remote, tos, datagram_size, payload)
DatagramBatch::new(
self.local,
self.remote,
tos,
NonZeroUsize::new(datagram_size).expect("datagram size cannot be zero"),
payload,
)
}
/// Get local address as `SocketAddr`
+2 -2
View File
@@ -37,8 +37,8 @@ fn gso() {
.dgram()
.unwrap();
assert_eq!(out.datagram_size(), 1232);
assert!(out.data().len() > out.datagram_size());
assert_eq!(out.datagram_size().get(), 1232);
assert!(out.data().len() > out.datagram_size().get());
}
#[test]
+1 -1
View File
@@ -1 +1 @@
{"files":{"Cargo.toml":"c44c53983661e7656b23b78b0eb7457f41e610ee3e456c957c137b75e7e882b9","build.rs":"bf57cd35a78f636c14c442c1926abc2deca3d137e9d207e4f2f960f5b8363b07","src/lib.rs":"18a9dafa4372d99ed26e2d8a2fde5060e587150630d8eedba4f5f6d4d9af916e"},"package":null}
{"files":{"Cargo.toml":"3c1085e0f4bfd691ce7e3af2361b79a88602f742b0f84b4d33b4d33e4aef259c","build.rs":"bf57cd35a78f636c14c442c1926abc2deca3d137e9d207e4f2f960f5b8363b07","src/lib.rs":"bb87c16ab8587eb2e3a68b948de6cc0d36a469194f243bfd6b33fcf31c9e6a2d"},"package":null}
+1 -1
View File
@@ -13,7 +13,7 @@
edition = "2021"
rust-version = "1.81.0"
name = "neqo-udp"
version = "0.17.0"
version = "0.18.0"
authors = ["The Neqo Authors <necko@mozilla.com>"]
build = "build.rs"
autolib = false
+6 -4
View File
@@ -64,7 +64,7 @@ pub fn send_inner(
destination: d.destination(),
ecn: EcnCodepoint::from_bits(Into::<u8>::into(d.tos())),
contents: d.data(),
segment_size: Some(d.datagram_size()),
segment_size: Some(d.datagram_size().get()),
src_ip: None,
};
@@ -75,7 +75,7 @@ pub fn send_inner(
"Failed to send datagram of size {} bytes, in {} segments, each {} bytes, from {} to {}. PMTUD probe? Ignoring error: {}",
d.data().len(),
d.num_datagrams(),
d.datagram_size(),
d.datagram_size().get(),
d.source(),
d.destination(),
e
@@ -89,7 +89,7 @@ pub fn send_inner(
"sent {} bytes, in {} segments, each {} bytes, from {} to {} ",
d.data().len(),
d.num_datagrams(),
d.datagram_size(),
d.datagram_size().get(),
d.source(),
d.destination(),
);
@@ -356,6 +356,8 @@ mod tests {
ignore = "GRO not available"
)]
fn many_datagrams_through_gso_gro() -> Result<(), io::Error> {
use std::num::NonZeroUsize;
const SEGMENT_SIZE: usize = 128;
let sender = socket()?;
@@ -368,7 +370,7 @@ mod tests {
sender.inner.local_addr()?,
receiver.inner.local_addr()?,
Tos::from((Dscp::Le, Ecn::Ect0)),
SEGMENT_SIZE,
NonZeroUsize::new(SEGMENT_SIZE).expect("SEGMENT_SIZE cannot be zero"),
msg,
);