For duplicate interests keep incoming face !!! Need more thinking
diff --git a/model/ccnx-l3-protocol.cc b/model/ccnx-l3-protocol.cc
index c06e0cf..d216b4f 100644
--- a/model/ccnx-l3-protocol.cc
+++ b/model/ccnx-l3-protocol.cc
@@ -172,6 +172,13 @@
return m_forwardingStrategy;
}
+Ptr<CcnxPit>
+CcnxL3Protocol::GetPit () const
+{
+ return m_pit;
+}
+
+
uint32_t
CcnxL3Protocol::AddFace (const Ptr<CcnxFace> &face)
{
@@ -397,7 +404,6 @@
Ptr<CcnxInterestHeader> &header,
const Ptr<const Packet> &packet)
{
- NS_LOG_FUNCTION (incomingFace << header << packet << header->GetName ());
m_inInterests (header, incomingFace);
// NS_LOG_DEBUG (*m_pit);
@@ -409,8 +415,43 @@
// NS_LOG_DEBUG ("isNew: " << isNew << ", isDup: " << isDuplicated);
+ NS_LOG_FUNCTION (header->GetName () << header->GetNonce () << boost::cref (*incomingFace) << isDuplicated);
+
+ /////////////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////////////////
+ // //
+ // !!!! IMPORTANT CHANGE !!!! Duplicate interests will create incoming face entry !!!! //
+ // //
+ /////////////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////////////////
+ /////////////////////////////////////////////////////////////////////////////////////////
+
+ // Data is not in cache
+ CcnxPitEntryIncomingFaceContainer::type::iterator inFace = pitEntry.m_incoming.find (incomingFace);
+ CcnxPitEntryOutgoingFaceContainer::type::iterator outFace = pitEntry.m_outgoing.find (incomingFace);
+
+ bool isRetransmitted = false;
+
+ if (inFace != pitEntry.m_incoming.end ())
+ {
+ // CcnxPitEntryIncomingFace.m_arrivalTime keeps track arrival time of the first packet... why?
+
+ isRetransmitted = true;
+ // this is almost definitely a retransmission. But should we trust the user on that?
+ }
+ else
+ {
+ m_pit->modify (m_pit->iterator_to (pitEntry),
+ ll::var(inFace) = ll::bind (&CcnxPitEntry::AddIncoming, ll::_1, incomingFace));
+ }
+ //////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////////
+ //////////////////////////////////////////////////////////////////////////////////
+
if (isDuplicated)
{
+ NS_LOG_DEBUG ("Received duplicatie interest on " << *incomingFace);
m_dropInterests (header, DUPLICATED, incomingFace);
/**
@@ -439,45 +480,13 @@
tie (contentObject, contentObjectHeader, payload) = m_contentStore->Lookup (header);
if (contentObject != 0)
{
- NS_ASSERT (contentObjectHeader != 0);
-
+ NS_ASSERT (contentObjectHeader != 0);
NS_LOG_LOGIC("Found in cache");
-
- incomingFace->Send (contentObject);
- m_outData (contentObjectHeader, payload, true, incomingFace);
- // Set pruning timout on PIT entry (instead of deleting the record)
- m_pit->modify (m_pit->iterator_to (pitEntry),
- bind (&CcnxPitEntry::SetExpireTime, ll::_1,
- Simulator::Now () + m_pit->GetPitEntryPruningTimeout ()));
-
+ OnDataDelayed (contentObjectHeader, contentObject, payload);
return;
}
- // \todo Detect retransmissions. Not yet sure how...
-
- // Data is not in cache
- CcnxPitEntryIncomingFaceContainer::type::iterator inFace = pitEntry.m_incoming.find (incomingFace);
- CcnxPitEntryOutgoingFaceContainer::type::iterator outFace = pitEntry.m_outgoing.find (incomingFace);
-
- bool isRetransmitted = false;
-
- if (inFace != pitEntry.m_incoming.end ())
- {
- // CcnxPitEntryIncomingFace.m_arrivalTime keeps track arrival time of the first packet... why?
-
- isRetransmitted = true;
- // this is almost definitely a retransmission. But should we trust the user on that?
- }
- else
- {
- m_pit->modify (m_pit->iterator_to (pitEntry),
- ll::var(inFace) = ll::bind (&CcnxPitEntry::AddIncoming, ll::_1, incomingFace));
- }
-
- // NS_LOG_DEBUG ("IsRetx: " << isRetransmitted);
- // NS_LOG_DEBUG (*m_pit);
-
// update PIT entry lifetime
m_pit->modify (m_pit->iterator_to (pitEntry),
ll::bind (&CcnxPitEntry::UpdateLifetime, ll::_1,
@@ -539,8 +548,8 @@
}
void
-CcnxL3Protocol::OnDataDelayed (Ptr<CcnxContentObjectHeader> header,
- Ptr<Packet> payload,
+CcnxL3Protocol::OnDataDelayed (Ptr<const CcnxContentObjectHeader> header,
+ Ptr<const Packet> payload,
const Ptr<const Packet> &packet)
{
if (m_delayingDataProcessing)