From daddd90d0770937b4d91493e481df2b3e75c30dc Mon Sep 17 00:00:00 2001 From: Tom Henderson Date: Fri, 2 May 2008 10:55:07 -0700 Subject: [PATCH] Implement GetRxAvailable () --- src/internet-node/tcp-socket.cc | 19 ++++++++++++++++--- src/internet-node/tcp-socket.h | 2 ++ src/internet-node/udp-socket.cc | 19 +++++++++++++++++-- src/internet-node/udp-socket.h | 2 ++ src/node/packet-socket.cc | 14 ++++++++++++-- src/node/packet-socket.h | 3 +++ src/node/socket.h | 8 +++++++- 7 files changed, 59 insertions(+), 8 deletions(-) diff --git a/src/internet-node/tcp-socket.cc b/src/internet-node/tcp-socket.cc index b117d2082..ea3eb9058 100644 --- a/src/internet-node/tcp-socket.cc +++ b/src/internet-node/tcp-socket.cc @@ -78,7 +78,8 @@ TcpSocket::GetTypeId () m_nextRxSequence (0), m_pendingData (0), m_rtt (0), - m_lastMeasuredRtt (Seconds(0.0)) + m_lastMeasuredRtt (Seconds(0.0)), + m_rxAvailable (0) { NS_LOG_FUNCTION (this); @@ -122,7 +123,8 @@ TcpSocket::TcpSocket(const TcpSocket& sock) m_rtt (0), m_lastMeasuredRtt (Seconds(0.0)), m_cnTimeout (sock.m_cnTimeout), - m_cnCount (sock.m_cnCount) + m_cnCount (sock.m_cnCount), + m_rxAvailable (0) { NS_LOG_FUNCTION_NOARGS (); NS_LOG_LOGIC("Invoked the copy constructor"); @@ -450,9 +452,10 @@ TcpSocket::Recv (uint32_t maxSize, uint32_t flags) return 0; } Ptr p = m_deliveryQueue.front (); - if (p->GetSize() <= maxSize) + if (p->GetSize () <= maxSize) { m_deliveryQueue.pop (); + m_rxAvailable -= p->GetSize (); } else { @@ -461,6 +464,14 @@ TcpSocket::Recv (uint32_t maxSize, uint32_t flags) return p; } +uint32_t +TcpSocket::GetRxAvailable (void) const +{ + // We separately maintain this state to avoid walking the queue + // every time this might be called + return m_rxAvailable; +} + void TcpSocket::ForwardUp (Ptr packet, Ipv4Address ipv4, uint16_t port) { @@ -979,6 +990,7 @@ void TcpSocket::NewRx (Ptr p, tag.SetAddress (fromAddress); p->AddTag (tag); m_deliveryQueue.push (p); + m_rxAvailable += p->GetSize (); NotifyDataRecv (); if (m_closeNotified) { @@ -1035,6 +1047,7 @@ void TcpSocket::NewRx (Ptr p, tag.SetAddress (fromAddress); p1->AddTag (tag); m_deliveryQueue.push (p1); + m_rxAvailable += p->GetSize (); NotifyDataRecv (); NS_LOG_LOGIC ("TcpSocket " << this << " adv rxseq1 by " << s1 ); diff --git a/src/internet-node/tcp-socket.h b/src/internet-node/tcp-socket.h index 6bf63082f..c7600e3f5 100644 --- a/src/internet-node/tcp-socket.h +++ b/src/internet-node/tcp-socket.h @@ -71,6 +71,7 @@ public: virtual int Listen(uint32_t queueLimit); virtual Ptr Recv (uint32_t maxSize, uint32_t flags); + virtual uint32_t GetRxAvailable (void) const; private: friend class Tcp; @@ -175,6 +176,7 @@ private: // Temporary queue for delivering data to application std::queue > m_deliveryQueue; + uint32_t m_rxAvailable; }; }//namespace ns3 diff --git a/src/internet-node/udp-socket.cc b/src/internet-node/udp-socket.cc index cae73b0c7..5960a929b 100644 --- a/src/internet-node/udp-socket.cc +++ b/src/internet-node/udp-socket.cc @@ -40,7 +40,8 @@ UdpSocket::UdpSocket () m_errno (ERROR_NOTERROR), m_shutdownSend (false), m_shutdownRecv (false), - m_connected (false) + m_connected (false), + m_rxAvailable (0) { NS_LOG_FUNCTION_NOARGS (); } @@ -333,9 +334,10 @@ UdpSocket::Recv (uint32_t maxSize, uint32_t flags) return 0; } Ptr p = m_deliveryQueue.front (); - if (p->GetSize() <= maxSize) + if (p->GetSize () <= maxSize) { m_deliveryQueue.pop (); + m_rxAvailable -= p->GetSize (); } else { @@ -344,6 +346,14 @@ UdpSocket::Recv (uint32_t maxSize, uint32_t flags) return p; } +uint32_t +UdpSocket::GetRxAvailable (void) const +{ + // We separately maintain this state to avoid walking the queue + // every time this might be called + return m_rxAvailable; +} + void UdpSocket::ForwardUp (Ptr packet, Ipv4Address ipv4, uint16_t port) { @@ -358,6 +368,7 @@ UdpSocket::ForwardUp (Ptr packet, Ipv4Address ipv4, uint16_t port) tag.SetAddress (address); packet->AddTag (tag); m_deliveryQueue.push (packet); + m_rxAvailable += packet->GetSize (); NotifyDataRecv (); } @@ -410,12 +421,16 @@ void UdpSocketTest::ReceivePacket2 (Ptr socket, Ptr packet, cons void UdpSocketTest::ReceivePkt (Ptr socket) { + uint32_t availableData = socket->GetRxAvailable (); m_receivedPacket = socket->Recv (std::numeric_limits::max(), 0); + NS_ASSERT (availableData == m_receivedPacket->GetSize ()); } void UdpSocketTest::ReceivePkt2 (Ptr socket) { + uint32_t availableData = socket->GetRxAvailable (); m_receivedPacket2 = socket->Recv (std::numeric_limits::max(), 0); + NS_ASSERT (availableData == m_receivedPacket2->GetSize ()); } bool diff --git a/src/internet-node/udp-socket.h b/src/internet-node/udp-socket.h index d976e1ad3..e5a425ddc 100644 --- a/src/internet-node/udp-socket.h +++ b/src/internet-node/udp-socket.h @@ -58,6 +58,7 @@ public: virtual int SendTo(const Address &address,Ptr p); virtual Ptr Recv (uint32_t maxSize, uint32_t flags); + virtual uint32_t GetRxAvailable (void) const; private: friend class Udp; @@ -82,6 +83,7 @@ private: bool m_connected; std::queue > m_deliveryQueue; + uint32_t m_rxAvailable; }; }//namespace ns3 diff --git a/src/node/packet-socket.cc b/src/node/packet-socket.cc index ad2041333..9600666e2 100644 --- a/src/node/packet-socket.cc +++ b/src/node/packet-socket.cc @@ -29,7 +29,7 @@ NS_LOG_COMPONENT_DEFINE ("PacketSocket"); namespace ns3 { -PacketSocket::PacketSocket () +PacketSocket::PacketSocket () : m_rxAvailable (0) { NS_LOG_FUNCTION_NOARGS (); m_state = STATE_OPEN; @@ -305,6 +305,7 @@ PacketSocket::ForwardUp (Ptr device, Ptr packet, tag.SetAddress (address); packet->AddTag (tag); m_deliveryQueue.push (packet); + m_rxAvailable += packet->GetSize (); NS_LOG_LOGIC ("UID is " << packet->GetUid() << " PacketSocket " << this); NotifyDataRecv (); } @@ -317,9 +318,10 @@ PacketSocket::Recv (uint32_t maxSize, uint32_t flags) return 0; } Ptr p = m_deliveryQueue.front (); - if (p->GetSize() <= maxSize) + if (p->GetSize () <= maxSize) { m_deliveryQueue.pop (); + m_rxAvailable -= p->GetSize (); } else { @@ -328,4 +330,12 @@ PacketSocket::Recv (uint32_t maxSize, uint32_t flags) return p; } +uint32_t +PacketSocket::GetRxAvailable (void) const +{ + // We separately maintain this state to avoid walking the queue + // every time this might be called + return m_rxAvailable; +} + }//namespace ns3 diff --git a/src/node/packet-socket.h b/src/node/packet-socket.h index b5282aaab..a2a60403f 100644 --- a/src/node/packet-socket.h +++ b/src/node/packet-socket.h @@ -89,6 +89,7 @@ public: virtual int SendTo(const Address &address,Ptr p); virtual Ptr Recv (uint32_t maxSize, uint32_t flags); + virtual uint32_t GetRxAvailable (void) const; private: @@ -114,6 +115,8 @@ private: Address m_destAddr; /// Default destination address std::queue > m_deliveryQueue; + uint32_t m_rxAvailable; + }; }//namespace ns3 diff --git a/src/node/socket.h b/src/node/socket.h index 62d512280..e9a11b51a 100644 --- a/src/node/socket.h +++ b/src/node/socket.h @@ -273,7 +273,13 @@ public: * 0 if the socket cannot return a next in-sequence packet. */ Ptr Recv (void); - + /** + * Return number of bytes which can be returned from one or + * multiple calls to Recv. + * Must be possible to call this method from the Recv callback. + */ + virtual uint32_t GetRxAvailable (void) const = 0; + protected: void NotifyCloseCompleted (void); void NotifyConnectionSucceeded (void);