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

(-)i/src/internet/model/tcp-socket-base.cc (-20 / +22 lines)
 Lines 2949-2955   uint16_t Link Here 
2949
TcpSocketBase::AdvertisedWindowSize (bool scale) const
2949
TcpSocketBase::AdvertisedWindowSize (bool scale) const
2950
{
2950
{
2951
  NS_LOG_FUNCTION (this << scale);
2951
  NS_LOG_FUNCTION (this << scale);
2952
  uint32_t w = m_rxBuffer->MaxBufferSize ();
2952
  uint32_t w = (m_rxBuffer->MaxRxSequence () > m_rxBuffer->NextRxSequence ()) ?
2953
    m_rxBuffer->MaxRxSequence () - m_rxBuffer->NextRxSequence () : 0;
2953
2954
2954
  if (scale)
2955
  if (scale)
2955
    {
2956
    {
 Lines 2979-2984   TcpSocketBase::ReceivedData (Ptr<Packet> p, const TcpHeader& tcpHeader) Link Here 
2979
      SendEmptyPacket (TcpHeader::ACK);
2980
      SendEmptyPacket (TcpHeader::ACK);
2980
      return;
2981
      return;
2981
    }
2982
    }
2983
  // Notify app to receive if necessary
2984
  if (expectedSeq < m_rxBuffer->NextRxSequence ())
2985
    { // NextRxSeq advanced, we have something to send to the app
2986
      if (!m_shutdownRecv)
2987
        {
2988
          NotifyDataRecv ();
2989
        }
2990
      // Handle exceptions
2991
      if (m_closeNotified)
2992
        {
2993
          NS_LOG_WARN ("Why TCP " << this << " got data after close notification?");
2994
        }
2995
      // If we received FIN before and now completed all "holes" in rx buffer,
2996
      // invoke peer close procedure
2997
      if (m_rxBuffer->Finished () && (tcpHeader.GetFlags () & TcpHeader::FIN) == 0)
2998
        {
2999
          DoPeerClose ();
3000
          return;
3001
        }
3002
    }
2982
  // Now send a new ACK packet acknowledging all received and delivered data
3003
  // Now send a new ACK packet acknowledging all received and delivered data
2983
  if (m_rxBuffer->Size () > m_rxBuffer->Available () || m_rxBuffer->NextRxSequence () > expectedSeq + p->GetSize ())
3004
  if (m_rxBuffer->Size () > m_rxBuffer->Available () || m_rxBuffer->NextRxSequence () > expectedSeq + p->GetSize ())
2984
    { // A gap exists in the buffer, or we filled a gap: Always ACK
3005
    { // A gap exists in the buffer, or we filled a gap: Always ACK
 Lines 3000-3024   TcpSocketBase::ReceivedData (Ptr<Packet> p, const TcpHeader& tcpHeader) Link Here 
3000
                        (Simulator::Now () + Simulator::GetDelayLeft (m_delAckEvent)).GetSeconds ());
3021
                        (Simulator::Now () + Simulator::GetDelayLeft (m_delAckEvent)).GetSeconds ());
3001
        }
3022
        }
3002
    }
3023
    }
3003
  // Notify app to receive if necessary
3004
  if (expectedSeq < m_rxBuffer->NextRxSequence ())
3005
    { // NextRxSeq advanced, we have something to send to the app
3006
      if (!m_shutdownRecv)
3007
        {
3008
          NotifyDataRecv ();
3009
        }
3010
      // Handle exceptions
3011
      if (m_closeNotified)
3012
        {
3013
          NS_LOG_WARN ("Why TCP " << this << " got data after close notification?");
3014
        }
3015
      // If we received FIN before and now completed all "holes" in rx buffer,
3016
      // invoke peer close procedure
3017
      if (m_rxBuffer->Finished () && (tcpHeader.GetFlags () & TcpHeader::FIN) == 0)
3018
        {
3019
          DoPeerClose ();
3020
        }
3021
    }
3022
}
3024
}
3023
3025
3024
/**
3026
/**

Return to bug 2559