aboutsummaryrefslogtreecommitdiffstats
path: root/mumd/src/network
diff options
context:
space:
mode:
Diffstat (limited to 'mumd/src/network')
-rw-r--r--mumd/src/network/tcp.rs4
-rw-r--r--mumd/src/network/udp.rs29
2 files changed, 14 insertions, 19 deletions
diff --git a/mumd/src/network/tcp.rs b/mumd/src/network/tcp.rs
index 3c96ee1..47ea311 100644
--- a/mumd/src/network/tcp.rs
+++ b/mumd/src/network/tcp.rs
@@ -44,6 +44,7 @@ pub async fn handle(
state: Arc<Mutex<State>>,
mut connection_info_receiver: watch::Receiver<Option<ConnectionInfo>>,
crypt_state_sender: mpsc::Sender<ClientCryptState>,
+ packet_sender: mpsc::UnboundedSender<ControlPacket<Serverbound>>,
mut packet_receiver: mpsc::UnboundedReceiver<ControlPacket<Serverbound>>,
mut tcp_event_register_receiver: mpsc::UnboundedReceiver<(TcpEvent, TcpEventCallback)>,
) {
@@ -67,14 +68,13 @@ pub async fn handle(
let state_lock = state.lock().unwrap();
authenticate(&mut sink, state_lock.username().unwrap().to_string()).await;
let phase_watcher = state_lock.phase_receiver();
- let packet_sender = state_lock.packet_sender();
drop(state_lock);
let event_queue = Arc::new(Mutex::new(HashMap::new()));
info!("Logging in...");
join!(
- send_pings(packet_sender, 10, phase_watcher.clone()),
+ send_pings(packet_sender.clone(), 10, phase_watcher.clone()),
listen(
Arc::clone(&state),
stream,
diff --git a/mumd/src/network/udp.rs b/mumd/src/network/udp.rs
index 4dde268..0c00029 100644
--- a/mumd/src/network/udp.rs
+++ b/mumd/src/network/udp.rs
@@ -1,10 +1,10 @@
use crate::network::ConnectionInfo;
use crate::state::{State, StatePhase};
-use log::*;
use bytes::Bytes;
use futures::{join, pin_mut, select, FutureExt, SinkExt, StreamExt, Stream};
use futures_util::stream::{SplitSink, SplitStream};
+use log::*;
use mumble_protocol::crypt::ClientCryptState;
use mumble_protocol::ping::{PingPacket, PongPacket};
use mumble_protocol::voice::{VoicePacket, VoicePacketPayload};
@@ -18,6 +18,8 @@ use tokio::net::UdpSocket;
use tokio::sync::{mpsc, oneshot, watch};
use tokio_util::udp::UdpFramed;
+pub type PingRequest = (u64, SocketAddr, Box<dyn FnOnce(PongPacket)>);
+
type UdpSender = SplitSink<UdpFramed<ClientCryptState>, (VoicePacket<Serverbound>, SocketAddr)>;
type UdpReceiver = SplitStream<UdpFramed<ClientCryptState>>;
@@ -90,17 +92,14 @@ async fn new_crypt_state(
source: Arc<Mutex<UdpReceiver>>,
) {
loop {
- match crypt_state.recv().await {
- Some(crypt_state) => {
- info!("Received new crypt state");
- let udp_socket = UdpSocket::bind((Ipv6Addr::from(0u128), 0u16))
- .await
- .expect("Failed to bind UDP socket");
- let (new_sink, new_source) = UdpFramed::new(udp_socket, crypt_state).split();
- *sink.lock().unwrap() = new_sink;
- *source.lock().unwrap() = new_source;
- },
- None => {},
+ if let Some(crypt_state) = crypt_state.recv().await {
+ info!("Received new crypt state");
+ let udp_socket = UdpSocket::bind((Ipv6Addr::from(0u128), 0u16))
+ .await
+ .expect("Failed to bind UDP socket");
+ let (new_sink, new_source) = UdpFramed::new(udp_socket, crypt_state).split();
+ *sink.lock().unwrap() = new_sink;
+ *source.lock().unwrap() = new_source;
}
}
}
@@ -248,11 +247,7 @@ async fn send_voice(
}
pub async fn handle_pings(
- mut ping_request_receiver: mpsc::UnboundedReceiver<(
- u64,
- SocketAddr,
- Box<dyn FnOnce(PongPacket)>,
- )>,
+ mut ping_request_receiver: mpsc::UnboundedReceiver<PingRequest>,
) {
let udp_socket = UdpSocket::bind((Ipv6Addr::from(0u128), 0u16))
.await