face: deduplicate received LpPackets with reliability
refs #5079
Change-Id: I19ad959ba736253a750997fa468d419c93425686
diff --git a/daemon/face/generic-link-service.cpp b/daemon/face/generic-link-service.cpp
index 1fecdb6..7e32fc7 100644
--- a/daemon/face/generic-link-service.cpp
+++ b/daemon/face/generic-link-service.cpp
@@ -125,6 +125,14 @@
}
void
+GenericLinkService::assignSequences(std::vector<lp::Packet>& pkts)
+{
+ std::for_each(pkts.begin(), pkts.end(), [this] (lp::Packet& pkt) {
+ pkt.set<lp::SequenceField>(++m_lastSeqNo);
+ });
+}
+
+void
GenericLinkService::encodeLpFields(const ndn::PacketBase& netPkt, lp::Packet& lpPacket)
{
if (m_options.allowLocalFields) {
@@ -200,8 +208,8 @@
BOOST_ASSERT(!frags.front().has<lp::FragCountField>());
}
- // Only assign sequences to fragments if packet contains more than 1 fragment
- if (frags.size() > 1) {
+ // Only assign sequences to fragments if reliability enabled or if packet contains >1 fragment
+ if (m_options.reliabilityOptions.isEnabled || frags.size() > 1) {
// Assign sequences to all fragments
this->assignSequences(frags);
}
@@ -216,18 +224,6 @@
}
void
-GenericLinkService::assignSequence(lp::Packet& pkt)
-{
- pkt.set<lp::SequenceField>(++m_lastSeqNo);
-}
-
-void
-GenericLinkService::assignSequences(std::vector<lp::Packet>& pkts)
-{
- std::for_each(pkts.begin(), pkts.end(), [this] (auto& pkt) { this->assignSequence(pkt); });
-}
-
-void
GenericLinkService::checkCongestionLevel(lp::Packet& pkt)
{
ssize_t sendQueueLength = getTransport()->getSendQueueLength();
@@ -279,7 +275,11 @@
lp::Packet pkt(packet);
if (m_options.reliabilityOptions.isEnabled) {
- m_reliability.processIncomingPacket(pkt);
+ if (!m_reliability.processIncomingPacket(pkt)) {
+ NFD_LOG_FACE_TRACE("received duplicate fragment: DROP");
+ ++this->nDuplicateSequence;
+ return;
+ }
}
if (!pkt.has<lp::FragmentField>()) {