diff --git a/CHANGELOG.md b/CHANGELOG.md index 41d17c4..6c6e9b0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,6 +23,7 @@ This file lists the changes that have occurred since January 2024 in the project * Hide advanced parameters in GUI * Add a reset parameters button in GUI * Add an option to measure latency-only for the client in the GUI +* Don't allow peers to connect with the regular server ## 0.2 - 2024-08-29 diff --git a/src/crusader-lib/src/discovery.rs b/src/crusader-lib/src/discovery.rs index 8f727c9..515ea03 100644 --- a/src/crusader-lib/src/discovery.rs +++ b/src/crusader-lib/src/discovery.rs @@ -185,7 +185,7 @@ pub async fn locate(peer_server: bool) -> Result { }) } -pub fn serve(state: Arc, port: u16, peer_server: bool) -> Result<(), anyhow::Error> { +pub fn serve(state: Arc, port: u16) -> Result<(), anyhow::Error> { async fn handle_packet( port: u16, peer_server: bool, @@ -253,12 +253,19 @@ pub fn serve(state: Arc, port: u16, peer_server: bool) -> Result<(), anyh let mut buf = [0; 1500]; loop { if let Ok((len, src)) = socket.recv_from(&mut buf).await { - handle_packet(port, peer_server, &hostname, &buf[..len], &socket, src) - .await - .map_err(|error| { - (state.msg)(&format!("Unable to handle discovery packet: {:?}", error)); - }) - .ok(); + handle_packet( + port, + state.peer_server, + &hostname, + &buf[..len], + &socket, + src, + ) + .await + .map_err(|error| { + (state.msg)(&format!("Unable to handle discovery packet: {:?}", error)); + }) + .ok(); } } }); diff --git a/src/crusader-lib/src/peer.rs b/src/crusader-lib/src/peer.rs index 47fa366..b4d6445 100644 --- a/src/crusader-lib/src/peer.rs +++ b/src/crusader-lib/src/peer.rs @@ -9,7 +9,7 @@ use crate::{ common::{hello, measure_latency, ping_recv, ping_send, TestState}, protocol::{codec, receive, send, ClientMessage, RawLatency, ServerMessage}, }; -use anyhow::bail; +use anyhow::{bail, Context}; use std::{ net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr}, sync::Arc, @@ -34,7 +34,9 @@ pub struct Peer { #[cfg(feature = "client")] impl Peer { pub async fn start(&mut self) -> Result<(), anyhow::Error> { - let reply: ServerMessage = receive(&mut self.rx).await?; + let reply: ServerMessage = receive(&mut self.rx) + .await + .context("Peer failed to get ready")?; match reply { ServerMessage::PeerReady { server_latency } => { (self.msg)(&format!( @@ -115,7 +117,9 @@ pub async fn connect_to_peer( ) .await?; - let reply: ServerMessage = receive(&mut control_rx).await?; + let reply: ServerMessage = receive(&mut control_rx) + .await + .context("Failed to create peer")?; match reply { ServerMessage::NewPeer => (), _ => bail!("Unexpected message {:?}", reply), diff --git a/src/crusader-lib/src/serve.rs b/src/crusader-lib/src/serve.rs index 7b8fe4b..cfc6ac8 100644 --- a/src/crusader-lib/src/serve.rs +++ b/src/crusader-lib/src/serve.rs @@ -103,6 +103,7 @@ pub(crate) struct State { clients: Mutex>>>, pong_servers: Mutex>>, pub(crate) msg: Box, + pub(crate) peer_server: bool, } fn ip_to_ipv6_mapped(ip: IpAddr) -> Ipv6Addr { @@ -160,6 +161,9 @@ async fn client(state: Arc, stream: TcpStream) -> Result<(), anyhow::Erro ping_interval, estimated_duration, } => { + if !state.peer_server { + bail!("Server not accepting peers") + } (state.msg)(&format!( "Serving as peer for {}, version {}", addr, hello.version @@ -631,6 +635,7 @@ async fn serve_async( clients: Mutex::new((0..SLOTS).map(|_| None).collect()), pong_servers: Default::default(), msg, + peer_server, }); let v6 = Socket::new(Domain::IPV6, socket2::Type::STREAM, Some(Protocol::TCP))?; @@ -655,7 +660,7 @@ async fn serve_async( task::spawn(listen(state.clone(), v6)); task::spawn(listen(state.clone(), v4)); - if let Err(error) = discovery::serve(state.clone(), port, peer_server) { + if let Err(error) = discovery::serve(state.clone(), port) { (state.msg)(&format!("Failed to run discovery: {:?}", error)); }