Adding options to enable caching of unsolicited (e.g., overheard over broadcast media) data packets
diff --git a/model/ccnx-content-store.cc b/model/ccnx-content-store.cc
index b0c4858..881c881 100644
--- a/model/ccnx-content-store.cc
+++ b/model/ccnx-content-store.cc
@@ -153,7 +153,7 @@
 boost::tuple<Ptr<Packet>, Ptr<const CcnxContentObjectHeader>, Ptr<const Packet> >
 CcnxContentStore::Lookup (Ptr<const CcnxInterestHeader> interest)
 {
-  NS_LOG_FUNCTION_NOARGS ();
+  NS_LOG_FUNCTION (this << interest->GetName ());
   CcnxContentStoreContainer::type::iterator it = m_contentStore.get<i_prefix> ().find (interest->GetName ());
   if (it != m_contentStore.end ())
     {
@@ -170,7 +170,7 @@
 void 
 CcnxContentStore::Add (Ptr<CcnxContentObjectHeader> header, Ptr<const Packet> packet)
 {
-  NS_LOG_FUNCTION_NOARGS ();
+  NS_LOG_FUNCTION (this << header->GetName ());
   CcnxContentStoreContainer::type::iterator it = m_contentStore.get<i_prefix> ().find (header->GetName ());
   if (it == m_contentStore.end ())
     { // add entry to the top
diff --git a/model/ccnx-l3-protocol.cc b/model/ccnx-l3-protocol.cc
index 87c0881..da7ad29 100644
--- a/model/ccnx-l3-protocol.cc
+++ b/model/ccnx-l3-protocol.cc
@@ -79,6 +79,10 @@
                    BooleanValue (true),
                    MakeBooleanAccessor (&CcnxL3Protocol::m_nacksEnabled),
                    MakeBooleanChecker ())
+    .AddAttribute ("CacheUnsolicitedData", "Cache overheard data that have not been requested",
+                   BooleanValue (false),
+                   MakeBooleanAccessor (&CcnxL3Protocol::m_cacheUnsolicitedData),
+                   MakeBooleanChecker ())
   ;
   return tid;
 }
@@ -559,11 +563,18 @@
         {
           // Unsolicited data, but we're interested in it... should we get it?
           // Potential hole for attacks
-          
-          NS_LOG_ERROR ("Node "<< m_node->GetId() <<
-                       ". PIT entry for "<< header->GetName ()<<" is valid, "
-                        "but outgoing entry for interface "<< boost::cref(*incomingFace) <<" doesn't exist\n");
 
+          if (m_cacheUnsolicitedData)
+            {
+              // Optimistically add or update entry in the content store
+              m_contentStore->Add (header, payload);
+            }
+          else
+            {
+              NS_LOG_ERROR ("Node "<< m_node->GetId() <<
+                            ". PIT entry for "<< header->GetName ()<<" is valid, "
+                            "but outgoing entry for interface "<< boost::cref(*incomingFace) <<" doesn't exist\n");
+            }
           // ignore unsolicited data
           return;
         }
@@ -598,11 +609,19 @@
     }
   catch (CcnxPitEntryNotFound)
     {
-      // 2. Drop data packet if PIT entry is not found
-      //    (unsolicited data packets should not "poison" content store)
+      if (m_cacheUnsolicitedData)
+        {
+          // Optimistically add or update entry in the content store
+          m_contentStore->Add (header, payload);
+        }
+      else
+        {
+          // Drop data packet if PIT entry is not found
+          // (unsolicited data packets should not "poison" content store)
       
-      //drop dulicated or not requested data packet
-      m_dropData (header, payload, UNSOLICITED, incomingFace);
+          //drop dulicated or not requested data packet
+          m_dropData (header, payload, UNSOLICITED, incomingFace);
+        }
       return; // do not process unsoliced data packets
     }
 }
@@ -611,6 +630,7 @@
 CcnxL3Protocol::GiveUpInterest (const CcnxPitEntry &pitEntry,
                                 Ptr<CcnxInterestHeader> header)
 {
+  NS_LOG_FUNCTION (this << &pitEntry);
   if (m_nacksEnabled)
     {
       Ptr<Packet> packet = Create<Packet> ();
@@ -619,6 +639,7 @@
 
       BOOST_FOREACH (const CcnxPitEntryIncomingFace &incoming, pitEntry.m_incoming)
         {
+          NS_LOG_DEBUG ("Send NACK for " << boost::cref (header->GetName ()) << " to " << boost::cref (*incoming.m_face));
           incoming.m_face->Send (packet->Copy ());
 
           m_outNacks (header, incoming.m_face);
diff --git a/model/ccnx-l3-protocol.h b/model/ccnx-l3-protocol.h
index 1da29b7..ba4fcaa 100644
--- a/model/ccnx-l3-protocol.h
+++ b/model/ccnx-l3-protocol.h
@@ -209,6 +209,7 @@
   Ptr<CcnxContentStore> m_contentStore; ///< \brief Content store (for caching purposes only)
 
   bool m_nacksEnabled;
+  bool m_cacheUnsolicitedData;
   
   // Time    m_bucketLeakInterval;
   // EventId m_bucketLeakEvent;