From 8aa1fa98d9fd5dea18534c446ae4217a77200062 Mon Sep 17 00:00:00 2001 From: DJMrTV Date: Sun, 19 Jan 2025 15:56:36 +0100 Subject: [PATCH] added partial functionality for endpoints --- src/main.rs | 2 +- src/prudp/endpoint.rs | 18 +++++++++++++++++- src/prudp/mod.rs | 3 ++- src/prudp/packet.rs | 23 ++++++++++++++++------ src/prudp/server.rs | 44 ++++++++++++++++++++++++++++++++++++------- src/prudp/sockaddr.rs | 7 +++++++ 6 files changed, 81 insertions(+), 16 deletions(-) create mode 100644 src/prudp/sockaddr.rs diff --git a/src/main.rs b/src/main.rs index 8918d2e..19edee5 100644 --- a/src/main.rs +++ b/src/main.rs @@ -38,7 +38,7 @@ fn main() { dotenv::dotenv().ok(); - info!("starting auth server"); + info!("starting auth server on {}:{}", *OWN_IP, *AUTH_SERVER_PORT); let (auth_server, auth_server_join_handle) = NexServer::new(SocketAddrV4::new(*OWN_IP, *AUTH_SERVER_PORT)) diff --git a/src/prudp/endpoint.rs b/src/prudp/endpoint.rs index 32c1593..3551e07 100644 --- a/src/prudp/endpoint.rs +++ b/src/prudp/endpoint.rs @@ -1,3 +1,19 @@ -pub struct Endpoint{ +use std::net::UdpSocket; +use std::sync::Arc; +use crate::prudp::packet::VirtualPort; +use crate::prudp::server::Connection; +pub struct Endpoint{ + socket: Arc, + virtual_port: VirtualPort, +} + +impl Endpoint{ + pub fn get_virual_port(&self) -> VirtualPort{ + self.virtual_port + } + + fn process_packet(connection: &Connection){ + + } } \ No newline at end of file diff --git a/src/prudp/mod.rs b/src/prudp/mod.rs index 8e9c2cf..97bfc74 100644 --- a/src/prudp/mod.rs +++ b/src/prudp/mod.rs @@ -1,4 +1,5 @@ pub mod packet; pub mod server; mod endpoint; -mod auth_module; \ No newline at end of file +mod auth_module; +mod sockaddr; \ No newline at end of file diff --git a/src/prudp/packet.rs b/src/prudp/packet.rs index 66d38f4..f8af327 100644 --- a/src/prudp/packet.rs +++ b/src/prudp/packet.rs @@ -2,10 +2,12 @@ use std::fmt::{Debug, Formatter}; use std::hint::unreachable_unchecked; use std::io; use std::io::{Cursor, ErrorKind, Read, Seek}; +use std::net::SocketAddrV4; use bytemuck::{Pod, Zeroable}; use thiserror::Error; use v_byte_macros::{EnumTryInto, SwapEndian}; use crate::endianness::{IS_BIG_ENDIAN, IS_LITTLE_ENDIAN, ReadExtensions}; +use crate::prudp::sockaddr::PRUDPSockAddr; #[derive(Error, Debug)] pub enum Error{ @@ -62,11 +64,11 @@ pub struct VirtualPort(u8); impl VirtualPort{ pub fn get_stream_type(self) -> u8 { - (self.0 & 0x0F) as u8 + (self.0 & 0xF0) >> 4 } pub fn get_port_number(self) -> u8 { - (self.0 & 0xF0) >> 4 + (self.0 & 0x0F) } pub fn stream_type(self, val: u8) -> Self { @@ -114,7 +116,8 @@ enum PacketSpecificData{ #[derive(Debug)] pub struct PRUDPPacket{ - pub header: PRUDPHeader + pub header: PRUDPHeader, + pub payload: Vec } #[derive(Copy, Clone, Debug)] @@ -208,14 +211,22 @@ impl PRUDPPacket{ }*/ - let mut packet_payload = vec![0u8; header.payload_size as usize]; + let mut payload = vec![0u8; header.payload_size as usize]; - reader.read_exact(&mut packet_payload)?; + reader.read_exact(&mut payload)?; Ok(Self{ - header + header, + payload }) } + + pub fn source_sockaddr(&self,socket_addr_v4: SocketAddrV4) -> PRUDPSockAddr{ + PRUDPSockAddr{ + regular_socket_addr: socket_addr_v4, + virtual_port: self.header.source_port + } + } } #[cfg(test)] diff --git a/src/prudp/server.rs b/src/prudp/server.rs index fa56ae9..f962360 100644 --- a/src/prudp/server.rs +++ b/src/prudp/server.rs @@ -1,16 +1,18 @@ use std::{env, io, thread}; use std::io::Cursor; use std::marker::PhantomData; -use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4, UdpSocket}; +use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4, TcpStream, UdpSocket}; +use std::net::SocketAddr::V4; use std::ops::{Deref, DerefMut}; -use std::sync::{Arc, Mutex}; +use std::sync::{Arc, Mutex, RwLock}; use std::sync::atomic::{AtomicBool, Ordering}; use std::thread::JoinHandle; use once_cell::sync::Lazy; use log::{error, info}; use crate::prudp::auth_module::AuthModule; use crate::prudp::endpoint::Endpoint; -use crate::prudp::packet::PRUDPPacket; +use crate::prudp::packet::{PRUDPPacket, VirtualPort}; +use crate::prudp::sockaddr::PRUDPSockAddr; static SERVER_DATAGRAMS: Lazy = Lazy::new(||{ env::var("SERVER_DATAGRAM_COUNT").ok() @@ -19,30 +21,53 @@ static SERVER_DATAGRAMS: Lazy = Lazy::new(||{ }); pub struct NexServer{ - pub endpoints: Mutex>, + pub endpoints: RwLock>, pub running: AtomicBool, //pub auth_module: Arc _no_outside_construction: PhantomData<()> } +pub struct Connection<'a>{ + socket: &'a UdpSocket, + prudp_addr: PRUDPSockAddr +} + + impl NexServer{ fn process_prudp_packet(&self, packet: &PRUDPPacket){ } - fn process_prudp_packets(&self, addr: SocketAddr, udp_message: &[u8]){ + fn process_prudp_packets<'a>(&self, socket: &'a UdpSocket, addr: SocketAddrV4, udp_message: &[u8]){ let mut stream = Cursor::new(udp_message); while stream.position() as usize != udp_message.len() { let packet = match PRUDPPacket::new(&mut stream){ Ok(p) => p, Err(e) => { - error!("Somebody is fucking with the servers or their connection is bad(from {})", addr); + error!("Somebody({}) is fucking with the servers or their connection is bad", addr); break; }, }; info!("got valid prudp packet from someone({}): \n{:?}", addr, packet); + let connection = Connection{ + socket, + prudp_addr: packet.source_sockaddr(addr) + }; + + let endpoints = self.endpoints.read().expect("poison"); + + let Some(endpoint) = endpoints.iter().find(|e|{ + e.get_virual_port().get_port_number() == connection.prudp_addr.virtual_port.get_port_number() + }) else { + error!("connection to invalid endpoint({}) attempted by {}", connection.prudp_addr.virtual_port.get_port_number(), connection.prudp_addr.regular_socket_addr); + continue; + }; + + + + } } @@ -57,9 +82,14 @@ impl NexServer{ let (len, addr) = socket.recv_from(&mut msg_buffer) .expect("Datagram thread crashed due to unexpected error from recv_from"); + let V4(addr) = addr else { + error!("somehow got ipv6 packet...? ignoring"); + continue; + }; + let current_msg = &msg_buffer[0..len]; info!("attempting to process message"); - self.process_prudp_packets(addr, current_msg); + self.process_prudp_packets(&socket, addr, current_msg); } } diff --git a/src/prudp/sockaddr.rs b/src/prudp/sockaddr.rs new file mode 100644 index 0000000..3280855 --- /dev/null +++ b/src/prudp/sockaddr.rs @@ -0,0 +1,7 @@ +use std::net::SocketAddrV4; +use crate::prudp::packet::VirtualPort; + +pub struct PRUDPSockAddr{ + pub regular_socket_addr: SocketAddrV4, + pub virtual_port: VirtualPort +} \ No newline at end of file