2007-07-31 09:09:31 +02:00
|
|
|
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
|
|
|
|
/*
|
|
|
|
|
* Copyright (c) 2006 Georgia Tech Research Corporation, INRIA
|
|
|
|
|
*
|
|
|
|
|
* 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
|
|
|
|
|
*
|
|
|
|
|
* Authors: George F. Riley<riley@ece.gatech.edu>
|
|
|
|
|
* Mathieu Lacage <mathieu.lacage@sophia.inria.fr>
|
|
|
|
|
*/
|
2007-06-04 16:21:05 +02:00
|
|
|
#include "node.h"
|
2007-03-20 06:28:24 -07:00
|
|
|
#include "node-list.h"
|
2007-05-02 09:16:58 +02:00
|
|
|
#include "net-device.h"
|
2007-05-13 09:46:38 +02:00
|
|
|
#include "application.h"
|
2007-08-01 08:58:18 +02:00
|
|
|
#include "packet-socket-factory.h"
|
2007-10-01 14:15:56 +02:00
|
|
|
#include "ns3/packet.h"
|
2007-05-02 10:33:39 +02:00
|
|
|
#include "ns3/simulator.h"
|
2007-08-01 12:33:44 +02:00
|
|
|
#include "ns3/composite-trace-resolver.h"
|
2007-02-08 11:11:24 +01:00
|
|
|
|
|
|
|
|
namespace ns3{
|
|
|
|
|
|
2008-01-02 10:33:39 +01:00
|
|
|
InterfaceId
|
|
|
|
|
Node::iid (void)
|
|
|
|
|
{
|
2008-01-03 08:34:31 +01:00
|
|
|
static InterfaceId iid = InterfaceId ("Node")
|
|
|
|
|
.SetParent<Object> ();
|
2008-01-02 10:33:39 +01:00
|
|
|
return iid;
|
|
|
|
|
}
|
2007-05-03 11:08:13 +02:00
|
|
|
|
2007-08-06 19:40:18 +02:00
|
|
|
NodeNetDeviceIndex::NodeNetDeviceIndex ()
|
|
|
|
|
: m_index (0)
|
|
|
|
|
{}
|
|
|
|
|
NodeNetDeviceIndex::NodeNetDeviceIndex (uint32_t index)
|
|
|
|
|
: m_index (index)
|
|
|
|
|
{}
|
|
|
|
|
uint32_t
|
|
|
|
|
NodeNetDeviceIndex::Get (void) const
|
|
|
|
|
{
|
|
|
|
|
return m_index;
|
|
|
|
|
}
|
|
|
|
|
void
|
|
|
|
|
NodeNetDeviceIndex::Print (std::ostream &os) const
|
|
|
|
|
{
|
|
|
|
|
os << "device=" << m_index;
|
|
|
|
|
}
|
|
|
|
|
uint16_t
|
|
|
|
|
NodeNetDeviceIndex::GetUid (void)
|
|
|
|
|
{
|
2007-08-08 10:06:58 +02:00
|
|
|
static uint16_t uid = AllocateUid<NodeNetDeviceIndex> ("NodeNetDeviceIndex");
|
2007-08-06 19:40:18 +02:00
|
|
|
return uid;
|
|
|
|
|
}
|
2007-08-27 14:59:50 +02:00
|
|
|
std::string
|
2007-08-30 14:35:44 +02:00
|
|
|
NodeNetDeviceIndex::GetTypeName (void) const
|
2007-08-27 14:59:50 +02:00
|
|
|
{
|
2007-08-30 14:35:44 +02:00
|
|
|
return "ns3::NodeNetDeviceIndex";
|
2007-08-27 14:59:50 +02:00
|
|
|
}
|
2007-08-06 19:40:18 +02:00
|
|
|
|
|
|
|
|
|
2007-12-11 13:51:03 +01:00
|
|
|
NodeApplicationIndex::NodeApplicationIndex ()
|
|
|
|
|
: m_index (0)
|
|
|
|
|
{}
|
|
|
|
|
NodeApplicationIndex::NodeApplicationIndex (uint32_t index)
|
|
|
|
|
: m_index (index)
|
|
|
|
|
{}
|
|
|
|
|
uint32_t
|
|
|
|
|
NodeApplicationIndex::Get (void) const
|
|
|
|
|
{
|
|
|
|
|
return m_index;
|
|
|
|
|
}
|
|
|
|
|
void
|
|
|
|
|
NodeApplicationIndex::Print (std::ostream &os) const
|
|
|
|
|
{
|
|
|
|
|
os << "device=" << m_index;
|
|
|
|
|
}
|
|
|
|
|
uint16_t
|
|
|
|
|
NodeApplicationIndex::GetUid (void)
|
|
|
|
|
{
|
|
|
|
|
static uint16_t uid = AllocateUid<NodeApplicationIndex> ("NodeApplicationIndex");
|
|
|
|
|
return uid;
|
|
|
|
|
}
|
|
|
|
|
std::string
|
|
|
|
|
NodeApplicationIndex::GetTypeName (void) const
|
|
|
|
|
{
|
|
|
|
|
return "ns3::NodeApplicationIndex";
|
|
|
|
|
}
|
|
|
|
|
|
2007-08-06 19:40:18 +02:00
|
|
|
|
2007-06-04 16:17:01 +02:00
|
|
|
Node::Node()
|
2007-05-25 10:56:03 +02:00
|
|
|
: m_id(0),
|
2007-05-02 13:44:41 +02:00
|
|
|
m_sid(0)
|
2007-02-12 16:01:18 +01:00
|
|
|
{
|
2007-08-01 08:58:18 +02:00
|
|
|
Construct ();
|
2007-03-19 22:19:38 -07:00
|
|
|
}
|
|
|
|
|
|
2007-06-04 16:17:01 +02:00
|
|
|
Node::Node(uint32_t sid)
|
2007-05-25 10:56:03 +02:00
|
|
|
: m_id(0),
|
2007-05-02 13:44:41 +02:00
|
|
|
m_sid(sid)
|
2007-03-19 22:19:38 -07:00
|
|
|
{
|
2007-08-01 08:58:18 +02:00
|
|
|
Construct ();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
Node::Construct (void)
|
|
|
|
|
{
|
2007-05-02 13:44:41 +02:00
|
|
|
m_id = NodeList::Add (this);
|
2008-01-02 09:09:24 +01:00
|
|
|
Ptr<PacketSocketFactory> socketFactory = CreateObject<PacketSocketFactory> ();
|
2007-08-01 08:58:18 +02:00
|
|
|
AddInterface (socketFactory);
|
2007-02-12 16:01:18 +01:00
|
|
|
}
|
2007-02-08 11:11:24 +01:00
|
|
|
|
2007-06-04 16:17:01 +02:00
|
|
|
Node::~Node ()
|
2007-02-08 11:11:24 +01:00
|
|
|
{}
|
|
|
|
|
|
2007-08-10 15:47:13 +02:00
|
|
|
Ptr<TraceResolver>
|
2007-08-28 14:33:53 +02:00
|
|
|
Node::GetTraceResolver (void) const
|
2007-05-13 11:30:15 +02:00
|
|
|
{
|
2007-08-10 15:47:13 +02:00
|
|
|
Ptr<CompositeTraceResolver> resolver = Create<CompositeTraceResolver> ();
|
2007-08-12 16:28:29 +02:00
|
|
|
resolver->AddArray ("devices", m_devices.begin (), m_devices.end (), NodeNetDeviceIndex ());
|
2007-12-11 13:51:03 +01:00
|
|
|
resolver->AddArray ("applications", m_applications.begin (), m_applications.end (), NodeApplicationIndex ());
|
2007-08-28 15:59:49 +02:00
|
|
|
resolver->SetParentResolver (Object::GetTraceResolver ());
|
2007-08-01 12:33:44 +02:00
|
|
|
return resolver;
|
2007-05-13 11:30:15 +02:00
|
|
|
}
|
|
|
|
|
|
2007-02-12 16:01:18 +01:00
|
|
|
uint32_t
|
2007-06-04 16:17:01 +02:00
|
|
|
Node::GetId (void) const
|
2007-02-12 16:01:18 +01:00
|
|
|
{
|
|
|
|
|
return m_id;
|
|
|
|
|
}
|
2007-03-21 23:17:11 -07:00
|
|
|
|
2007-02-12 16:01:18 +01:00
|
|
|
uint32_t
|
2007-06-04 16:17:01 +02:00
|
|
|
Node::GetSystemId (void) const
|
2007-02-12 16:01:18 +01:00
|
|
|
{
|
|
|
|
|
return m_sid;
|
|
|
|
|
}
|
2007-02-08 11:11:24 +01:00
|
|
|
|
2007-04-30 10:16:04 +02:00
|
|
|
uint32_t
|
2007-06-04 16:17:01 +02:00
|
|
|
Node::AddDevice (Ptr<NetDevice> device)
|
2007-04-30 10:16:04 +02:00
|
|
|
{
|
2007-08-01 08:58:18 +02:00
|
|
|
uint32_t index = m_devices.size ();
|
2007-08-01 13:53:48 +02:00
|
|
|
m_devices.push_back (device);
|
2007-05-04 12:17:14 -07:00
|
|
|
device->SetIfIndex(index);
|
2007-07-31 09:09:31 +02:00
|
|
|
device->SetReceiveCallback (MakeCallback (&Node::ReceiveFromDevice, this));
|
|
|
|
|
NotifyDeviceAdded (device);
|
2007-04-30 10:16:04 +02:00
|
|
|
return index;
|
|
|
|
|
}
|
2007-05-10 20:19:26 +02:00
|
|
|
Ptr<NetDevice>
|
2007-06-04 16:17:01 +02:00
|
|
|
Node::GetDevice (uint32_t index) const
|
2007-04-30 10:16:04 +02:00
|
|
|
{
|
2007-08-01 13:53:48 +02:00
|
|
|
return m_devices[index];
|
2007-04-30 10:16:04 +02:00
|
|
|
}
|
|
|
|
|
uint32_t
|
2007-06-04 16:17:01 +02:00
|
|
|
Node::GetNDevices (void) const
|
2007-04-30 10:16:04 +02:00
|
|
|
{
|
|
|
|
|
return m_devices.size ();
|
|
|
|
|
}
|
|
|
|
|
|
2007-05-13 09:46:38 +02:00
|
|
|
uint32_t
|
2007-06-04 16:17:01 +02:00
|
|
|
Node::AddApplication (Ptr<Application> application)
|
2007-05-13 09:46:38 +02:00
|
|
|
{
|
|
|
|
|
uint32_t index = m_applications.size ();
|
|
|
|
|
m_applications.push_back (application);
|
|
|
|
|
return index;
|
|
|
|
|
}
|
|
|
|
|
Ptr<Application>
|
2007-06-04 16:17:01 +02:00
|
|
|
Node::GetApplication (uint32_t index) const
|
2007-05-13 09:46:38 +02:00
|
|
|
{
|
|
|
|
|
return m_applications[index];
|
|
|
|
|
}
|
|
|
|
|
uint32_t
|
2007-06-04 16:17:01 +02:00
|
|
|
Node::GetNApplications (void) const
|
2007-05-13 09:46:38 +02:00
|
|
|
{
|
|
|
|
|
return m_applications.size ();
|
|
|
|
|
}
|
|
|
|
|
|
2007-08-01 12:33:44 +02:00
|
|
|
void
|
|
|
|
|
Node::DoDispose()
|
2007-05-02 09:10:19 +02:00
|
|
|
{
|
2007-05-10 20:19:26 +02:00
|
|
|
for (std::vector<Ptr<NetDevice> >::iterator i = m_devices.begin ();
|
2007-05-02 09:16:58 +02:00
|
|
|
i != m_devices.end (); i++)
|
|
|
|
|
{
|
2007-05-10 20:19:26 +02:00
|
|
|
Ptr<NetDevice> device = *i;
|
2007-05-02 09:16:58 +02:00
|
|
|
device->Dispose ();
|
2007-05-10 20:19:26 +02:00
|
|
|
*i = 0;
|
2007-05-02 09:16:58 +02:00
|
|
|
}
|
2007-05-03 13:11:50 +02:00
|
|
|
m_devices.clear ();
|
2007-05-13 09:46:38 +02:00
|
|
|
for (std::vector<Ptr<Application> >::iterator i = m_applications.begin ();
|
|
|
|
|
i != m_applications.end (); i++)
|
|
|
|
|
{
|
|
|
|
|
Ptr<Application> application = *i;
|
|
|
|
|
application->Dispose ();
|
|
|
|
|
*i = 0;
|
|
|
|
|
}
|
|
|
|
|
m_applications.clear ();
|
2007-05-25 10:56:03 +02:00
|
|
|
Object::DoDispose ();
|
2007-05-02 09:10:19 +02:00
|
|
|
}
|
|
|
|
|
|
2007-07-31 09:09:31 +02:00
|
|
|
void
|
|
|
|
|
Node::NotifyDeviceAdded (Ptr<NetDevice> device)
|
|
|
|
|
{}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
Node::RegisterProtocolHandler (ProtocolHandler handler,
|
|
|
|
|
uint16_t protocolType,
|
|
|
|
|
Ptr<NetDevice> device)
|
|
|
|
|
{
|
|
|
|
|
struct Node::ProtocolHandlerEntry entry;
|
|
|
|
|
entry.handler = handler;
|
|
|
|
|
entry.protocol = protocolType;
|
|
|
|
|
entry.device = device;
|
|
|
|
|
m_handlers.push_back (entry);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
Node::UnregisterProtocolHandler (ProtocolHandler handler)
|
|
|
|
|
{
|
|
|
|
|
for (ProtocolHandlerList::iterator i = m_handlers.begin ();
|
|
|
|
|
i != m_handlers.end (); i++)
|
|
|
|
|
{
|
|
|
|
|
if (i->handler.IsEqual (handler))
|
|
|
|
|
{
|
|
|
|
|
m_handlers.erase (i);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
2007-10-01 14:15:56 +02:00
|
|
|
Node::ReceiveFromDevice (Ptr<NetDevice> device, Ptr<Packet> packet,
|
2007-08-01 08:58:18 +02:00
|
|
|
uint16_t protocol, const Address &from)
|
2007-07-31 09:09:31 +02:00
|
|
|
{
|
|
|
|
|
bool found = false;
|
|
|
|
|
for (ProtocolHandlerList::iterator i = m_handlers.begin ();
|
|
|
|
|
i != m_handlers.end (); i++)
|
|
|
|
|
{
|
|
|
|
|
if (i->device == 0 ||
|
|
|
|
|
(i->device != 0 && i->device == device))
|
|
|
|
|
{
|
2007-08-01 08:58:18 +02:00
|
|
|
if (i->protocol == 0 ||
|
|
|
|
|
i->protocol == protocol)
|
2007-07-31 09:09:31 +02:00
|
|
|
{
|
2007-08-01 08:58:18 +02:00
|
|
|
i->handler (device, packet, protocol, from);
|
2007-07-31 09:09:31 +02:00
|
|
|
found = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return found;
|
|
|
|
|
}
|
|
|
|
|
|
2007-02-08 11:11:24 +01:00
|
|
|
}//namespace ns3
|