View | Details | Raw Unified | Return to bug 231
Collapse All | Expand All

(-)a/src/internet/model/udp-socket-impl.cc (-32 / +27 lines)
 Lines 841-862    Link Here 
841
UdpSocketImpl::Recv (uint32_t maxSize, uint32_t flags)
841
UdpSocketImpl::Recv (uint32_t maxSize, uint32_t flags)
842
{
842
{
843
  NS_LOG_FUNCTION (this << maxSize << flags);
843
  NS_LOG_FUNCTION (this << maxSize << flags);
844
  if (m_deliveryQueue.empty () )
844
845
    {
845
  Address fromAddress;
846
      m_errno = ERROR_AGAIN;
846
  Ptr<Packet> packet = RecvFrom (maxSize, flags, fromAddress);
847
      return 0;
847
  return packet;
848
    }
849
  Ptr<Packet> p = m_deliveryQueue.front ();
850
  if (p->GetSize () <= maxSize) 
851
    {
852
      m_deliveryQueue.pop ();
853
      m_rxAvailable -= p->GetSize ();
854
    }
855
  else
856
    {
857
      p = 0; 
858
    }
859
  return p;
860
}
848
}
861
849
862
Ptr<Packet>
850
Ptr<Packet>
 Lines 864-879    Link Here 
864
                         Address &fromAddress)
852
                         Address &fromAddress)
865
{
853
{
866
  NS_LOG_FUNCTION (this << maxSize << flags);
854
  NS_LOG_FUNCTION (this << maxSize << flags);
867
  Ptr<Packet> packet = Recv (maxSize, flags);
855
868
  if (packet != 0)
856
  if (m_deliveryQueue.empty () )
869
    {
857
    {
870
      SocketAddressTag tag;
858
      m_errno = ERROR_AGAIN;
871
      bool found;
859
      return 0;
872
      found = packet->PeekPacketTag (tag);
873
      NS_ASSERT (found);
874
      fromAddress = tag.GetAddress ();
875
    }
860
    }
876
  return packet;
861
  Ptr<Packet> p = m_deliveryQueue.front ().first;
862
  fromAddress = m_deliveryQueue.front ().second;
863
864
  SocketAddressTag tag;
865
  tag.SetAddress (fromAddress);
866
  p->AddPacketTag (tag);
867
868
  if (p->GetSize () <= maxSize)
869
    {
870
      m_deliveryQueue.pop ();
871
      m_rxAvailable -= p->GetSize ();
872
    }
873
  else
874
    {
875
      p = 0;
876
    }
877
  return p;
877
}
878
}
878
879
879
int
880
int
 Lines 1034-1043    Link Here 
1034
  if ((m_rxAvailable + packet->GetSize ()) <= m_rcvBufSize)
1035
  if ((m_rxAvailable + packet->GetSize ()) <= m_rcvBufSize)
1035
    {
1036
    {
1036
      Address address = InetSocketAddress (header.GetSource (), port);
1037
      Address address = InetSocketAddress (header.GetSource (), port);
1037
      SocketAddressTag tag;
1038
      m_deliveryQueue.push (std::make_pair (packet, address));
1038
      tag.SetAddress (address);
1039
      packet->AddPacketTag (tag);
1040
      m_deliveryQueue.push (packet);
1041
      m_rxAvailable += packet->GetSize ();
1039
      m_rxAvailable += packet->GetSize ();
1042
      NotifyDataRecv ();
1040
      NotifyDataRecv ();
1043
    }
1041
    }
 Lines 1090-1099    Link Here 
1090
  if ((m_rxAvailable + packet->GetSize ()) <= m_rcvBufSize)
1088
  if ((m_rxAvailable + packet->GetSize ()) <= m_rcvBufSize)
1091
    {
1089
    {
1092
      Address address = Inet6SocketAddress (header.GetSourceAddress (), port);
1090
      Address address = Inet6SocketAddress (header.GetSourceAddress (), port);
1093
      SocketAddressTag tag;
1091
      m_deliveryQueue.push (std::make_pair (packet, address));
1094
      tag.SetAddress (address);
1095
      packet->AddPacketTag (tag);
1096
      m_deliveryQueue.push (packet);
1097
      m_rxAvailable += packet->GetSize ();
1092
      m_rxAvailable += packet->GetSize ();
1098
      NotifyDataRecv ();
1093
      NotifyDataRecv ();
1099
    }
1094
    }
(-)a/src/internet/model/udp-socket-impl.h (-1 / +1 lines)
 Lines 235-241    Link Here 
235
  bool                     m_connected;       //!< Connection established
235
  bool                     m_connected;       //!< Connection established
236
  bool                     m_allowBroadcast;  //!< Allow send broadcast packets
236
  bool                     m_allowBroadcast;  //!< Allow send broadcast packets
237
237
238
  std::queue<Ptr<Packet> > m_deliveryQueue; //!< Queue for incoming packets
238
  std::queue<std::pair<Ptr<Packet>, Address> > m_deliveryQueue; //!< Queue for incoming packets
239
  uint32_t m_rxAvailable;                   //!< Number of available bytes to be received
239
  uint32_t m_rxAvailable;                   //!< Number of available bytes to be received
240
240
241
  // Socket attributes
241
  // Socket attributes

Return to bug 231