]> git.sesse.net Git - greproxy/blob - reorderer.h
Merge branch 'master' of /srv/git.sesse.net/www/greproxy
[greproxy] / reorderer.h
1 #ifndef _REORDERER_H
2 #define _REORDERER_H 1
3
4 #include <assert.h>
5 #include <stdint.h>
6 #include <sys/time.h>
7
8 #include <algorithm>
9 #include <map>
10 #include <queue>
11 #include <string>
12 #include <vector>
13
14 #include "protocol.h"
15
16 struct GREPacket {
17         uint32_t seq;
18         uint16_t proto;
19         std::string data;
20         timeval ts;
21
22         bool operator> (const GREPacket &other) const {
23                 return seq > other.seq;
24         }
25 };
26
27 class Reorderer : public Sender {
28 public:
29         Reorderer(Sender* sender);
30         void send_packet(uint16_t proto, const std::string& data, uint32_t seq);
31         void possibly_adjust_tv(timeval *tv);
32
33         int get_reorders() const { return num_reorders; }
34         int get_lost_packets() const { return num_lost_packets; }
35         int get_ts_discontinuities() const { return num_ts_discontinuities; }
36
37 private:
38         void check_ts_discontinuity(uint16_t proto, const std::string &data, bool silence);
39
40         Sender* sender;
41         int last_seq;
42         timeval last_sent_packet;
43
44         std::priority_queue<GREPacket, std::vector<GREPacket>, std::greater<GREPacket>> packet_buffer;
45         std::map<int, int> ccs;
46
47         int num_reorders = 0, num_lost_packets = 0, num_ts_discontinuities = 0;
48 };
49
50 #endif  // !defined(_REORDERER_H)