Skip to content

Commit 5462e15

Browse files
Merge d6d0a9e into 095fcc7
2 parents 095fcc7 + d6d0a9e commit 5462e15

File tree

10 files changed

+91
-114
lines changed

10 files changed

+91
-114
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ jobs:
189189
# uses: obi1kenobi/cargo-semver-checks-action@v2
190190
uses: n0-computer/cargo-semver-checks-action@feat-baseline
191191
with:
192-
package: iroh, iroh-base, iroh-dns-server, iroh-net-bench, iroh-relay, iroh-net-report
192+
package: iroh, iroh-base, iroh-dns-server, iroh-bench, iroh-relay, iroh-net-report
193193
baseline-rev: ${{ env.HEAD_COMMIT_SHA }}
194194
use-cache: false
195195

.github/workflows/tests.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ env:
2323
RUSTFLAGS: -Dwarnings
2424
RUSTDOCFLAGS: -Dwarnings
2525
SCCACHE_CACHE_SIZE: "10G"
26-
CRATES_LIST: "iroh,iroh-net-bench,iroh-test,iroh-dns-server,iroh-relay,iroh-net-report"
26+
CRATES_LIST: "iroh,iroh-bench,iroh-test,iroh-dns-server,iroh-relay,iroh-net-report"
2727
IROH_FORCE_STAGING_RELAYS: "1"
2828

2929
jobs:

Cargo.lock

Lines changed: 20 additions & 20 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

iroh-net-report/src/defaults.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
/// The STUN port as defined by [RFC 8489](<https://www.rfc-editor.org/rfc/rfc8489#section-18.6>)
66
pub const DEFAULT_STUN_PORT: u16 = 3478;
77

