diff options
author | michele papalini <micpapal@cisco.com> | 2019-10-31 13:19:08 +0100 |
---|---|---|
committer | michele papalini <micpapal@cisco.com> | 2019-10-31 13:19:08 +0100 |
commit | 8259480129f8911e7c4085dea9876c61bc59314f (patch) | |
tree | ff88c63f95048f6c7c1a693e0c266074161d1393 | |
parent | af6553e2bea9dc7210fa11c7b7b0473e0c59de3d (diff) |
[HICN-361] speed up the socket start up
Signed-off-by: michele papalini <micpapal@cisco.com>
Change-Id: Id8f59c9c52d7c1fa21edbae9ee1b965b25fe6800
-rw-r--r-- | libtransport/src/hicn/transport/protocols/rtc.cc | 47 |
1 files changed, 31 insertions, 16 deletions
diff --git a/libtransport/src/hicn/transport/protocols/rtc.cc b/libtransport/src/hicn/transport/protocols/rtc.cc index 3edd90725..1a3511003 100644 --- a/libtransport/src/hicn/transport/protocols/rtc.cc +++ b/libtransport/src/hicn/transport/protocols/rtc.cc @@ -46,6 +46,7 @@ RTCTransportProtocol::~RTCTransportProtocol() { int RTCTransportProtocol::start() { probeRtt(); + sentinelTimer(); newRound(); return TransportProtocol::start(); } @@ -65,6 +66,7 @@ void RTCTransportProtocol::resume() { inflightInterestsCount_ = 0; probeRtt(); + sentinelTimer(); newRound(); scheduleNextInterests(); @@ -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 @@ -508,24 +505,43 @@ void RTCTransportProtocol::scheduleNextInterests() { } 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()) + @@ -552,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); |