model+helper: Converting L3Protocol and StackHelper to use NFD codebase
diff --git a/helper/ndn-stack-helper.cpp b/helper/ndn-stack-helper.cpp
index 5d3dcd2..a1a3292 100644
--- a/helper/ndn-stack-helper.cpp
+++ b/helper/ndn-stack-helper.cpp
@@ -19,37 +19,19 @@
  *          Ilya Moiseenko <iliamo@cs.ucla.edu>
  */
 
-#include "ns3/assert.h"
-#include "ns3/log.h"
-#include "ns3/object.h"
-#include "ns3/names.h"
-#include "ns3/packet-socket-factory.h"
-#include "ns3/config.h"
-#include "ns3/simulator.h"
-#include "ns3/string.h"
-#include "ns3/net-device.h"
-#include "ns3/channel.h"
-#include "ns3/callback.h"
-#include "ns3/node.h"
-#include "ns3/core-config.h"
-#include "ns3/point-to-point-net-device.h"
-#include "ns3/point-to-point-helper.h"
-#include "ns3/callback.h"
-
-#include "../model/ndn-net-device-face.hpp"
-#include "../model/ndn-l3-protocol.hpp"
-
-#include "ns3/node-list.h"
-
-#include "ns3/data-rate.h"
-
-#include "ndn-face-container.hpp"
 #include "ndn-stack-helper.hpp"
+
+#include "ns3/log.h"
+#include "ns3/names.h"
+#include "ns3/point-to-point-net-device.h"
+
+#include "model/ndn-l3-protocol.hpp"
+#include "model/ndn-net-device-face.hpp"
+#include "utils/ndn-time.hpp"
 #include "utils/dummy-keychain.hpp"
 
 #include <limits>
 #include <map>
-#include <boost/foreach.hpp>
 #include <boost/lexical_cast.hpp>
 
 NS_LOG_COMPONENT_DEFINE("ndn.StackHelper");
