helper/dce-manager-helper.cc
author Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
Wed, 15 Sep 2010 11:40:31 +0200
changeset 6 64c6f4f78c91
parent 0 0a55bed4c895
child 64 015a353a487b
permissions -rw-r--r--
add attribute to control loader type

#include "dce-manager-helper.h"
#include "ns3/dce-manager.h"
#include "ns3/socket-fd-factory.h"
#include "ns3/task-scheduler.h"
#include "ns3/task-manager.h"
#include "ns3/loader-factory.h"
#include "ns3/random-variable.h"
#include "ns3/uinteger.h"
#include "ns3/string.h"
#include "ns3/config.h"

namespace ns3 {

UniformVariable g_firstPid;

NS_OBJECT_ENSURE_REGISTERED (DceManagerHelper);

TypeId 
DceManagerHelper::GetTypeId (void)
{
  static TypeId tid = TypeId ("ns3::DceManagerHelper")
    .SetParent<ObjectBase> ()
    .AddAttribute ("LoaderFactory", 
		   "The kind of loader factory created when Install is called", 
		   StringValue ("ns3::CoojaLoaderFactory[]"),
		   MakeObjectFactoryAccessor (&DceManagerHelper::m_loaderFactory),
		   MakeObjectFactoryChecker ())
    ;
  return tid;
}
TypeId 
DceManagerHelper::GetInstanceTypeId (void) const
{
  return DceManagerHelper::GetTypeId ();
}

DceManagerHelper::DceManagerHelper ()
{
  ConstructSelf (AttributeList ());
  m_taskManagerFactory.SetTypeId ("ns3::TaskManager");
  m_schedulerFactory.SetTypeId ("ns3::RrTaskScheduler");
  m_managerFactory.SetTypeId ("ns3::DceManager");
  m_networkStackFactory.SetTypeId ("ns3::Ns3SocketFdFactory");
}
void 
DceManagerHelper::SetScheduler (std::string type, 
				    std::string n0, const AttributeValue &v0,
				    std::string n1, const AttributeValue &v1)
{
  m_schedulerFactory.SetTypeId (type);
  m_schedulerFactory.Set (n0, v0);
  m_schedulerFactory.Set (n1, v1);
}
void 
DceManagerHelper::SetTaskManagerAttribute (std::string n0, const AttributeValue &v0)
{
  m_taskManagerFactory.Set (n0, v0);
}
void 
DceManagerHelper::SetLoader (std::string type)
{
  m_loaderFactory.SetTypeId (type);
}
void 
DceManagerHelper::SetNetworkStack (std::string type,
				       std::string n0, const AttributeValue &v0)
{
  m_networkStackFactory.SetTypeId (type);
  m_networkStackFactory.Set (n0, v0);
}
void 
DceManagerHelper::SetAttribute (std::string n1, const AttributeValue &v1)
{
  m_managerFactory.Set (n1, v1);
}
void
DceManagerHelper::Install (NodeContainer nodes)
{
  for (NodeContainer::Iterator i = nodes.Begin (); i != nodes.End (); ++i)
    {
      Ptr<DceManager> manager = m_managerFactory.Create<DceManager> ();
      Ptr<TaskManager> taskManager = m_taskManagerFactory.Create<TaskManager> ();
      Ptr<TaskScheduler> scheduler = m_schedulerFactory.Create<TaskScheduler> ();
      Ptr<LoaderFactory> loader = m_loaderFactory.Create<LoaderFactory> ();
      Ptr<SocketFdFactory> networkStack = m_networkStackFactory.Create<SocketFdFactory> ();
      taskManager->SetScheduler (scheduler);
      manager->SetAttribute ("FirstPid", UintegerValue (g_firstPid.GetInteger (0, 0xffff)));
      Ptr<Node> node = *i;
      node->AggregateObject (taskManager);
      node->AggregateObject (loader);
      node->AggregateObject (manager);
      node->AggregateObject (networkStack);
    }
}

} // namespace ns3