--- a/src/internet/model/udp-socket-impl.cc Wed Feb 22 13:58:51 2012 +0000 +++ a/src/internet/model/udp-socket-impl.cc Thu Feb 23 13:05:15 2012 +0100 @@ -737,7 +737,8 @@ m_errno = ERROR_AGAIN; return 0; } - Ptr p = m_deliveryQueue.front (); + DeliveryQueueElement e = m_deliveryQueue.front (); + Ptr p = e.packet; if (p->GetSize () <= maxSize) { m_deliveryQueue.pop (); @@ -755,16 +756,24 @@ Address &fromAddress) { NS_LOG_FUNCTION (this << maxSize << flags); - Ptr packet = Recv (maxSize, flags); - if (packet != 0) + if (m_deliveryQueue.empty ()) { - SocketAddressTag tag; - bool found; - found = packet->PeekPacketTag (tag); - NS_ASSERT (found); - fromAddress = tag.GetAddress (); + m_errno = ERROR_AGAIN; + return 0; } - return packet; + DeliveryQueueElement e = m_deliveryQueue.front (); + Ptr p = e.packet; + if (p->GetSize () <= maxSize) + { + m_deliveryQueue.pop (); + m_rxAvailable -= p->GetSize (); + fromAddress = e.socketAddress; + } + else + { + p = 0; + } + return p; } int @@ -853,10 +862,10 @@ if ((m_rxAvailable + packet->GetSize ()) <= m_rcvBufSize) { Address address = InetSocketAddress (header.GetSource (), port); - SocketAddressTag tag; - tag.SetAddress (address); - packet->AddPacketTag (tag); - m_deliveryQueue.push (packet); + DeliveryQueueElement e; + e.packet = packet; + e.socketAddress = address; + m_deliveryQueue.push (e); m_rxAvailable += packet->GetSize (); NotifyDataRecv (); } @@ -885,10 +894,10 @@ if ((m_rxAvailable + packet->GetSize ()) <= m_rcvBufSize) { Address address = Inet6SocketAddress (saddr, port); - SocketAddressTag tag; - tag.SetAddress (address); - packet->AddPacketTag (tag); - m_deliveryQueue.push (packet); + DeliveryQueueElement e; + e.packet = packet; + e.socketAddress = address; + m_deliveryQueue.push (e); m_rxAvailable += packet->GetSize (); NotifyDataRecv (); } --- a/src/internet/model/udp-socket-impl.h Wed Feb 22 13:58:51 2012 +0000 +++ a/src/internet/model/udp-socket-impl.h Thu Feb 23 13:05:15 2012 +0100 @@ -133,7 +133,13 @@ bool m_connected; bool m_allowBroadcast; - std::queue > m_deliveryQueue; + struct DeliveryQueueElement + { + Ptr packet; + Address socketAddress; + }; + + std::queue m_deliveryQueue; uint32_t m_rxAvailable; // Socket attributes