perror("sendto");
return;
}
+
+ ++sent_packets;
}
int GREProtocol::fd() const
//printf("gre packet: proto=%x\n", ntohs(gre->protocol_type));
+ ++received_packets;
sender->send_packet(ntohs(gre->protocol_type), string(ptr, buf + ret), seq);
}
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)
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;
}
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;
+ }
}
}
}
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);
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)
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;
});
}
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;
Sender *sender;
std::map<int, RSGroup> rs_groups;
fecpp::fec_code rs;
+
+ int num_recovered_packets = 0;
};
#endif /* !defined(_RSDECODER_H) */
#include "tunprotocol.h"
#include "rsdecoder.h"
#include "pacer.h"
+#include "timeutil.h"
using namespace std;
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 ( ;; ) {
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;
+ }
}
}
perror("write");
return;
}
+
+ ++sent_packets;
}
int TUNProtocol::fd() const
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++);
}
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)