Skip to content

Commit b8c9a00

Browse files
committed
master: refactor MTU buffer handling
1 parent c8ca5b0 commit b8c9a00

File tree

1 file changed

+27
-17
lines changed

1 file changed

+27
-17
lines changed

master/src/master_server.rs

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -35,16 +35,28 @@ type ServerInfo = xash3d_protocol::ServerInfo<Box<[u8]>>;
3535

3636
pub 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

4657
impl 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

7183
impl 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-
99109
const 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

Comments
 (0)