GetPrefix was added to Producer app
diff --git a/apps/ccnx-producer.cc b/apps/ccnx-producer.cc
index 7e0757a..d320a2d 100644
--- a/apps/ccnx-producer.cc
+++ b/apps/ccnx-producer.cc
@@ -34,44 +34,18 @@
static TypeId tid = TypeId ("ns3::CcnxProducer")
.SetParent<Application> ()
.AddConstructor<CcnxProducer> ()
- // Alex: this is incorrect. SetNode call is not called if face is created using this accessor
- // .AddAttribute ("Face","Local face to be used",
- // PointerValue (CreateObject<CcnxLocalFace> ()),
- // MakePointerAccessor (&CcnxProducer::m_face),
- // MakePointerChecker<CcnxLocalFace> ())
- .AddAttribute ("Ccnx","Ccnx is needed to access ContentStore",
- PointerValue (NULL),
- MakePointerAccessor (&CcnxProducer::m_ccnx),
- MakePointerChecker<Ccnx> ())
-
- /*.AddAttribute ("InterestName","CcnxName of the Interest (use CcnxNameComponents)",
- PointerValue (CreateObject<CcnxNameComponents> ()),
- MakePointerAccessor (&CcnxConsumer::m_interestName),
- MakePointerChecker<CcnxNameComponents> ())
- .AddAttribute ("LifeTime", "LifeTime fo interest packet",
- TimeValue (Seconds (4.0)),
- MakeTimeAccessor (&CcnxConsumer::m_interestLifeTime),
- MakeTimeChecker ())
- .AddAttribute ("MinSuffixComponents", "MinSuffixComponents",
- IntegerValue(-1),
- MakeIntegerAccessor(&CcnxConsumer::m_minSuffixComponents),
- MakeIntegerChecker<int32_t>())
- .AddAttribute ("MaxSuffixComponents", "MaxSuffixComponents",
- IntegerValue(-1),
- MakeIntegerAccessor(&CcnxConsumer::m_maxSuffixComponents),
- MakeIntegerChecker<int32_t>())
- .AddAttribute ("ChildSelector", "ChildSelector",
- BooleanValue(false),
- MakeBooleanAccessor(&CcnxConsumer::m_childSelector),
- MakeBooleanChecker())
- .AddAttribute ("Exclude", "only simple name matching is supported (use CcnxNameComponents)",
- PointerValue (CreateObject<CcnxNameComponents> ()),
- MakePointerAccessor (&CcnxConsumer::m_exclude),
- MakePointerChecker<CcnxNameComponents> ())*/
- .AddAttribute ("Capacity", "Capacity of the ContentStore",
+ /*.AddAttribute ("Capacity", "Capacity of the ContentStore",
UintegerValue(100),
MakeUintegerAccessor(&CcnxProducer::m_storeCapacity),
- MakeUintegerChecker<uint32_t>())
+ MakeUintegerChecker<uint32_t>())*/
+ .AddAttribute ("Prefix","Prefix, for which producer has the data",
+ CcnxNameComponentsValue (),
+ MakeCcnxNameComponentsAccessor (&CcnxProducer::m_prefix),
+ MakeCcnxNameComponentsChecker ())
+ .AddAttribute ("PayloadSize", "Virtual payload size for Content packets",
+ UintegerValue(100),
+ MakeUintegerAccessor(&CcnxProducer::m_virtualPayloadSize),
+ MakeUintegerChecker<uint32_t>())
.AddTraceSource ("InterestTrace", "Interests that were received",
MakeTraceSourceAccessor (&CcnxProducer::m_interestsTrace))
.AddTraceSource ("ContentObjectTrace", "ContentObjects that were sent",
@@ -104,15 +78,58 @@
CcnxProducer::StartApplication () // Called at time specified by Start
{
NS_LOG_FUNCTION_NOARGS ();
-// ScheduleNextTx();
+
+ NS_ASSERT_MSG (m_face == 0, "Face should not exist");
+ m_face = Create<CcnxLocalFace> ();
+
+ // step 1. Set up forwarding from face to application
+ m_face->SetNode (GetNode ());
+ m_face->SetInterestHandler (MakeCallback (&CcnxProducer::OnInterest, this));
+
+ // step 2. Set up forwarding to and from ccnx
+ NS_ASSERT_MSG (GetNode ()->GetObject<Ccnx> () !=0,
+ "Ccnx stack should be installed on the node " << GetNode ());
+ GetNode ()->GetObject<Ccnx> ()->AddFace (m_face);
+ //Add (const CcnxNameComponents &prefix, Ptr<CcnxFace> face, int32_t metric);
+ GetNode ()->GetObject<Ccnx> ()->GetObject<CcnxFib> ()->Add(m_prefix, m_face, 0);
+ // step 3. Enable face
+ m_face->SetUp ();
}
void
CcnxProducer::StopApplication () // Called at time specified by Stop
{
NS_LOG_FUNCTION_NOARGS ();
+}
+
+void
+CcnxProducer::OnInterest(const Ptr<const CcnxInterestHeader> &interest)
+{
+ NS_LOG_FUNCTION (this);
+
+
+
+ //Ptr<Packet> data = Lookup (interest);
+
+
+
+ Ptr<Packet> incomingPacket = Create<Packet>(m_virtualPayloadSize);
+ incomingPacket->AddHeader (*interest);
+ m_interestsTrace(m_face,incomingPacket);
+
+
+
+ static CcnxContentObjectTail tail; ///< \internal for optimization purposes
+ Ptr<Packet> outgoingPacket = Create<Packet> (m_virtualPayloadSize);
+ Ptr<CcnxContentObjectHeader> header = Create<CcnxContentObjectHeader>();
+ header->SetName(Create<CcnxNameComponents>(interest->GetName()));
+ outgoingPacket->AddHeader(*header);
+ outgoingPacket->AddTrailer (tail);
+
+ m_contentObjectsTrace(m_face,outgoingPacket);
- CancelEvents ();
+ m_face->ReceiveFromApplication(outgoingPacket);
+
}
void
@@ -122,48 +139,26 @@
// Simulator::Cancel (m_sendEvent);
}
-
-/*void
-CcnxProducer::ScheduleNextTx ()
+
+CcnxNameComponents
+CcnxProducer::GetPrefix() const
{
- NS_LOG_FUNCTION_NOARGS ();
-
- Time nextTime = Seconds(m_offTime);
- m_sendEvent = Simulator::Schedule (nextTime, &CcnxConsumer::SendPacket, this);
- }
- */
+ return m_prefix;
+}
-/*void
-CcnxConsumer::SendPacket ()
- {
- NS_LOG_FUNCTION_NOARGS ();
- NS_LOG_INFO ("Sending Interest at " << Simulator::Now ());
-
- uint32_t randomNonce = UniformVariable().GetInteger(1, std::numeric_limits<uint32_t>::max ());
- CcnxInterestHeader interestHeader;
- interestHeader.SetNonce(randomNonce);
- interestHeader.SetName(m_interestName);
- interestHeader.SetInterestLifetime(m_interestLifeTime);
- interestHeader.SetChildSelector(m_childSelector);
- interestHeader.SetExclude(m_exclude);
- interestHeader.SetMaxSuffixComponents(m_maxSuffixComponents);
- interestHeader.SetMinSuffixComponents(m_minSuffixComponents);
-
- Ptr<Packet> packet = Create<Packet> ();
- packet->AddHeader (interestHeader);
-
- m_face->Receive(packet);
-
- ScheduleNextTx();
- }*/
-
-uint32_t
+/*uint32_t
CcnxProducer::GetStoreCapacity()
{
- return m_storeCapacity;
+ return m_storeCapacity;
}
void
+CcnxProducer::SetStoreCapacity(uint32_t capacity)
+{
+ m_storeCapacity = capacity;
+}
+ */
+/*void
CcnxProducer::HandlePacket(const Ptr<CcnxFace> &face, const Ptr<const Packet> &packet)
{
uint8_t type[2];
@@ -182,11 +177,41 @@
{
m_contentObjectsTrace(face,packet);
}
-}
+}*/
+
+/*Ptr<Packet>
+CcnxProducer::Lookup (Ptr<const CcnxInterestHeader> interest)
+{
+ NS_LOG_FUNCTION_NOARGS ();
+ DataStoreContainer::type::iterator it = m_availableData.get<i_prefix> ().find (interest->GetName ());
+
+ if (it != m_availableData.end ())
+ {
+ // return fully formed CCNx packet
+ return it->GetFullyFormedCcnxPacket ();
+ }
+
+ return 0;
+}
void
-CcnxProducer::AddContentStoreEntry (Ptr<CcnxContentObjectHeader> header, Ptr<const Packet> packet)
+CcnxProducer::Add (Ptr<CcnxContentObjectHeader> header, Ptr<const Packet> packet)
{
- // m_ccnx->m_contentStore->Add (header, packet);
-}
+ NS_LOG_FUNCTION_NOARGS ();
+ DataStoreContainer::type::iterator it = m_availableData.get<i_prefix> ().find (header->GetName ());
+
+ if (it == m_availableData.end ())
+ { // add entry to the top
+ m_availableData.get<i_mru> ().push_front (DataStoreEntry (header, packet));
+
+ if (m_availableData.size () > m_storeCapacity)
+ m_availableData.get<i_mru> ().pop_back ();
+ }
+ else
+ {
+ // promote entry to the top
+ //m_contentStore.get<i_mru> ().relocate (m_contentStore.get<i_mru> ().begin (),
+ // m_contentStore.project<i_mru> (it));
+ }
+}*/
}