make Ipv4L4Demux an NsUnknown object.
authorMathieu Lacage <mathieu.lacage@sophia.inria.fr>
Thu, 03 May 2007 12:46:50 +0200
changeset 514 7c9a037a32b7
parent 513 b7c7ea629de9
child 515 e907146a191e
make Ipv4L4Demux an NsUnknown object.
src/node/internet-node.cc
src/node/internet-node.h
src/node/ipv4-l4-demux.cc
src/node/ipv4-l4-demux.h
src/node/ipv4.cc
src/node/node.cc
src/node/node.h
--- a/src/node/internet-node.cc	Thu May 03 12:33:08 2007 +0200
+++ b/src/node/internet-node.cc	Thu May 03 12:46:50 2007 +0200
@@ -40,17 +40,21 @@
   // 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 @@
 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 @@
   return m_applicationList;
 } 
 
-Ipv4L4Demux*     
-InternetNode::GetIpv4L4Demux() const
-{
-  m_ipv4L4Demux->Ref ();
-  return m_ipv4L4Demux;
-}
 
 Ipv4 *
 InternetNode::GetIpv4 (void) const
@@ -136,7 +127,9 @@
 Udp *
 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 ();
   return udp;
 }
--- a/src/node/internet-node.h	Thu May 03 12:33:08 2007 +0200
+++ b/src/node/internet-node.h	Thu May 03 12:46:50 2007 +0200
@@ -46,7 +46,6 @@
   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 @@
   bool ReceiveFromDevice (NetDevice *device, const Packet &p, uint16_t protocolNumber) const;
   // Capabilities
   ApplicationList* m_applicationList;
-  Ipv4L4Demux*     m_ipv4L4Demux;
   std::string      m_name;
 };
 
--- a/src/node/ipv4-l4-demux.cc	Thu May 03 12:33:08 2007 +0200
+++ b/src/node/ipv4-l4-demux.cc	Thu May 03 12:46:50 2007 +0200
@@ -24,24 +24,27 @@
 
 #include <sstream>
 #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 @@
       m_node->Unref ();
       m_node = 0;
     }
+  NsUnknown::DoDispose ();
 }
 
 TraceResolver *
--- a/src/node/ipv4-l4-demux.h	Thu May 03 12:33:08 2007 +0200
+++ b/src/node/ipv4-l4-demux.h	Thu May 03 12:46:50 2007 +0200
@@ -26,7 +26,7 @@
 #define IPV4_L4_DEMUX_H
 
 #include <list>
-#include "ns3/object.h"
+#include "ns3/ns-unknown.h"
 
 namespace ns3 {
 
@@ -38,15 +38,14 @@
 /**
  * \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 @@
    */
   void Erase(Ipv4L4Protocol*protocol);
 private:
+  virtual void DoDispose (void);
   typedef std::list<Ipv4L4Protocol*> L4List_t;
   L4List_t m_protocols;
   Node *m_node;
--- a/src/node/ipv4.cc	Thu May 03 12:33:08 2007 +0200
+++ b/src/node/ipv4.cc	Thu May 03 12:46:50 2007 +0200
@@ -512,7 +512,7 @@
 void
 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 ());
   demux->Unref ();
   protocol->Receive (p, ip.GetSource (), ip.GetDestination ());
--- a/src/node/node.cc	Thu May 03 12:33:08 2007 +0200
+++ b/src/node/node.cc	Thu May 03 12:46:50 2007 +0200
@@ -103,12 +103,6 @@
   NsUnknown::DoDispose ();
 }
 
-Ipv4L4Demux*
-Node::GetIpv4L4Demux() const
-{
-  return 0;
-}
-
 ApplicationList* Node::GetApplicationList() const
 {
   return 0;
--- a/src/node/node.h	Thu May 03 12:33:08 2007 +0200
+++ b/src/node/node.h	Thu May 03 12:46:50 2007 +0200
@@ -32,7 +32,6 @@
 namespace ns3 {
 
 class ApplicationList;
-class Ipv4L4Demux;
 class Ipv4;
 class Udp;
 class Arp;
@@ -73,7 +72,6 @@
   // 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;