@@ -58,16 +40,11 @@
 namespace ndn {
 
 StackHelper::StackHelper()
-  : m_limitsEnabled(false)
-  , m_needSetDefaultRoutes(false)
 {
   setCustomNdnCxxClocks();
 
   m_ndnFactory.SetTypeId("ns3::ndn::L3Protocol");
-  m_strategyFactory.SetTypeId("ns3::ndn::fw::Flooding");
-  m_contentStoreFactory.SetTypeId("ns3::ndn::cs::Lru");
-  m_fibFactory.SetTypeId("ns3::ndn::fib::Default");
-  m_pitFactory.SetTypeId("ns3::ndn::pit::Persistent");
+  // m_contentStoreFactory.SetTypeId("ns3::ndn::cs::Lru");
 
   m_netDeviceCallbacks.push_back(
     std::make_pair(PointToPointNetDevice::GetTypeId(),
@@ -93,110 +70,6 @@
                                make_shared<ns3::ndn::time::CustomSystemClock>());
 }
 
-void
-StackHelper::SetStackAttributes(const std::string& attr1, const std::string& value1,
-                                const std::string& attr2, const std::string& value2,
-                                const std::string& attr3, const std::string& value3,
-                                const std::string& attr4, const std::string& value4)
-{
-  if (attr1 != "")
-    m_ndnFactory.Set(attr1, StringValue(value1));
-  if (attr2 != "")
-    m_ndnFactory.Set(attr2, StringValue(value2));
-  if (attr3 != "")
-    m_ndnFactory.Set(attr3, StringValue(value3));
-  if (attr4 != "")
-    m_ndnFactory.Set(attr4, StringValue(value4));
-}
-
-void
-StackHelper::SetForwardingStrategy(const std::string& strategy, const std::string& attr1,
-                                   const std::string& value1, const std::string& attr2,
-                                   const std::string& value2, const std::string& attr3,
-                                   const std::string& value3, const std::string& attr4,
-                                   const std::string& value4)
-{
-  m_strategyFactory.SetTypeId(strategy);
-  if (attr1 != "")
-    m_strategyFactory.Set(attr1, StringValue(value1));
-  if (attr2 != "")
-    m_strategyFactory.Set(attr2, StringValue(value2));
-  if (attr3 != "")
-    m_strategyFactory.Set(attr3, StringValue(value3));
-  if (attr4 != "")
-    m_strategyFactory.Set(attr4, StringValue(value4));
-}
-
-void
-StackHelper::SetContentStore(const std::string& contentStore, const std::string& attr1,
-                             const std::string& value1, const std::string& attr2,
-                             const std::string& value2, const std::string& attr3,
-                             const std::string& value3, const std::string& attr4,
-                             const std::string& value4)
-{
-  m_contentStoreFactory.SetTypeId(contentStore);
-  if (attr1 != "")
-    m_contentStoreFactory.Set(attr1, StringValue(value1));
-  if (attr2 != "")
-    m_contentStoreFactory.Set(attr2, StringValue(value2));
-  if (attr3 != "")
-    m_contentStoreFactory.Set(attr3, StringValue(value3));
-  if (attr4 != "")
-    m_contentStoreFactory.Set(attr4, StringValue(value4));
-}
-
-void
-StackHelper::SetPit(const std::string& pitClass, const std::string& attr1,
-                    const std::string& value1, const std::string& attr2, const std::string& value2,
-                    const std::string& attr3, const std::string& value3, const std::string& attr4,
-                    const std::string& value4)
-{
-  m_pitFactory.SetTypeId(pitClass);
-  if (attr1 != "")
-    m_pitFactory.Set(attr1, StringValue(value1));
-  if (attr2 != "")
-    m_pitFactory.Set(attr2, StringValue(value2));
-  if (attr3 != "")
-    m_pitFactory.Set(attr3, StringValue(value3));
-  if (attr4 != "")
-    m_pitFactory.Set(attr4, StringValue(value4));
-}
-
-void
-StackHelper::SetFib(const std::string& fibClass, const std::string& attr1,
-                    const std::string& value1, const std::string& attr2, const std::string& value2,
-                    const std::string& attr3, const std::string& value3, const std::string& attr4,
-                    const std::string& value4)
-{
-  m_fibFactory.SetTypeId(fibClass);
-  if (attr1 != "")
-    m_fibFactory.Set(attr1, StringValue(value1));
-  if (attr2 != "")
-    m_fibFactory.Set(attr2, StringValue(value2));
-  if (attr3 != "")
-    m_fibFactory.Set(attr3, StringValue(value3));
-  if (attr4 != "")
-    m_fibFactory.Set(attr4, StringValue(value4));
-}
-
-void
-StackHelper::SetDefaultRoutes(bool needSet)
-{
-  NS_LOG_FUNCTION(this << needSet);
-  m_needSetDefaultRoutes = needSet;
-}
-
-void
-StackHelper::EnableLimits(bool enable /* = true*/, Time avgRtt /*=Seconds(0.1)*/,
-                          uint32_t avgData /*=1100*/, uint32_t avgInterest /*=40*/)
-{
-  NS_LOG_INFO("EnableLimits: " << enable);
-  m_limitsEnabled = enable;
-  m_avgRtt = avgRtt;
-  m_avgDataSize = avgData;
-  m_avgInterestSize = avgInterest;
-}
-
 Ptr<FaceContainer>
 StackHelper::Install(const NodeContainer& c) const
 {
@@ -216,8 +89,6 @@
 Ptr<FaceContainer>
 StackHelper::Install(Ptr<Node> node) const
 {
-  // NS_ASSERT_MSG (m_forwarding, "SetForwardingHelper() should be set prior calling Install()
-  // method");
   Ptr<FaceContainer> faces = Create<FaceContainer>();
 
   if (node->GetObject<L3Protocol>() != 0) {
@@ -226,25 +97,13 @@
     return 0;
   }
 
-  // Create L3Protocol
   Ptr<L3Protocol> ndn = m_ndnFactory.Create<L3Protocol>();
-
-  // Create and aggregate FIB
-  // Ptr<Fib> fib = m_fibFactory.Create<Fib> ();
-  // ndn->AggregateObject (fib);
-
-  // Create and aggregate PIT
-  // ndn->AggregateObject (m_pitFactory.Create<Pit> ());
-
-  // Create and aggregate forwarding strategy
-  // ndn->AggregateObject (m_strategyFactory.Create<ForwardingStrategy> ());
-
-  // Create and aggregate content store
-  // ndn->AggregateObject (m_contentStoreFactory.Create<ContentStore> ());
-
   // Aggregate L3Protocol on node
   node->AggregateObject(ndn);
 
+  // NFD initialization
+  ndn->initialize();
+
   for (uint32_t index = 0; index < node->GetNDevices(); index++) {
     Ptr<NetDevice> device = node->GetDevice(index);
     // This check does not make sense: LoopbackNetDevice is installed only if IP stack is installed,
@@ -254,26 +113,19 @@
 
     shared_ptr<NetDeviceFace> face;
 
-    for (std::list<std::pair<TypeId, NetDeviceFaceCreateCallback>>::const_iterator item =
-           m_netDeviceCallbacks.begin();
-         item != m_netDeviceCallbacks.end(); item++) {
-      if (device->GetInstanceTypeId() == item->first
-          || device->GetInstanceTypeId().IsChildOf(item->first)) {
-        face = item->second(node, ndn, device);
+    for (const auto& item : m_netDeviceCallbacks) {
+      if (device->GetInstanceTypeId() == item.first ||
+          device->GetInstanceTypeId().IsChildOf(item.first)) {
+        face = item.second(node, ndn, device);
         if (face != 0)
           break;
       }
     }
+
     if (face == 0) {
       face = DefaultNetDeviceCallback(node, ndn, device);
     }
 
-    if (m_needSetDefaultRoutes) {
-      // default route with lowest priority possible
-      AddRoute(node, "/", StaticCast<Face>(face), std::numeric_limits<int32_t>::max());
-    }
-
-    face->SetUp();
     faces->Add(face);
   }
 
@@ -291,10 +143,9 @@
 StackHelper::UpdateNetDeviceFaceCreateCallback(TypeId netDeviceType,
                                                NetDeviceFaceCreateCallback callback)
 {
-  for (NetDeviceCallbackList::iterator i = m_netDeviceCallbacks.begin();
-       i != m_netDeviceCallbacks.end(); i++) {
-    if (i->first == netDeviceType) {
-      i->second = callback;
+  for (auto& i : m_netDeviceCallbacks) {
+    if (i.first == netDeviceType) {
+      i.second = callback;
       return;
     }
   }
@@ -304,13 +155,9 @@
 StackHelper::RemoveNetDeviceFaceCreateCallback(TypeId netDeviceType,
                                                NetDeviceFaceCreateCallback callback)
 {
-  for (NetDeviceCallbackList::iterator i = m_netDeviceCallbacks.begin();
-       i != m_netDeviceCallbacks.end(); i++) {
-    if (i->first == netDeviceType) {
-      m_netDeviceCallbacks.erase(i);
-      return;
-    }
-  }
+  m_netDeviceCallbacks.remove_if([&] (const std::pair<TypeId, NetDeviceFaceCreateCallback>& i) {
+      return (i.first == netDeviceType);
+    });
 }
 
 shared_ptr<NetDeviceFace>
@@ -319,10 +166,11 @@
 {
   NS_LOG_DEBUG("Creating default NetDeviceFace on node " << node->GetId());
 
-  shared_ptr<NetDeviceFace> face = CreateObject<NetDeviceFace>(node, netDevice);
+  shared_ptr<NetDeviceFace> face = std::make_shared<NetDeviceFace>(node, netDevice);
 
-  ndn->AddFace(face);
-  NS_LOG_LOGIC("Node " << node->GetId() << ": added NetDeviceFace as face #" << *face);
+  ndn->addFace(face);
+  NS_LOG_LOGIC("Node " << node->GetId() << ": added NetDeviceFace as face #"
+                       << face->getLocalUri());
 
   return face;
 }
@@ -333,46 +181,11 @@
 {
   NS_LOG_DEBUG("Creating point-to-point NetDeviceFace on node " << node->GetId());
 
-  shared_ptr<NetDeviceFace> face = CreateObject<NetDeviceFace>(node, device);
+  shared_ptr<NetDeviceFace> face = std::make_shared<NetDeviceFace>(node, device);
 
-  ndn->AddFace(face);
-  NS_LOG_LOGIC("Node " << node->GetId() << ": added NetDeviceFace as face #" << *face);
-
-  if (m_limitsEnabled) {
-    // Ptr<Limits> limits = face->GetObject<Limits> ();
-    /*if (limits == 0)
-    {
-        NS_FATAL_ERROR ("Limits are enabled, but the selected forwarding strategy does not support
-    limits. Please revise your scenario");
-        exit (1);
-    }*/
-
-    NS_LOG_INFO("Limits are enabled");
-    Ptr<PointToPointNetDevice> p2p = DynamicCast<PointToPointNetDevice>(device);
-    if (p2p != 0) {
-      // Setup bucket filtering
-      // Assume that we know average data packet size, and this size is equal default size
-      // Set maximum buckets (averaging over 1 second)
-
-      DataRateValue dataRate;
-      device->GetAttribute("DataRate", dataRate);
-      TimeValue linkDelay;
-      device->GetChannel()->GetAttribute("Delay", linkDelay);
-
-      NS_LOG_INFO("DataRate for this link is " << dataRate.Get());
-
-      double maxInterestPackets =
-        1.0 * dataRate.Get().GetBitRate() / 8.0 / (m_avgDataSize + m_avgInterestSize);
-      // NS_LOG_INFO ("Max packets per second: " << maxInterestPackets);
-      // NS_LOG_INFO ("Max burst: " << m_avgRtt.ToDouble (Time::S) * maxInterestPackets);
-      //         NS_LOG_INFO ("MaxLimit: " << (int)(m_avgRtt.ToDouble (Time::S) *
-      //         maxInterestPackets));
-      /*
-      // Set max to BDP
-      limits->SetLimits (maxInterestPackets, m_avgRtt.ToDouble (Time::S));
-      limits->SetLinkDelay (linkDelay.Get ().ToDouble (Time::S)); */
-    }
-  }
+  ndn->addFace(face);
+  NS_LOG_LOGIC("Node " << node->GetId() << ": added NetDeviceFace as face #"
+                       << face->getLocalUri());
 
   return face;
 }
@@ -384,94 +197,5 @@
   return Install(node);
 }
 
-void
-StackHelper::AddRoute(Ptr<Node> node, const std::string& prefix, shared_ptr<Face> face, int32_t metric)
-{
-  NS_LOG_LOGIC("[" << node->GetId() << "]$ route add " << prefix << " via " << *face << " metric "
-                   << metric);
-
-  // Ptr<Fib>  fib  = node->GetObject<Fib> ();
-
-  // NameValue prefixValue;
-  // prefixValue.DeserializeFromString (prefix, MakeNameChecker ());
-  ::ndn::Name name(prefix);
-  // fib->Add (name, face, metric);
-}
-
-void
-StackHelper::AddRoute(Ptr<Node> node, const std::string& prefix, uint32_t faceId, int32_t metric)
-{
-  Ptr<L3Protocol> ndn = node->GetObject<L3Protocol>();
-  NS_ASSERT_MSG(ndn != 0, "Ndn stack should be installed on the node");
-
-  shared_ptr<Face> face = ndn->GetFace(faceId);
-  NS_ASSERT_MSG(face != 0, "Face with ID [" << faceId << "] does not exist on node ["
-                                            << node->GetId() << "]");
-
-  AddRoute(node, prefix, face, metric);
-}
-
-void
-StackHelper::AddRoute(const std::string& nodeName, const std::string& prefix, uint32_t faceId,
-                      int32_t metric)
-{
-  Ptr<Node> node = Names::Find<Node>(nodeName);
-  NS_ASSERT_MSG(node != 0, "Node [" << nodeName << "] does not exist");
-
-  Ptr<L3Protocol> ndn = node->GetObject<L3Protocol>();
-  NS_ASSERT_MSG(ndn != 0, "Ndn stack should be installed on the node");
-
-  shared_ptr<Face> face = ndn->GetFace(faceId);
-  NS_ASSERT_MSG(face != 0, "Face with ID [" << faceId << "] does not exist on node [" << nodeName
-                                            << "]");
-
-  AddRoute(node, prefix, face, metric);
-}
-
-void
-StackHelper::AddRoute(Ptr<Node> node, const std::string& prefix, Ptr<Node> otherNode,
-                      int32_t metric)
-{
-  for (uint32_t deviceId = 0; deviceId < node->GetNDevices(); deviceId++) {
-    Ptr<PointToPointNetDevice> netDevice =
-      DynamicCast<PointToPointNetDevice>(node->GetDevice(deviceId));
-    if (netDevice == 0)
-      continue;
-
-    Ptr<Channel> channel = netDevice->GetChannel();
-    if (channel == 0)
-      continue;
-
-    if (channel->GetDevice(0)->GetNode() == otherNode
-        || channel->GetDevice(1)->GetNode() == otherNode) {
-      Ptr<L3Protocol> ndn = node->GetObject<L3Protocol>();
-      NS_ASSERT_MSG(ndn != 0, "Ndn stack should be installed on the node");
-
-      shared_ptr<Face> face = ndn->GetFaceByNetDevice(netDevice);
-      NS_ASSERT_MSG(face != 0, "There is no face associated with the p2p link");
-
-      AddRoute(node, prefix, face, metric);
-
-      return;
-    }
-  }
-
-  NS_FATAL_ERROR("Cannot add route: Node# " << node->GetId() << " and Node# " << otherNode->GetId()
-                                            << " are not connected");
-}
-
-void
-StackHelper::AddRoute(const std::string& nodeName, const std::string& prefix,
-                      const std::string& otherNodeName, int32_t metric)
-{
-  Ptr<Node> node = Names::Find<Node>(nodeName);
-  NS_ASSERT_MSG(node != 0, "Node [" << nodeName << "] does not exist");
-
-  Ptr<Node> otherNode = Names::Find<Node>(otherNodeName);
-  NS_ASSERT_MSG(otherNode != 0, "Node [" << otherNodeName << "] does not exist");
-
-  AddRoute(node, prefix, otherNode, metric);
-}
-
 } // namespace ndn
 } // namespace ns3