make Ipv4L4Demux an NsUnknown object.

Mathieu Lacage 2007-05-03 12:46:50 +02:00
parent 0e11e9f7f4
commit 69ffe8defb
7 changed files with 23 additions and 36 deletions

View File

@ -40,17 +40,21 @@ InternetNode::InternetNode()
// Instantiate the capabilities // Instantiate the capabilities
m_applicationList = new ApplicationList(this); m_applicationList = new ApplicationList(this);
L3Demux *l3Demux = new L3Demux(this); L3Demux *l3Demux = new L3Demux(this);
Ipv4L4Demux *ipv4L4Demux = new Ipv4L4Demux(this);
NsUnknown::AddInterface (l3Demux); NsUnknown::AddInterface (l3Demux);
m_ipv4L4Demux = new Ipv4L4Demux(this); NsUnknown::AddInterface (ipv4L4Demux);
Ipv4 *ipv4 = new Ipv4 (this); Ipv4 *ipv4 = new Ipv4 (this);
Arp *arp = new Arp (this); Arp *arp = new Arp (this);
Udp *udp = new Udp (this); Udp *udp = new Udp (this);
l3Demux->Insert (ipv4); l3Demux->Insert (ipv4);
l3Demux->Insert (arp); l3Demux->Insert (arp);
m_ipv4L4Demux->Insert (udp); ipv4L4Demux->Insert (udp);
l3Demux->Unref (); l3Demux->Unref ();
ipv4L4Demux->Unref ();
ipv4->Unref (); ipv4->Unref ();
arp->Unref (); arp->Unref ();
udp->Unref (); udp->Unref ();
@ -93,13 +97,6 @@ InternetNode::CreateTraceResolver (TraceContext const &context)
void void
InternetNode::DoDispose() InternetNode::DoDispose()
{ {
if (m_ipv4L4Demux != 0)
{
m_ipv4L4Demux->Dispose ();
m_ipv4L4Demux->Unref ();
m_ipv4L4Demux = 0;
}
if (m_applicationList != 0) if (m_applicationList != 0)
{ {
m_applicationList->Dispose (); m_applicationList->Dispose ();
@ -117,12 +114,6 @@ InternetNode::GetApplicationList() const
return m_applicationList; return m_applicationList;
} }
Ipv4L4Demux*
InternetNode::GetIpv4L4Demux() const
{
m_ipv4L4Demux->Ref ();
return m_ipv4L4Demux;
}
Ipv4 * Ipv4 *
InternetNode::GetIpv4 (void) const InternetNode::GetIpv4 (void) const
@ -136,7 +127,9 @@ InternetNode::GetIpv4 (void) const
Udp * Udp *
InternetNode::GetUdp (void) const InternetNode::GetUdp (void) const
{ {
Udp *udp = static_cast<Udp*> (m_ipv4L4Demux->PeekProtocol (Udp::PROT_NUMBER)); Ipv4L4Demux *demux = QueryInterface<Ipv4L4Demux> (Ipv4L4Demux::iid);
Udp *udp = static_cast<Udp*> (demux->PeekProtocol (Udp::PROT_NUMBER));
demux->Unref ();
udp->Ref (); udp->Ref ();
return udp; return udp;
} }

View File

@ -46,7 +46,6 @@ public:
virtual TraceResolver *CreateTraceResolver (TraceContext const &context); virtual TraceResolver *CreateTraceResolver (TraceContext const &context);
// Capability access // Capability access
virtual ApplicationList* GetApplicationList() const; virtual ApplicationList* GetApplicationList() const;
virtual Ipv4L4Demux* GetIpv4L4Demux() const;
virtual Ipv4 * GetIpv4 (void) const; virtual Ipv4 * GetIpv4 (void) const;
virtual Udp * GetUdp (void) const; virtual Udp * GetUdp (void) const;
virtual Arp * GetArp (void) const; virtual Arp * GetArp (void) const;
@ -59,7 +58,6 @@ private:
bool ReceiveFromDevice (NetDevice *device, const Packet &p, uint16_t protocolNumber) const; bool ReceiveFromDevice (NetDevice *device, const Packet &p, uint16_t protocolNumber) const;
// Capabilities // Capabilities
ApplicationList* m_applicationList; ApplicationList* m_applicationList;
Ipv4L4Demux* m_ipv4L4Demux;
std::string m_name; std::string m_name;
}; };

View File

