X-Git-Url: http://git.localhorst.tv/?a=blobdiff_plain;f=src%2Fnet%2Fnet.cpp;h=0686d54eb0b9d87077b2838daac3091c54c79b37;hb=015bb899f8e3fb014bfa69fdcbb30db1c1163384;hp=9b50479b135445ae0225a28f98653fee18c6f000;hpb=33b37e7242e4cbfa76e4a0d6e5bb54223b541162;p=blank.git diff --git a/src/net/net.cpp b/src/net/net.cpp index 9b50479..0686d54 100644 --- a/src/net/net.cpp +++ b/src/net/net.cpp @@ -84,6 +84,11 @@ uint16_t Connection::Send(UDPpacket &udp_pack, UDPsocket sock) { throw NetError("SDLNet_UDP_Send"); } + if (HasHandler()) { + Handler().PacketOut(udp_pack); + Handler().PacketSent(seq); + } + FlagSend(); return seq; } @@ -111,6 +116,7 @@ void Connection::Received(const UDPpacket &udp_pack) { } Packet::TControl ctrl_new = pack.header.ctrl; + Handler().PacketIn(udp_pack); Handler().Handle(udp_pack); if (diff > 0) { @@ -151,20 +157,43 @@ uint16_t Connection::SendPing(UDPpacket &udp_pack, UDPsocket sock) { ConnectionHandler::ConnectionHandler() : packets_lost(0) , packets_received(0) -, packet_loss(0.0f) { +, packet_loss(0.0f) +, stamp_cursor(15) +, stamp_last(0) +, rtt(64.0f) +, next_sample(1000) +, tx_bytes(0) +, rx_bytes(0) +, tx_kbps(0.0f) +, rx_kbps(0.0f) { + Uint32 now = SDL_GetTicks(); + for (Uint32 &s : stamps) { + s = now; + } + next_sample += now; +} +void ConnectionHandler::PacketSent(uint16_t seq) noexcept { + if (!SamplePacket(seq)) { + return; + } + stamp_cursor = (stamp_cursor + 1) % 16; + stamps[stamp_cursor] = SDL_GetTicks(); + stamp_last = seq; } void ConnectionHandler::PacketLost(uint16_t seq) { OnPacketLost(seq); ++packets_lost; UpdatePacketLoss(); + UpdateRTT(seq); } void ConnectionHandler::PacketReceived(uint16_t seq) { OnPacketReceived(seq); ++packets_received; UpdatePacketLoss(); + UpdateRTT(seq); } void ConnectionHandler::UpdatePacketLoss() noexcept { @@ -176,6 +205,48 @@ void ConnectionHandler::UpdatePacketLoss() noexcept { } } +void ConnectionHandler::UpdateRTT(std::uint16_t seq) noexcept { + if (!SamplePacket(seq)) return; + int diff = HeadDiff(seq); + if (diff > 0 || diff < -15) { + // packet outside observed time frame + return; + } + int cur_rtt = SDL_GetTicks() - stamps[(stamp_cursor + diff + 16) % 16]; + rtt += (cur_rtt - rtt) * 0.1f; +} + +bool ConnectionHandler::SamplePacket(std::uint16_t seq) const noexcept { + // only sample every eighth packet + return seq % 8 == 0; +} + +int ConnectionHandler::HeadDiff(std::uint16_t seq) const noexcept { + int16_t diff = int16_t(seq) - int16_t(stamp_last); + return diff / 8; +} + +void ConnectionHandler::PacketIn(const UDPpacket &pack) noexcept { + rx_bytes += pack.len + 20; // I know, I know, it's an estimate (about 48 for IPv6) + UpdateStats(); +} + +void ConnectionHandler::PacketOut(const UDPpacket &pack) noexcept { + tx_bytes += pack.len + 20; + UpdateStats(); +} + +void ConnectionHandler::UpdateStats() noexcept { + Uint32 now = SDL_GetTicks(); + if (now >= next_sample) { + tx_kbps = float(tx_bytes) * (1.0f / 1024.0f); + rx_kbps = float(rx_bytes) * (1.0f / 1024.0f); + tx_bytes = 0; + rx_bytes = 0; + next_sample += 1000; + } +} + ostream &operator <<(ostream &out, const IPaddress &addr) { const unsigned char *host = reinterpret_cast(&addr.host);