View | Details | Raw Unified | Return to bug 2068
Collapse All | Expand All

(-)a/src/internet/model/tcp-socket-base.cc (-16 / +25 lines)
 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 ());
(-)a/src/internet/model/tcp-socket-base.h (-2 / +5 lines)
 Lines 883-891   protected: Link Here 
883
   * to utilize later to calculate RTT.
883
   * to utilize later to calculate RTT.
884
   *
884
   *
885
   * \see EstimateRtt
885
   * \see EstimateRtt
886
   * \param option Option from the packet
886
   * \param option Option from the segment
887
   * \param seq Sequence number of the segment
887
   */
888
   */
888
  void ProcessOptionTimestamp (const Ptr<const TcpOption> option);
889
  void ProcessOptionTimestamp (const Ptr<const TcpOption> option,
890
                               const SequenceNumber32 &seq);
889
  /**
891
  /**
890
   * \brief Add the timestamp option to the header
892
   * \brief Add the timestamp option to the header
891
   *
893
   *
 Lines 950-955   protected: Link Here 
950
  uint16_t              m_maxWinSize;  //!< Maximum window size to advertise
952
  uint16_t              m_maxWinSize;  //!< Maximum window size to advertise
951
  TracedValue<uint32_t> m_rWnd;        //!< Receiver window (RCV.WND in RFC793)
953
  TracedValue<uint32_t> m_rWnd;        //!< Receiver window (RCV.WND in RFC793)
952
  TracedValue<SequenceNumber32> m_highRxMark;     //!< Highest seqno received
954
  TracedValue<SequenceNumber32> m_highRxMark;     //!< Highest seqno received
955
  SequenceNumber32 m_highTxAck;                   //!< Highest ack sent
953
  TracedValue<SequenceNumber32> m_highRxAckMark;  //!< Highest ack received
956
  TracedValue<SequenceNumber32> m_highRxAckMark;  //!< Highest ack received
954
  uint32_t                      m_bytesAckedNotProcessed;  //!< Bytes acked, but not processed
957
  uint32_t                      m_bytesAckedNotProcessed;  //!< Bytes acked, but not processed
955
958

Return to bug 2068