fw+doc: Renaming and extending limit extenstion

SimpleLimits now called PerOutFaceLimits.  Also, there is now
PerFibLimits that is inherited from PerOutFaceLimits and implements
additional check.

Also, this commit includes a couple of tricks to improve documentation
of templated classes (PerOutFaceLimits and PerFibLimits). Not ideal, but
much better than before.
diff --git a/model/fw/best-route.cc b/model/fw/best-route.cc
index 076234f..046d7a2 100644
--- a/model/fw/best-route.cc
+++ b/model/fw/best-route.cc
@@ -33,14 +33,21 @@
 #include <boost/lambda/bind.hpp>
 namespace ll = boost::lambda;
 
-NS_LOG_COMPONENT_DEFINE ("ndn.fw.BestRoute");
-
 namespace ns3 {
 namespace ndn {
 namespace fw {
 
 NS_OBJECT_ENSURE_REGISTERED (BestRoute);
-  
+
+LogComponent BestRoute::g_log = LogComponent (BestRoute::GetLogName ().c_str ());
+
+std::string
+BestRoute::GetLogName ()
+{
+  return super::GetLogName ()+".BestRoute";
+}
+
+
 TypeId
 BestRoute::GetTypeId (void)
 {
diff --git a/model/fw/best-route.h b/model/fw/best-route.h
index 3f4fef7..6e17b99 100644
--- a/model/fw/best-route.h
+++ b/model/fw/best-route.h
@@ -24,6 +24,7 @@
 #define NDNSIM_BEST_ROUTE_H
 
 #include "green-yellow-red.h"
+#include "ns3/log.h"
 
 namespace ns3 {
 namespace ndn {
@@ -44,6 +45,12 @@
   GetTypeId ();
 
   /**
+   * @brief Helper function to retrieve logging name for the forwarding strategy
+   */
+  static std::string
+  GetLogName ();
+  
+  /**
    * @brief Default constructor
    */
   BestRoute ();
@@ -54,6 +61,8 @@
                        Ptr<const InterestHeader> header,
                        Ptr<const Packet> origPacket,
                        Ptr<pit::Entry> pitEntry);
+protected:
+  static LogComponent g_log;
 };
 
 } // namespace fw
diff --git a/model/fw/flooding.cc b/model/fw/flooding.cc
index 6d021ec..b4e94a8 100644
--- a/model/fw/flooding.cc
+++ b/model/fw/flooding.cc
@@ -36,14 +36,20 @@
 #include <boost/lambda/bind.hpp>
 namespace ll = boost::lambda;
 
-NS_LOG_COMPONENT_DEFINE ("ndn.fw.Flooding");
-
 namespace ns3 {
 namespace ndn {
 namespace fw {
 
 NS_OBJECT_ENSURE_REGISTERED (Flooding);
-    
+
+LogComponent Flooding::g_log = LogComponent (Flooding::GetLogName ().c_str ());
+
+std::string
+Flooding::GetLogName ()
+{
+  return super::GetLogName ()+".Flooding";
+}
+
 TypeId Flooding::GetTypeId ()
 {
   static TypeId tid = TypeId ("ns3::ndn::fw::Flooding")
diff --git a/model/fw/flooding.h b/model/fw/flooding.h
index d730113..c4f6205 100644
--- a/model/fw/flooding.h
+++ b/model/fw/flooding.h
@@ -23,6 +23,7 @@
 #define NDNSIM_FLOODING_H
 
 #include "nacks.h"
+#include "ns3/log.h"
 
 namespace ns3 {
 namespace ndn {
@@ -37,9 +38,19 @@
 class Flooding :
     public Nacks
 {
-public:
-  static TypeId GetTypeId ();
+private:
+  typedef Nacks super;
 
+public:
+  static TypeId
+  GetTypeId ();
+
+  /**
+   * @brief Helper function to retrieve logging name for the forwarding strategy
+   */
+  static std::string
+  GetLogName ();
+  
   /**
    * @brief Default constructor
    */
@@ -53,8 +64,8 @@
                        Ptr<const Packet> origPacket,
                        Ptr<pit::Entry> pitEntry);
 
-private:
-  typedef Nacks super;
+protected:
+  static LogComponent g_log;
 };
 
 } // namespace fw
diff --git a/model/fw/green-yellow-red.h b/model/fw/green-yellow-red.h
index 363d0cb..371f7fd 100644
--- a/model/fw/green-yellow-red.h
+++ b/model/fw/green-yellow-red.h
@@ -34,7 +34,8 @@
     public Nacks
 {
 public:
-  static TypeId GetTypeId (void);
+  static TypeId
+  GetTypeId (void);
 
 protected:
   virtual void
diff --git a/model/fw/nacks.h b/model/fw/nacks.h
index ef14f19..421897b 100644
--- a/model/fw/nacks.h
+++ b/model/fw/nacks.h
@@ -35,11 +35,11 @@
 {
 private:
   typedef ForwardingStrategy super;
-
+  
 public:
   static TypeId
   GetTypeId ();
-
+  
   // from super
   virtual void
   OnInterest (Ptr<Face> face,
diff --git a/model/fw/ndn-forwarding-strategy.cc b/model/fw/ndn-forwarding-strategy.cc
index 14db750..770613b 100644
--- a/model/fw/ndn-forwarding-strategy.cc
+++ b/model/fw/ndn-forwarding-strategy.cc
@@ -44,13 +44,19 @@
 #include <boost/tuple/tuple.hpp>
 namespace ll = boost::lambda;
 
-NS_LOG_COMPONENT_DEFINE ("ndn.ForwardingStrategy");
-
 namespace ns3 {
 namespace ndn {
 
 NS_OBJECT_ENSURE_REGISTERED (ForwardingStrategy);
 
+NS_LOG_COMPONENT_DEFINE (ForwardingStrategy::GetLogName ().c_str ());
+
+std::string
+ForwardingStrategy::GetLogName ()
+{
+  return "ndn.fw";
+}
+
 TypeId ForwardingStrategy::GetTypeId (void)
 {
   static TypeId tid = TypeId ("ns3::ndn::ForwardingStrategy")
diff --git a/model/fw/ndn-forwarding-strategy.h b/model/fw/ndn-forwarding-strategy.h
index fa42502..cd0d041 100644
--- a/model/fw/ndn-forwarding-strategy.h
+++ b/model/fw/ndn-forwarding-strategy.h
@@ -49,6 +49,11 @@
   static TypeId GetTypeId (void);
 
   /**
+   * @brief Helper function to retrieve logging name for the forwarding strategy
+   */
+  static std::string GetLogName ();
+
+  /**
    * @brief Default constructor
    */
   ForwardingStrategy ();
diff --git a/model/fw/per-fib-limits.cc b/model/fw/per-fib-limits.cc
new file mode 100644
index 0000000..3b60cf5
--- /dev/null
+++ b/model/fw/per-fib-limits.cc
@@ -0,0 +1,68 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2012 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "per-fib-limits.h"
+#include "per-out-face-limits.h"
+
+#include "ns3/ndn-l3-protocol.h"
+#include "ns3/ndn-interest-header.h"
+#include "ns3/ndn-content-object-header.h"
+
+#include "best-route.h"
+#include "flooding.h"
+#include "smart-flooding.h"
+
+namespace ns3 {
+namespace ndn {
+namespace fw {
+
+template class PerFibLimits< PerOutFaceLimits<BestRoute> >;
+typedef PerFibLimits< PerOutFaceLimits<BestRoute> > PerFibLimitsPerOutFaceLimitsBestRoute;
+NS_OBJECT_ENSURE_REGISTERED (PerFibLimitsPerOutFaceLimitsBestRoute);
+
+template class PerFibLimits< PerOutFaceLimits<Flooding> >;
+typedef PerFibLimits< PerOutFaceLimits<Flooding> > PerFibLimitsPerOutFaceLimitsFlooding;
+NS_OBJECT_ENSURE_REGISTERED (PerFibLimitsPerOutFaceLimitsFlooding);
+
+template class PerFibLimits< PerOutFaceLimits<SmartFlooding> >;
+typedef PerFibLimits< PerOutFaceLimits<SmartFlooding> > PerFibLimitsPerOutFaceLimitsSmartFlooding;
+NS_OBJECT_ENSURE_REGISTERED (PerFibLimitsPerOutFaceLimitsSmartFlooding);
+
+#ifdef DOXYGEN
+// /**
+//  * \brief Strategy implementing per-fib-per-out-face limits on top of BestRoute strategy
+//  */
+class BestRoute::PerOutFaceLimits::PerFibLimits : public ::ns3::ndn::fw::PerFibLimits< ::ns3::ndn::fw::PerOutFaceLimits<BestRoute> > { };
+
+/**
+ * \brief Strategy implementing per-fib-per-out-face limits on top of Flooding strategy
+ */
+class Flooding::PerOutFaceLimits::PerFibLimits : public ::ns3::ndn::fw::PerFibLimits< ::ns3::ndn::fw::PerOutFaceLimits<Flooding> > { };
+
+/**
+ * \brief Strategy implementing per-fib-per-out-face limits on top of SmartFlooding strategy
+ */
+class SmartFlooding::PerOutFaceLimits::PerFibLimits : public ::ns3::ndn::fw::PerFibLimits< ::ns3::ndn::fw::PerOutFaceLimits<SmartFlooding> > { };
+
+#endif
+
+} // namespace fw
+} // namespace ndn
+} // namespace ns3
diff --git a/model/fw/simple-limits.h b/model/fw/per-fib-limits.h
similarity index 60%
copy from model/fw/simple-limits.h
copy to model/fw/per-fib-limits.h
index ce639e3..3632a87 100644
--- a/model/fw/simple-limits.h
+++ b/model/fw/per-fib-limits.h
@@ -1,6 +1,6 @@
 /* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
 /*
- * Copyright (c) 2011 University of California, Los Angeles
+ * Copyright (c) 2012 University of California, Los Angeles
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 as
@@ -19,8 +19,8 @@
  */
 
 
-#ifndef NDNSIM_SIMPLE_LIMITS_H
-#define NDNSIM_SIMPLE_LIMITS_H
+#ifndef NDNSIM_PER_FIB_LIMITS_H
+#define NDNSIM_PER_FIB_LIMITS_H
 
 #include "ns3/event-id.h"
 #include "ns3/log.h"
@@ -42,7 +42,7 @@
  * \brief Strategy implementing per-FIB entry limits
  */
 template<class Parent>
-class SimpleLimits :
+class PerFibLimits :
     public Parent
 {
 private:
@@ -53,25 +53,36 @@
   GetTypeId ();
 
   /**
+   * @brief Helper function to retrieve logging name for the forwarding strategy
+   */
+  static std::string
+  GetLogName ();
+  
+  /**
    * @brief Default constructor
    */
-  SimpleLimits ()
+  PerFibLimits ()
   { }
   
+  /// \copydoc ForwardingStrategy::WillEraseTimedOutPendingInterest
   virtual void
   WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry);
 
+  /// \copydoc ForwardingStrategy::AddFace
   virtual void
   AddFace (Ptr<Face> face)
   {
-    ObjectFactory factory (m_limitType);
-    Ptr<Limits> limits = factory.template Create<Limits> ();
-    face->AggregateObject (limits);
-
     super::AddFace (face);
+
+    if (face->GetObject<Limits> () == 0)
+      {
+        NS_FATAL_ERROR ("At least per-face limits should be enabled");
+        exit (1);
+      }
   }
   
 protected:
+  /// \copydoc ForwardingStrategy::CanSendOutInterest
   virtual bool
   CanSendOutInterest (Ptr<Face> inFace,
                       Ptr<Face> outFace,
@@ -79,39 +90,43 @@
                       Ptr<const Packet> origPacket,
                       Ptr<pit::Entry> pitEntry);
   
+  /// \copydoc ForwardingStrategy::WillSatisfyPendingInterest
   virtual void
   WillSatisfyPendingInterest (Ptr<Face> inFace,
                               Ptr<pit::Entry> pitEntry);
 
+protected:
+  static LogComponent g_log; ///< @brief Logging variable
+  
 private:
   std::string m_limitType;
-
-  static LogComponent g_log;
 };
 
 template<class Parent>
-LogComponent SimpleLimits<Parent>::g_log = LogComponent ("ndn.SimpleLimits");
+LogComponent PerFibLimits<Parent>::g_log = LogComponent (PerFibLimits<Parent>::GetLogName ().c_str ());
+
+template<class Parent>
+std::string
+PerFibLimits<Parent>::GetLogName ()
+{
+  return super::GetLogName ()+".PerFibLimits";
+}
 
 template<class Parent>
 TypeId
-SimpleLimits<Parent>::GetTypeId (void)
+PerFibLimits<Parent>::GetTypeId (void)
 {
-  static TypeId tid = TypeId ((super::GetTypeId ().GetName ()+"::SimpleLimits").c_str ())
+  static TypeId tid = TypeId ((super::GetTypeId ().GetName ()+"::PerFibLimits").c_str ())
     .SetGroupName ("Ndn")
     .template SetParent <super> ()
-    .template AddConstructor <SimpleLimits> ()
-
-    .template AddAttribute ("Limit", "Limit type to be used (e.g., ns3::ndn::Limits::Window or ns3::ndn::Limits::Rate)",
-                            StringValue ("ns3::ndn::Limits::Window"),
-                            MakeStringAccessor (&SimpleLimits<Parent>::m_limitType),
-                            MakeStringChecker ())    
+    .template AddConstructor <PerFibLimits> ()
     ;
   return tid;
 }
 
 template<class Parent>
 bool
-SimpleLimits<Parent>::CanSendOutInterest (Ptr<Face> inFace,
+PerFibLimits<Parent>::CanSendOutInterest (Ptr<Face> inFace,
                                           Ptr<Face> outFace,
                                           Ptr<const InterestHeader> header,
                                           Ptr<const Packet> origPacket,
@@ -119,36 +134,29 @@
 {
   NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
 
-  if (!super::CanSendOutInterest (inFace, outFace, header, origPacket, pitEntry))
+  Ptr<Limits> fibLimits = pitEntry->GetFibEntry ()->template GetObject<Limits> ();
+  // no checks for the limit here. the check should be somewhere elese
+  
+  if (fibLimits->IsBelowLimit ())
     {
-      return false;
+      if (super::CanSendOutInterest (inFace, outFace, header, origPacket, pitEntry))
+        {
+          fibLimits->BorrowLimit ();
+          return true;
+        }
     }
   
-  Ptr<Limits> faceLimits = outFace->template GetObject<Limits> ();
-  if (faceLimits->IsBelowLimit ())
-    {
-      faceLimits->BorrowLimit ();
-      return true;
-    }
-  else
-    {
-      return false;
-    }
+  return false;
 }
 
 template<class Parent>
 void
-SimpleLimits<Parent>::WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry)
+PerFibLimits<Parent>::WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry)
 {
   NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
 
-  for (pit::Entry::out_container::iterator face = pitEntry->GetOutgoing ().begin ();
-       face != pitEntry->GetOutgoing ().end ();
-       face ++)
-    {
-      Ptr<Limits> faceLimits = face->m_face->GetObject<Limits> ();
-      faceLimits->ReturnLimit ();
-    }
+  Ptr<Limits> fibLimits = pitEntry->GetFibEntry ()->template GetObject<Limits> ();
+  fibLimits->ReturnLimit ();
 
   super::WillEraseTimedOutPendingInterest (pitEntry);
 }
@@ -156,18 +164,13 @@
 
 template<class Parent>
 void
-SimpleLimits<Parent>::WillSatisfyPendingInterest (Ptr<Face> inFace,
+PerFibLimits<Parent>::WillSatisfyPendingInterest (Ptr<Face> inFace,
                                                         Ptr<pit::Entry> pitEntry)
 {
   NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
 
-  for (pit::Entry::out_container::iterator face = pitEntry->GetOutgoing ().begin ();
-       face != pitEntry->GetOutgoing ().end ();
-       face ++)
-    {
-      Ptr<Limits> faceLimits = face->m_face->GetObject<Limits> ();
-      faceLimits->ReturnLimit ();
-    }
+  Ptr<Limits> fibLimits = pitEntry->GetFibEntry ()->template GetObject<Limits> ();
+  fibLimits->ReturnLimit ();
   
   super::WillSatisfyPendingInterest (inFace, pitEntry);
 }
@@ -176,4 +179,4 @@
 } // namespace ndn
 } // namespace ns3
 
-#endif // NDNSIM_SIMPLE_LIMITS_H
+#endif // NDNSIM_PER_FIB_LIMITS_H
diff --git a/model/fw/per-out-face-limits.cc b/model/fw/per-out-face-limits.cc
new file mode 100644
index 0000000..5591739
--- /dev/null
+++ b/model/fw/per-out-face-limits.cc
@@ -0,0 +1,67 @@
+/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
+/*
+ * Copyright (c) 2011 University of California, Los Angeles
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation;
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
+ */
+
+#include "per-out-face-limits.h"
+
+#include "ns3/ndn-l3-protocol.h"
+#include "ns3/ndn-interest-header.h"
+#include "ns3/ndn-content-object-header.h"
+
+#include "best-route.h"
+#include "flooding.h"
+#include "smart-flooding.h"
+
+namespace ns3 {
+namespace ndn {
+namespace fw {
+
+template class PerOutFaceLimits<BestRoute>;
+typedef PerOutFaceLimits<BestRoute> PerOutFaceLimitsBestRoute;
+NS_OBJECT_ENSURE_REGISTERED (PerOutFaceLimitsBestRoute);
+
+template class PerOutFaceLimits<Flooding>;
+typedef PerOutFaceLimits<Flooding> PerOutFaceLimitsFlooding;
+NS_OBJECT_ENSURE_REGISTERED (PerOutFaceLimitsFlooding);
+
+template class PerOutFaceLimits<SmartFlooding>;
+typedef PerOutFaceLimits<SmartFlooding> PerOutFaceLimitsSmartFlooding;
+NS_OBJECT_ENSURE_REGISTERED (PerOutFaceLimitsSmartFlooding);
+
+#ifdef DOXYGEN
+// /**
+//  * \brief Strategy implementing per-out-face limits on top of BestRoute strategy
+//  */
+class BestRoute::PerOutFaceLimits : public ::ns3::ndn::fw::PerOutFaceLimits<BestRoute> { };
+
+/**
+ * \brief Strategy implementing per-out-face limits on top of Flooding strategy
+ */
+class Flooding::PerOutFaceLimits : public ::ns3::ndn::fw::PerOutFaceLimits<Flooding> { };
+
+/**
+ * \brief Strategy implementing per-out-face limits on top of SmartFlooding strategy
+ */
+class SmartFlooding::PerOutFaceLimits : public ::ns3::ndn::fw::PerOutFaceLimits<SmartFlooding> { };
+#endif
+
+} // namespace fw
+} // namespace ndn
+} // namespace ns3
+
diff --git a/model/fw/simple-limits.h b/model/fw/per-out-face-limits.h
similarity index 71%
rename from model/fw/simple-limits.h
rename to model/fw/per-out-face-limits.h
index ce639e3..534768b 100644
--- a/model/fw/simple-limits.h
+++ b/model/fw/per-out-face-limits.h
@@ -19,8 +19,8 @@
  */
 
 
-#ifndef NDNSIM_SIMPLE_LIMITS_H
-#define NDNSIM_SIMPLE_LIMITS_H
+#ifndef NDNSIM_PER_OUT_FACE_LIMITS_H
+#define NDNSIM_PER_OUT_FACE_LIMITS_H
 
 #include "ns3/event-id.h"
 #include "ns3/log.h"
@@ -39,28 +39,39 @@
 
 /**
  * \ingroup ndn
- * \brief Strategy implementing per-FIB entry limits
+ * \brief Strategy implementing per-outgoing face limits
  */
 template<class Parent>
-class SimpleLimits :
+class PerOutFaceLimits :
     public Parent
 {
 private:
   typedef Parent super;
 
 public:
+  /**
+   * @brief Get TypeId of the class
+   */
   static TypeId
   GetTypeId ();
 
   /**
+   * @brief Helper function to retrieve logging name for the forwarding strategy
+   */
+  static std::string
+  GetLogName ();
+  
+  /**
    * @brief Default constructor
    */
-  SimpleLimits ()
+  PerOutFaceLimits ()
   { }
-  
+
+  /// \copydoc ForwardingStrategy::WillEraseTimedOutPendingInterest
   virtual void
   WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry);
 
+  /// \copydoc ForwardingStrategy::AddFace
   virtual void
   AddFace (Ptr<Face> face)
   {
@@ -72,6 +83,7 @@
   }
   
 protected:
+  /// \copydoc ForwardingStrategy::CanSendOutInterest
   virtual bool
   CanSendOutInterest (Ptr<Face> inFace,
                       Ptr<Face> outFace,
@@ -79,31 +91,40 @@
                       Ptr<const Packet> origPacket,
                       Ptr<pit::Entry> pitEntry);
   
+  /// \copydoc ForwardingStrategy::WillSatisfyPendingInterest
   virtual void
   WillSatisfyPendingInterest (Ptr<Face> inFace,
                               Ptr<pit::Entry> pitEntry);
 
+protected:
+  static LogComponent g_log; ///< @brief Logging variable
+  
 private:
   std::string m_limitType;
-
-  static LogComponent g_log;
 };
 
 template<class Parent>
-LogComponent SimpleLimits<Parent>::g_log = LogComponent ("ndn.SimpleLimits");
+LogComponent PerOutFaceLimits<Parent>::g_log = LogComponent (PerOutFaceLimits<Parent>::GetLogName ().c_str ());
+
+template<class Parent>
+std::string
+PerOutFaceLimits<Parent>::GetLogName ()
+{
+  return super::GetLogName ()+".PerOutFaceLimits";
+}
 
 template<class Parent>
 TypeId
-SimpleLimits<Parent>::GetTypeId (void)
+PerOutFaceLimits<Parent>::GetTypeId (void)
 {
-  static TypeId tid = TypeId ((super::GetTypeId ().GetName ()+"::SimpleLimits").c_str ())
+  static TypeId tid = TypeId ((super::GetTypeId ().GetName ()+"::PerOutFaceLimits").c_str ())
     .SetGroupName ("Ndn")
     .template SetParent <super> ()
-    .template AddConstructor <SimpleLimits> ()
+    .template AddConstructor <PerOutFaceLimits> ()
 
     .template AddAttribute ("Limit", "Limit type to be used (e.g., ns3::ndn::Limits::Window or ns3::ndn::Limits::Rate)",
                             StringValue ("ns3::ndn::Limits::Window"),
-                            MakeStringAccessor (&SimpleLimits<Parent>::m_limitType),
+                            MakeStringAccessor (&PerOutFaceLimits<Parent>::m_limitType),
                             MakeStringChecker ())    
     ;
   return tid;
@@ -111,34 +132,30 @@
 
 template<class Parent>
 bool
-SimpleLimits<Parent>::CanSendOutInterest (Ptr<Face> inFace,
+PerOutFaceLimits<Parent>::CanSendOutInterest (Ptr<Face> inFace,
                                           Ptr<Face> outFace,
                                           Ptr<const InterestHeader> header,
                                           Ptr<const Packet> origPacket,
                                           Ptr<pit::Entry> pitEntry)
 {
   NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
-
-  if (!super::CanSendOutInterest (inFace, outFace, header, origPacket, pitEntry))
-    {
-      return false;
-    }
   
   Ptr<Limits> faceLimits = outFace->template GetObject<Limits> ();
   if (faceLimits->IsBelowLimit ())
     {
-      faceLimits->BorrowLimit ();
-      return true;
+      if (super::CanSendOutInterest (inFace, outFace, header, origPacket, pitEntry))
+        {
+          faceLimits->BorrowLimit ();
+          return true;
+        }
     }
-  else
-    {
-      return false;
-    }
+  
+  return false;
 }
 
 template<class Parent>
 void
-SimpleLimits<Parent>::WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry)
+PerOutFaceLimits<Parent>::WillEraseTimedOutPendingInterest (Ptr<pit::Entry> pitEntry)
 {
   NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
 
@@ -156,7 +173,7 @@
 
 template<class Parent>
 void
-SimpleLimits<Parent>::WillSatisfyPendingInterest (Ptr<Face> inFace,
+PerOutFaceLimits<Parent>::WillSatisfyPendingInterest (Ptr<Face> inFace,
                                                         Ptr<pit::Entry> pitEntry)
 {
   NS_LOG_FUNCTION (this << pitEntry->GetPrefix ());
@@ -176,4 +193,4 @@
 } // namespace ndn
 } // namespace ns3
 
-#endif // NDNSIM_SIMPLE_LIMITS_H
+#endif // NDNSIM_PER_OUT_FACE_LIMITS_H
diff --git a/model/fw/simple-limits.cc b/model/fw/simple-limits.cc
deleted file mode 100644
index 7880194..0000000
--- a/model/fw/simple-limits.cc
+++ /dev/null
@@ -1,57 +0,0 @@
-/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
-/*
- * Copyright (c) 2011 University of California, Los Angeles
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 2 as
- * published by the Free Software Foundation;
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
- *
- * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
- */
-
-#include "simple-limits.h"
-
-#include "ns3/ndn-l3-protocol.h"
-#include "ns3/ndn-interest-header.h"
-#include "ns3/ndn-content-object-header.h"
-
-#include "best-route.h"
-#include "flooding.h"
-#include "smart-flooding.h"
-
-namespace ns3 {
-namespace ndn {
-namespace fw {
-
-template class SimpleLimits<BestRoute>;
-typedef SimpleLimits<BestRoute> SimpleLimitsBestRoute;
-NS_OBJECT_ENSURE_REGISTERED (SimpleLimitsBestRoute);
-
-template class SimpleLimits<Flooding>;
-typedef SimpleLimits<Flooding> SimpleLimitsFlooding;
-NS_OBJECT_ENSURE_REGISTERED (SimpleLimitsFlooding);
-
-template class SimpleLimits<SmartFlooding>;
-typedef SimpleLimits<SmartFlooding> SimpleLimitsSmartFlooding;
-NS_OBJECT_ENSURE_REGISTERED (SimpleLimitsSmartFlooding);
-
-#ifdef DOXYGEN
-
-class SimpleLimitsBestRoute     : public SimpleLimits<BestRoute> { };
-class SimpleLimitsFlooding      : public SimpleLimits<Flooding> { };
-class SimpleLimitsSmartFlooding : public SimpleLimits<SmartFlooding> { };
-
-#endif
-
-} // namespace fw
-} // namespace ndn
-} // namespace ns3
diff --git a/model/fw/smart-flooding.cc b/model/fw/smart-flooding.cc
index e74b612..8a1d367 100644
--- a/model/fw/smart-flooding.cc
+++ b/model/fw/smart-flooding.cc
@@ -35,14 +35,20 @@
 #include <boost/lambda/bind.hpp>
 namespace ll = boost::lambda;
 
-NS_LOG_COMPONENT_DEFINE ("ndn.fw.SmartFlooding");
-
 namespace ns3 {
 namespace ndn {
 namespace fw {
 
 NS_OBJECT_ENSURE_REGISTERED (SmartFlooding);
-    
+
+LogComponent SmartFlooding::g_log = LogComponent (SmartFlooding::GetLogName ().c_str ());
+
+std::string
+SmartFlooding::GetLogName ()
+{
+  return super::GetLogName ()+".SmartFlooding";
+}
+
 TypeId
 SmartFlooding::GetTypeId (void)
 {
diff --git a/model/fw/smart-flooding.h b/model/fw/smart-flooding.h
index d30031b..f66d1e8 100644
--- a/model/fw/smart-flooding.h
+++ b/model/fw/smart-flooding.h
@@ -22,6 +22,7 @@
 #define NDNSIM_SMART_FLOODING_H
 
 #include "green-yellow-red.h"
+#include "ns3/log.h"
 
 namespace ns3 {
 namespace ndn {
@@ -33,8 +34,18 @@
 class SmartFlooding :
     public GreenYellowRed
 {
+private:
+  typedef GreenYellowRed super;
+
 public:
-  static TypeId GetTypeId ();
+  static TypeId
+  GetTypeId ();
+
+  /**
+   * @brief Helper function to retrieve logging name for the forwarding strategy
+   */
+  static std::string
+  GetLogName ();
 
   /**
    * @brief Default constructor
@@ -48,8 +59,8 @@
                        Ptr<const Packet> origPacket,
                        Ptr<pit::Entry> pitEntry);
 
-private:
-  typedef GreenYellowRed super;
+protected:
+  static LogComponent g_log;
 };
 
 } // namespace fw