diff --git a/src/node/ipv4-end-point-demux.cc b/src/node/ipv4-end-point-demux.cc index 9f5d097c9..47240c7eb 100644 --- a/src/node/ipv4-end-point-demux.cc +++ b/src/node/ipv4-end-point-demux.cc @@ -127,6 +127,20 @@ Ipv4EndPointDemux::Allocate (Ipv4Address localAddress, uint16_t localPort, return endPoint; } +void +Ipv4EndPointDemux::DeAllocate (Ipv4EndPoint *endPoint) +{ + for (EndPointsI i = m_endPoints.begin (); i != m_endPoints.end (); i++) + { + if (*i == endPoint) + { + delete endPoint; + m_endPoints.erase (i); + break; + } + } +} + /* * If we have an exact match, we return it. diff --git a/src/node/ipv4-end-point-demux.h b/src/node/ipv4-end-point-demux.h index a674342b5..aa0b2530e 100644 --- a/src/node/ipv4-end-point-demux.h +++ b/src/node/ipv4-end-point-demux.h @@ -51,6 +51,8 @@ public: Ipv4Address peerAddress, uint16_t peerPort); + void DeAllocate (Ipv4EndPoint *endPoint); + private: uint16_t AllocateEphemeralPort (void); typedef std::list EndPoints; diff --git a/src/node/node.cc b/src/node/node.cc index 896ed1558..aba39ac07 100644 --- a/src/node/node.cc +++ b/src/node/node.cc @@ -51,7 +51,6 @@ Node::Node(uint32_t sid) Node::~Node () {} - uint32_t Node::GetId (void) const { @@ -99,7 +98,7 @@ void Node::DoDispose() device->Dispose (); device->Unref (); } - m_devices.erase (m_devices.begin (), m_devices.end ()); + m_devices.clear (); NsUnknown::DoDispose (); } diff --git a/src/node/udp-socket.cc b/src/node/udp-socket.cc index e940dfa51..b28c721ad 100644 --- a/src/node/udp-socket.cc +++ b/src/node/udp-socket.cc @@ -40,7 +40,31 @@ UdpSocket::UdpSocket (Node *node) } UdpSocket::~UdpSocket () { - Destroy (); + if (m_node != 0) + { + m_node->Unref (); + m_node = 0; + } + if (m_endPoint != 0) + { + NS_ASSERT (m_udp != 0); + /** + * Note that this piece of code is a bit tricky: + * when DeAllocate is called, it will call into + * Ipv4EndPointDemux::Deallocate which triggers + * a delete of the associated endPoint which triggers + * in turn a call to the method ::Destroy below + * will will zero the m_endPoint field. + */ + NS_ASSERT (m_endPoint != 0); + m_udp->DeAllocate (m_endPoint); + NS_ASSERT (m_endPoint == 0); + } + if (m_udp != 0) + { + m_udp->Unref (); + m_udp = 0; + } } Node * diff --git a/src/node/udp.cc b/src/node/udp.cc index 780d11c43..0864ae281 100644 --- a/src/node/udp.cc +++ b/src/node/udp.cc @@ -106,6 +106,12 @@ Udp::Allocate (Ipv4Address localAddress, uint16_t localPort, peerAddress, peerPort); } +void +Udp::DeAllocate (Ipv4EndPoint *endPoint) +{ + m_endPoints->DeAllocate (endPoint); +} + void Udp::Receive(Packet& packet, Ipv4Address const &source, diff --git a/src/node/udp.h b/src/node/udp.h index 6728d1d96..04fab4a7f 100644 --- a/src/node/udp.h +++ b/src/node/udp.h @@ -54,6 +54,8 @@ public: Ipv4EndPoint *Allocate (Ipv4Address localAddress, uint16_t localPort, Ipv4Address peerAddress, uint16_t peerPort); + void DeAllocate (Ipv4EndPoint *endPoint); + // called by UdpSocket. void Send (Packet packet, Ipv4Address saddr, Ipv4Address daddr,