]> git.sesse.net Git - greproxy/commitdiff
Make tungre output statistics on stderr every 10 seconds.
authorSteinar H. Gunderson <sgunderson@bigfoot.com>
Tue, 10 Feb 2015 23:29:00 +0000 (00:29 +0100)
committerSteinar H. Gunderson <sgunderson@bigfoot.com>
Tue, 10 Feb 2015 23:29:00 +0000 (00:29 +0100)
greprotocol.cpp
greprotocol.h
reorderer.cpp
reorderer.h
rsdecoder.cpp
rsdecoder.h
tungre.cpp
tunprotocol.cpp
tunprotocol.h

index 8a400534a59c52d91343ac7767f1d4247b186c58..d3daa9c829ae9a14c100291405312595f9a63664 100644 (file)
@@ -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);
 }
 
index 739b97e17177a0a3e9936804caf3d45fcadcb5e0..738ec7b195ef620ddbf99db72a8a7dfa609c52f0 100644 (file)
@@ -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)
index e4cafe124416d19b1ae231fce9d201c69d72f7de..697f8189d3a05da187d0fb74ed8149f86f50d19c 100644 (file)
@@ -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;
+                       }
                }
        }
 }
index 622083e0563da0f968161e98654f144cc2666fd1..920c57c50a9af6470190f88ecc5550a38b1eedc0 100644 (file)
@@ -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<GREPacket, std::vector<GREPacket>, std::greater<GREPacket>> packet_buffer;
        std::map<int, int> ccs;
+
+       int num_reorders = 0, num_lost_packets = 0;
 };
 
 #endif  // !defined(_REORDERER_H)
index 14527ca06cea226d9ad0dff1e1a458a0e82564a8..58fa1ac634cd4df294d6a04a4554e1d30fb53028 100644 (file)
@@ -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;
                        });
                }
                
index 8e63aa67a8a7b12b0bd8c708d3d38279f9c20ae6..3b1634db7e63347574788b1cd032b136dc575353 100644 (file)
@@ -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<int, GREPacket> packets;
@@ -23,6 +25,8 @@ private:
        Sender *sender;
        std::map<int, RSGroup> rs_groups;
        fecpp::fec_code rs;
+
+       int num_recovered_packets = 0;
 };
 
 #endif  /* !defined(_RSDECODER_H) */
index fb39982e9f8c216016b9ca2e4784718812497167..5ee81cb131d8c087bcf3a07a48cb11271ed5f3cc 100644 (file)
@@ -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;
+               }
        }
 }
index 7a52362c5482ee8e93a7d0cab04038b9faac2c89..510decf29464d5e9b77b7ec38ff9c291c7a63ab9 100644 (file)
@@ -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++);
 }
 
index d9f40fa4e661c07e43f34b40ea838ec8e6ed70e1..79e528f379904f9b642440fb5328285f79325b7a 100644 (file)
@@ -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)