|
Lines 298-304
TcpSocketBase::TcpSocketBase (const TcpSocketBase& sock)
|
Link Here
|
|---|
|
| 298 |
m_delAckCount (0), |
298 |
m_delAckCount (0), |
| 299 |
m_delAckMaxCount (sock.m_delAckMaxCount), |
299 |
m_delAckMaxCount (sock.m_delAckMaxCount), |
| 300 |
m_noDelay (sock.m_noDelay), |
300 |
m_noDelay (sock.m_noDelay), |
| 301 |
m_cnRetries (sock.m_cnRetries), |
301 |
m_synRetries (sock.m_synRetries), |
| 302 |
m_delAckTimeout (sock.m_delAckTimeout), |
302 |
m_delAckTimeout (sock.m_delAckTimeout), |
| 303 |
m_persistTimeout (sock.m_persistTimeout), |
303 |
m_persistTimeout (sock.m_persistTimeout), |
| 304 |
m_cnTimeout (sock.m_cnTimeout), |
304 |
m_cnTimeout (sock.m_cnTimeout), |
|
Lines 661-667
TcpSocketBase::Connect (const Address & address)
|
Link Here
|
|---|
|
| 661 |
|
661 |
|
| 662 |
// Re-initialize parameters in case this socket is being reused after CLOSE |
662 |
// Re-initialize parameters in case this socket is being reused after CLOSE |
| 663 |
m_rtt->Reset (); |
663 |
m_rtt->Reset (); |
| 664 |
m_cnCount = m_cnRetries; |
664 |
m_synCount = m_synRetries; |
|
|
665 |
m_dataRetrCount = m_dataRetries; |
| 665 |
|
666 |
|
| 666 |
// DoConnect() will do state-checking and send a SYN packet |
667 |
// DoConnect() will do state-checking and send a SYN packet |
| 667 |
return DoConnect (); |
668 |
return DoConnect (); |
|
Lines 1562-1568
TcpSocketBase::ProcessSynSent (Ptr<Packet> packet, const TcpHeader& tcpHeader)
|
Link Here
|
|---|
|
| 1562 |
{ // Received SYN, move to SYN_RCVD state and respond with SYN+ACK |
1563 |
{ // Received SYN, move to SYN_RCVD state and respond with SYN+ACK |
| 1563 |
NS_LOG_DEBUG ("SYN_SENT -> SYN_RCVD"); |
1564 |
NS_LOG_DEBUG ("SYN_SENT -> SYN_RCVD"); |
| 1564 |
m_state = SYN_RCVD; |
1565 |
m_state = SYN_RCVD; |
| 1565 |
m_cnCount = m_cnRetries; |
1566 |
m_synCount = m_synRetries; |
|
|
1567 |
m_dataRetrCount = m_dataRetries; |
| 1566 |
m_rxBuffer->SetNextRxSequence (tcpHeader.GetSequenceNumber () + SequenceNumber32 (1)); |
1568 |
m_rxBuffer->SetNextRxSequence (tcpHeader.GetSequenceNumber () + SequenceNumber32 (1)); |
| 1567 |
SendEmptyPacket (TcpHeader::SYN | TcpHeader::ACK); |
1569 |
SendEmptyPacket (TcpHeader::SYN | TcpHeader::ACK); |
| 1568 |
} |
1570 |
} |
|
Lines 2014-2020
TcpSocketBase::SendEmptyPacket (uint8_t flags)
|
Link Here
|
|---|
|
| 2014 |
bool isAck = flags == TcpHeader::ACK; |
2016 |
bool isAck = flags == TcpHeader::ACK; |
| 2015 |
if (hasSyn) |
2017 |
if (hasSyn) |
| 2016 |
{ |
2018 |
{ |
| 2017 |
if (m_cnCount == 0) |
2019 |
if (m_synCount == 0) |
| 2018 |
{ // No more connection retries, give up |
2020 |
{ // No more connection retries, give up |
| 2019 |
NS_LOG_LOGIC ("Connection failed."); |
2021 |
NS_LOG_LOGIC ("Connection failed."); |
| 2020 |
m_rtt->Reset (); //According to recommendation -> RFC 6298 |
2022 |
m_rtt->Reset (); //According to recommendation -> RFC 6298 |
|
Lines 2023-2031
TcpSocketBase::SendEmptyPacket (uint8_t flags)
|
Link Here
|
|---|
|
| 2023 |
} |
2025 |
} |
| 2024 |
else |
2026 |
else |
| 2025 |
{ // Exponential backoff of connection time out |
2027 |
{ // Exponential backoff of connection time out |
| 2026 |
int backoffCount = 0x1 << (m_cnRetries - m_cnCount); |
2028 |
int backoffCount = 0x1 << (m_synRetries - m_synCount); |
| 2027 |
m_rto = m_cnTimeout * backoffCount; |
2029 |
m_rto = m_cnTimeout * backoffCount; |
| 2028 |
m_cnCount--; |
2030 |
m_synCount--; |
| 2029 |
} |
2031 |
} |
| 2030 |
} |
2032 |
} |
| 2031 |
if (m_endPoint != 0) |
2033 |
if (m_endPoint != 0) |
|
Lines 2177-2183
TcpSocketBase::CompleteFork (Ptr<Packet> p, const TcpHeader& h,
|
Link Here
|
|---|
|
| 2177 |
// Change the cloned socket from LISTEN state to SYN_RCVD |
2179 |
// Change the cloned socket from LISTEN state to SYN_RCVD |
| 2178 |
NS_LOG_DEBUG ("LISTEN -> SYN_RCVD"); |
2180 |
NS_LOG_DEBUG ("LISTEN -> SYN_RCVD"); |
| 2179 |
m_state = SYN_RCVD; |
2181 |
m_state = SYN_RCVD; |
| 2180 |
m_cnCount = m_cnRetries; |
2182 |
m_synCount = m_synRetries; |
|
|
2183 |
m_dataRetrCount = m_dataRetries; |
| 2181 |
SetupCallback (); |
2184 |
SetupCallback (); |
| 2182 |
// Set the sequence number and send SYN+ACK |
2185 |
// Set the sequence number and send SYN+ACK |
| 2183 |
m_rxBuffer->SetNextRxSequence (h.GetSequenceNumber () + SequenceNumber32 (1)); |
2186 |
m_rxBuffer->SetNextRxSequence (h.GetSequenceNumber () + SequenceNumber32 (1)); |
|
Lines 2778-2784
TcpSocketBase::DoRetransmit ()
|
Link Here
|
|---|
|
| 2778 |
// Retransmit SYN packet |
2781 |
// Retransmit SYN packet |
| 2779 |
if (m_state == SYN_SENT) |
2782 |
if (m_state == SYN_SENT) |
| 2780 |
{ |
2783 |
{ |
| 2781 |
if (m_cnCount > 0) |
2784 |
if (m_synCount > 0) |
| 2782 |
{ |
2785 |
{ |
| 2783 |
SendEmptyPacket (TcpHeader::SYN); |
2786 |
SendEmptyPacket (TcpHeader::SYN); |
| 2784 |
} |
2787 |
} |
|
Lines 2788-2793
TcpSocketBase::DoRetransmit ()
|
Link Here
|
|---|
|
| 2788 |
} |
2791 |
} |
| 2789 |
return; |
2792 |
return; |
| 2790 |
} |
2793 |
} |
|
|
2794 |
|
| 2795 |
if (m_dataRetrCount == 0) |
| 2796 |
{ |
| 2797 |
NotifyErrorClose (); |
| 2798 |
DeallocateEndPoint (); |
| 2799 |
return; |
| 2800 |
} |
| 2801 |
else |
| 2802 |
{ |
| 2803 |
--m_dataRetrCount; |
| 2804 |
} |
| 2805 |
|
| 2791 |
// Retransmit non-data packet: Only if in FIN_WAIT_1 or CLOSING state |
2806 |
// Retransmit non-data packet: Only if in FIN_WAIT_1 or CLOSING state |
| 2792 |
if (m_txBuffer->Size () == 0) |
2807 |
if (m_txBuffer->Size () == 0) |
| 2793 |
{ |
2808 |
{ |
|
Lines 2887-2902
TcpSocketBase::GetConnTimeout (void) const
|
Link Here
|
|---|
|
| 2887 |
} |
2902 |
} |
| 2888 |
|
2903 |
|
| 2889 |
void |
2904 |
void |
| 2890 |
TcpSocketBase::SetConnCount (uint32_t count) |
2905 |
TcpSocketBase::SetSynRetries (uint32_t count) |
| 2891 |
{ |
2906 |
{ |
| 2892 |
NS_LOG_FUNCTION (this << count); |
2907 |
NS_LOG_FUNCTION (this << count); |
| 2893 |
m_cnRetries = count; |
2908 |
m_synRetries = count; |
| 2894 |
} |
2909 |
} |
| 2895 |
|
2910 |
|
| 2896 |
uint32_t |
2911 |
uint32_t |
| 2897 |
TcpSocketBase::GetConnCount (void) const |
2912 |
TcpSocketBase::GetSynRetries (void) const |
| 2898 |
{ |
2913 |
{ |
| 2899 |
return m_cnRetries; |
2914 |
return m_synRetries; |
|
|
2915 |
} |
| 2916 |
|
| 2917 |
void |
| 2918 |
TcpSocketBase::SetDataRetries (uint32_t retries) |
| 2919 |
{ |
| 2920 |
NS_LOG_FUNCTION (this << retries); |
| 2921 |
m_dataRetries = retries; |
| 2922 |
} |
| 2923 |
|
| 2924 |
uint32_t |
| 2925 |
TcpSocketBase::GetDataRetries (void) const |
| 2926 |
{ |
| 2927 |
NS_LOG_FUNCTION (this); |
| 2928 |
return m_dataRetries; |
| 2900 |
} |
2929 |
} |
| 2901 |
|
2930 |
|
| 2902 |
void |
2931 |
void |