diff --git a/daemon/HTTPServer.cpp b/daemon/HTTPServer.cpp
index d9daeb5e..8706f786 100644
--- a/daemon/HTTPServer.cpp
+++ b/daemon/HTTPServer.cpp
@@ -289,6 +289,11 @@ namespace http {
if (family.length () > 0)
s << ""<< tr("Family") << ": " << family << "
\r\n";
s << "" << tr("Tunnel creation success rate") << ": " << i2p::tunnel::tunnels.GetTunnelCreationSuccessRate () << "%
\r\n";
+ bool isTotalTCSR;
+ i2p::config::GetOption("http.showTotalTCSR", isTotalTCSR);
+ if (isTotalTCSR) {
+ s << "" << tr("Total tunnel creation success rate") << ": " << i2p::tunnel::tunnels.GetTotalTunnelCreationSuccessRate() << "%
\r\n";
+ }
s << "" << tr("Received") << ": ";
ShowTraffic (s, i2p::transport::transports.GetTotalReceivedBytes ());
s << " (" << tr(/* tr: Kibibyte/s */ "%.2f KiB/s", (double) i2p::transport::transports.GetInBandwidth15s () / 1024) << ")
\r\n";
diff --git a/libi2pd/Config.cpp b/libi2pd/Config.cpp
index 07ab2f20..971b1273 100644
--- a/libi2pd/Config.cpp
+++ b/libi2pd/Config.cpp
@@ -95,6 +95,7 @@ namespace config {
("http.hostname", value()->default_value("localhost"), "Expected hostname for WebUI")
("http.webroot", value()->default_value("/"), "WebUI root path (default: / )")
("http.lang", value()->default_value("english"), "WebUI language (default: english )")
+ ("http.showTotalTCSR", value()->default_value(false), "Show additional value with total TCSR since router's start (default: false)")
;
options_description httpproxy("HTTP Proxy options");
diff --git a/libi2pd/Tunnel.cpp b/libi2pd/Tunnel.cpp
index 4d205544..a0e36978 100644
--- a/libi2pd/Tunnel.cpp
+++ b/libi2pd/Tunnel.cpp
@@ -332,7 +332,8 @@ namespace tunnel
Tunnels tunnels;
Tunnels::Tunnels (): m_IsRunning (false), m_Thread (nullptr),
- m_TunnelCreationSuccessRate (TCSR_START_VALUE), m_TunnelCreationAttemptsNum(0) {
+ m_TunnelCreationSuccessRate (TCSR_START_VALUE), m_TunnelCreationAttemptsNum(0),
+ m_TotalNumSuccesiveTunnelCreations (0), m_TotalNumFailedTunnelCreations (0) { // for normal avarage
}
Tunnels::~Tunnels ()
diff --git a/libi2pd/Tunnel.h b/libi2pd/Tunnel.h
index 7fa1eb54..03693206 100644
--- a/libi2pd/Tunnel.h
+++ b/libi2pd/Tunnel.h
@@ -269,15 +269,21 @@ namespace tunnel
i2p::util::Queue > m_Queue;
i2p::util::MemoryPoolMt > m_I2NPTunnelEndpointMessagesMemoryPool;
i2p::util::MemoryPoolMt > m_I2NPTunnelMessagesMemoryPool;
-
+ // count of tunnels for total TCSR algorithm
+ int m_TotalNumSuccesiveTunnelCreations, m_TotalNumFailedTunnelCreations;
+
// Calculating of tunnel creation success rate
- // A modified version of the EWMA algorithm, where alpha is increased at the beginning to accelerate similarity
void SuccesiveTunnelCreation() {
+ // total TCSR
+ m_TotalNumSuccesiveTunnelCreations++;
+ // A modified version of the EWMA algorithm, where alpha is increased at the beginning to accelerate similarity
double alpha = TCSR_SMOOTHING_CONSTANT + (1 - TCSR_SMOOTHING_CONSTANT)/++m_TunnelCreationAttemptsNum;
m_TunnelCreationSuccessRate = alpha * 1 + (1 - alpha) * m_TunnelCreationSuccessRate;
};
void FailedTunnelCreation() {
+ m_TotalNumFailedTunnelCreations++;
+
double alpha = TCSR_SMOOTHING_CONSTANT + (1 - TCSR_SMOOTHING_CONSTANT)/++m_TunnelCreationAttemptsNum;
m_TunnelCreationSuccessRate = alpha * 0 + (1 - alpha) * m_TunnelCreationSuccessRate;
};
@@ -297,6 +303,11 @@ namespace tunnel
int GetQueueSize () { return m_Queue.GetSize (); };
int GetTunnelCreationSuccessRate () const { return std::round(m_TunnelCreationSuccessRate * 100); } // in percents
+ int GetTotalTunnelCreationSuccessRate () const // in percents
+ {
+ int totalNum = m_TotalNumSuccesiveTunnelCreations + m_TotalNumFailedTunnelCreations;
+ return totalNum ? m_TotalNumSuccesiveTunnelCreations*100/totalNum : 0;
+ }
};
extern Tunnels tunnels;