BGL implementation for ccnx global routing seems to work. Need more debugging
diff --git a/helper/boost-graph-ccnx-global-routing-helper.h b/helper/boost-graph-ccnx-global-routing-helper.h
index 3711278..ef04fac 100644
--- a/helper/boost-graph-ccnx-global-routing-helper.h
+++ b/helper/boost-graph-ccnx-global-routing-helper.h
@@ -24,7 +24,9 @@
 
 #include <boost/graph/graph_traits.hpp>
 #include <boost/graph/properties.hpp>
+#include <boost/ref.hpp>
 
+#include "ns3/ccnx-face.h"
 #include "ns3/node-list.h"
 #include "ns3/channel-list.h"
 #include "../model/ccnx-global-router.h"
@@ -202,12 +204,65 @@
 struct property_traits< EdgeWeights >
 {
   // Metric property map
-  typedef uint16_t value_type;
-  typedef uint16_t reference;
+  typedef tuple< ns3::Ptr<ns3::CcnxFace>, uint16_t > value_type;
+  typedef tuple< ns3::Ptr<ns3::CcnxFace>, uint16_t > reference;
   typedef ns3::CcnxGlobalRouter::Incidency key_type;
   typedef readable_property_map_tag category;
 };
 
+const property_traits< EdgeWeights >::value_type WeightZero (0, 0);
+const property_traits< EdgeWeights >::value_type WeightInf (0, std::numeric_limits<uint16_t>::max ());
+
+struct WeightCompare :
+    public std::binary_function<property_traits< EdgeWeights >::reference,
+                                property_traits< EdgeWeights >::reference,
+                                bool>
+{
+  bool
+  operator () (property_traits< EdgeWeights >::reference a,
+               property_traits< EdgeWeights >::reference b) const
+  {
+    return a.get<1> () < b.get<1> ();
+  }
+
+  bool
+  operator () (property_traits< EdgeWeights >::reference a,
+               uint32_t b) const
+  {
+    return a.get<1> () < b;
+  }
+  
+  bool
+  operator () (uint32_t a,
+               uint32_t b) const
+  {
+    return a < b;
+  }
+
+};
+
+struct WeightCombine :
+    public std::binary_function<uint32_t,
+                                property_traits< EdgeWeights >::reference,
+                                uint32_t>
+{
+  uint32_t
+  operator () (uint32_t a, property_traits< EdgeWeights >::reference b) const
+  {
+    return a + b.get<1> ();
+  }
+
+  tuple< ns3::Ptr<ns3::CcnxFace>, uint32_t >
+  operator () (tuple< ns3::Ptr<ns3::CcnxFace>, uint32_t > a,
+               property_traits< EdgeWeights >::reference b) const
+  {
+    if (a.get<0> () == 0)
+      return make_tuple (b.get<0> (), a.get<1> () + b.get<1> ());
+    else
+      return make_tuple (a.get<0> (), a.get<1> () + b.get<1> ());
+  }
+};
+  
 template<>
 struct property_traits< VertexIds >
 {
@@ -234,12 +289,12 @@
   return VertexIds (g);
 }
 
-template<class K, class V>
+template<class M, class K, class V>
 inline void
-put (std::map<K,V> &mapp,
+put (reference_wrapper< M > mapp,
      K a, V p)
 {
-  mapp[a] = p;
+  mapp.get ()[a] = p;
 }
 
 // void
@@ -251,23 +306,22 @@
   return gr->GetId ();
 }
 
-inline uint16_t
+inline property_traits< EdgeWeights >::reference
 get(const boost::EdgeWeights&, ns3::CcnxGlobalRouter::Incidency &edge)
 {
   if (edge.get<1> () == 0)
-    return 0;
+    return property_traits< EdgeWeights >::reference (0, 0);
   else
-    return edge.get<1> ()->GetMetric ();
+    return property_traits< EdgeWeights >::reference (edge.get<1> (), edge.get<1> ()->GetMetric ());
 }
 
-
 struct PredecessorsMap :
   public std::map< ns3::Ptr< ns3::CcnxGlobalRouter >, ns3::Ptr< ns3::CcnxGlobalRouter > >
 {
 };
 
 template<>
