aboutsummaryrefslogtreecommitdiffstats
path: root/mumd/src/network.rs
diff options
context:
space:
mode:
authorGustav Sörnäs <gustav@sornas.net>2020-10-10 17:38:57 +0200
committerGustav Sörnäs <gustav@sornas.net>2020-10-10 17:38:57 +0200
commit2aee60f7bbc6186cf6ca63aef182e1fe52fa03ad (patch)
tree3c60651a37bbdf082fea57bfc0e08bcde52ef764 /mumd/src/network.rs
parente88e8df4d464e7c937e64ea68701a7c155bd3f1d (diff)
downloadmum-2aee60f7bbc6186cf6ca63aef182e1fe52fa03ad.tar.gz
move connect_udp to network.rs
Co-authored-by: Eskil Queseth <eskilq@kth.se>
Diffstat (limited to 'mumd/src/network.rs')
-rw-r--r--mumd/src/network.rs30
1 files changed, 30 insertions, 0 deletions
diff --git a/mumd/src/network.rs b/mumd/src/network.rs
index 6aec343..34b5d01 100644
--- a/mumd/src/network.rs
+++ b/mumd/src/network.rs
@@ -1,15 +1,21 @@
+use futures::channel::oneshot;
use futures::StreamExt;
use futures_util::stream::{SplitSink, SplitStream};
use mumble_protocol::{Serverbound, Clientbound};
use mumble_protocol::control::ClientControlCodec;
use mumble_protocol::control::ControlCodec;
use mumble_protocol::control::ControlPacket;
+use mumble_protocol::crypt::ClientCryptState;
+use mumble_protocol::voice::VoicePacket;
+use std::net::Ipv6Addr;
use std::net::SocketAddr;
use tokio::net::TcpStream;
+use tokio::net::UdpSocket;
use tokio_tls::TlsConnector;
use tokio_tls::TlsStream;
use tokio_util::codec::Decoder;
use tokio_util::codec::Framed;
+use tokio_util::udp::UdpFramed;
pub async fn connect_tcp(
server_addr: SocketAddr,
@@ -38,3 +44,27 @@ pub async fn connect_tcp(
// Wrap the TLS stream with Mumble's client-side control-channel codec
ClientControlCodec::new().framed(tls_stream).split()
}
+
+pub async fn connect_udp(
+ server_addr: SocketAddr,
+ crypt_state: oneshot::Receiver<ClientCryptState>,
+) -> (
+ SplitSink<UdpFramed<ClientCryptState>, (VoicePacket<Serverbound>, SocketAddr)>,
+ SplitStream<UdpFramed<ClientCryptState>>
+) {
+ // Bind UDP socket
+ let udp_socket = UdpSocket::bind((Ipv6Addr::from(0u128), 0u16))
+ .await
+ .expect("Failed to bind UDP socket");
+
+ // Wait for initial CryptState
+ let crypt_state = match crypt_state.await {
+ Ok(crypt_state) => crypt_state,
+ // disconnected before we received the CryptSetup packet, oh well
+ Err(_) => panic!("disconnect before crypt packet received"), //TODO exit gracefully
+ };
+ println!("UDP ready!");
+
+ // Wrap the raw UDP packets in Mumble's crypto and voice codec (CryptState does both)
+ UdpFramed::new(udp_socket, crypt_state).split()
+}