@ -24,24 +24,27 @@
#include <sstream> #include <sstream>
#include "ns3/composite-trace-resolver.h" #include "ns3/composite-trace-resolver.h"
#include "ns3/iid-manager.h"
#include "ipv4-l4-demux.h" #include "ipv4-l4-demux.h"
#include "ipv4-l4-protocol.h" #include "ipv4-l4-protocol.h"
#include "node.h" #include "node.h"
namespace ns3 { namespace ns3 {
const uint32_t Ipv4L4Demux::iid = IidManager::Allocate ("Ipv4L4Demux");
Ipv4L4Demux::Ipv4L4Demux (Node *node) Ipv4L4Demux::Ipv4L4Demux (Node *node)
: m_node (node) : NsUnknown (Ipv4L4Demux::iid),
m_node (node)
{ {
m_node->Ref (); m_node->Ref ();
} }
Ipv4L4Demux::~Ipv4L4Demux() Ipv4L4Demux::~Ipv4L4Demux()
{ {}
Dispose ();
}
void void
Ipv4L4Demux::Dispose (void) Ipv4L4Demux::DoDispose (void)
{ {
for (L4List_t::const_iterator i = m_protocols.begin(); i != m_protocols.end(); ++i) for (L4List_t::const_iterator i = m_protocols.begin(); i != m_protocols.end(); ++i)
{ {
@ -54,6 +57,7 @@ Ipv4L4Demux::Dispose (void)
m_node->Unref (); m_node->Unref ();
m_node = 0; m_node = 0;
} }
NsUnknown::DoDispose ();
} }
TraceResolver * TraceResolver *

View File

@ -26,7 +26,7 @@
#define IPV4_L4_DEMUX_H #define IPV4_L4_DEMUX_H
#include <list> #include <list>
#include "ns3/object.h" #include "ns3/ns-unknown.h"
namespace ns3 { namespace ns3 {
@ -38,15 +38,14 @@ class TraceContext;
/** /**
* \brief L4 Ipv4 Demux * \brief L4 Ipv4 Demux
*/ */
class Ipv4L4Demux : public Object class Ipv4L4Demux : public NsUnknown
{ {
public: public:
static const uint32_t iid;
typedef int Ipv4L4ProtocolTraceType; typedef int Ipv4L4ProtocolTraceType;
Ipv4L4Demux (Node *node); Ipv4L4Demux (Node *node);
virtual ~Ipv4L4Demux(); virtual ~Ipv4L4Demux();
void Dispose (void);
/** /**
* \param context the trace context to use to construct the * \param context the trace context to use to construct the
* TraceResolver to return * TraceResolver to return
@ -84,6 +83,7 @@ public:
*/ */
void Erase(Ipv4L4Protocol*protocol); void Erase(Ipv4L4Protocol*protocol);
private: private:
virtual void DoDispose (void);
typedef std::list<Ipv4L4Protocol*> L4List_t; typedef std::list<Ipv4L4Protocol*> L4List_t;
L4List_t m_protocols; L4List_t m_protocols;
Node *m_node; Node *m_node;

View File

@ -512,7 +512,7 @@ Ipv4::Forwarding (Packet const &packet, Ipv4Header &ipHeader, NetDevice *device)
void void
Ipv4::ForwardUp (Packet p, Ipv4Header const&ip) Ipv4::ForwardUp (Packet p, Ipv4Header const&ip)
{ {
Ipv4L4Demux *demux = m_node->GetIpv4L4Demux (); Ipv4L4Demux *demux = m_node->QueryInterface<Ipv4L4Demux> (Ipv4L4Demux::iid);
Ipv4L4Protocol *protocol = demux->PeekProtocol (ip.GetProtocol ()); Ipv4L4Protocol *protocol = demux->PeekProtocol (ip.GetProtocol ());
demux->Unref (); demux->Unref ();
protocol->Receive (p, ip.GetSource (), ip.GetDestination ()); protocol->Receive (p, ip.GetSource (), ip.GetDestination ());

View File

@ -103,12 +103,6 @@ void Node::DoDispose()
NsUnknown::DoDispose (); NsUnknown::DoDispose ();
} }
Ipv4L4Demux*
Node::GetIpv4L4Demux() const
{
return 0;
}
ApplicationList* Node::GetApplicationList() const ApplicationList* Node::GetApplicationList() const
{ {
return 0; return 0;

View File

@ -32,7 +32,6 @@
namespace ns3 { namespace ns3 {
class ApplicationList; class ApplicationList;
class Ipv4L4Demux;
class Ipv4; class Ipv4;
class Udp; class Udp;
class Arp; class Arp;
@ -73,7 +72,6 @@ public:
// Each of these has a default behavior of returning a null capability // Each of these has a default behavior of returning a null capability
// of the correct type if one exists, or the nil pointer if no // of the correct type if one exists, or the nil pointer if no
// null capability exists. // null capability exists.
virtual Ipv4L4Demux* GetIpv4L4Demux() const;
virtual ApplicationList* GetApplicationList() const; virtual ApplicationList* GetApplicationList() const;
virtual Ipv4 * GetIpv4 (void) const; virtual Ipv4 * GetIpv4 (void) const;
virtual Udp * GetUdp (void) const; virtual Udp * GetUdp (void) const;