+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;
+ }
+}
+