Display packet loss

This commit is contained in:
Ludvig Strigeus 2018-11-17 17:22:25 +01:00
parent 5c29201cd8
commit 09fa28ea4d
4 changed files with 27 additions and 6 deletions

View file

@ -1503,6 +1503,7 @@ static const AdvancedTextInfo ADVANCED_TEXT_INFOS[] = {
{Y + 19 * 3, 66, "Handshake:"}, {Y + 19 * 3, 66, "Handshake:"},
{Y + 19 * 4, 66, ""}, {Y + 19 * 4, 66, ""},
{Y + 19 * 5, 66, "Overhead:"}, {Y + 19 * 5, 66, "Overhead:"},
{Y + 19 * 6, 66, "Packet Loss:"},
#undef Y #undef Y
}; };
@ -1579,6 +1580,12 @@ static const char *GetAdvancedInfoValue(char buffer[256], int i) {
overhead_out_pct / 1000, overhead_out_pct % 1000); overhead_out_pct / 1000, overhead_out_pct % 1000);
return buffer; return buffer;
} }
case 6: {
snprintf(buffer, 256, "%.3f%% (%d packets)",
ps->lost_packets_tot ? 100.0f * (ps->lost_packets_tot - ps->lost_packets_valid) / ps->lost_packets_tot : 0.0f,
(int)(ps->lost_packets_tot - ps->lost_packets_valid));
return buffer;
}
default: return ""; default: return "";
} }
} }

View file

@ -95,6 +95,11 @@ const WgProcessorStats &WireguardProcessor::GetStats() {
if (peer) { if (peer) {
stats_.endpoint = peer->endpoint_; stats_.endpoint = peer->endpoint_;
stats_.endpoint_protocol = peer->endpoint_protocol_; stats_.endpoint_protocol = peer->endpoint_protocol_;
if (peer->curr_keypair_) {
stats_.lost_packets_tot = peer->curr_keypair_->replay_detector.expected_seq_nr();
stats_.lost_packets_valid = peer->curr_keypair_->incoming_packet_count;
}
} }
return stats_; return stats_;
} }
@ -434,8 +439,8 @@ add_padding:
byte *write = data; byte *write = data;
uint8 tag = WG_SHORT_HEADER_BIT, inner_tag; uint8 tag = WG_SHORT_HEADER_BIT, inner_tag;
// For every 16 incoming packets, send out an ack. // For every 16 incoming packets, send out an ack.
if (keypair->incoming_packet_count >= 16) { if ((uint32)(keypair->incoming_packet_count - keypair->send_ack_ctr) >= 16) {
keypair->incoming_packet_count = 0; keypair->send_ack_ctr = (uint32)keypair->incoming_packet_count;
uint64 next_expected_packet = keypair->replay_detector.expected_seq_nr(); uint64 next_expected_packet = keypair->replay_detector.expected_seq_nr();
if (next_expected_packet < 0x10000) { if (next_expected_packet < 0x10000) {
WriteLE16(write -= 2, (uint16)next_expected_packet); WriteLE16(write -= 2, (uint16)next_expected_packet);
@ -794,7 +799,6 @@ void WireguardProcessor::HandleShortHeaderFormatPacket(uint32 tag, Packet *packe
stats_.compression_wg_saved_in += 16 - (data - packet->data); stats_.compression_wg_saved_in += 16 - (data - packet->data);
keypair->send_ctr_acked = std::max<uint64>(keypair->send_ctr_acked, acked_counter); keypair->send_ctr_acked = std::max<uint64>(keypair->send_ctr_acked, acked_counter);
keypair->incoming_packet_count++;
WgPeer::CopyEndpointToPeer_Locked(keypair, &packet->addr); WgPeer::CopyEndpointToPeer_Locked(keypair, &packet->addr);
@ -836,6 +840,9 @@ void WireguardProcessor::HandleAuthenticatedDataPacket_WillUnlock(WgKeypair *key
WgPeer *peer = keypair->peer; WgPeer *peer = keypair->peer;
assert(peer->IsPeerLocked()); assert(peer->IsPeerLocked());
// Remember how many incoming packets we've seen so we can approximate loss
keypair->incoming_packet_count++;
// Promote the next key to the current key when we receive a data packet, // Promote the next key to the current key when we receive a data packet,
// the handshake is now complete. // the handshake is now complete.
if (peer->CheckSwitchToNextKey_Locked(keypair)) { if (peer->CheckSwitchToNextKey_Locked(keypair)) {

View file

@ -44,6 +44,12 @@ struct WgProcessorStats {
// Address of the endpoint // Address of the endpoint
IpAddr endpoint; IpAddr endpoint;
// For lost packets calculation, the total # of incoming packets
uint64 lost_packets_valid;
// For lost packets calculation, the total # of incoming packets according to seqnr
uint64 lost_packets_tot;
uint8 endpoint_protocol; uint8 endpoint_protocol;
}; };

View file

@ -704,18 +704,19 @@ struct WgKeypair {
// Cipher suite // Cipher suite
uint8 cipher_suite; uint8 cipher_suite;
// Used so we know when to send out ack packets.
uint32 incoming_packet_count;
// Id of the key in my map. (MainThread) // Id of the key in my map. (MainThread)
uint32 local_key_id; uint32 local_key_id;
// Id of the key in their map // Id of the key in their map
uint32 remote_key_id; uint32 remote_key_id;
// Used to send out acks.
uint32 send_ack_ctr;
// The timestamp of when the key was created, to be able to expire it // The timestamp of when the key was created, to be able to expire it
uint64 key_timestamp; uint64 key_timestamp;
// The highest acked send_ctr value // The highest acked send_ctr value
uint64 send_ctr_acked; uint64 send_ctr_acked;
// Used to detect incoming packet loss
uint64 incoming_packet_count;
// Counter value for chacha20 for outgoing packets // Counter value for chacha20 for outgoing packets
uint64 send_ctr; uint64 send_ctr;
// The key used for chacha20 encryption // The key used for chacha20 encryption