@@ -35,16 +35,28 @@ type ServerInfo = xash3d_protocol::ServerInfo<Box<[u8]>>;
3535
3636pub trait AddrExt : Sized + Eq + Hash + Display + Copy + ToSocketAddrs + ServerAddress {
3737 type Ip : Eq + Hash + Display + Copy + FromStr ;
38+ type MtuBuffer : AsMut < [ u8 ] > ;
3839
3940 fn extract ( addr : SocketAddr ) -> Result < Self , SocketAddr > ;
4041 fn ip ( & self ) -> & Self :: Ip ;
4142 fn wrap ( self ) -> SocketAddr ;
42-
43- fn mtu ( ) -> usize ;
43+ fn mtu_buffer ( ) -> Self :: MtuBuffer ;
44+
45+ // /// Returns an uninitialized buffer with MTU length.
46+ // #[inline(always)]
47+ // fn mtu_buffer_uninit() -> Self::MtuBuffer {
48+ // let buf = std::mem::MaybeUninit::uninit();
49+ // // SAFETY: used only to encode packets
50+ // #[allow(unsafe_code)]
51+ // unsafe {
52+ // buf.assume_init()
53+ // }
54+ // }
4455}
4556
4657impl AddrExt for SocketAddrV4 {
4758 type Ip = Ipv4Addr ;
59+ type MtuBuffer = [ u8 ; 512 ] ;
4860
4961 fn extract ( addr : SocketAddr ) -> Result < Self , SocketAddr > {
5062 if let SocketAddr :: V4 ( addr) = addr {
@@ -63,13 +75,14 @@ impl AddrExt for SocketAddrV4 {
6375 }
6476
6577 #[ inline( always) ]
66- fn mtu ( ) -> usize {
67- 512
78+ fn mtu_buffer ( ) -> Self :: MtuBuffer {
79+ [ 0 ; 512 ]
6880 }
6981}
7082
7183impl AddrExt for SocketAddrV6 {
7284 type Ip = Ipv6Addr ;
85+ type MtuBuffer = [ u8 ; 1280 ] ;
7386
7487 fn extract ( addr : SocketAddr ) -> Result < Self , SocketAddr > {
7588 if let SocketAddr :: V6 ( addr) = addr {
@@ -88,14 +101,11 @@ impl AddrExt for SocketAddrV6 {
88101 }
89102
90103 #[ inline( always) ]
91- fn mtu ( ) -> usize {
92- MAX_PACKET_SIZE
104+ fn mtu_buffer ( ) -> Self :: MtuBuffer {
105+ [ 0 ; 1280 ]
93106 }
94107}
95108
96- /// The maximum size of UDP packets.
97- const MAX_PACKET_SIZE : usize = 1280 ;
98-
99109const GAMEDIR_MAX_SIZE : usize = 31 ;
100110
101111#[ derive( Error , Debug ) ]
@@ -265,9 +275,9 @@ impl<Addr: AddrExt> MasterServer<Addr> {
265275 }
266276
267277 pub fn run ( & mut self , sig_flag : & AtomicBool ) -> Result < ( ) , Error > {
268- let mut buf = [ 0 ; MAX_PACKET_SIZE ] ;
278+ let mut buf = [ 0 ; 2048 ] ;
269279 while !sig_flag. load ( Ordering :: Relaxed ) {
270- let ( n, from) = match self . sock . recv_from ( & mut buf[ .. Addr :: mtu ( ) ] ) {
280+ let ( n, from) = match self . sock . recv_from ( & mut buf) {
271281 Ok ( x) => x,
272282 Err ( e) => match e. kind ( ) {
273283 io:: ErrorKind :: Interrupted => break ,
@@ -305,9 +315,9 @@ impl<Addr: AddrExt> MasterServer<Addr> {
305315 match p {
306316 server:: Packet :: Challenge ( p) => {
307317 let master_challenge = self . add_challenge ( from) ;
308- let mut buf = [ 0 ; MAX_PACKET_SIZE ] ;
309318 let resp = master:: ChallengeResponse :: new ( master_challenge, p. server_challenge ) ;
310319 trace ! ( "{from}: send {resp:?}" ) ;
320+ let mut buf = [ 0 ; 32 ] ;
311321 let packet = resp. encode ( & mut buf) ?;
312322 self . sock . send_to ( packet, from) ?;
313323 }
@@ -480,8 +490,8 @@ impl<Addr: AddrExt> MasterServer<Addr> {
480490 ..Default :: default ( )
481491 } ;
482492 trace ! ( "{from}: send {resp:?}" ) ;
483- let mut buf = [ 0 ; MAX_PACKET_SIZE ] ;
484- let packet = resp. encode ( & mut buf[ .. Addr :: mtu ( ) ] ) ?;
493+ let mut buf = Addr :: mtu_buffer ( ) ;
494+ let packet = resp. encode ( buf. as_mut ( ) ) ?;
485495 self . sock . send_to ( packet, from) ?;
486496 Ok ( ( ) )
487497 }
@@ -639,11 +649,11 @@ impl<Addr: AddrExt> MasterServer<Addr> {
639649 A : ToSocketAddrs ,
640650 S : ServerAddress ,
641651 {
642- let mut buf = [ 0 ; MAX_PACKET_SIZE ] ;
643- let mut offset = 0 ;
644652 let mut list = master:: QueryServersResponse :: new ( key) ;
653+ let mut buf = Addr :: mtu_buffer ( ) ;
654+ let mut offset = 0 ;
645655 loop {
646- let ( packet, count) = list. encode ( & mut buf[ .. Addr :: mtu ( ) ] , & servers[ offset..] ) ?;
656+ let ( packet, count) = list. encode ( buf. as_mut ( ) , & servers[ offset..] ) ?;
647657 self . sock . send_to ( packet, & to) ?;
648658 offset += count;
649659 if offset >= servers. len ( ) {
0 commit comments