Implement GetRxAvailable ()
authorTom Henderson <tomh@tomh.org>
Fri, 02 May 2008 10:55:07 -0700
changeset 3104 24d9d9aa0977
parent 3103 91c6fce46125
child 3105 682950a37ea6
Implement GetRxAvailable ()
src/internet-node/tcp-socket.cc
src/internet-node/tcp-socket.h
src/internet-node/udp-socket.cc
src/internet-node/udp-socket.h
src/node/packet-socket.cc
src/node/packet-socket.h
src/node/socket.h
--- a/src/internet-node/tcp-socket.cc	Fri May 02 09:38:18 2008 -0700
+++ b/src/internet-node/tcp-socket.cc	Fri May 02 10:55:07 2008 -0700
@@ -78,7 +78,8 @@
     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 @@
     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 @@
       return 0;
     }
   Ptr<Packet> p = m_deliveryQueue.front ();
-  if (p->GetSize() <= maxSize)
+  if (p->GetSize () <= maxSize)
     {
       m_deliveryQueue.pop ();
+      m_rxAvailable -= p->GetSize ();
     }
   else
     {
@@ -461,6 +464,14 @@
   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> packet, Ipv4Address ipv4, uint16_t port)
 {
@@ -979,6 +990,7 @@
       tag.SetAddress (fromAddress);
       p->AddTag (tag);
       m_deliveryQueue.push (p);
+      m_rxAvailable += p->GetSize ();
       NotifyDataRecv ();
       if (m_closeNotified)
         {
@@ -1035,6 +1047,7 @@
           tag.SetAddress (fromAddress);
           p1->AddTag (tag);
           m_deliveryQueue.push (p1);
+          m_rxAvailable += p->GetSize ();
           NotifyDataRecv ();
 
           NS_LOG_LOGIC ("TcpSocket " << this << " adv rxseq1 by " << s1 );
--- a/src/internet-node/tcp-socket.h	Fri May 02 09:38:18 2008 -0700
+++ b/src/internet-node/tcp-socket.h	Fri May 02 10:55:07 2008 -0700
@@ -71,6 +71,7 @@
   virtual int Listen(uint32_t queueLimit);
 
   virtual Ptr<Packet> Recv (uint32_t maxSize, uint32_t flags);
+  virtual uint32_t GetRxAvailable (void) const;
 
 private:
   friend class Tcp;
@@ -175,6 +176,7 @@
   
   // Temporary queue for delivering data to application
   std::queue<Ptr<Packet> > m_deliveryQueue;
+  uint32_t m_rxAvailable; 
 };
 
 }//namespace ns3
--- a/src/internet-node/udp-socket.cc	Fri May 02 09:38:18 2008 -0700
+++ b/src/internet-node/udp-socket.cc	Fri May 02 10:55:07 2008 -0700
@@ -40,7 +40,8 @@
     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 @@
       return 0;
     }
   Ptr<Packet> p = m_deliveryQueue.front ();
-  if (p->GetSize() <= maxSize) 
+  if (p->GetSize () <= maxSize) 
     {
       m_deliveryQueue.pop ();
+      m_rxAvailable -= p->GetSize ();
     }
   else
     {
@@ -344,6 +346,14 @@
   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> packet, Ipv4Address ipv4, uint16_t port)
 {
@@ -358,6 +368,7 @@
   tag.SetAddress (address);
   packet->AddTag (tag);
   m_deliveryQueue.push (packet);
+  m_rxAvailable += packet->GetSize ();
   NotifyDataRecv ();
 }
 
@@ -410,12 +421,16 @@
 
 void UdpSocketTest::ReceivePkt (Ptr<Socket> socket)
 {
+  uint32_t availableData = socket->GetRxAvailable ();
   m_receivedPacket = socket->Recv (std::numeric_limits<uint32_t>::max(), 0);
+  NS_ASSERT (availableData == m_receivedPacket->GetSize ());
 }
 
 void UdpSocketTest::ReceivePkt2 (Ptr<Socket> socket)
 {
+  uint32_t availableData = socket->GetRxAvailable ();
   m_receivedPacket2 = socket->Recv (std::numeric_limits<uint32_t>::max(), 0);
+  NS_ASSERT (availableData == m_receivedPacket2->GetSize ());
 }
 
 bool
--- a/src/internet-node/udp-socket.h	Fri May 02 09:38:18 2008 -0700
+++ b/src/internet-node/udp-socket.h	Fri May 02 10:55:07 2008 -0700
@@ -58,6 +58,7 @@
   virtual int SendTo(const Address &address,Ptr<Packet> p);
 
   virtual Ptr<Packet> Recv (uint32_t maxSize, uint32_t flags);
+  virtual uint32_t GetRxAvailable (void) const;
 
 private:
   friend class Udp;
@@ -82,6 +83,7 @@
   bool m_connected;
 
   std::queue<Ptr<Packet> > m_deliveryQueue;
+  uint32_t m_rxAvailable;
 };
 
 }//namespace ns3
--- a/src/node/packet-socket.cc	Fri May 02 09:38:18 2008 -0700
+++ b/src/node/packet-socket.cc	Fri May 02 10:55:07 2008 -0700
@@ -29,7 +29,7 @@
 
 namespace ns3 {
 
-PacketSocket::PacketSocket ()
+PacketSocket::PacketSocket () : m_rxAvailable (0)
 {
   NS_LOG_FUNCTION_NOARGS ();
   m_state = STATE_OPEN;
@@ -305,6 +305,7 @@
   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 @@
       return 0;
     }
   Ptr<Packet> p = m_deliveryQueue.front ();
-  if (p->GetSize() <= maxSize)
+  if (p->GetSize () <= maxSize)
     {
       m_deliveryQueue.pop ();
+      m_rxAvailable -= p->GetSize ();
     }
   else
     {
@@ -328,4 +330,12 @@
   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
--- a/src/node/packet-socket.h	Fri May 02 09:38:18 2008 -0700
+++ b/src/node/packet-socket.h	Fri May 02 10:55:07 2008 -0700
@@ -89,6 +89,7 @@
   virtual int SendTo(const Address &address,Ptr<Packet> p);
 
   virtual Ptr<Packet> Recv (uint32_t maxSize, uint32_t flags);
+  virtual uint32_t GetRxAvailable (void) const;
 
 
 private:
@@ -114,6 +115,8 @@
   Address m_destAddr; /// Default destination address
 
   std::queue<Ptr<Packet> > m_deliveryQueue;
+  uint32_t m_rxAvailable;
+
 };
 
 }//namespace ns3
--- a/src/node/socket.h	Fri May 02 09:38:18 2008 -0700
+++ b/src/node/socket.h	Fri May 02 10:55:07 2008 -0700
@@ -273,7 +273,13 @@
    * 0 if the socket cannot return a next in-sequence packet.
    */
    Ptr<Packet> 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);