17 #include <hicn/transport/config.h>
18 #include <hicn/transport/core/asio_wrapper.h>
19 #include <hicn/transport/core/content_object.h>
20 #include <hicn/transport/core/name.h>
21 #include <protocols/indexer.h>
22 #include <protocols/rtc/rtc_consts.h>
23 #include <protocols/rtc/rtc_state.h>
27 #include <unordered_map>
36 :
public std::enable_shared_from_this<RTCLossDetectionAndRecovery> {
43 using rtxState =
struct rtx_state_;
44 using SendRtxCallback = std::function<void(uint32_t)>;
48 asio::io_service &io_service);
52 void setState(std::shared_ptr<RTCState> state) { state_ = state; }
53 void setFecParams(uint32_t n, uint32_t k) {
59 bool isRtxOn() {
return rtx_on_; }
61 void onNewRound(
bool in_sync);
62 void onTimeout(uint32_t seq);
63 void onPacketRecoveredFec(uint32_t seq);
70 bool isRtx(uint32_t seq) {
71 if (rtx_state_.find(seq) != rtx_state_.end())
return true;
76 void addToRetransmissions(uint32_t start, uint32_t stop);
77 uint64_t computeNextSend(uint32_t seq,
bool new_rtx);
79 void scheduleNextRtx();
80 bool deleteRtx(uint32_t seq);
81 void scheduleSentinelTimer(uint64_t expires_from_now);
83 uint32_t computeFecPacketsToAsk(
bool in_sync);
86 using namespace std::chrono;
88 duration_cast<milliseconds>(steady_clock::now().time_since_epoch())
97 std::map<uint32_t, rtxState> rtx_state_;
100 std::multimap<uint64_t, uint32_t> rtx_timers_;
103 std::unordered_set<uint32_t> recover_with_fec_;
107 uint64_t next_rtx_timer_;
108 uint64_t last_event_;
109 uint64_t sentinel_timer_interval_;
115 std::unique_ptr<asio::steady_timer> timer_;
116 std::unique_ptr<asio::steady_timer> sentinel_timer_;
117 std::shared_ptr<RTCState> state_;
121 SendRtxCallback send_rtx_callback_;