704 if (w < m_segmentSize && m_pendingData->Size () > w) |
704 if (w < m_segmentSize && m_pendingData->Size () > w) |
705 { |
705 { |
706 break; // No more |
706 break; // No more |
707 } |
707 } |
708 uint32_t s = std::min (w, m_segmentSize); // Send no more than window |
708 uint32_t s = std::min (w, m_segmentSize); // Send no more than window |
709 PendingData* d = m_pendingData->CopyFromSeq (s, m_firstPendingSequence, |
709 Ptr<Packet> p = m_pendingData->CopyFromSeq (s, m_firstPendingSequence, |
710 m_nextTxSequence); |
710 m_nextTxSequence); |
711 NS_LOG_LOGIC("TcpSocket " << this << " sendPendingData" |
711 NS_LOG_LOGIC("TcpSocket " << this << " sendPendingData" |
712 << " txseq " << m_nextTxSequence |
712 << " txseq " << m_nextTxSequence |
713 << " s " << s |
713 << " s " << s |
714 << " datasize " << d->Size() ); |
714 << " datasize " << p->GetSize() ); |
715 uint8_t flags = 0; |
715 uint8_t flags = 0; |
716 if (withAck) |
716 if (withAck) |
717 { |
717 { |
718 flags |= TcpHeader::ACK; |
718 flags |= TcpHeader::ACK; |
719 } |
719 } |
720 uint32_t sz = d->Size (); // Size of packet |
720 uint32_t sz = p->GetSize (); // Size of packet |
721 uint32_t remainingData = m_pendingData->SizeFromSeq( |
721 uint32_t remainingData = m_pendingData->SizeFromSeq( |
722 m_firstPendingSequence, |
722 m_firstPendingSequence, |
723 m_nextTxSequence + SequenceNumber (sz)); |
723 m_nextTxSequence + SequenceNumber (sz)); |
724 if (m_closeOnEmpty && (remainingData == 0)) |
724 if (m_closeOnEmpty && (remainingData == 0)) |
725 { |
725 { |
726 flags = TcpHeader::FIN; |
726 flags = TcpHeader::FIN; |
727 m_state = FIN_WAIT_1; |
727 m_state = FIN_WAIT_1; |
728 } |
728 } |
729 // Create and send the packet |
|
730 |
|
731 Ptr<Packet> p = Create<Packet> (d->data, sz); |
|
732 |
729 |
733 TcpHeader header; |
730 TcpHeader header; |
734 header.SetFlags (flags); |
731 header.SetFlags (flags); |
735 header.SetSequenceNumber (m_nextTxSequence); |
732 header.SetSequenceNumber (m_nextTxSequence); |
736 header.SetAckNumber (m_nextRxSequence); |
733 header.SetAckNumber (m_nextRxSequence); |
1058 { // Must have lost FIN, re-send |
1055 { // Must have lost FIN, re-send |
1059 SendEmptyPacket (TcpHeader::FIN); |
1056 SendEmptyPacket (TcpHeader::FIN); |
1060 } |
1057 } |
1061 return; |
1058 return; |
1062 } |
1059 } |
1063 PendingData* d = m_pendingData->CopyFromSeq (m_segmentSize, |
1060 Ptr<Packet> p = m_pendingData->CopyFromSeq (m_segmentSize, |
1064 m_firstPendingSequence, |
1061 m_firstPendingSequence, |
1065 m_highestRxAck); |
1062 m_highestRxAck); |
1066 // Calculate remaining data for COE check |
1063 // Calculate remaining data for COE check |
1067 uint32_t remainingData = |
1064 uint32_t remainingData = m_pendingData->SizeFromSeq ( |
1068 m_pendingData->SizeFromSeq (m_firstPendingSequence, |
1065 m_firstPendingSequence, |
1069 m_nextTxSequence + SequenceNumber(d->Size ())); |
1066 m_nextTxSequence + SequenceNumber(p->GetSize ())); |
1070 if (m_closeOnEmpty && remainingData == 0) |
1067 if (m_closeOnEmpty && remainingData == 0) |
1071 { // Add the FIN flag |
1068 { // Add the FIN flag |
1072 flags = flags | TcpHeader::FIN; |
1069 flags = flags | TcpHeader::FIN; |
1073 } |
1070 } |
1074 Ptr<Packet> p = Create<Packet> (d->data, d->Size()); |
1071 |
1075 NS_LOG_LOGIC ("TcpSocket " << this << " retxing seq " << m_highestRxAck); |
1072 NS_LOG_LOGIC ("TcpSocket " << this << " retxing seq " << m_highestRxAck); |
1076 if (m_retxEvent.IsExpired () ) |
1073 if (m_retxEvent.IsExpired () ) |
1077 { |
1074 { |
1078 Time rto = m_rtt->RetransmitTimeout (); |
1075 Time rto = m_rtt->RetransmitTimeout (); |
1079 NS_LOG_LOGIC ("Schedule retransmission timeout at time " |
1076 NS_LOG_LOGIC ("Schedule retransmission timeout at time " |
1080 << Simulator::Now ().GetSeconds () << " to expire at time " |
1077 << Simulator::Now ().GetSeconds () << " to expire at time " |
1081 << (Simulator::Now () + rto).GetSeconds ()); |
1078 << (Simulator::Now () + rto).GetSeconds ()); |
1082 m_retxEvent = Simulator::Schedule (rto,&TcpSocket::ReTxTimeout,this); |
1079 m_retxEvent = Simulator::Schedule (rto,&TcpSocket::ReTxTimeout,this); |
1083 } |
1080 } |
1084 m_rtt->SentSeq (m_highestRxAck,d->Size ()); |
1081 m_rtt->SentSeq (m_highestRxAck,p->GetSize ()); |
1085 // And send the packet |
1082 // And send the packet |
1086 TcpHeader tcpHeader; |
1083 TcpHeader tcpHeader; |
1087 tcpHeader.SetSequenceNumber (m_nextTxSequence); |
1084 tcpHeader.SetSequenceNumber (m_nextTxSequence); |
1088 tcpHeader.SetAckNumber (m_nextRxSequence); |
1085 tcpHeader.SetAckNumber (m_nextRxSequence); |
1089 tcpHeader.SetSourcePort (m_endPoint->GetLocalPort()); |
1086 tcpHeader.SetSourcePort (m_endPoint->GetLocalPort()); |