diff --git a/HTTPServer.cpp b/HTTPServer.cpp
index 88e7b272..577ef748 100644
--- a/HTTPServer.cpp
+++ b/HTTPServer.cpp
@@ -104,15 +104,22 @@ namespace util
s << "-->" << it.second->GetTunnelID ();
else
s << "-->" << it.second->GetTunnelID () << "-->";
- s << "
";
+ s << " " << it.second->GetNumTransmittedBytes () << "
";
}
s << "
Transports
";
for (auto it: i2p::transports.GetNTCPSessions ())
{
+ // RouterInfo of incoming connection doesn't have address
+ bool outgoing = it.second->GetRemoteRouterInfo ().GetNTCPAddress ();
if (it.second->IsEstablished ())
+ {
+ if (outgoing) s << "-->";
s << it.second->GetRemoteRouterInfo ().GetIdentHashAbbreviation () << ": "
- << it.second->GetSocket ().remote_endpoint().address ().to_string () << "
";
+ << it.second->GetSocket ().remote_endpoint().address ().to_string ();
+ if (!outgoing) s << "-->";
+ s << "
";
+ }
}
}
diff --git a/TransitTunnel.cpp b/TransitTunnel.cpp
index 5771c385..d92b62a9 100644
--- a/TransitTunnel.cpp
+++ b/TransitTunnel.cpp
@@ -14,7 +14,8 @@ namespace tunnel
TransitTunnel::TransitTunnel (uint32_t receiveTunnelID,
const uint8_t * nextIdent, uint32_t nextTunnelID,
const uint8_t * layerKey,const uint8_t * ivKey):
- m_TunnelID (receiveTunnelID), m_NextTunnelID (nextTunnelID), m_NextIdent (nextIdent)
+ m_TunnelID (receiveTunnelID), m_NextTunnelID (nextTunnelID),
+ m_NextIdent (nextIdent), m_NumTransmittedBytes (0)
{
memcpy (m_LayerKey, layerKey, 32);
memcpy (m_IVKey, ivKey, 32);
@@ -43,6 +44,7 @@ namespace tunnel
FillI2NPMessageHeader (tunnelMsg, eI2NPTunnelData);
i2p::transports.SendMessage (m_NextIdent, tunnelMsg);
+ m_NumTransmittedBytes += tunnelMsg->GetLength ();
}
void TransitTunnel::SendTunnelDataMsg (const uint8_t * gwHash, uint32_t gwTunnel, i2p::I2NPMessage * msg)
diff --git a/TransitTunnel.h b/TransitTunnel.h
index 2109ee31..570429f5 100644
--- a/TransitTunnel.h
+++ b/TransitTunnel.h
@@ -23,6 +23,7 @@ namespace tunnel
virtual void HandleTunnelDataMsg (i2p::I2NPMessage * tunnelMsg);
virtual void SendTunnelDataMsg (const uint8_t * gwHash, uint32_t gwTunnel, i2p::I2NPMessage * msg);
+ virtual size_t GetNumTransmittedBytes () const { return m_NumTransmittedBytes; };
uint32_t GetTunnelID () const { return m_TunnelID; };
@@ -37,6 +38,7 @@ namespace tunnel
i2p::data::IdentHash m_NextIdent;
uint8_t m_LayerKey[32];
uint8_t m_IVKey[32];
+ size_t m_NumTransmittedBytes;
CryptoPP::ECB_Mode::Encryption m_ECBEncryption;
CryptoPP::CBC_Mode::Encryption m_CBCEncryption;
@@ -53,6 +55,7 @@ namespace tunnel
layerKey, ivKey), m_Gateway(this) {};
void SendTunnelDataMsg (const uint8_t * gwHash, uint32_t gwTunnel, i2p::I2NPMessage * msg);
+ size_t GetNumTransmittedBytes () const { return m_Gateway.GetNumSentBytes (); };
private:
@@ -69,6 +72,7 @@ namespace tunnel
TransitTunnel (receiveTunnelID, nextIdent, nextTunnelID, layerKey, ivKey) {};
void HandleTunnelDataMsg (i2p::I2NPMessage * tunnelMsg);
+ size_t GetNumTransmittedBytes () const { return m_Endpoint.GetNumReceivedBytes (); }
private: