Lines 76-85
TcpSocketImpl::GetTypeId ()
|
Link Here
|
---|
|
76 |
m_highestRxAck (0), |
76 |
m_highestRxAck (0), |
77 |
m_lastRxAck (0), |
77 |
m_lastRxAck (0), |
78 |
m_nextRxSequence (0), |
78 |
m_nextRxSequence (0), |
|
|
79 |
m_rxAvailable (0), |
80 |
m_rxBufSize (0), |
79 |
m_pendingData (0), |
81 |
m_pendingData (0), |
|
|
82 |
m_rxWindowSize (0), |
83 |
m_persistTime (Seconds(6)), //XXX hook this into attributes? |
80 |
m_rtt (0), |
84 |
m_rtt (0), |
81 |
m_lastMeasuredRtt (Seconds(0.0)), |
85 |
m_lastMeasuredRtt (Seconds(0.0)) |
82 |
m_rxAvailable (0) |
|
|
83 |
{ |
86 |
{ |
84 |
NS_LOG_FUNCTION (this); |
87 |
NS_LOG_FUNCTION (this); |
85 |
} |
88 |
} |
Lines 112-131
TcpSocketImpl::TcpSocketImpl(const TcpSo
|
Link Here
|
---|
|
112 |
m_highestRxAck (sock.m_highestRxAck), |
115 |
m_highestRxAck (sock.m_highestRxAck), |
113 |
m_lastRxAck (sock.m_lastRxAck), |
116 |
m_lastRxAck (sock.m_lastRxAck), |
114 |
m_nextRxSequence (sock.m_nextRxSequence), |
117 |
m_nextRxSequence (sock.m_nextRxSequence), |
|
|
118 |
m_rxAvailable (0), |
119 |
m_rxBufSize (0), |
115 |
m_pendingData (0), |
120 |
m_pendingData (0), |
116 |
m_segmentSize (sock.m_segmentSize), |
121 |
m_segmentSize (sock.m_segmentSize), |
117 |
m_rxWindowSize (sock.m_rxWindowSize), |
122 |
m_rxWindowSize (sock.m_rxWindowSize), |
118 |
m_advertisedWindowSize (sock.m_advertisedWindowSize), |
|
|
119 |
m_cWnd (sock.m_cWnd), |
123 |
m_cWnd (sock.m_cWnd), |
120 |
m_ssThresh (sock.m_ssThresh), |
124 |
m_ssThresh (sock.m_ssThresh), |
121 |
m_initialCWnd (sock.m_initialCWnd), |
125 |
m_initialCWnd (sock.m_initialCWnd), |
|
|
126 |
m_persistTime (sock.m_persistTime), |
122 |
m_rtt (0), |
127 |
m_rtt (0), |
123 |
m_lastMeasuredRtt (Seconds(0.0)), |
128 |
m_lastMeasuredRtt (Seconds(0.0)), |
124 |
m_cnTimeout (sock.m_cnTimeout), |
129 |
m_cnTimeout (sock.m_cnTimeout), |
125 |
m_cnCount (sock.m_cnCount), |
130 |
m_cnCount (sock.m_cnCount), |
126 |
m_rxAvailable (0), |
|
|
127 |
m_sndBufSize (sock.m_sndBufSize), |
131 |
m_sndBufSize (sock.m_sndBufSize), |
128 |
m_rcvBufSize(sock.m_rcvBufSize) |
132 |
m_rxBufMaxSize(sock.m_rxBufMaxSize) |
129 |
{ |
133 |
{ |
130 |
NS_LOG_FUNCTION_NOARGS (); |
134 |
NS_LOG_FUNCTION_NOARGS (); |
131 |
NS_LOG_LOGIC("Invoked the copy constructor"); |
135 |
NS_LOG_LOGIC("Invoked the copy constructor"); |
Lines 176-182
TcpSocketImpl::SetNode (Ptr<Node> node)
|
Link Here
|
---|
|
176 |
m_node = node; |
180 |
m_node = node; |
177 |
// Initialize some variables |
181 |
// Initialize some variables |
178 |
m_cWnd = m_initialCWnd * m_segmentSize; |
182 |
m_cWnd = m_initialCWnd * m_segmentSize; |
179 |
m_rxWindowSize = m_advertisedWindowSize; |
|
|
180 |
} |
183 |
} |
181 |
|
184 |
|
182 |
void |
185 |
void |
Lines 212-217
TcpSocketImpl::Destroy (void)
|
Link Here
|
---|
|
212 |
m_node = 0; |
215 |
m_node = 0; |
213 |
m_endPoint = 0; |
216 |
m_endPoint = 0; |
214 |
m_tcp = 0; |
217 |
m_tcp = 0; |
|
|
218 |
NS_LOG_LOGIC (this<<" Cancelled ReTxTimeout event which was set to expire at " |
219 |
<< (Simulator::Now () + |
220 |
Simulator::GetDelayLeft (m_retxEvent)).GetSeconds()); |
215 |
m_retxEvent.Cancel (); |
221 |
m_retxEvent.Cancel (); |
216 |
} |
222 |
} |
217 |
int |
223 |
int |
Lines 492-497
TcpSocketImpl::Recv (uint32_t maxSize, u
|
Link Here
|
---|
|
492 |
out[i->first] = i->second; |
498 |
out[i->first] = i->second; |
493 |
} |
499 |
} |
494 |
m_rxAvailable -= i->second->GetSize (); |
500 |
m_rxAvailable -= i->second->GetSize (); |
|
|
501 |
m_rxBufSize -= i->second->GetSize (); |
495 |
m_bufferedData.erase (i); // Remove from list |
502 |
m_bufferedData.erase (i); // Remove from list |
496 |
} |
503 |
} |
497 |
if (out.size() == 0) |
504 |
if (out.size() == 0) |
Lines 514-519
TcpSocketImpl::Recv (uint32_t maxSize, u
|
Link Here
|
---|
|
514 |
m_bufferedData[i->first+SequenceNumber(avail)] |
521 |
m_bufferedData[i->first+SequenceNumber(avail)] |
515 |
= i->second->CreateFragment(avail,i->second->GetSize()-avail); |
522 |
= i->second->CreateFragment(avail,i->second->GetSize()-avail); |
516 |
m_rxAvailable += i->second->GetSize()-avail; |
523 |
m_rxAvailable += i->second->GetSize()-avail; |
|
|
524 |
m_rxBufSize += i->second->GetSize()-avail; |
517 |
} |
525 |
} |
518 |
} |
526 |
} |
519 |
return outPacket; |
527 |
return outPacket; |
Lines 570-575
TcpSocketImpl::ForwardUp (Ptr<Packet> pa
|
Link Here
|
---|
|
570 |
m_lastMeasuredRtt = m; |
578 |
m_lastMeasuredRtt = m; |
571 |
} |
579 |
} |
572 |
} |
580 |
} |
|
|
581 |
|
582 |
if (m_rxWindowSize == 0 && tcpHeader.GetWindowSize () != 0) |
583 |
{ //persist probes end |
584 |
NS_LOG_LOGIC (this<<" Leaving zerowindow persist state"); |
585 |
m_persistEvent.Cancel (); |
586 |
} |
587 |
m_rxWindowSize = tcpHeader.GetWindowSize (); //update the flow control window |
573 |
|
588 |
|
574 |
Events_t event = SimulationSingleton<TcpStateMachine>::Get ()->FlagsEvent (tcpHeader.GetFlags () ); |
589 |
Events_t event = SimulationSingleton<TcpStateMachine>::Get ()->FlagsEvent (tcpHeader.GetFlags () ); |
575 |
Actions_t action = ProcessEvent (event); //updates the state |
590 |
Actions_t action = ProcessEvent (event); //updates the state |
Lines 632-638
Actions_t TcpSocketImpl::ProcessEvent (E
|
Link Here
|
---|
|
632 |
|
647 |
|
633 |
void TcpSocketImpl::SendEmptyPacket (uint8_t flags) |
648 |
void TcpSocketImpl::SendEmptyPacket (uint8_t flags) |
634 |
{ |
649 |
{ |
635 |
NS_LOG_FUNCTION (this << flags); |
650 |
NS_LOG_FUNCTION (this << (uint32_t)flags); |
636 |
Ptr<Packet> p = Create<Packet> (); |
651 |
Ptr<Packet> p = Create<Packet> (); |
637 |
TcpHeader header; |
652 |
TcpHeader header; |
638 |
|
653 |
|
Lines 641-647
void TcpSocketImpl::SendEmptyPacket (uin
|
Link Here
|
---|
|
641 |
header.SetAckNumber (m_nextRxSequence); |
656 |
header.SetAckNumber (m_nextRxSequence); |
642 |
header.SetSourcePort (m_endPoint->GetLocalPort ()); |
657 |
header.SetSourcePort (m_endPoint->GetLocalPort ()); |
643 |
header.SetDestinationPort (m_remotePort); |
658 |
header.SetDestinationPort (m_remotePort); |
644 |
header.SetWindowSize (m_advertisedWindowSize); |
659 |
header.SetWindowSize (AdvertisedWindowSize()); |
645 |
m_tcp->SendPacket (p, header, m_endPoint->GetLocalAddress (), |
660 |
m_tcp->SendPacket (p, header, m_endPoint->GetLocalAddress (), |
646 |
m_remoteAddress); |
661 |
m_remoteAddress); |
647 |
Time rto = m_rtt->RetransmitTimeout (); |
662 |
Time rto = m_rtt->RetransmitTimeout (); |
Lines 651-659
void TcpSocketImpl::SendEmptyPacket (uin
|
Link Here
|
---|
|
651 |
m_cnTimeout = m_cnTimeout + m_cnTimeout; |
666 |
m_cnTimeout = m_cnTimeout + m_cnTimeout; |
652 |
m_cnCount--; |
667 |
m_cnCount--; |
653 |
} |
668 |
} |
654 |
if (m_retxEvent.IsExpired () ) //no outstanding timer |
669 |
bool isAck = (flags == TcpHeader::ACK); |
|
|
670 |
if (m_retxEvent.IsExpired () && !isAck) //no outstanding timer |
655 |
{ |
671 |
{ |
656 |
NS_LOG_LOGIC ("Schedule retransmission timeout at time " |
672 |
NS_LOG_LOGIC (this<<" Schedule ReTxTimeout at time " |
657 |
<< Simulator::Now ().GetSeconds () << " to expire at time " |
673 |
<< Simulator::Now ().GetSeconds () << " to expire at time " |
658 |
<< (Simulator::Now () + rto).GetSeconds ()); |
674 |
<< (Simulator::Now () + rto).GetSeconds ()); |
659 |
m_retxEvent = Simulator::Schedule (rto, &TcpSocketImpl::ReTxTimeout, this); |
675 |
m_retxEvent = Simulator::Schedule (rto, &TcpSocketImpl::ReTxTimeout, this); |
Lines 790-796
bool TcpSocketImpl::ProcessPacketAction
|
Link Here
|
---|
|
790 |
NS_LOG_DEBUG ("TcpSocketImpl " << this << " ACK_TX_1" << |
806 |
NS_LOG_DEBUG ("TcpSocketImpl " << this << " ACK_TX_1" << |
791 |
" nextRxSeq " << m_nextRxSequence); |
807 |
" nextRxSeq " << m_nextRxSequence); |
792 |
SendEmptyPacket (TcpHeader::ACK); |
808 |
SendEmptyPacket (TcpHeader::ACK); |
793 |
m_rxWindowSize = tcpHeader.GetWindowSize (); |
|
|
794 |
if (tcpHeader.GetAckNumber () > m_highestRxAck) |
809 |
if (tcpHeader.GetAckNumber () > m_highestRxAck) |
795 |
{ |
810 |
{ |
796 |
m_highestRxAck = tcpHeader.GetAckNumber (); |
811 |
m_highestRxAck = tcpHeader.GetAckNumber (); |
Lines 808-820
bool TcpSocketImpl::ProcessPacketAction
|
Link Here
|
---|
|
808 |
{ |
823 |
{ |
809 |
break; |
824 |
break; |
810 |
} |
825 |
} |
811 |
if (tcpHeader.GetAckNumber () == m_highestRxAck && |
826 |
if (tcpHeader.GetAckNumber () == m_highestRxAck) |
812 |
tcpHeader.GetAckNumber () < m_nextTxSequence) |
|
|
813 |
{ |
827 |
{ |
814 |
DupAck (tcpHeader, ++m_dupAckCount); |
828 |
if (tcpHeader.GetAckNumber () < m_nextTxSequence) |
|
|
829 |
{ |
830 |
DupAck (tcpHeader, ++m_dupAckCount); |
831 |
} |
832 |
NS_ASSERT(tcpHeader.GetAckNumber () <= m_nextTxSequence); |
833 |
//if the ack is precisely equal to the nextTxSequence |
815 |
break; |
834 |
break; |
816 |
} |
835 |
} |
817 |
if (tcpHeader.GetAckNumber () > m_highestRxAck) |
836 |
if (tcpHeader.GetAckNumber () > m_highestRxAck) |
818 |
{ |
837 |
{ |
819 |
m_dupAckCount = 0; |
838 |
m_dupAckCount = 0; |
820 |
} |
839 |
} |
Lines 928-934
bool TcpSocketImpl::SendPendingData (boo
|
Link Here
|
---|
|
928 |
<< " highestRxAck " << m_highestRxAck |
947 |
<< " highestRxAck " << m_highestRxAck |
929 |
<< " pd->Size " << m_pendingData->Size () |
948 |
<< " pd->Size " << m_pendingData->Size () |
930 |
<< " pd->SFS " << m_pendingData->SizeFromSeq (m_firstPendingSequence, m_nextTxSequence)); |
949 |
<< " pd->SFS " << m_pendingData->SizeFromSeq (m_firstPendingSequence, m_nextTxSequence)); |
931 |
|
950 |
//XXX pd->Size is probably a bug, should be SizeFromSeq(...) |
932 |
if (w < m_segmentSize && m_pendingData->Size () > w) |
951 |
if (w < m_segmentSize && m_pendingData->Size () > w) |
933 |
{ |
952 |
{ |
934 |
break; // No more |
953 |
break; // No more |
Lines 961-966
bool TcpSocketImpl::SendPendingData (boo
|
Link Here
|
---|
|
961 |
header.SetAckNumber (m_nextRxSequence); |
980 |
header.SetAckNumber (m_nextRxSequence); |
962 |
header.SetSourcePort (m_endPoint->GetLocalPort()); |
981 |
header.SetSourcePort (m_endPoint->GetLocalPort()); |
963 |
header.SetDestinationPort (m_remotePort); |
982 |
header.SetDestinationPort (m_remotePort); |
|
|
983 |
header.SetWindowSize (AdvertisedWindowSize()); |
964 |
if (m_shutdownSend) |
984 |
if (m_shutdownSend) |
965 |
{ |
985 |
{ |
966 |
m_errno = ERROR_SHUTDOWN; |
986 |
m_errno = ERROR_SHUTDOWN; |
Lines 971-977
bool TcpSocketImpl::SendPendingData (boo
|
Link Here
|
---|
|
971 |
if (m_retxEvent.IsExpired () ) //go ahead and schedule the retransmit |
991 |
if (m_retxEvent.IsExpired () ) //go ahead and schedule the retransmit |
972 |
{ |
992 |
{ |
973 |
Time rto = m_rtt->RetransmitTimeout (); |
993 |
Time rto = m_rtt->RetransmitTimeout (); |
974 |
NS_LOG_LOGIC ("SendPendingData Schedule retransmission timeout at time " << |
994 |
NS_LOG_LOGIC (this<<" SendPendingData Schedule ReTxTimeout at time " << |
975 |
Simulator::Now ().GetSeconds () << " to expire at time " << |
995 |
Simulator::Now ().GetSeconds () << " to expire at time " << |
976 |
(Simulator::Now () + rto).GetSeconds () ); |
996 |
(Simulator::Now () + rto).GetSeconds () ); |
977 |
m_retxEvent = Simulator::Schedule (rto,&TcpSocketImpl::ReTxTimeout,this); |
997 |
m_retxEvent = Simulator::Schedule (rto,&TcpSocketImpl::ReTxTimeout,this); |
Lines 1024-1029
uint32_t TcpSocketImpl::AvailableWindow
|
Link Here
|
---|
|
1024 |
return (win - unack); // Amount of window space available |
1044 |
return (win - unack); // Amount of window space available |
1025 |
} |
1045 |
} |
1026 |
|
1046 |
|
|
|
1047 |
uint32_t TcpSocketImpl::RxBufferFreeSpace() |
1048 |
{ |
1049 |
return m_rxBufMaxSize - m_rxBufSize; |
1050 |
} |
1051 |
|
1052 |
uint16_t TcpSocketImpl::AdvertisedWindowSize() |
1053 |
{ |
1054 |
uint32_t max = 0xffff; |
1055 |
return std::min(RxBufferFreeSpace(), max); |
1056 |
} |
1057 |
|
1027 |
void TcpSocketImpl::NewRx (Ptr<Packet> p, |
1058 |
void TcpSocketImpl::NewRx (Ptr<Packet> p, |
1028 |
const TcpHeader& tcpHeader, |
1059 |
const TcpHeader& tcpHeader, |
1029 |
const Address& fromAddress) |
1060 |
const Address& fromAddress) |
Lines 1039-1047
void TcpSocketImpl::NewRx (Ptr<Packet> p
|
Link Here
|
---|
|
1039 |
" ack " << tcpHeader.GetAckNumber() << |
1070 |
" ack " << tcpHeader.GetAckNumber() << |
1040 |
" p.size is " << p->GetSize()); |
1071 |
" p.size is " << p->GetSize()); |
1041 |
States_t origState = m_state; |
1072 |
States_t origState = m_state; |
|
|
1073 |
if (RxBufferFreeSpace() < p->GetSize()) |
1074 |
{ //if not enough room, fragment |
1075 |
p = p->CreateFragment(0, RxBufferFreeSpace()); |
1076 |
} |
1077 |
//XXX |
1078 |
//fragmenting here MIGHT not be the right thing to do, since possibly we trim |
1079 |
//the front and back off the packet below if it isn't all new data, so the |
1080 |
//check against RxBufferFreeSpace and fragmentation should ideally occur |
1081 |
//just before insertion into m_bufferedData, but this strategy is more |
1082 |
//agressive in rejecting oversized packets and still gives acceptable TCP |
1042 |
uint32_t s = p->GetSize (); // Size of associated data |
1083 |
uint32_t s = p->GetSize (); // Size of associated data |
1043 |
if (s == 0) |
1084 |
if (s == 0) |
1044 |
{// Nothing to do if no associated data |
1085 |
{//if there is no data or no rx buffer space, just ack anyway |
|
|
1086 |
SendEmptyPacket (TcpHeader::ACK); |
1045 |
return; |
1087 |
return; |
1046 |
} |
1088 |
} |
1047 |
// Log sequence received if enabled |
1089 |
// Log sequence received if enabled |
Lines 1074-1087
void TcpSocketImpl::NewRx (Ptr<Packet> p
|
Link Here
|
---|
|
1074 |
//buffer this, it'll be read by call to Recv |
1116 |
//buffer this, it'll be read by call to Recv |
1075 |
UnAckData_t::iterator i = |
1117 |
UnAckData_t::iterator i = |
1076 |
m_bufferedData.find (tcpHeader.GetSequenceNumber () ); |
1118 |
m_bufferedData.find (tcpHeader.GetSequenceNumber () ); |
1077 |
if (i != m_bufferedData.end () ) //we found it already in the buffer |
1119 |
NS_ASSERT(i == m_bufferedData.end ()); //no way it should have been found |
1078 |
{ |
1120 |
// Save for later delivery if there is room |
1079 |
i->second = 0; // relase reference to already buffered |
1121 |
m_bufferedData[tcpHeader.GetSequenceNumber () ] = p; |
1080 |
} |
|
|
1081 |
// Save for later delivery |
1082 |
m_bufferedData[tcpHeader.GetSequenceNumber () ] = p; |
1083 |
m_rxAvailable += p->GetSize (); |
1122 |
m_rxAvailable += p->GetSize (); |
1084 |
RxBufFinishInsert (tcpHeader.GetSequenceNumber ()); |
1123 |
RxBufFinishInsert (tcpHeader.GetSequenceNumber ()); |
|
|
1124 |
m_rxBufSize += p->GetSize (); |
1085 |
NotifyDataRecv (); |
1125 |
NotifyDataRecv (); |
1086 |
if (m_closeNotified) |
1126 |
if (m_closeNotified) |
1087 |
{ |
1127 |
{ |
Lines 1181-1186
void TcpSocketImpl::NewRx (Ptr<Packet> p
|
Link Here
|
---|
|
1181 |
// Save for later delivery |
1221 |
// Save for later delivery |
1182 |
m_bufferedData[start] = p; |
1222 |
m_bufferedData[start] = p; |
1183 |
m_rxAvailable += p->GetSize (); |
1223 |
m_rxAvailable += p->GetSize (); |
|
|
1224 |
m_rxBufSize += p->GetSize(); |
1184 |
RxBufFinishInsert(start); |
1225 |
RxBufFinishInsert(start); |
1185 |
NotifyDataRecv (); |
1226 |
NotifyDataRecv (); |
1186 |
} |
1227 |
} |
Lines 1248-1260
void TcpSocketImpl::CommonNewAck (Sequen
|
Link Here
|
---|
|
1248 |
//DEBUG(1,(cout << "TCP " << this << "Cancelling retx timer " << endl)); |
1289 |
//DEBUG(1,(cout << "TCP " << this << "Cancelling retx timer " << endl)); |
1249 |
if (!skipTimer) |
1290 |
if (!skipTimer) |
1250 |
{ |
1291 |
{ |
1251 |
m_retxEvent.Cancel (); |
1292 |
NS_LOG_LOGIC (this<<" Cancelled ReTxTimeout event which was set to expire at " |
|
|
1293 |
<< (Simulator::Now () + |
1294 |
Simulator::GetDelayLeft (m_retxEvent)).GetSeconds()); |
1295 |
m_retxEvent.Cancel (); |
1252 |
//On recieving a "New" ack we restart retransmission timer .. RFC 2988 |
1296 |
//On recieving a "New" ack we restart retransmission timer .. RFC 2988 |
1253 |
Time rto = m_rtt->RetransmitTimeout (); |
1297 |
Time rto = m_rtt->RetransmitTimeout (); |
1254 |
NS_LOG_LOGIC ("Schedule retransmission timeout at time " |
1298 |
NS_LOG_LOGIC (this<<" Schedule ReTxTimeout at time " |
1255 |
<< Simulator::Now ().GetSeconds () << " to expire at time " |
1299 |
<< Simulator::Now ().GetSeconds () << " to expire at time " |
1256 |
<< (Simulator::Now () + rto).GetSeconds ()); |
1300 |
<< (Simulator::Now () + rto).GetSeconds ()); |
1257 |
m_retxEvent = Simulator::Schedule (rto, &TcpSocketImpl::ReTxTimeout, this); |
1301 |
m_retxEvent = |
|
|
1302 |
Simulator::Schedule (rto, &TcpSocketImpl::ReTxTimeout, this); |
1303 |
} |
1304 |
if (m_rxWindowSize == 0 && m_persistEvent.IsExpired ()) //zerowindow |
1305 |
{ |
1306 |
NS_LOG_LOGIC (this<<"Enter zerowindow persist state"); |
1307 |
NS_LOG_LOGIC (this<<" Cancelled ReTxTimeout event which was set to expire at " |
1308 |
<< (Simulator::Now () + |
1309 |
Simulator::GetDelayLeft (m_retxEvent)).GetSeconds()); |
1310 |
m_retxEvent.Cancel (); |
1311 |
NS_LOG_LOGIC ("Schedule persist timeout at time " |
1312 |
<<Simulator::Now ().GetSeconds () << " to expire at time " |
1313 |
<< (Simulator::Now () + m_persistTime).GetSeconds()); |
1314 |
m_persistEvent = |
1315 |
Simulator::Schedule (m_persistTime, &TcpSocketImpl::PersistTimeout, this); |
1316 |
NS_ASSERT (m_persistTime == Simulator::GetDelayLeft (m_persistEvent)); |
1258 |
} |
1317 |
} |
1259 |
NS_LOG_LOGIC ("TCP " << this << " NewAck " << ack |
1318 |
NS_LOG_LOGIC ("TCP " << this << " NewAck " << ack |
1260 |
<< " numberAck " << (ack - m_highestRxAck)); // Number bytes ack'ed |
1319 |
<< " numberAck " << (ack - m_highestRxAck)); // Number bytes ack'ed |
Lines 1276-1281
void TcpSocketImpl::CommonNewAck (Sequen
|
Link Here
|
---|
|
1276 |
delete m_pendingData; |
1335 |
delete m_pendingData; |
1277 |
m_pendingData = 0; |
1336 |
m_pendingData = 0; |
1278 |
// Insure no re-tx timer |
1337 |
// Insure no re-tx timer |
|
|
1338 |
NS_LOG_LOGIC (this<<" Cancelled ReTxTimeout event which was set to expire at " |
1339 |
<< (Simulator::Now () + |
1340 |
Simulator::GetDelayLeft (m_retxEvent)).GetSeconds()); |
1279 |
m_retxEvent.Cancel (); |
1341 |
m_retxEvent.Cancel (); |
1280 |
} |
1342 |
} |
1281 |
} |
1343 |
} |
Lines 1341-1346
void TcpSocketImpl::ReTxTimeout ()
|
Link Here
|
---|
|
1341 |
void TcpSocketImpl::ReTxTimeout () |
1403 |
void TcpSocketImpl::ReTxTimeout () |
1342 |
{ // Retransmit timeout |
1404 |
{ // Retransmit timeout |
1343 |
NS_LOG_FUNCTION (this); |
1405 |
NS_LOG_FUNCTION (this); |
|
|
1406 |
NS_LOG_LOGIC (this<<" ReTxTimeout Expired at time "<<Simulator::Now ().GetSeconds()); |
1344 |
m_ssThresh = Window () / 2; // Per RFC2581 |
1407 |
m_ssThresh = Window () / 2; // Per RFC2581 |
1345 |
m_ssThresh = std::max (m_ssThresh, 2 * m_segmentSize); |
1408 |
m_ssThresh = std::max (m_ssThresh, 2 * m_segmentSize); |
1346 |
// Set cWnd to segSize on timeout, per rfc2581 |
1409 |
// Set cWnd to segSize on timeout, per rfc2581 |
Lines 1363-1368
void TcpSocketImpl::LastAckTimeout ()
|
Link Here
|
---|
|
1363 |
{ |
1426 |
{ |
1364 |
m_closeNotified = true; |
1427 |
m_closeNotified = true; |
1365 |
} |
1428 |
} |
|
|
1429 |
} |
1430 |
|
1431 |
void TcpSocketImpl::PersistTimeout () |
1432 |
{ |
1433 |
NS_LOG_LOGIC ("PersistTimeout expired at "<<Simulator::Now ().GetSeconds ()); |
1434 |
m_persistTime = Scalar(2)*m_persistTime; |
1435 |
m_persistTime = std::min(Seconds(60),m_persistTime); //maxes out at 60 |
1436 |
//the persist timeout sends exactly one byte probes |
1437 |
//this is explicit in stevens, and kind of in rfc793 p42, rfc1122 sec4.2.2.17 |
1438 |
Ptr<Packet> p = |
1439 |
m_pendingData->CopyFromSeq(1,m_firstPendingSequence,m_nextTxSequence); |
1440 |
TcpHeader tcpHeader; |
1441 |
tcpHeader.SetSequenceNumber (m_nextTxSequence); |
1442 |
tcpHeader.SetAckNumber (m_nextRxSequence); |
1443 |
tcpHeader.SetSourcePort (m_endPoint->GetLocalPort()); |
1444 |
tcpHeader.SetDestinationPort (m_remotePort); |
1445 |
tcpHeader.SetWindowSize (AdvertisedWindowSize()); |
1446 |
|
1447 |
m_tcp->SendPacket (p, tcpHeader, m_endPoint->GetLocalAddress (), |
1448 |
m_remoteAddress); |
1449 |
NS_LOG_LOGIC ("Schedule persist timeout at time " |
1450 |
<<Simulator::Now ().GetSeconds () << " to expire at time " |
1451 |
<< (Simulator::Now () + m_persistTime).GetSeconds()); |
1452 |
m_persistEvent = |
1453 |
Simulator::Schedule (m_persistTime, &TcpSocketImpl::PersistTimeout, this); |
1366 |
} |
1454 |
} |
1367 |
|
1455 |
|
1368 |
void TcpSocketImpl::Retransmit () |
1456 |
void TcpSocketImpl::Retransmit () |
Lines 1390-1398
void TcpSocketImpl::Retransmit ()
|
Link Here
|
---|
|
1390 |
} |
1478 |
} |
1391 |
return; |
1479 |
return; |
1392 |
} |
1480 |
} |
|
|
1481 |
NS_ASSERT(m_nextTxSequence == m_highestRxAck); |
1393 |
Ptr<Packet> p = m_pendingData->CopyFromSeq (m_segmentSize, |
1482 |
Ptr<Packet> p = m_pendingData->CopyFromSeq (m_segmentSize, |
1394 |
m_firstPendingSequence, |
1483 |
m_firstPendingSequence, |
1395 |
m_highestRxAck); |
1484 |
m_nextTxSequence); |
1396 |
// Calculate remaining data for COE check |
1485 |
// Calculate remaining data for COE check |
1397 |
uint32_t remainingData = m_pendingData->SizeFromSeq ( |
1486 |
uint32_t remainingData = m_pendingData->SizeFromSeq ( |
1398 |
m_firstPendingSequence, |
1487 |
m_firstPendingSequence, |
Lines 1406-1412
void TcpSocketImpl::Retransmit ()
|
Link Here
|
---|
|
1406 |
if (m_retxEvent.IsExpired () ) |
1495 |
if (m_retxEvent.IsExpired () ) |
1407 |
{ |
1496 |
{ |
1408 |
Time rto = m_rtt->RetransmitTimeout (); |
1497 |
Time rto = m_rtt->RetransmitTimeout (); |
1409 |
NS_LOG_LOGIC ("Schedule retransmission timeout at time " |
1498 |
NS_LOG_LOGIC (this<<" Schedule ReTxTimeout at time " |
1410 |
<< Simulator::Now ().GetSeconds () << " to expire at time " |
1499 |
<< Simulator::Now ().GetSeconds () << " to expire at time " |
1411 |
<< (Simulator::Now () + rto).GetSeconds ()); |
1500 |
<< (Simulator::Now () + rto).GetSeconds ()); |
1412 |
m_retxEvent = Simulator::Schedule (rto,&TcpSocketImpl::ReTxTimeout,this); |
1501 |
m_retxEvent = Simulator::Schedule (rto,&TcpSocketImpl::ReTxTimeout,this); |
Lines 1419-1425
void TcpSocketImpl::Retransmit ()
|
Link Here
|
---|
|
1419 |
tcpHeader.SetSourcePort (m_endPoint->GetLocalPort()); |
1508 |
tcpHeader.SetSourcePort (m_endPoint->GetLocalPort()); |
1420 |
tcpHeader.SetDestinationPort (m_remotePort); |
1509 |
tcpHeader.SetDestinationPort (m_remotePort); |
1421 |
tcpHeader.SetFlags (flags); |
1510 |
tcpHeader.SetFlags (flags); |
1422 |
tcpHeader.SetWindowSize (m_advertisedWindowSize); |
1511 |
tcpHeader.SetWindowSize (AdvertisedWindowSize()); |
1423 |
|
1512 |
|
1424 |
m_tcp->SendPacket (p, tcpHeader, m_endPoint->GetLocalAddress (), |
1513 |
m_tcp->SendPacket (p, tcpHeader, m_endPoint->GetLocalAddress (), |
1425 |
m_remoteAddress); |
1514 |
m_remoteAddress); |
|
1440 |
void |
1529 |
void |
1441 |
TcpSocketImpl::SetRcvBufSize (uint32_t size) |
1530 |
TcpSocketImpl::SetRcvBufSize (uint32_t size) |
1442 |
{ |
1531 |
{ |
1443 |
m_rcvBufSize = size; |
1532 |
m_rxBufMaxSize = size; |
1444 |
} |
1533 |
} |
1445 |
|
1534 |
|
1446 |
uint32_t |
1535 |
uint32_t |
1447 |
TcpSocketImpl::GetRcvBufSize (void) const |
1536 |
TcpSocketImpl::GetRcvBufSize (void) const |
1448 |
{ |
1537 |
{ |
1449 |
return m_rcvBufSize; |
1538 |
return m_rxBufMaxSize; |
1450 |
} |
1539 |
} |
1451 |
|
1540 |
|
1452 |
void |
1541 |
void |
Lines 1459-1476
TcpSocketImpl::GetSegSize (void) const
|
Link Here
|
---|
|
1459 |
TcpSocketImpl::GetSegSize (void) const |
1548 |
TcpSocketImpl::GetSegSize (void) const |
1460 |
{ |
1549 |
{ |
1461 |
return m_segmentSize; |
1550 |
return m_segmentSize; |
1462 |
} |
|
|
1463 |
|
1464 |
void |
1465 |
TcpSocketImpl::SetAdvWin (uint32_t window) |
1466 |
{ |
1467 |
m_advertisedWindowSize = window; |
1468 |
} |
1469 |
|
1470 |
uint32_t |
1471 |
TcpSocketImpl::GetAdvWin (void) const |
1472 |
{ |
1473 |
return m_advertisedWindowSize; |
1474 |
} |
1551 |
} |
1475 |
|
1552 |
|
1476 |
void |
1553 |
void |