8-
/// Contains all timeouts that we use in `iroh-net_report`.
8+
/// Contains all timeouts that we use in `iroh-net-report`.
99
pub(crate) mod timeouts {
1010
use std::time::Duration;
1111

iroh/bench/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
[package]
2-
name = "iroh-net-bench"
2+
name = "iroh-bench"
33
version = "0.29.0"
44
edition = "2021"
55
license = "MIT OR Apache-2.0"

iroh/bench/src/bin/bulk.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@ use std::collections::BTreeMap;
33
use anyhow::Result;
44
use clap::Parser;
55
#[cfg(not(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd")))]
6-
use iroh_net_bench::quinn;
7-
use iroh_net_bench::{configure_tracing_subscriber, iroh, rt, s2n, Commands, Opt};
6+
use iroh_bench::quinn;
7+
use iroh_bench::{configure_tracing_subscriber, iroh, rt, s2n, Commands, Opt};
88

99
fn main() {
1010
let cmd = Commands::parse();
@@ -135,11 +135,17 @@ pub fn run_iroh(opt: Opt) -> Result<()> {
135135

136136
#[cfg(not(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd")))]
137137
pub fn run_quinn(opt: Opt) -> Result<()> {
138+
use rustls::pki_types::{CertificateDer, PrivatePkcs8KeyDer};
139+
138140
let server_span = tracing::error_span!("server");
139141
let runtime = rt();
142+
let cert = rcgen::generate_simple_self_signed(vec!["localhost".into()]).unwrap();
143+
let key = PrivatePkcs8KeyDer::from(cert.key_pair.serialize_der());
144+
let cert = CertificateDer::from(cert.cert);
145+
140146
let (server_addr, endpoint) = {
141147
let _guard = server_span.enter();
142-
quinn::server_endpoint(&runtime, &opt)
148+
quinn::server_endpoint(&runtime, cert.clone(), key.into(), &opt)
143149
};
144150

145151
let server_thread = std::thread::spawn(move || {
@@ -151,10 +157,11 @@ pub fn run_quinn(opt: Opt) -> Result<()> {
151157

152158
let mut handles = Vec::new();
153159
for id in 0..opt.clients {
160+
let cert = cert.clone();
154161
handles.push(std::thread::spawn(move || {
155162
let _guard = tracing::error_span!("client", id).entered();
156163
let runtime = rt();
157-
match runtime.block_on(quinn::client(server_addr, opt)) {
164+
match runtime.block_on(quinn::client(server_addr, cert, opt)) {
158165
Ok(stats) => Ok(stats),
159166
Err(e) => {
160167
eprintln!("client failed: {e:#}");

iroh/bench/src/iroh.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use crate::{
1616
client_handler, stats::TransferResult, ClientStats, ConnectionSelector, EndpointSelector, Opt,
1717
};
1818

19-
pub const ALPN: &[u8] = b"n0/iroh-net-bench/0";
19+
pub const ALPN: &[u8] = b"n0/iroh-bench/0";
2020

2121
/// Creates a server endpoint which runs on the given runtime
2222
pub fn server_endpoint(

iroh/bench/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ pub mod s2n;
2121
pub mod stats;
2222

2323
#[derive(Parser, Debug, Clone, Copy)]
24-
#[clap(name = "iroh-net-bench")]
24+
#[clap(name = "iroh-bench")]
2525
pub enum Commands {
2626
Iroh(Opt),
2727
#[cfg(not(any(target_os = "freebsd", target_os = "openbsd", target_os = "netbsd")))]

iroh/bench/src/quinn.rs

Lines changed: 53 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,57 @@
11
use std::{
2-
net::SocketAddr,
2+
net::{IpAddr, Ipv4Addr, SocketAddr},
33
sync::Arc,
44
time::{Duration, Instant},
55
};
66

77
use anyhow::{Context, Result};
88
use bytes::Bytes;
9-
use quinn::{Connection, Endpoint, RecvStream, SendStream, TokioRuntime, TransportConfig};
10-
use socket2::{Domain, Protocol, Socket, Type};
9+
use quinn::{
10+
crypto::rustls::QuicClientConfig, Connection, Endpoint, RecvStream, SendStream, TransportConfig,
11+
};
12+
use rustls::{
13+
pki_types::{CertificateDer, PrivateKeyDer},
14+
RootCertStore,
15+
};
1116
use tracing::{trace, warn};
1217

1318
use crate::{
1419
client_handler, stats::TransferResult, ClientStats, ConnectionSelector, EndpointSelector, Opt,
1520
};
1621

17-
/// Derived from the iroh udp SOCKET_BUFFER_SIZE
18-
const SOCKET_BUFFER_SIZE: usize = 7 << 20;
1922
pub const ALPN: &[u8] = b"n0/quinn-bench/0";
2023

2124
/// Creates a server endpoint which runs on the given runtime
22-
pub fn server_endpoint(rt: &tokio::runtime::Runtime, opt: &Opt) -> (SocketAddr, quinn::Endpoint) {
23-
let secret_key = iroh::key::SecretKey::generate();
24-
let crypto = iroh::tls::make_server_config(&secret_key, vec![ALPN.to_vec()], false).unwrap();
25-
26-
let transport = transport_config(opt.max_streams, opt.initial_mtu);
27-
28-
let mut server_config = quinn::ServerConfig::with_crypto(Arc::new(crypto));
29-
server_config.transport_config(Arc::new(transport));
30-
31-
let addr = SocketAddr::new("127.0.0.1".parse().unwrap(), 0);
32-
33-
let socket = bind_socket(addr).unwrap();
34-
35-
let _guard = rt.enter();
36-
rt.block_on(async move {
37-
let ep = quinn::Endpoint::new(
38-
Default::default(),
39-
Some(server_config),
40-
socket,
41-
Arc::new(TokioRuntime),
25+
pub fn server_endpoint(
26+
rt: &tokio::runtime::Runtime,
27+
cert: CertificateDer<'static>,
28+
key: PrivateKeyDer<'static>,
29+
opt: &Opt,
30+
) -> (SocketAddr, quinn::Endpoint) {
31+
let cert_chain = vec![cert];
32+
let mut server_config = quinn::ServerConfig::with_single_cert(cert_chain, key).unwrap();
33+
server_config.transport = Arc::new(transport_config(opt.max_streams, opt.initial_mtu));
34+
35+
let endpoint = {
36+
let _guard = rt.enter();
37+
quinn::Endpoint::server(
38+
server_config,
39+
SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 0),
4240
)
43-
.unwrap();
44-
let addr = ep.local_addr().unwrap();
45-
(addr, ep)
46-
})
41+
.unwrap()
42+
};
43+
let server_addr = endpoint.local_addr().unwrap();
44+
(server_addr, endpoint)
4745
}
4846

4947
/// Create and run a client
50-
pub async fn client(server_addr: SocketAddr, opt: Opt) -> Result<ClientStats> {
48+
pub async fn client(
49+
server_addr: SocketAddr,
50+
server_cert: CertificateDer<'static>,
51+
opt: Opt,
52+
) -> Result<ClientStats> {
5153
let client_start = std::time::Instant::now();
52-
let (endpoint, connection) = connect_client(server_addr, opt).await?;
54+
let (endpoint, connection) = connect_client(server_addr, server_cert, opt).await?;
5355
let client_connect_time = client_start.elapsed();
5456
let mut res = client_handler(
5557
EndpointSelector::Quinn(endpoint),
@@ -64,29 +66,34 @@ pub async fn client(server_addr: SocketAddr, opt: Opt) -> Result<ClientStats> {
6466
/// Create a client endpoint and client connection
6567
pub async fn connect_client(
6668
server_addr: SocketAddr,
69+
server_cert: CertificateDer<'_>,
6770
opt: Opt,
6871
) -> Result<(::quinn::Endpoint, Connection)> {
69-
let secret_key = iroh::key::SecretKey::generate();
70-
let quic_client_config =
71-
iroh::tls::make_client_config(&secret_key, None, vec![ALPN.to_vec()], false)?;
72-
let mut config = quinn::ClientConfig::new(Arc::new(quic_client_config));
72+
let endpoint =
73+
quinn::Endpoint::client(SocketAddr::new(IpAddr::V4(Ipv4Addr::LOCALHOST), 0)).unwrap();
7374

74-
let transport = transport_config(opt.max_streams, opt.initial_mtu);
75+
let mut roots = RootCertStore::empty();
76+
roots.add(server_cert)?;
7577

76-
// let mut config = quinn::ClientConfig::new(Arc::new(crypto));
77-
config.transport_config(Arc::new(transport));
78+
let provider = rustls::crypto::ring::default_provider();
7879

79-
let addr = SocketAddr::new("127.0.0.1".parse().unwrap(), 0);
80+
let crypto = rustls::ClientConfig::builder_with_provider(provider.into())
81+
.with_protocol_versions(&[&rustls::version::TLS13])
82+
.unwrap()
83+
.with_root_certificates(roots)
84+
.with_no_client_auth();
8085

81-
let socket = bind_socket(addr).unwrap();
86+
let mut client_config = quinn::ClientConfig::new(Arc::new(QuicClientConfig::try_from(crypto)?));
87+
client_config.transport_config(Arc::new(transport_config(opt.max_streams, opt.initial_mtu)));
8288

83-
let ep =
84-
quinn::Endpoint::new(Default::default(), None, socket, Arc::new(TokioRuntime)).unwrap();
85-
let connection = ep
86-
.connect_with(config, server_addr, "local")?
89+
let connection = endpoint
90+
.connect_with(client_config, server_addr, "localhost")
91+
.unwrap()
8792
.await
88-
.context("connecting")?;
89-
Ok((ep, connection))
93+
.context("unable to connect")?;
94+
trace!("connected");
95+
96+
Ok((endpoint, connection))
9097
}
9198

9299
pub fn transport_config(max_streams: usize, initial_mtu: u16) -> TransportConfig {
@@ -104,43 +111,6 @@ pub fn transport_config(max_streams: usize, initial_mtu: u16) -> TransportConfig
104111
config
105112
}
106113

107-
fn bind_socket(addr: SocketAddr) -> Result<std::net::UdpSocket> {
108-
let socket = Socket::new(Domain::for_address(addr), Type::DGRAM, Some(Protocol::UDP))
109-
.context("create socket")?;
110-
111-
if addr.is_ipv6() {
112-
socket.set_only_v6(false).context("set_only_v6")?;
113-
}
114-
115-
socket
116-
.bind(&socket2::SockAddr::from(addr))
117-
.context("binding endpoint")?;
118-
socket
119-
.set_send_buffer_size(SOCKET_BUFFER_SIZE)
120-
.context("send buffer size")?;
121-
socket
122-
.set_recv_buffer_size(SOCKET_BUFFER_SIZE)
123-
.context("recv buffer size")?;
124-
125-
let buf_size = socket.send_buffer_size().context("send buffer size")?;
126-
if buf_size < SOCKET_BUFFER_SIZE {
127-
warn!(
128-
"Unable to set desired send buffer size. Desired: {}, Actual: {}",
129-
SOCKET_BUFFER_SIZE, buf_size
130-
);
131-
}
132-
133-
let buf_size = socket.recv_buffer_size().context("recv buffer size")?;
134-
if buf_size < SOCKET_BUFFER_SIZE {
135-
warn!(
136-
"Unable to set desired recv buffer size. Desired: {}, Actual: {}",
137-
SOCKET_BUFFER_SIZE, buf_size
138-
);
139-
}
140-
141-
Ok(socket.into())
142-
}
143-
144114
async fn drain_stream(
145115
stream: &mut RecvStream,
146116
read_unordered: bool,

iroh/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -242,7 +242,7 @@ pub mod endpoint;
242242
mod magicsock;
243243
pub mod metrics;
244244
pub mod protocol;
245-
pub mod tls;
245+
mod tls;
246246

247247
pub(crate) mod util;
248248

0 commit comments

Comments
 (0)