diff options
author | michele papalini <micpapal@cisco.com> | 2019-04-04 18:05:16 +0200 |
---|---|---|
committer | michele papalini <micpapal@cisco.com> | 2019-04-04 18:05:16 +0200 |
commit | 9307374bf9dbf3805d97d90ffd04d7f41f2c61a0 (patch) | |
tree | 003cdca34e7ac9b9360be2053735292b5108dbce | |
parent | 805cfe7b075b4f906a4646211b5aa29a993cb16f (diff) |
[HICN-170] do not send interests for already received content
Change-Id: I87c9c0a0b556263582f451e73cb22091cdc0919a
Signed-off-by: michele papalini <micpapal@cisco.com>
-rw-r--r-- | libtransport/src/hicn/transport/protocols/rtc.cc | 47 | ||||
-rw-r--r-- | libtransport/src/hicn/transport/protocols/rtc.h | 10 |
2 files changed, 46 insertions, 11 deletions
diff --git a/libtransport/src/hicn/transport/protocols/rtc.cc b/libtransport/src/hicn/transport/protocols/rtc.cc index 13c688d00..882508b41 100644 --- a/libtransport/src/hicn/transport/protocols/rtc.cc +++ b/libtransport/src/hicn/transport/protocols/rtc.cc @@ -106,6 +106,7 @@ void RTCTransportProtocol::reset() { inflightInterestsCount_ = 0; while (interestRetransmissions_.size() != 0) interestRetransmissions_.pop(); lastSegNacked_ = 0; + lastReceived_ = 0; nackedByProducer_.clear(); nackedByProducerMaxSize_ = 512; @@ -364,6 +365,8 @@ void RTCTransportProtocol::sendInterest() { } inflightInterests_[pkt].transmissionTime = 0; + inflightInterests_[pkt].received = 0; + inflightInterests_[pkt].sequence = rtxSeg; isRTX = true; } else { // in this case we send the packet only if it is not pending yet @@ -372,14 +375,23 @@ void RTCTransportProtocol::sendInterest() { actualSegment_++; return; } + uint32_t pkt = actualSegment_ & modMask_; + + //if we already reacevied the content we don't ask it again + if(inflightInterests_[pkt].received == 1 && + inflightInterests_[pkt].sequence == actualSegment_) { + actualSegment_++; + return; + } // sentInt = actualSegment_; - uint32_t pkt = actualSegment_ & modMask_; inflightInterests_[pkt].transmissionTime = std::chrono::duration_cast<std::chrono::milliseconds>( std::chrono::steady_clock::now().time_since_epoch()) .count(); inflightInterests_[pkt].retransmissions = 0; + inflightInterests_[pkt].received = 0; + inflightInterests_[pkt].sequence = actualSegment_; actualSegment_++; } @@ -452,7 +464,8 @@ void RTCTransportProtocol::onTimeout(Interest::Ptr &&interest) { } if (inflightInterests_[pkt].retransmissions < HICN_MAX_RTX && - lastSegNacked_ <= segmentNumber) { + lastSegNacked_ <= segmentNumber && + actualSegment_ < segmentNumber) { interestRetransmissions_.push(segmentNumber); } @@ -495,7 +508,6 @@ void RTCTransportProtocol::onNack(const ContentObject &content_object) { uint32_t productionRate = *(++payload); uint32_t nackSegment = content_object.getName().getSuffix(); - gotNack_ = true; // we synch the estimated production rate with the actual one estimatedBw_ = (double)productionRate; @@ -521,13 +533,30 @@ void RTCTransportProtocol::onNack(const ContentObject &content_object) { // we are asking stuff in the future gotFutureNack_++; - actualSegment_ = productionSeg + 1; + if(lastReceived_ > productionSeg){ + //if this happens the producer socket was restarted + //we erase all the inflight + timeout state (only for the first NACK) + if(gotFutureNack_ == 1){ + while (interestRetransmissions_.size() != 0) + interestRetransmissions_.pop(); + for (uint32_t i = 0; i < inflightInterests_.size(); i++){ + inflightInterests_[i].transmissionTime = 0; + inflightInterests_[i].sequence = 0; + inflightInterests_[i].retransmissions = 0; + inflightInterests_[i].received = 0; + } + } + actualSegment_ = productionSeg + 1; + //we can't say much abouit the window, so keep it as it is + }else{ + actualSegment_ = productionSeg + 1; - computeMaxWindow(productionRate, 0); - decreaseWindow(); + computeMaxWindow(productionRate, 0); + decreaseWindow(); - if (currentState_ == HICN_RTC_SYNC_STATE) { - currentState_ = HICN_RTC_NORMAL_STATE; + if (currentState_ == HICN_RTC_SYNC_STATE) { + currentState_ = HICN_RTC_NORMAL_STATE; + } } } // equal should not happen } @@ -582,6 +611,8 @@ void RTCTransportProtocol::onContentObject( } else { receivedData_++; + inflightInterests_[pkt].received = 1; + lastReceived_ = segmentNumber; avgPacketSize_ = (HICN_ESTIMATED_PACKET_SIZE * avgPacketSize_) + ((1 - HICN_ESTIMATED_PACKET_SIZE) * payload->length()); diff --git a/libtransport/src/hicn/transport/protocols/rtc.h b/libtransport/src/hicn/transport/protocols/rtc.h index 51a288574..227f1d737 100644 --- a/libtransport/src/hicn/transport/protocols/rtc.h +++ b/libtransport/src/hicn/transport/protocols/rtc.h @@ -84,7 +84,9 @@ namespace protocol { struct sentInterest { uint64_t transmissionTime; + uint32_t sequence; //sequence number of the interest sent uint8_t retransmissions; + uint8_t received; //1 = received, 0 = not received }; class RTCTransportProtocol : public TransportProtocol, public Reassembly { @@ -160,9 +162,11 @@ class RTCTransportProtocol : public TransportProtocol, public Reassembly { uint32_t inflightInterestsCount_; std::queue<uint32_t> interestRetransmissions_; std::vector<sentInterest> inflightInterests_; - uint32_t lastSegNacked_; //indicates the last segment id in a past Nack. - //we do not ask for retransmissions for samething - //that is older than this value. + uint32_t lastSegNacked_; //indicates the segment id in the last received + // past Nack. we do not ask for retransmissions + //for samething that is older than this value. + uint32_t lastReceived_; //segment of the last content object received + //indicates the base of the window on the client uint32_t nackedByProducerMaxSize_; std::set<uint32_t> nackedByProducer_; // this is used to avoid retransmissions from the |