diff --git a/src/node/internet-node.cc b/src/node/internet-node.cc index 0ac0f8047..e5046c3d3 100644 --- a/src/node/internet-node.cc +++ b/src/node/internet-node.cc @@ -40,17 +40,21 @@ InternetNode::InternetNode() // Instantiate the capabilities m_applicationList = new ApplicationList(this); L3Demux *l3Demux = new L3Demux(this); + Ipv4L4Demux *ipv4L4Demux = new Ipv4L4Demux(this); + NsUnknown::AddInterface (l3Demux); - m_ipv4L4Demux = new Ipv4L4Demux(this); + NsUnknown::AddInterface (ipv4L4Demux); + Ipv4 *ipv4 = new Ipv4 (this); Arp *arp = new Arp (this); Udp *udp = new Udp (this); l3Demux->Insert (ipv4); l3Demux->Insert (arp); - m_ipv4L4Demux->Insert (udp); + ipv4L4Demux->Insert (udp); l3Demux->Unref (); + ipv4L4Demux->Unref (); ipv4->Unref (); arp->Unref (); udp->Unref (); @@ -93,13 +97,6 @@ InternetNode::CreateTraceResolver (TraceContext const &context) void InternetNode::DoDispose() { - if (m_ipv4L4Demux != 0) - { - m_ipv4L4Demux->Dispose (); - m_ipv4L4Demux->Unref (); - m_ipv4L4Demux = 0; - } - if (m_applicationList != 0) { m_applicationList->Dispose (); @@ -117,12 +114,6 @@ InternetNode::GetApplicationList() const return m_applicationList; } -Ipv4L4Demux* -InternetNode::GetIpv4L4Demux() const -{ - m_ipv4L4Demux->Ref (); - return m_ipv4L4Demux; -} Ipv4 * InternetNode::GetIpv4 (void) const @@ -136,7 +127,9 @@ InternetNode::GetIpv4 (void) const Udp * InternetNode::GetUdp (void) const { - Udp *udp = static_cast (m_ipv4L4Demux->PeekProtocol (Udp::PROT_NUMBER)); + Ipv4L4Demux *demux = QueryInterface (Ipv4L4Demux::iid); + Udp *udp = static_cast (demux->PeekProtocol (Udp::PROT_NUMBER)); + demux->Unref (); udp->Ref (); return udp; } diff --git a/src/node/internet-node.h b/src/node/internet-node.h index 90584cd21..d010516cf 100644 --- a/src/node/internet-node.h +++ b/src/node/internet-node.h @@ -46,7 +46,6 @@ public: virtual TraceResolver *CreateTraceResolver (TraceContext const &context); // Capability access virtual ApplicationList* GetApplicationList() const; - virtual Ipv4L4Demux* GetIpv4L4Demux() const; virtual Ipv4 * GetIpv4 (void) const; virtual Udp * GetUdp (void) const; virtual Arp * GetArp (void) const; @@ -59,7 +58,6 @@ private: bool ReceiveFromDevice (NetDevice *device, const Packet &p, uint16_t protocolNumber) const; // Capabilities ApplicationList* m_applicationList; - Ipv4L4Demux* m_ipv4L4Demux; std::string m_name; }; diff --git a/src/node/ipv4-l4-demux.cc b/src/node/ipv4-l4-demux.cc index 4d05e4c2d..a341aad4d 100644 --- a/src/node/ipv4-l4-demux.cc +++ b/src/node/ipv4-l4-demux.cc @@ -24,24 +24,27 @@ #include #include "ns3/composite-trace-resolver.h" +#include "ns3/iid-manager.h" #include "ipv4-l4-demux.h" #include "ipv4-l4-protocol.h" #include "node.h" namespace ns3 { +const uint32_t Ipv4L4Demux::iid = IidManager::Allocate ("Ipv4L4Demux"); + Ipv4L4Demux::Ipv4L4Demux (Node *node) - : m_node (node) + : NsUnknown (Ipv4L4Demux::iid), + m_node (node) { m_node->Ref (); } Ipv4L4Demux::~Ipv4L4Demux() -{ - Dispose (); -} +{} + void -Ipv4L4Demux::Dispose (void) +Ipv4L4Demux::DoDispose (void) { 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 = 0; } + NsUnknown::DoDispose (); } TraceResolver * diff --git a/src/node/ipv4-l4-demux.h b/src/node/ipv4-l4-demux.h index bd347d8b6..e87b90511 100644 --- a/src/node/ipv4-l4-demux.h +++ b/src/node/ipv4-l4-demux.h @@ -26,7 +26,7 @@ #define IPV4_L4_DEMUX_H #include -#include "ns3/object.h" +#include "ns3/ns-unknown.h" namespace ns3 { @@ -38,15 +38,14 @@ class TraceContext; /** * \brief L4 Ipv4 Demux */ -class Ipv4L4Demux : public Object +class Ipv4L4Demux : public NsUnknown { public: + static const uint32_t iid; typedef int Ipv4L4ProtocolTraceType; Ipv4L4Demux (Node *node); virtual ~Ipv4L4Demux(); - void Dispose (void); - /** * \param context the trace context to use to construct the * TraceResolver to return @@ -84,6 +83,7 @@ public: */ void Erase(Ipv4L4Protocol*protocol); private: + virtual void DoDispose (void); typedef std::list L4List_t; L4List_t m_protocols; Node *m_node; diff --git a/src/node/ipv4.cc b/src/node/ipv4.cc index 967b5b369..14a1b2867 100644 --- a/src/node/ipv4.cc +++ b/src/node/ipv4.cc @@ -512,7 +512,7 @@ Ipv4::Forwarding (Packet const &packet, Ipv4Header &ipHeader, NetDevice *device) void Ipv4::ForwardUp (Packet p, Ipv4Header const&ip) { - Ipv4L4Demux *demux = m_node->GetIpv4L4Demux (); + Ipv4L4Demux *demux = m_node->QueryInterface (Ipv4L4Demux::iid); Ipv4L4Protocol *protocol = demux->PeekProtocol (ip.GetProtocol ()); demux->Unref (); protocol->Receive (p, ip.GetSource (), ip.GetDestination ()); diff --git a/src/node/node.cc b/src/node/node.cc index 296aff23f..896ed1558 100644 --- a/src/node/node.cc +++ b/src/node/node.cc @@ -103,12 +103,6 @@ void Node::DoDispose() NsUnknown::DoDispose (); } -Ipv4L4Demux* -Node::GetIpv4L4Demux() const -{ - return 0; -} - ApplicationList* Node::GetApplicationList() const { return 0; diff --git a/src/node/node.h b/src/node/node.h index 66bb6480d..96c65f5e9 100644 --- a/src/node/node.h +++ b/src/node/node.h @@ -32,7 +32,6 @@ namespace ns3 { class ApplicationList; -class Ipv4L4Demux; class Ipv4; class Udp; class Arp; @@ -73,7 +72,6 @@ public: // 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 // null capability exists. - virtual Ipv4L4Demux* GetIpv4L4Demux() const; virtual ApplicationList* GetApplicationList() const; virtual Ipv4 * GetIpv4 (void) const; virtual Udp * GetUdp (void) const;