23 #include "ns3/names.h" 24 #include "ns3/string.h" 25 #include "ns3/point-to-point-net-device.h" 26 #include "ns3/point-to-point-channel.h" 27 #include "ns3/node-list.h" 28 #include "ns3/simulator.h" 30 #if HAVE_NS3_VISUALIZER 31 #include "../../visualizer/model/visual-simulator-impl.h" 32 #endif // HAVE_NS3_VISUALIZER 42 #include <boost/lexical_cast.hpp> 44 #include "ns3/ndnSIM/NFD/daemon/face/generic-link-service.hpp" 45 #include "ns3/ndnSIM/NFD/daemon/table/cs-policy-priority-fifo.hpp" 46 #include "ns3/ndnSIM/NFD/daemon/table/cs-policy-lru.hpp" 48 NS_LOG_COMPONENT_DEFINE(
"ndn.StackHelper");
54 : m_isForwarderStatusManagerDisabled(false)
55 , m_isStrategyChoiceManagerDisabled(false)
56 , m_needSetDefaultRoutes(false)
61 m_csPolicies.insert({
"nfd::cs::lru", [] {
return make_unique<nfd::cs::LruPolicy>(); }});
62 m_csPolicies.insert({
"nfd::cs::priority_fifo", [] () {
return make_unique<nfd::cs::PriorityFifoPolicy>(); }});
64 m_csPolicyCreationFunc = m_csPolicies[
"nfd::cs::lru"];
66 m_ndnFactory.SetTypeId(
"ns3::ndn::L3Protocol");
67 m_contentStoreFactory.SetTypeId(
"ns3::ndn::cs::Lru");
69 m_netDeviceCallbacks.push_back(
70 std::make_pair(PointToPointNetDevice::GetTypeId(),
71 MakeCallback(&StackHelper::PointToPointNetDeviceCallback,
this)));
90 make_shared<ns3::ndn::time::CustomSystemClock>());
96 NS_LOG_FUNCTION(
this << needSet);
97 m_needSetDefaultRoutes = needSet;
102 const std::string& attr2,
const std::string& value2,
103 const std::string& attr3,
const std::string& value3,
104 const std::string& attr4,
const std::string& value4)
107 m_ndnFactory.Set(attr1, StringValue(value1));
109 m_ndnFactory.Set(attr2, StringValue(value2));
111 m_ndnFactory.Set(attr3, StringValue(value3));
113 m_ndnFactory.Set(attr4, StringValue(value4));
118 const std::string& value1,
const std::string& attr2,
119 const std::string& value2,
const std::string& attr3,
120 const std::string& value3,
const std::string& attr4,
121 const std::string& value4)
125 m_contentStoreFactory.SetTypeId(contentStore);
127 m_contentStoreFactory.Set(attr1, StringValue(value1));
129 m_contentStoreFactory.Set(attr2, StringValue(value2));
131 m_contentStoreFactory.Set(attr3, StringValue(value3));
133 m_contentStoreFactory.Set(attr4, StringValue(value4));
139 m_maxCsSize = maxSize;
145 auto found = m_csPolicies.find(policy);
146 if (found != m_csPolicies.end()) {
147 m_csPolicyCreationFunc = found->second;
150 NS_FATAL_ERROR(
"Cache replacement policy " << policy <<
" not found");
151 NS_LOG_DEBUG(
"Available cache replacement policies: ");
152 for (
auto it = m_csPolicies.begin(); it != m_csPolicies.end(); it++) {
153 NS_LOG_DEBUG(
" " << it->first);
161 for (NodeContainer::Iterator i = c.Begin(); i != c.End(); ++i) {
169 Install(NodeContainer::GetGlobal());
176 NS_FATAL_ERROR(
"Cannot re-install NDN stack on node " 180 Simulator::ScheduleWithContext(node->GetId(), Seconds(0), &StackHelper::doInstall,
this, node);
185 StackHelper::doInstall(Ptr<Node> node)
const 190 if (m_isForwarderStatusManagerDisabled) {
191 ndn->getConfig().put(
"ndnSIM.disable_forwarder_status_manager",
true);
194 if (m_isStrategyChoiceManagerDisabled) {
195 ndn->getConfig().put(
"ndnSIM.disable_strategy_choice_manager",
true);
198 ndn->getConfig().put(
"tables.cs_max_packets", (m_maxCsSize == 0) ? 1 : m_maxCsSize);
201 if (m_maxCsSize == 0) {
206 ndn->setCsReplacementPolicy(m_csPolicyCreationFunc);
210 node->AggregateObject(
ndn);
212 for (uint32_t index = 0; index < node->GetNDevices(); index++) {
213 Ptr<NetDevice> device = node->GetDevice(index);
219 this->createAndRegisterFace(node,
ndn, device);
227 m_netDeviceCallbacks.push_back(std::make_pair(netDeviceType, callback));
234 for (
auto& i : m_netDeviceCallbacks) {
235 if (i.first == netDeviceType) {
246 m_netDeviceCallbacks.remove_if([&] (
const std::pair<TypeId, FaceCreateCallback>& i) {
247 return (i.first == netDeviceType);
254 std::string uri =
"netdev://";
255 Address address = netDevice->GetAddress();
256 if (Mac48Address::IsMatchingType(address)) {
257 uri +=
"[" + boost::lexical_cast<std::string>(Mac48Address::ConvertFrom(address)) +
"]";
265 StackHelper::DefaultNetDeviceCallback(Ptr<Node> node, Ptr<L3Protocol>
ndn,
266 Ptr<NetDevice> netDevice)
const 268 NS_LOG_DEBUG(
"Creating default Face on node " << node->GetId());
273 opts.allowReassembly =
true;
274 opts.allowCongestionMarking =
true;
276 auto linkService = make_unique<::nfd::face::GenericLinkService>(opts);
278 auto transport = make_unique<NetDeviceTransport>(node, netDevice,
280 "netdev://[ff:ff:ff:ff:ff:ff]");
282 auto face = std::make_shared<Face>(std::move(linkService), std::move(transport));
286 NS_LOG_LOGIC(
"Node " << node->GetId() <<
": added Face as face #" 287 << face->getLocalUri());
293 StackHelper::PointToPointNetDeviceCallback(Ptr<Node> node, Ptr<L3Protocol>
ndn,
294 Ptr<NetDevice> device)
const 296 NS_LOG_DEBUG(
"Creating point-to-point Face on node " << node->GetId());
298 Ptr<PointToPointNetDevice> netDevice = DynamicCast<PointToPointNetDevice>(device);
299 NS_ASSERT(netDevice !=
nullptr);
302 Ptr<PointToPointChannel> channel = DynamicCast<PointToPointChannel>(netDevice->GetChannel());
303 NS_ASSERT(channel !=
nullptr);
305 Ptr<NetDevice> remoteNetDevice = channel->GetDevice(0);
306 if (remoteNetDevice->GetNode() == node)
307 remoteNetDevice = channel->GetDevice(1);
315 auto linkService = make_unique<::nfd::face::GenericLinkService>(opts);
317 auto transport = make_unique<NetDeviceTransport>(node, netDevice,
321 auto face = std::make_shared<Face>(std::move(linkService), std::move(transport));
325 NS_LOG_LOGIC(
"Node " << node->GetId() <<
": added Face as face #" 326 << face->getLocalUri());
334 Ptr<Node> node = Names::Find<Node>(nodeName);
348 for (uint32_t index = 0; index < node->GetNDevices(); index++) {
350 Ptr<NetDevice> device = node->GetDevice(index);
352 if (
ndn->getFaceByNetDevice(device) ==
nullptr) {
353 this->createAndRegisterFace(node,
ndn, device);
361 for (NodeContainer::Iterator i = c.Begin(); i != c.End(); ++i) {
369 Ptr<Node> node = Names::Find<Node>(nodeName);
376 Update(NodeContainer::GetGlobal());
380 StackHelper::createAndRegisterFace(Ptr<Node> node, Ptr<L3Protocol>
ndn, Ptr<NetDevice> device)
const 382 shared_ptr<Face> face;
384 for (
const auto& item : m_netDeviceCallbacks) {
385 if (device->GetInstanceTypeId() == item.first ||
386 device->GetInstanceTypeId().IsChildOf(item.first)) {
387 face = item.second(node,
ndn, device);
394 face = DefaultNetDeviceCallback(node,
ndn, device);
397 if (m_needSetDefaultRoutes) {
407 m_isStrategyChoiceManagerDisabled =
true;
413 m_isForwarderStatusManagerDisabled =
true;
419 for (uint32_t i = 0; i < NodeList::GetNNodes(); ++i) {
424 for (
auto& face :
ndn->getForwarder()->getFaceTable()) {
425 auto transport = dynamic_cast<NetDeviceTransport*>(face.getTransport());
426 if (transport ==
nullptr)
428 auto p2p = dynamic_cast<PointToPointChannel*>(&(*(transport->GetNetDevice()->GetChannel())));
429 TimeValue currentDelay;
430 p2p->GetAttribute(
"Delay", currentDelay);
431 face.setMetric((currentDelay.Get().ToDouble(Time::S)) * 1000);
433 std::cout <<
"Node " << i <<
": Face " << face.getId()
434 <<
" with metric " << face.getMetric() <<
"\n";
442 Simulator::Stop(Seconds(0));
443 #if HAVE_NS3_VISUALIZER 444 auto impl = DynamicCast<VisualSimulatorImpl>(Simulator::GetImplementation());
445 if (impl !=
nullptr) {
446 impl->RunRealSimulator();
453 #endif // HAVE_NS3_VISUALIZER virtual ~StackHelper()
Destroy the NdnStackHelper.
Copyright (c) 2011-2015 Regents of the University of California.
void setPolicy(const std::string &policy)
Set the cache replacement policy for NFD's Content Store.
StackHelper()
Create a new NdnStackHelper with a default NDN_FLOODING forwarding stategy.
static void ProcessWarmupEvents()
bool allowReassembly
enables reassembly
void RemoveFaceCreateCallback(TypeId netDeviceType, FaceCreateCallback callback)
Remove callback to create and configure instance of the face, based on supplied Ptr<Node> and Ptr<Net...
void setCsSize(size_t maxSize)
Set maximum size for NFD's Content Store (in number of packets)
void SetDefaultRoutes(bool needSet)
Set flag indicating necessity to install default routes in FIB.
static void SetLinkDelayAsFaceMetric()
Set face metric of all faces connected through PointToPoint channel to channel latency.
void 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="")
Set parameters of NdnL3Protocol.
static void AddRoute(Ptr< Node > node, const Name &prefix, shared_ptr< Face > face, int32_t metric)
Add forwarding entry to FIB.
void InstallAll() const
Install Ndn stack on all nodes in the simulation.
void disableForwarderStatusManager()
Disable Forwarder Status Manager.
std::string constructFaceUri(Ptr< NetDevice > netDevice)
void setCustomNdnCxxClocks()
bool allowCongestionMarking
enables send queue congestion detection and marking
Callback< shared_ptr< Face >, Ptr< Node >, Ptr< L3Protocol >, Ptr< NetDevice > > FaceCreateCallback
void Install(const std::string &nodeName) const
Install Ndn stack on the node.
Copyright (c) 2011-2015 Regents of the University of California.
void AddFaceCreateCallback(TypeId netDeviceType, FaceCreateCallback callback)
Add callback to create and configure instance of the face, based on supplied Ptr<Node> and Ptr<NetDev...
void SetOldContentStore(const std::string &contentStoreClass, 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="")
Set ndnSIM 1.0 content store implementation and its attributes.
Implementation network-layer of NDN stack.
void setCustomClocks(shared_ptr< CustomSteadyClock > steadyClock=nullptr, shared_ptr< CustomSystemClock > systemClock=nullptr)
Set custom system and steady clocks.
Options that control the behavior of GenericLinkService.
ndn cs ContentStore
Copyright (c) 2011-2015 Regents of the University of California.
void UpdateAll()
Update Ndn stack on all the nodes (Add faces for new devices)
static KeyChain & getKeyChain()
void UpdateFaceCreateCallback(TypeId netDeviceType, FaceCreateCallback callback)
Update callback to create and configure instance of the face, based on supplied Ptr<Node> and Ptr<Net...
void Update(Ptr< Node > node)
Update Ndn stack on a given node (Add faces for new devices)
void disableStrategyChoiceManager()
Disable Strategy Choice Manager.
bool allowFragmentation
enables fragmentation