diff options
-rw-r--r-- | libtransport/src/hicn/transport/protocols/rtc.cc | 71 | ||||
-rw-r--r-- | libtransport/src/hicn/transport/protocols/rtc.h | 4 |
2 files changed, 44 insertions, 31 deletions
diff --git a/libtransport/src/hicn/transport/protocols/rtc.cc b/libtransport/src/hicn/transport/protocols/rtc.cc index f52494aba..1a3511003 100644 --- a/libtransport/src/hicn/transport/protocols/rtc.cc +++ b/libtransport/src/hicn/transport/protocols/rtc.cc @@ -34,6 +34,7 @@ RTCTransportProtocol::RTCTransportProtocol( rtx_timer_ = std::make_unique<asio::steady_timer>(portal_->getIoService()); probe_timer_ = std::make_unique<asio::steady_timer>(portal_->getIoService()); sentinel_timer_ = std::make_unique<asio::steady_timer>(portal_->getIoService()); + round_timer_ = std::make_unique<asio::steady_timer>(portal_->getIoService()); reset(); } @@ -45,6 +46,8 @@ RTCTransportProtocol::~RTCTransportProtocol() { int RTCTransportProtocol::start() { probeRtt(); + sentinelTimer(); + newRound(); return TransportProtocol::start(); } @@ -60,10 +63,11 @@ void RTCTransportProtocol::resume() { is_running_ = true; - lastRoundBegin_ = std::chrono::steady_clock::now(); inflightInterestsCount_ = 0; probeRtt(); + sentinelTimer(); + newRound(); scheduleNextInterests(); portal_->runEventsLoop(); @@ -75,7 +79,6 @@ void RTCTransportProtocol::resume() { void RTCTransportProtocol::reset() { portal_->setConsumerCallback(this); // controller var - lastRoundBegin_ = std::chrono::steady_clock::now(); currentState_ = HICN_RTC_SYNC_STATE; // cwin var @@ -143,15 +146,14 @@ uint32_t min(uint32_t a, uint32_t b) { return b; } -void RTCTransportProtocol::checkRound() { - uint32_t duration = - (uint32_t)std::chrono::duration_cast<std::chrono::milliseconds>( - std::chrono::steady_clock::now() - lastRoundBegin_) - .count(); - if (duration >= HICN_ROUND_LEN) { - lastRoundBegin_ = std::chrono::steady_clock::now(); - updateStats(duration); // update stats and window - } +void RTCTransportProtocol::newRound() { + round_timer_->expires_from_now(std::chrono::milliseconds( + HICN_ROUND_LEN)); + round_timer_->async_wait([this](std::error_code ec) { + if (ec) return; + updateStats(HICN_ROUND_LEN); + newRound(); + }); } void RTCTransportProtocol::updateDelayStats( @@ -231,11 +233,6 @@ void RTCTransportProtocol::updateStats(uint32_t round_duration) { pathTable_.find(producerPathLabels_[1]) == pathTable_.end()) return; // this should not happen - //set sentinel timer if needed - if(rounds_ == 0){ - sentinelTimer(); - } - // as a queuing delay we keep the lowest one among the two paths // if one path is congested the forwarder should decide to do not // use it so it does not make sense to inform the application @@ -449,7 +446,6 @@ void RTCTransportProtocol::sendInterest(Name *interest_name, bool rtx) { } void RTCTransportProtocol::scheduleNextInterests() { - checkRound(); if (!is_running_ && !is_first_) return; while (inflightInterestsCount_ < currentCWin_) { @@ -505,29 +501,47 @@ void RTCTransportProtocol::scheduleNextInterests() { actualSegment_ = (actualSegment_ + 1) % HICN_MIN_PROBE_SEQ; sendInterest(interest_name, false); - checkRound(); } } void RTCTransportProtocol::sentinelTimer(){ - uint32_t wait = 1; - if(pathTable_.find(producerPathLabels_[0]) != pathTable_.end()){ - wait = round( - pathTable_[producerPathLabels_[0]]->getInterArrivalGap()); + uint32_t wait = 10; + + if(pathTable_.find(producerPathLabels_[0]) != pathTable_.end() && + pathTable_.find(producerPathLabels_[1]) != pathTable_.end()){ + //we have all the info to set the timers + wait = round(pathTable_[producerPathLabels_[0]]->getInterArrivalGap()); + if(wait == 0) + wait = 1; } - if(wait == 0) - wait = 1; sentinel_timer_->expires_from_now(std::chrono::milliseconds(wait)); sentinel_timer_->async_wait([this](std::error_code ec) { + if (ec) return; - uint64_t now = std::chrono::duration_cast<std::chrono::milliseconds>( + + uint64_t now = std::chrono::duration_cast<std::chrono::milliseconds>( std::chrono::steady_clock::now().time_since_epoch()) .count(); - if(pathTable_.find(producerPathLabels_[0]) != pathTable_.end() || - pathTable_.find(producerPathLabels_[1]) != pathTable_.end()){ + if(pathTable_.find(producerPathLabels_[0]) == pathTable_.end() || + pathTable_.find(producerPathLabels_[1]) == pathTable_.end()){ + //we have no info, so we send again + for(auto it = packets_in_window_.begin(); + it != packets_in_window_.end(); it++){ + uint32_t pkt = it->first & modMask_; + if (inflightInterests_[pkt].sequence == it->first) { + inflightInterests_[pkt].transmissionTime = now; + Name *interest_name = nullptr; + socket_->getSocketOption(GeneralTransportOptions::NETWORK_NAME, + &interest_name); + interest_name->setSuffix(it->first); + it->second++; + sendInterest(interest_name, true); + } + } + }else{ uint64_t max_waiting_time = round((pathTable_[producerPathLabels_[1]]->getMinRtt() - pathTable_[producerPathLabels_[0]]->getMinRtt()) + @@ -554,12 +568,11 @@ void RTCTransportProtocol::sentinelTimer(){ } } } - }//esle not enough info to resend the packet, schedule the timer agian + } sentinelTimer(); }); } - void RTCTransportProtocol::addRetransmissions(uint32_t val) { // add only val in the rtx list addRetransmissions(val, val + 1); diff --git a/libtransport/src/hicn/transport/protocols/rtc.h b/libtransport/src/hicn/transport/protocols/rtc.h index 908be017a..46063d041 100644 --- a/libtransport/src/hicn/transport/protocols/rtc.h +++ b/libtransport/src/hicn/transport/protocols/rtc.h @@ -108,7 +108,6 @@ class RTCTransportProtocol : public TransportProtocol, public Reassembly { private: // algo functions void reset() override; - void checkRound(); // CC functions void updateDelayStats(const ContentObject &content_object); @@ -129,6 +128,7 @@ class RTCTransportProtocol : public TransportProtocol, public Reassembly { uint64_t retransmit(); void checkRtx(); void probeRtt(); + void newRound(); void onTimeout(Interest::Ptr &&interest) override; bool onNack(const ContentObject &content_object, bool rtx); void onContentObject(Interest::Ptr &&interest, @@ -141,7 +141,7 @@ class RTCTransportProtocol : public TransportProtocol, public Reassembly { } // controller var - std::chrono::steady_clock::time_point lastRoundBegin_; + std::unique_ptr<asio::steady_timer> round_timer_; unsigned currentState_; // cwin var |