@@ -190,6 +190,7 @@ pub struct MasterServer<Addr: AddrExt> {
190190
191191 update_addr : SocketAddr ,
192192 update_gamedir : TimedHashMap < Addr , StrArr < GAMEDIR_MAX_SIZE > > ,
193+ client_rate_limit : TimedHashMap < Addr :: Ip , u32 > ,
193194
194195 blocklist : HashSet < Addr :: Ip > ,
195196
@@ -218,6 +219,7 @@ impl<Addr: AddrExt> MasterServer<Addr> {
218219 rng : Rng :: new ( ) ,
219220 update_addr,
220221 update_gamedir : TimedHashMap :: new ( 5 ) ,
222+ client_rate_limit : TimedHashMap :: new ( 1 ) ,
221223 admin_challenges : TimedHashMap :: new ( timeout. challenge ) ,
222224 admin_limit : TimedHashMap :: new ( timeout. admin ) ,
223225 blocklist : Default :: default ( ) ,
@@ -294,6 +296,7 @@ impl<Addr: AddrExt> MasterServer<Addr> {
294296 self . servers . clear ( ) ;
295297 self . admin_challenges . clear ( ) ;
296298 self . stats . clear ( ) ;
299+ self . client_rate_limit . clear ( ) ;
297300 }
298301
299302 fn handle_server_packet ( & mut self , from : Addr , p : server:: Packet ) -> Result < ( ) , Error > {
@@ -310,7 +313,7 @@ impl<Addr: AddrExt> MasterServer<Addr> {
310313 }
311314 server:: Packet :: ServerAdd ( p) => {
312315 let challenge = match self . challenges . get ( & from) {
313- Some ( e) => e,
316+ Some ( e) => e. value ,
314317 None => {
315318 trace ! ( "{}: Challenge does not exists" , from) ;
316319 return Ok ( ( ) ) ;
@@ -324,7 +327,7 @@ impl<Addr: AddrExt> MasterServer<Addr> {
324327 ) ;
325328 return Ok ( ( ) ) ;
326329 }
327- if p. challenge != * challenge {
330+ if p. challenge != challenge {
328331 warn ! (
329332 "{from}: Expected challenge {challenge} but received {}" ,
330333 p. challenge
@@ -484,6 +487,15 @@ impl<Addr: AddrExt> MasterServer<Addr> {
484487 }
485488
486489 fn handle_game_packet ( & mut self , from : Addr , p : game:: Packet ) -> Result < ( ) , Error > {
490+ if self . cfg . server . client_rate_limit > 0 {
491+ let counter = self . client_rate_limit . entry ( * from. ip ( ) ) . or_default ( ) ;
492+ counter. value = counter. value . saturating_add ( 1 ) ;
493+ if counter. value > self . cfg . server . client_rate_limit {
494+ trace ! ( "{from}: client rate limit {}" , counter. value) ;
495+ return Ok ( ( ) ) ;
496+ }
497+ }
498+
487499 trace ! ( "{from}: recv {p:?}" ) ;
488500 match p {
489501 game:: Packet :: QueryServers ( p) => {
@@ -608,15 +620,15 @@ impl<Addr: AddrExt> MasterServer<Addr> {
608620 fn add_server ( & mut self , addr : Addr , server : ServerInfo ) {
609621 match self . servers . entry ( addr) {
610622 hash_map:: Entry :: Occupied ( mut e) => {
611- trace ! ( "{}: Updated GameServer " , addr) ;
623+ trace ! ( "{}: game server update " , addr) ;
612624 e. insert ( Timed :: new ( server) ) ;
613625 }
614626 hash_map:: Entry :: Vacant ( _) => {
615627 if self . count_servers ( addr. ip ( ) ) >= self . cfg . server . max_servers_per_ip {
616628 trace ! ( "{}: max servers per ip" , addr) ;
617629 return ;
618630 }
619- trace ! ( "{}: New GameServer " , addr) ;
631+ trace ! ( "{}: game server add " , addr) ;
620632 self . servers . insert ( addr, server) ;
621633 }
622634 }
0 commit comments