|
Lines 283-288
TcpSocketBase::TcpSocketBase (void)
|
Link Here
|
|---|
|
| 283 |
m_maxWinSize (0), |
283 |
m_maxWinSize (0), |
| 284 |
m_rWnd (0), |
284 |
m_rWnd (0), |
| 285 |
m_highRxMark (0), |
285 |
m_highRxMark (0), |
|
|
286 |
m_highTxAck (0), |
| 286 |
m_highRxAckMark (0), |
287 |
m_highRxAckMark (0), |
| 287 |
m_bytesAckedNotProcessed (0), |
288 |
m_bytesAckedNotProcessed (0), |
| 288 |
m_winScalingEnabled (0), |
289 |
m_winScalingEnabled (0), |
|
Lines 352-357
TcpSocketBase::TcpSocketBase (const TcpSocketBase& sock)
|
Link Here
|
|---|
|
| 352 |
m_maxWinSize (sock.m_maxWinSize), |
353 |
m_maxWinSize (sock.m_maxWinSize), |
| 353 |
m_rWnd (sock.m_rWnd), |
354 |
m_rWnd (sock.m_rWnd), |
| 354 |
m_highRxMark (sock.m_highRxMark), |
355 |
m_highRxMark (sock.m_highRxMark), |
|
|
356 |
m_highTxAck (sock.m_highTxAck), |
| 355 |
m_highRxAckMark (sock.m_highRxAckMark), |
357 |
m_highRxAckMark (sock.m_highRxAckMark), |
| 356 |
m_bytesAckedNotProcessed (sock.m_bytesAckedNotProcessed), |
358 |
m_bytesAckedNotProcessed (sock.m_bytesAckedNotProcessed), |
| 357 |
m_winScalingEnabled (sock.m_winScalingEnabled), |
359 |
m_winScalingEnabled (sock.m_winScalingEnabled), |
|
Lines 1215-1221
TcpSocketBase::DoForwardUp (Ptr<Packet> packet, const Address &fromAddress,
|
Link Here
|
|---|
|
| 1215 |
// When receiving a <SYN> or <SYN-ACK> we should adapt TS to the other end |
1217 |
// When receiving a <SYN> or <SYN-ACK> we should adapt TS to the other end |
| 1216 |
if (tcpHeader.HasOption (TcpOption::TS) && m_timestampEnabled) |
1218 |
if (tcpHeader.HasOption (TcpOption::TS) && m_timestampEnabled) |
| 1217 |
{ |
1219 |
{ |
| 1218 |
ProcessOptionTimestamp (tcpHeader.GetOption (TcpOption::TS)); |
1220 |
ProcessOptionTimestamp (tcpHeader.GetOption (TcpOption::TS), |
|
|
1221 |
tcpHeader.GetSequenceNumber ()); |
| 1219 |
} |
1222 |
} |
| 1220 |
else |
1223 |
else |
| 1221 |
{ |
1224 |
{ |
|
Lines 1228-1249
TcpSocketBase::DoForwardUp (Ptr<Packet> packet, const Address &fromAddress,
|
Link Here
|
|---|
|
| 1228 |
} |
1231 |
} |
| 1229 |
else if (tcpHeader.GetFlags () & TcpHeader::ACK) |
1232 |
else if (tcpHeader.GetFlags () & TcpHeader::ACK) |
| 1230 |
{ |
1233 |
{ |
| 1231 |
if (m_timestampEnabled) |
1234 |
if (m_timestampEnabled && ! tcpHeader.HasOption (TcpOption::TS)) |
| 1232 |
{ |
1235 |
{ |
| 1233 |
if (tcpHeader.HasOption (TcpOption::TS)) |
1236 |
// Ignoring segment without TS, RFC 7323 |
| 1234 |
{ |
1237 |
NS_LOG_LOGIC ("At state " << TcpStateName[m_state] << |
| 1235 |
ProcessOptionTimestamp (tcpHeader.GetOption (TcpOption::TS)); |
1238 |
" received packet of seq [" << seq << |
| 1236 |
} |
1239 |
":" << seq + packet->GetSize () << |
| 1237 |
else |
1240 |
") without TS option. Silently discard it"); |
| 1238 |
{ |
1241 |
return; |
| 1239 |
NS_LOG_LOGIC ("At state " << TcpStateName[m_state] << |
|
|
| 1240 |
" received packet of seq [" << seq << |
| 1241 |
":" << seq + packet->GetSize () << |
| 1242 |
") without TS option. Silently discard it"); |
| 1243 |
return; |
| 1244 |
} |
| 1245 |
} |
1242 |
} |
| 1246 |
|
1243 |
|
|
|
1244 |
ProcessOptionTimestamp (tcpHeader.GetOption (TcpOption::TS), |
| 1245 |
tcpHeader.GetSequenceNumber ()); |
| 1246 |
|
| 1247 |
EstimateRtt (tcpHeader); |
1247 |
EstimateRtt (tcpHeader); |
| 1248 |
UpdateWindowSize (tcpHeader); |
1248 |
UpdateWindowSize (tcpHeader); |
| 1249 |
} |
1249 |
} |
|
Lines 1984-1989
TcpSocketBase::SendEmptyPacket (uint8_t flags)
|
Link Here
|
|---|
|
| 1984 |
{ // If sending an ACK, cancel the delay ACK as well |
1984 |
{ // If sending an ACK, cancel the delay ACK as well |
| 1985 |
m_delAckEvent.Cancel (); |
1985 |
m_delAckEvent.Cancel (); |
| 1986 |
m_delAckCount = 0; |
1986 |
m_delAckCount = 0; |
|
|
1987 |
if (m_highTxAck < header.GetAckNumber ()) |
| 1988 |
{ |
| 1989 |
m_highTxAck = header.GetAckNumber (); |
| 1990 |
} |
| 1987 |
} |
1991 |
} |
| 1988 |
if (m_retxEvent.IsExpired () && (hasSyn || hasFin) && !isAck ) |
1992 |
if (m_retxEvent.IsExpired () && (hasSyn || hasFin) && !isAck ) |
| 1989 |
{ // Retransmit SYN / SYN+ACK / FIN / FIN+ACK to guard against lost |
1993 |
{ // Retransmit SYN / SYN+ACK / FIN / FIN+ACK to guard against lost |
|
Lines 3252-3263
TcpSocketBase::AddOptionWScale (TcpHeader &header)
|
Link Here
|
|---|
|
| 3252 |
} |
3256 |
} |
| 3253 |
|
3257 |
|
| 3254 |
void |
3258 |
void |
| 3255 |
TcpSocketBase::ProcessOptionTimestamp (const Ptr<const TcpOption> option) |
3259 |
TcpSocketBase::ProcessOptionTimestamp (const Ptr<const TcpOption> option, |
|
|
3260 |
const SequenceNumber32 &seq) |
| 3256 |
{ |
3261 |
{ |
| 3257 |
NS_LOG_FUNCTION (this << option); |
3262 |
NS_LOG_FUNCTION (this << option); |
| 3258 |
|
3263 |
|
| 3259 |
Ptr<const TcpOptionTS> ts = DynamicCast<const TcpOptionTS> (option); |
3264 |
Ptr<const TcpOptionTS> ts = DynamicCast<const TcpOptionTS> (option); |
| 3260 |
m_timestampToEcho = ts->GetTimestamp (); |
3265 |
|
|
|
3266 |
if (seq == m_rxBuffer->NextRxSequence () && seq <= m_highTxAck) |
| 3267 |
{ |
| 3268 |
m_timestampToEcho = ts->GetTimestamp (); |
| 3269 |
} |
| 3261 |
|
3270 |
|
| 3262 |
NS_LOG_INFO (m_node->GetId () << " Got timestamp=" << |
3271 |
NS_LOG_INFO (m_node->GetId () << " Got timestamp=" << |
| 3263 |
m_timestampToEcho << " and Echo=" << ts->GetEcho ()); |
3272 |
m_timestampToEcho << " and Echo=" << ts->GetEcho ()); |