-struct property_traits< PredecessorsMap >
+struct property_traits< reference_wrapper<PredecessorsMap> >
 {
   // Metric property map
   typedef ns3::Ptr< ns3::CcnxGlobalRouter > value_type;
@@ -278,26 +332,26 @@
 
 
 struct DistancesMap :
-  public std::map< ns3::Ptr< ns3::CcnxGlobalRouter >, uint32_t >
+  public std::map< ns3::Ptr< ns3::CcnxGlobalRouter >, tuple< ns3::Ptr<ns3::CcnxFace>, uint32_t > >
 {
 };
 
 template<>
-struct property_traits< DistancesMap >
+struct property_traits< reference_wrapper<DistancesMap> >
 {
   // Metric property map
-  typedef uint32_t value_type;
-  typedef uint32_t reference;
+  typedef tuple< ns3::Ptr<ns3::CcnxFace>, uint32_t > value_type;
+  typedef tuple< ns3::Ptr<ns3::CcnxFace>, uint32_t > reference;
   typedef ns3::Ptr< ns3::CcnxGlobalRouter > key_type;
   typedef read_write_property_map_tag category;
 };
 
-inline uint32_t
+inline tuple< ns3::Ptr<ns3::CcnxFace>, uint32_t >
 get (DistancesMap &map, ns3::Ptr<ns3::CcnxGlobalRouter> key)
 {
   boost::DistancesMap::iterator i = map.find (key);
   if (i == map.end ())
-    return std::numeric_limits<uint32_t>::max ();
+    return tuple< ns3::Ptr<ns3::CcnxFace>, uint32_t > (0, std::numeric_limits<uint32_t>::max ());
   else
     return i->second;
 }
diff --git a/helper/ccnx-global-routing-helper.cc b/helper/ccnx-global-routing-helper.cc
index 63e202e..5fde9cb 100644
--- a/helper/ccnx-global-routing-helper.cc
+++ b/helper/ccnx-global-routing-helper.cc
@@ -35,6 +35,11 @@
 #include "ns3/channel-list.h"
 
 #include <boost/lexical_cast.hpp>
+#include <boost/concept/assert.hpp>
+// #include <boost/graph/graph_concepts.hpp>
+// #include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/dijkstra_shortest_paths.hpp>
+
 #include "boost-graph-ccnx-global-routing-helper.h"
 
 NS_LOG_COMPONENT_DEFINE ("CcnxGlobalRoutingHelper");
@@ -171,20 +176,10 @@
   AddOrigin (prefix, node);
 }
 
