plugins/ip-faces: Updating TcpFace implementation
In addition to changes to follow latest API changes in ndnSIM, the
helper ndn::IpFacesHelper allows scheduling TcpFace creation at specific
point of simulation.
Refs #1006 (http://redmine.named-data.net/)
diff --git a/plugins/ip-faces/ndn-ip-faces-helper.cc b/plugins/ip-faces/ndn-ip-faces-helper.cc
index efd956f..4d64268 100644
--- a/plugins/ip-faces/ndn-ip-faces-helper.cc
+++ b/plugins/ip-faces/ndn-ip-faces-helper.cc
@@ -60,25 +60,45 @@
}
-static void
-CreateTcpFaceStep2 (Ptr<Node> node, Ipv4Address address, const std::string &prefix)
+struct TcpPrefixRegistrator : SimpleRefCount<TcpPrefixRegistrator>
{
- Ptr<Face> face = TcpFace::CreateOrGetFace (node, address);
- ndn::StackHelper::AddRoute (node, prefix, face, 1);
-}
+ TcpPrefixRegistrator (Ptr<Node> node, const std::string &prefix, int16_t metric)
+ : m_node (node)
+ , m_prefix (prefix)
+ , m_metric (metric)
+ {
+ }
+
+ void
+ Run (Ptr<Face> face)
+ {
+ ndn::StackHelper::AddRoute (m_node, m_prefix, face, m_metric);
+ }
+private:
+ Ptr<Node> m_node;
+ std::string m_prefix;
+ int16_t m_metric;
+};
static void
-CreateTcpFaceStep1 (Ptr<Node> node, Ipv4Address address, const std::string &prefix)
+ScheduledCreateTcp (Ptr<Node> node, Ipv4Address address, const std::string &prefix, int16_t metric)
{
- TcpFace::CreateOrGetFace (node, address);
-
- Simulator::ScheduleWithContext (node->GetId (), Seconds (1.0), CreateTcpFaceStep2, node, address, prefix);
+ Ptr<Face> face = TcpFace::GetFaceByAddress (address);
+ if (face == 0)
+ {
+ Ptr<TcpPrefixRegistrator> registrator = Create<TcpPrefixRegistrator> (node, prefix, metric);
+ TcpFace::CreateOrGetFace (node, address, MakeCallback (&TcpPrefixRegistrator::Run, registrator));
+ }
+ else
+ {
+ ndn::StackHelper::AddRoute (node, prefix, face, metric);
+ }
}
void
-IpFacesHelper::CreateTcpFace (Ptr<Node> node, Ipv4Address address, const std::string &prefix)
+IpFacesHelper::CreateTcpFace (const Time &when, Ptr<Node> node, Ipv4Address address, const std::string &prefix, int16_t metric/* = 1*/)
{
- Simulator::ScheduleWithContext (node->GetId (), Seconds (1.0), CreateTcpFaceStep1, node, address, prefix);
+ Simulator::ScheduleWithContext (node->GetId (), when, ScheduledCreateTcp, node, address, prefix, metric);
}