From 3bcabb4fd4764b0804b8b44cb967edf7369cc714 Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 11 Feb 2015 00:29:00 +0100 Subject: [PATCH] Make tungre output statistics on stderr every 10 seconds. --- greprotocol.cpp | 3 +++ greprotocol.h | 5 +++++ reorderer.cpp | 11 ++++++++--- reorderer.h | 5 +++++ rsdecoder.cpp | 2 +- rsdecoder.h | 4 ++++ tungre.cpp | 31 +++++++++++++++++++++++++++++++ tunprotocol.cpp | 3 +++ tunprotocol.h | 5 +++++ 9 files changed, 65 insertions(+), 4 deletions(-) diff --git a/greprotocol.cpp b/greprotocol.cpp index 8a40053..d3daa9c 100644 --- a/greprotocol.cpp +++ b/greprotocol.cpp @@ -72,6 +72,8 @@ void GREProtocol::send_packet(uint16_t proto, const string &data, int incoming_s perror("sendto"); return; } + + ++sent_packets; } int GREProtocol::fd() const @@ -114,6 +116,7 @@ void GREProtocol::read_packet(Sender *sender) //printf("gre packet: proto=%x\n", ntohs(gre->protocol_type)); + ++received_packets; sender->send_packet(ntohs(gre->protocol_type), string(ptr, buf + ret), seq); } diff --git a/greprotocol.h b/greprotocol.h index 739b97e..738ec7b 100644 --- a/greprotocol.h +++ b/greprotocol.h @@ -15,9 +15,14 @@ public: virtual int fd() const; virtual void read_packet(Sender* sender); + int get_received_packets() const { return received_packets; } + int get_sent_packets() const { return sent_packets; } + private: int sock; sockaddr_in6 dstaddr; + + int received_packets = 0, sent_packets = 0; }; #endif // !defined(_GREPROTOCOL_H) diff --git a/reorderer.cpp b/reorderer.cpp index e4cafe1..697f818 100644 --- a/reorderer.cpp +++ b/reorderer.cpp @@ -40,12 +40,14 @@ void Reorderer::send_packet(uint16_t proto, const string& data, int seq) printf("Gave up waiting for packets [%d,%d> (buffer full)\n", last_seq + 1, packet_buffer.top().seq); silence = true; + num_lost_packets += packet_buffer.top().seq - (last_seq + 1); last_seq = packet_buffer.top().seq - 1; } else if (!packet_buffer.empty() && tdiff(packet_buffer.top().ts, now) > TIMEOUT_SEC) { printf("Gave up waiting for packets [%d,%d> (timeout)\n", last_seq + 1, packet_buffer.top().seq); silence = true; + num_lost_packets += packet_buffer.top().seq - (last_seq + 1); last_seq = packet_buffer.top().seq - 1; } @@ -84,9 +86,12 @@ void Reorderer::send_packet(uint16_t proto, const string& data, int seq) packet_buffer.pop(); last_seq = front_seq; last_sent_packet = now; - if (!silence && !packet_buffer.empty()) { - printf("Reordering with packet buffer size %d: seq=%d new_front_seq=%d\n", int(packet_buffer.size()), front_seq, packet_buffer.top().seq); - silence = true; + if (!packet_buffer.empty()) { + ++num_reorders; + if (!silence) { + printf("Reordering with packet buffer size %d: seq=%d new_front_seq=%d\n", int(packet_buffer.size()), front_seq, packet_buffer.top().seq); + silence = true; + } } } } diff --git a/reorderer.h b/reorderer.h index 622083e..920c57c 100644 --- a/reorderer.h +++ b/reorderer.h @@ -30,6 +30,9 @@ public: void send_packet(uint16_t proto, const std::string& data, int seq); void possibly_adjust_tv(timeval *tv); + int get_reorders() const { return num_reorders; } + int get_lost_packets() const { return num_lost_packets; } + private: void check_ts_discontinuity(uint16_t proto, const std::string &data, bool silence); @@ -39,6 +42,8 @@ private: std::priority_queue, std::greater> packet_buffer; std::map ccs; + + int num_reorders = 0, num_lost_packets = 0; }; #endif // !defined(_REORDERER_H) diff --git a/rsdecoder.cpp b/rsdecoder.cpp index 14527ca..58fa1ac 100644 --- a/rsdecoder.cpp +++ b/rsdecoder.cpp @@ -124,7 +124,7 @@ void RSDecoder::send_packet(uint16_t proto, const std::string &data, int incomin printf("Reconstructed packet %d (proto=0x%04x len=%d, data=%02x %02x %02x %02x %02x %02x %02x %02x)\n", packet_num, ntohs(proto_be), ntohs(len_be), ptr[0], ptr[1], ptr[2], ptr[3], ptr[4], ptr[5], ptr[6], ptr[7]); - + ++num_recovered_packets; }); } diff --git a/rsdecoder.h b/rsdecoder.h index 8e63aa6..3b1634d 100644 --- a/rsdecoder.h +++ b/rsdecoder.h @@ -15,6 +15,8 @@ public: RSDecoder(Sender *sender); virtual void send_packet(uint16_t proto, const std::string &data, int incoming_seq); + int get_recovered_packets() const { return num_recovered_packets; } + private: struct RSGroup { std::map packets; @@ -23,6 +25,8 @@ private: Sender *sender; std::map rs_groups; fecpp::fec_code rs; + + int num_recovered_packets = 0; }; #endif /* !defined(_RSDECODER_H) */ diff --git a/tungre.cpp b/tungre.cpp index fb39982..5ee81cb 100644 --- a/tungre.cpp +++ b/tungre.cpp @@ -10,6 +10,7 @@ #include "tunprotocol.h" #include "rsdecoder.h" #include "pacer.h" +#include "timeutil.h" using namespace std; @@ -34,6 +35,13 @@ int main(int argc, char **argv) Reorderer tun_reorderer(&tun_pacer); RSDecoder tun_decoder(&tun_reorderer); + int last_rcvd = 0, last_reorders = 0; + int last_fec_recovered = 0, last_lost = 0; + int last_output = 0; + int last_sent = 0; + timeval last_print; + gettimeofday(&last_print, NULL); + fd_set fds; FD_ZERO(&fds); for ( ;; ) { @@ -55,5 +63,28 @@ int main(int argc, char **argv) tun.read_packet(&gre_pacer); } tun_pacer.possibly_flush_packets(); + + timeval now; + gettimeofday(&now, NULL); + + if (tdiff(last_print, now) > 10.0) { + int rcvd = gre.get_received_packets(); + int fec_recovered = tun_decoder.get_recovered_packets(); + int reorders = tun_reorderer.get_reorders(); + int lost = tun_reorderer.get_lost_packets(); + int output = tun.get_sent_packets(); + int sent = gre.get_sent_packets(); + fprintf(stderr, "%5dp rcvd, %3dp FEC recovered, %4d reorders, %3dp lost, %5dp output. %5dp sent\n", + rcvd - last_rcvd, fec_recovered - last_fec_recovered, + reorders - last_reorders, lost - last_lost, + output - last_output, sent - last_sent); + last_rcvd = rcvd; + last_fec_recovered = fec_recovered; + last_reorders = reorders; + last_lost = lost; + last_output = output; + last_sent = sent; + last_print = now; + } } } diff --git a/tunprotocol.cpp b/tunprotocol.cpp index 7a52362..510decf 100644 --- a/tunprotocol.cpp +++ b/tunprotocol.cpp @@ -62,6 +62,8 @@ void TUNProtocol::send_packet(uint16_t proto, const string &data, int incoming_s perror("write"); return; } + + ++sent_packets; } int TUNProtocol::fd() const @@ -89,6 +91,7 @@ void TUNProtocol::read_packet(Sender *sender) ptr += 2; //fprintf(stderr, "tun packet: flags=%x proto=%x len=%d\n", // flags, proto, ret - 4); + ++received_packets; sender->send_packet(proto, string(ptr, buf + ret), seq++); } diff --git a/tunprotocol.h b/tunprotocol.h index d9f40fa..79e528f 100644 --- a/tunprotocol.h +++ b/tunprotocol.h @@ -13,9 +13,14 @@ public: virtual int fd() const; virtual void read_packet(Sender* sender); + int get_received_packets() const { return received_packets; } + int get_sent_packets() const { return sent_packets; } + private: int tunfd; int seq; + + int received_packets = 0, sent_packets = 0; }; #endif // !defined(_TUNPROTOCOL_H) -- 2.39.2