-} // namespace ns3
-
-
-
-#include <boost/concept/assert.hpp>
-#include <boost/graph/graph_concepts.hpp>
-// #include <boost/graph/adjacency_list.hpp>
-#include <boost/graph/dijkstra_shortest_paths.hpp>
-
-namespace ns3 {
-
 void
 CcnxGlobalRoutingHelper::CalculateRoutes ()
 {
+  NS_LOG_DEBUG ("Enter");
   BOOST_CONCEPT_ASSERT(( VertexListGraphConcept< CcnxGlobalRouterGraph > ));
   BOOST_CONCEPT_ASSERT(( IncidenceGraphConcept< CcnxGlobalRouterGraph > ));
   // BOOST_CONCEPT_ASSERT(( ReadablePropertyMapConcept< CcnxGlobalRouterGraph,
@@ -197,61 +192,56 @@
 
   
   CcnxGlobalRouterGraph graph;
-  Ptr<CcnxGlobalRouter> source = (*NodeList::Begin ())->GetObject<CcnxGlobalRouter> ();
-  
   typedef graph_traits < CcnxGlobalRouterGraph >::vertex_descriptor vertex_descriptor;
 
-  PredecessorsMap predecessors;
-  DistancesMap    distances;
-  // std::map< vertex_descriptor, int > distances;
-  // std::vector<uint32_t> d (num_vertices (graph));
-  // std::vector<int> distances;
-  // std::map< vertex_descriptor, std::
-
-  dijkstra_shortest_paths (graph, source,
-  			   predecessor_map (predecessors)
-			   .
-  			   distance_map (distances)
-  			   );
-
-  // BOOST_CONCEPT_ASSERT(( BidirectionalGraphConcept<CcnxGlobalRouterGraph> ));
-  // BOOST_CONCEPT_ASSERT(( MutableGraphConcept<CcnxGlobalRouterGraph> ));
-
-  // typedef adjacency_list < listS, vecS, undirectedS, no_property, property < edge_weight_t, uint16_t > > Graph;
-  // typedef Graph::vertex_descriptor Vertex;
-
-  // class Graph
-  // {
-  // public:
-  //   typedef Ptr<CcnxGlobalRouter> vertex_descriptor;
-  //   typedef pair< Ptr<CcnxGlobalRouter>, Ptr<CcnxGlobalRouter> > edge_descriptor;
-  //   typedef directed_tag directed_category;
-  //   typedef disallow_parallel_edge_tag edge_parallel_category;
-  //   typedef adjacency_graph_tag traversal_category;
-
-  //   typedef CcnxGlobalRouter::Incidency adjacency_iterator;
-
-  //   // null_vertex() ???
-  //   // adjacent_vertices(v, g) ???
-  // };
+  for (NodeList::Iterator node = NodeList::Begin (); node != NodeList::End (); node++)
+    {
+      Ptr<CcnxGlobalRouter> source = (*node)->GetObject<CcnxGlobalRouter> ();
+      if (source == 0)
+	{
+	  NS_LOG_DEBUG ("Node " << (*node)->GetId () << " does not export CcnxGlobalRouter interface");
+	  continue;
+	}
   
-  // Graph graph;
+      // PredecessorsMap predecessors;
+      DistancesMap    distances;
 
-  // for (NodeList::Iterator node = NodeList::Begin (); node != NodeList::End (); node++)
-  //   {
-  //     Ptr<CcnxGlobalRouter> gr = (*node)->GetObject<CcnxGlobalRouter> ();
-  //     if (gr == 0)
-  // 	continue;
+      dijkstra_shortest_paths (graph, source,
+			       // predecessor_map (boost::ref(predecessors))
+			       // .
+			       distance_map (boost::ref(distances))
+			       .
+			       distance_inf (WeightInf)
+			       .
+			       distance_zero (WeightZero)
+			       .
+			       distance_compare (boost::WeightCompare ())
+			       .
+			       distance_combine (boost::WeightCombine ())
+			       );
 
-  //     for (CcnxGlobalRouter::IncidencyList::const_iterator i = gr->GetIncidencies ().begin ();
-  // 	   i != gr->GetIncidencies ().end ();
-  // 	   i++)
-  // 	{
-  // 	  add_edge (gr, i->get<1> (), 10, graph);
-  // 	}
-  //     break;
-  //   }
+      // NS_LOG_DEBUG (predecessors.size () << ", " << distances.size ());
   
+      cout << "Reachability from Node: " << source->GetObject<Node> ()->GetId () << endl;
+      for (DistancesMap::iterator i = distances.begin ();
+	   i != distances.end ();
+	   i++)
+	{
+	  if (i->first == source)
+	    continue;
+	  else
+	    {
+	      cout << "  Node " << i->first->GetObject<Node> ()->GetId ();
+	      if (distances[i->first].get<0> () == 0)
+		cout << " is unreachable" << endl;
+	      else
+		cout << " reachable via face " << *i->second.get<0> ()
+		     << " with distance " << i->second.get<1> () << endl;
+	    }
+	}
+
+    }
+  // NS_LOG_DEBUG ("Exit");
 }
 
 
diff --git a/helper/ccnx-stack-helper.cc b/helper/ccnx-stack-helper.cc
index b7c8a01..22f0f22 100644
--- a/helper/ccnx-stack-helper.cc
+++ b/helper/ccnx-stack-helper.cc
@@ -222,97 +222,4 @@
 }
 
 
