src/internet-node/tcp-socket.cc
changeset 2354 ba9d1cad1a7c
parent 2353 5a1149f7de4e
child 2362 d02b7fd0e577
child 2556 b13dd6239954
equal deleted inserted replaced
2353:5a1149f7de4e 2354:ba9d1cad1a7c
   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());