|
|
| 82 |
m_highestRxAck (0), |
82 |
m_highestRxAck (0), |
| 83 |
m_lastRxAck (0), |
83 |
m_lastRxAck (0), |
| 84 |
m_nextRxSequence (0), |
84 |
m_nextRxSequence (0), |
|
|
85 |
m_finSequence (0), |
| 85 |
m_rxAvailable (0), |
86 |
m_rxAvailable (0), |
| 86 |
m_rxBufSize (0), |
87 |
m_rxBufSize (0), |
| 87 |
m_pendingData (0), |
88 |
m_pendingData (0), |
|
|
| 119 |
m_highestRxAck (sock.m_highestRxAck), |
120 |
m_highestRxAck (sock.m_highestRxAck), |
| 120 |
m_lastRxAck (sock.m_lastRxAck), |
121 |
m_lastRxAck (sock.m_lastRxAck), |
| 121 |
m_nextRxSequence (sock.m_nextRxSequence), |
122 |
m_nextRxSequence (sock.m_nextRxSequence), |
|
|
123 |
m_finSequence (sock.m_finSequence), |
| 122 |
m_rxAvailable (0), |
124 |
m_rxAvailable (0), |
| 123 |
m_rxBufSize (0), |
125 |
m_rxBufSize (0), |
| 124 |
m_pendingData (0), |
126 |
m_pendingData (0), |
|
|
| 345 |
" deferring close, state " << m_state); |
347 |
" deferring close, state " << m_state); |
| 346 |
return 0; |
348 |
return 0; |
| 347 |
} |
349 |
} |
|
|
350 |
m_finSequence = m_nextTxSequence + SequenceNumber (1); |
| 348 |
Actions_t action = ProcessEvent (APP_CLOSE); |
351 |
Actions_t action = ProcessEvent (APP_CLOSE); |
| 349 |
ProcessAction (action); |
352 |
ProcessAction (action); |
| 350 |
return 0; |
353 |
return 0; |
|
|
| 943 |
if(tcpHeader.GetFlags() & TcpHeader::FIN) |
946 |
if(tcpHeader.GetFlags() & TcpHeader::FIN) |
| 944 |
{ |
947 |
{ |
| 945 |
++m_nextRxSequence; //bump this to account for the FIN |
948 |
++m_nextRxSequence; //bump this to account for the FIN |
|
|
949 |
m_nextTxSequence = m_finSequence; |
| 946 |
} |
950 |
} |
| 947 |
SendEmptyPacket (TcpHeader::ACK); |
951 |
SendEmptyPacket (TcpHeader::ACK); |
| 948 |
break; |
952 |
break; |
|
|
| 1037 |
// out of sequence. If so, note pending close and process |
1041 |
// out of sequence. If so, note pending close and process |
| 1038 |
// new sequence rx |
1042 |
// new sequence rx |
| 1039 |
if (tcpHeader.GetSequenceNumber () != m_nextRxSequence) |
1043 |
if (tcpHeader.GetSequenceNumber () != m_nextRxSequence) |
| 1040 |
{ // process close later |
1044 |
{ |
| 1041 |
m_pendingClose = true; |
1045 |
if (m_finSequence != m_nextRxSequence) |
| 1042 |
NS_LOG_LOGIC ("TcpSocketImpl " << this << " setting pendingClose" |
1046 |
{ |
| 1043 |
<< " rxseq " << tcpHeader.GetSequenceNumber () |
1047 |
// process close later |
| 1044 |
<< " nextRxSeq " << m_nextRxSequence); |
1048 |
m_finSequence = tcpHeader.GetSequenceNumber () + SequenceNumber (p->GetSize ()); |
| 1045 |
NewRx (p, tcpHeader, fromAddress, toAddress); |
1049 |
m_pendingClose = true; |
| 1046 |
return true; |
1050 |
NS_LOG_LOGIC ("TcpSocketImpl " << this << " setting pendingClose" |
|
|
1051 |
<< " rxseq " << tcpHeader.GetSequenceNumber () |
| 1052 |
<< " nextRxSeq " << m_nextRxSequence); |
| 1053 |
NewRx (p, tcpHeader, fromAddress, toAddress); |
| 1054 |
return true; |
| 1055 |
} |
| 1047 |
} |
1056 |
} |
| 1048 |
// Now we need to see if any data came with the FIN |
1057 |
// Now we need to see if any data came with the FIN |
| 1049 |
// if so, call NewRx |
1058 |
// if so, call NewRx |
|
|
| 1159 |
m_nextTxSequence + SequenceNumber (sz)); |
1168 |
m_nextTxSequence + SequenceNumber (sz)); |
| 1160 |
if (m_closeOnEmpty && (remainingData == 0)) |
1169 |
if (m_closeOnEmpty && (remainingData == 0)) |
| 1161 |
{ |
1170 |
{ |
|
|
1171 |
m_finSequence = m_nextTxSequence + SequenceNumber (1 + sz); |
| 1162 |
flags = TcpHeader::FIN; |
1172 |
flags = TcpHeader::FIN; |
| 1163 |
m_state = FIN_WAIT_1; |
1173 |
m_state = FIN_WAIT_1; |
| 1164 |
} |
1174 |
} |