|
|
| 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 |
/** |