-void
-CcnxStackHelper::InstallFakeGlobalRoutesImpl ()
-{
-  for (NodeList::Iterator node = NodeList::Begin ();
-       node != NodeList::End ();
-       node ++)
-    {
-      NS_ASSERT_MSG ((*node)->GetObject<Ipv4> () != 0,
-                     "InternetStack should be installed on all nodes");
-
-      NS_ASSERT_MSG (Ipv4RoutingHelper::GetRouting<Ipv4GlobalRoutingOrderedNexthops>
-                     (
-                      (*node)->GetObject<Ipv4> ()->GetRoutingProtocol ()
-                      ),
-                     "InternetStack should have Ipv4GlobalRoutingOrderedNexthops as routing protocol");
-      // Example:
-      //
-      // Ipv4GlobalRoutingHelper ipv4RoutingHelper ("ns3::Ipv4GlobalRoutingUnorderedNexthops");
-      // stack.SetRoutingHelper (ipv4RoutingHelper);
-      //
-      
-      Ptr<GlobalRouter> globalRouter = (*node)->GetObject<GlobalRouter> ();
-      if (globalRouter == 0) continue;
-
-      globalRouter->InjectRoute (Ipv4Address((*node)->GetId ()), Ipv4Mask("255.255.255.255"));
-    }
-}
-
-void
-CcnxStackHelper::InstallFakeGlobalRoutes ()
-{
-  InstallFakeGlobalRoutesImpl ();
-  Ipv4GlobalRoutingHelper::PopulateAllPossibleRoutingTables ();
-}
-
-void
-CcnxStackHelper::InstallRouteTo (Ptr<Node> destNode)
-{
-  InstallRouteTo (boost::lexical_cast<std::string> (destNode->GetId ()), destNode);
-}
-
-void
-CcnxStackHelper::InstallRouteTo (const std::string &prefix, Ptr<Node> destNode)
-{
-  Ipv4Address destIpv4 = Ipv4Address(destNode->GetId ());
-  
-  for (NodeList::Iterator node = NodeList::Begin ();
-       node != NodeList::End ();
-       node ++)
-    {
-      if (destNode == *node) continue;
-      
-      Ptr<Ccnx> ccnx = (*node)->GetObject<Ccnx> ();
-      NS_ASSERT_MSG (ccnx != 0, "CCNx stack should be installed on all nodes");
-
-      Ptr<Ipv4> ipv4 = (*node)->GetObject<Ipv4> ();
-      NS_ASSERT_MSG (ipv4 != 0,
-                     "InternetStack should be installed on all nodes");
-      
-      Ptr<Ipv4GlobalRoutingOrderedNexthops> routing =
-        Ipv4RoutingHelper::GetRouting<Ipv4GlobalRoutingOrderedNexthops> (ipv4->GetRoutingProtocol ());
-      NS_ASSERT_MSG (routing != 0, "Ipv4GlobalRoutingOrderedNexthops should be used in InternetStack");
-
-      Ptr<Ipv4GlobalRoutingOrderedNexthops::EntryContainer>
-        routes = routing->Lookup (destIpv4);
-
-      NS_ASSERT_MSG (routes != 0, "Should not happen... Call the developer");
-
-      BOOST_FOREACH (const Ipv4RoutingTableEntry &entry, *routes)
-        {
-          Ptr<NetDevice> netDevice = ipv4->GetNetDevice (entry.GetInterface ());
-          NS_ASSERT_MSG (netDevice != 0, "Should never happen. Call the popos");
-          
-          Ptr<CcnxFace> face = ccnx->GetFaceByNetDevice (netDevice);
-          NS_ASSERT_MSG (face != 0, "Definitely should never happen. Call the president");
-            
-          AddRoute (*node, prefix, face, entry.GetMetric ());
-        }
-    }
-}
-
-void
-CcnxStackHelper::InstallRoutesToAll ()
-{
-  for (NodeList::Iterator node = NodeList::Begin ();
-       node != NodeList::End ();
-       node ++)
-    {
-      InstallRouteTo (*node);
-    }
-}
-
-
 } // namespace ns3
diff --git a/model/ccnx-net-device-face.cc b/model/ccnx-net-device-face.cc
index 3d3275e..c09e6b2 100644
--- a/model/ccnx-net-device-face.cc
+++ b/model/ccnx-net-device-face.cc
@@ -52,6 +52,8 @@
 {
   NS_LOG_FUNCTION (this << netDevice);
 
+  SetMetric (1); // default metric
+
   NS_ASSERT_MSG (m_netDevice != 0, "CcnxNetDeviceFace needs to be assigned a valid NetDevice");
 }
 
diff --git a/wscript b/wscript
index baf5c8e..4839954 100644
--- a/wscript
+++ b/wscript
@@ -65,6 +65,7 @@
         "helper/tracers/ccnx-consumer-window-tracer.h",
         "helper/tracers/ccnx-path-weight-tracer.h",
         "helper/ccnx-face-container.h",
+        "helper/ccnx-global-routing-helper.h",
 
         "apps/ccnx-app.h",