diff --git a/minetest.conf.example b/minetest.conf.example index 64cb877..071b97c 100644 --- a/minetest.conf.example +++ b/minetest.conf.example @@ -198,3 +198,8 @@ #dedicated_server_step = 0.1 # Can be set to true to disable shutting down on invalid world data #ignore_world_load_errors = false +# Congestion control parameters +# time in seconds, rate in ~500B packets +#congestion_control_aim_rtt = 0.2 +#congestion_control_max_rate = 400 +#congestion_control_min_rate = 10 diff --git a/src/connection.cpp b/src/connection.cpp index 4f5d095..ed5a752 100644 --- a/src/connection.cpp +++ b/src/connection.cpp @@ -25,6 +25,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include "util/serialize.h" #include "util/numeric.h" #include "util/string.h" +#include "settings.h" namespace con { @@ -466,7 +467,10 @@ Peer::Peer(u16 a_id, Address a_address): m_sendtime_accu(0), m_max_packets_per_second(10), m_num_sent(0), - m_max_num_sent(0) + m_max_num_sent(0), + congestion_control_aim_rtt(0.2), + congestion_control_max_rate(400), + congestion_control_min_rate(10) { } Peer::~Peer() @@ -477,15 +481,15 @@ void Peer::reportRTT(float rtt) { if(rtt >= 0.0){ if(rtt < 0.01){ - if(m_max_packets_per_second < 400) + if(m_max_packets_per_second < congestion_control_max_rate) m_max_packets_per_second += 10; - } else if(rtt < 0.2){ - if(m_max_packets_per_second < 100) + } else if(rtt < congestion_control_aim_rtt){ + if(m_max_packets_per_second < congestion_control_max_rate) m_max_packets_per_second += 2; } else { m_max_packets_per_second *= 0.8; - if(m_max_packets_per_second < 10) - m_max_packets_per_second = 10; + if(m_max_packets_per_second < congestion_control_min_rate) + m_max_packets_per_second = congestion_control_min_rate; } } @@ -891,12 +895,24 @@ void Connection::receive() void Connection::runTimeouts(float dtime) { + float congestion_control_aim_rtt + = g_settings->getFloat("congestion_control_aim_rtt"); + float congestion_control_max_rate + = g_settings->getFloat("congestion_control_max_rate"); + float congestion_control_min_rate + = g_settings->getFloat("congestion_control_min_rate"); + core::list timeouted_peers; core::map::Iterator j; j = m_peers.getIterator(); for(; j.atEnd() == false; j++) { Peer *peer = j.getNode()->getValue(); + + // Update congestion control values + peer->congestion_control_aim_rtt = congestion_control_aim_rtt; + peer->congestion_control_max_rate = congestion_control_max_rate; + peer->congestion_control_min_rate = congestion_control_min_rate; /* Check peer timeout diff --git a/src/connection.h b/src/connection.h index f88e813..f99cd1b 100644 --- a/src/connection.h +++ b/src/connection.h @@ -394,7 +394,11 @@ public: float m_max_packets_per_second; int m_num_sent; int m_max_num_sent; - + + // Updated from configuration by Connection + float congestion_control_aim_rtt; + float congestion_control_max_rate; + float congestion_control_min_rate; private: }; diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp index 8ce9cb1..d186427 100644 --- a/src/defaultsettings.cpp +++ b/src/defaultsettings.cpp @@ -106,6 +106,11 @@ void set_default_settings(Settings *settings) settings->setDefault("sound_volume", "0.8"); settings->setDefault("desynchronize_mapblock_texture_animation", "true"); + settings->setDefault("mip_map", "false"); + settings->setDefault("anisotropic_filter", "false"); + settings->setDefault("bilinear_filter", "false"); + settings->setDefault("trilinear_filter", "false"); + // Server stuff // "map-dir" doesn't exist by default. settings->setDefault("default_game", "minetest"); @@ -142,10 +147,8 @@ void set_default_settings(Settings *settings) settings->setDefault("full_block_send_enable_min_time_from_building", "2.0"); settings->setDefault("dedicated_server_step", "0.1"); settings->setDefault("ignore_world_load_errors", "false"); - settings->setDefault("mip_map", "false"); - settings->setDefault("anisotropic_filter", "false"); - settings->setDefault("bilinear_filter", "false"); - settings->setDefault("trilinear_filter", "false"); - + settings->setDefault("congestion_control_aim_rtt", "0.2"); + settings->setDefault("congestion_control_max_rate", "400"); + settings->setDefault("congestion_control_min_rate", "10"); }