Display packet loss
This commit is contained in:
parent
5c29201cd8
commit
09fa28ea4d
4 changed files with 27 additions and 6 deletions
|
@ -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 "";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)) {
|
||||||
|
|
|
@ -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;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -705,17 +705,18 @@ 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
|
||||||
|
|
Loading…
Reference in a new issue