tcp: Update tcp-dctcp-test

This commit is contained in:
Tom Henderson
2020-12-13 20:52:19 -08:00
parent d25b586cbb
commit af06552ee2

View File

@@ -29,6 +29,7 @@
#include "tcp-error-model.h"
#include "ns3/tcp-l4-protocol.h"
#include "ns3/tcp-dctcp.h"
#include "ns3/tcp-linux-reno.h"
#include "ns3/tcp-tx-buffer.h"
#include "ns3/config.h"
@@ -508,9 +509,9 @@ TcpDctcpCodePointsTest::CreateReceiverSocket (Ptr<Node> node)
* \ingroup internet-test
* \ingroup tests
*
* \brief DCTCP should be same as NewReno during slow start
* \brief DCTCP should be same as Linux during slow start
*/
class TcpDctcpToNewReno : public TestCase
class TcpDctcpToLinuxReno : public TestCase
{
public:
/**
@@ -525,7 +526,7 @@ public:
* \param rtt RTT
* \param name Name of the test
*/
TcpDctcpToNewReno (uint32_t cWnd, uint32_t segmentSize, uint32_t ssThresh,
TcpDctcpToLinuxReno (uint32_t cWnd, uint32_t segmentSize, uint32_t ssThresh,
uint32_t segmentsAcked, SequenceNumber32 highTxMark,
SequenceNumber32 lastAckedSeq, Time rtt, const std::string &name);
@@ -545,7 +546,7 @@ private:
Ptr<TcpSocketState> m_state; //!< state
};
TcpDctcpToNewReno::TcpDctcpToNewReno (uint32_t cWnd, uint32_t segmentSize, uint32_t ssThresh,
TcpDctcpToLinuxReno::TcpDctcpToLinuxReno (uint32_t cWnd, uint32_t segmentSize, uint32_t ssThresh,
uint32_t segmentsAcked, SequenceNumber32 highTxMark,
SequenceNumber32 lastAckedSeq, Time rtt, const std::string &name)
: TestCase (name),
@@ -560,15 +561,15 @@ TcpDctcpToNewReno::TcpDctcpToNewReno (uint32_t cWnd, uint32_t segmentSize, uint3
}
void
TcpDctcpToNewReno::DoRun ()
TcpDctcpToLinuxReno::DoRun ()
{
Simulator::Schedule (Seconds (0.0), &TcpDctcpToNewReno::ExecuteTest, this);
Simulator::Schedule (Seconds (0.0), &TcpDctcpToLinuxReno::ExecuteTest, this);
Simulator::Run ();
Simulator::Destroy ();
}
void
TcpDctcpToNewReno::ExecuteTest ()
TcpDctcpToLinuxReno::ExecuteTest ()
{
m_state = CreateObject <TcpSocketState> ();
m_state->m_cWnd = m_cWnd;
@@ -587,94 +588,12 @@ TcpDctcpToNewReno::ExecuteTest ()
Ptr<TcpDctcp> cong = CreateObject <TcpDctcp> ();
cong->IncreaseWindow (m_state, m_segmentsAcked);
Ptr<TcpNewReno> NewRenoCong = CreateObject <TcpNewReno> ();
NewRenoCong->IncreaseWindow (state, m_segmentsAcked);
Ptr<TcpLinuxReno> LinuxRenoCong = CreateObject <TcpLinuxReno> ();
LinuxRenoCong->IncreaseWindow (state, m_segmentsAcked);
NS_TEST_ASSERT_MSG_EQ (m_state->m_cWnd.Get (), state->m_cWnd.Get (),
"cWnd has not updated correctly");
}
/**
* \ingroup internet-test
* \ingroup tests
*
* \brief Test to validate cWnd decrement DCTCP
*/
class TcpDctcpDecrementTest : public TestCase
{
public:
/**
* \brief Constructor
*
* \param cWnd congestion window
* \param segmentSize segment size
* \param segmentsAcked segments acked
* \param highTxMark high tx mark
* \param lastAckedSeq last acked seq
* \param rtt RTT
* \param name Name of the test
*/
TcpDctcpDecrementTest (uint32_t cWnd, uint32_t segmentSize, uint32_t segmentsAcked, SequenceNumber32 nextTxSequence,
SequenceNumber32 lastAckedSeq, Time rtt, const std::string &name);
private:
virtual void DoRun (void);
/** \brief Execute the test
*/
void ExecuteTest (void);
uint32_t m_cWnd; //!< cWnd
uint32_t m_segmentSize; //!< segment size
uint32_t m_segmentsAcked; //!< segments acked
Time m_rtt; //!< rtt
SequenceNumber32 m_nextTxSequence; //!< next seq num to be sent
SequenceNumber32 m_lastAckedSeq; //!< last acked seq
Ptr<TcpSocketState> m_state; //!< state
};
TcpDctcpDecrementTest::TcpDctcpDecrementTest (uint32_t cWnd, uint32_t segmentSize, uint32_t segmentsAcked, SequenceNumber32 nextTxSequence,
SequenceNumber32 lastAckedSeq, Time rtt, const std::string &name)
: TestCase (name),
m_cWnd (cWnd),
m_segmentSize (segmentSize),
m_segmentsAcked (segmentsAcked),
m_rtt (rtt),
m_nextTxSequence (nextTxSequence),
m_lastAckedSeq (lastAckedSeq)
{
}
void
TcpDctcpDecrementTest::DoRun ()
{
Config::SetDefault ("ns3::TcpDctcp::DctcpAlphaOnInit", DoubleValue (0));
Simulator::Schedule (Seconds (0.0), &TcpDctcpDecrementTest::ExecuteTest, this);
Simulator::Run ();
Simulator::Destroy ();
}
void
TcpDctcpDecrementTest::ExecuteTest (void)
{
m_state = CreateObject <TcpSocketState> ();
m_state->m_cWnd = m_cWnd;
m_state->m_segmentSize = m_segmentSize;
m_state->m_nextTxSequence = m_nextTxSequence;
m_state->m_lastAckedSeq = m_lastAckedSeq;
Ptr<TcpDctcp> cong = CreateObject <TcpDctcp> ();
m_state->m_ecnState = TcpSocketState::ECN_IDLE;
cong->PktsAcked (m_state, m_segmentsAcked, m_rtt);
NS_TEST_ASSERT_MSG_EQ (m_state->m_cWnd.Get (), m_cWnd,
"cWnd has updated correctly");
m_state->m_ecnState = TcpSocketState::ECN_ECE_RCVD;
cong->PktsAcked (m_state, m_segmentsAcked, m_rtt);
uint32_t val = (uint32_t)(m_cWnd * (1 - 0.0625 / 2.0));
NS_TEST_ASSERT_MSG_EQ (m_state->m_cWnd.Get (), val,
"cWnd has updated correctly");
}
/**
* \ingroup internet-test
@@ -687,12 +606,11 @@ class TcpDctcpTestSuite : public TestSuite
public:
TcpDctcpTestSuite () : TestSuite ("tcp-dctcp-test", UNIT)
{
AddTestCase (new TcpDctcpToNewReno (2 * 1446, 1446, 4 * 1446, 2, SequenceNumber32 (4753), SequenceNumber32 (3216), MilliSeconds (100), "DCTCP falls to New Reno for slowstart"), TestCase::QUICK);
AddTestCase (new TcpDctcpDecrementTest (4 * 1446, 1446, 2, SequenceNumber32 (3216), SequenceNumber32 (4753), MilliSeconds (100), "DCTCP decrement test"), TestCase::QUICK);
AddTestCase (new TcpDctcpToLinuxReno (2 * 1446, 1446, 4 * 1446, 2, SequenceNumber32 (4753), SequenceNumber32 (3216), MilliSeconds (100), "DCTCP falls to New Reno for slowstart"), TestCase::QUICK);
AddTestCase (new TcpDctcpCodePointsTest (1, "ECT Test : Check if ECT is set on Syn, Syn+Ack, Ack and Data packets for DCTCP packets"),
TestCase::QUICK);
AddTestCase (new TcpDctcpCodePointsTest (2, "ECT Test : Check if ECT is not set on Syn, Syn+Ack and Ack but set on Data packets for non-DCTCP but ECN enabled traffic"),TestCase::QUICK);
AddTestCase (new TcpDctcpCodePointsTest (3, "ECE Functionality Test: ECE should only be sent by reciever when it receives CE flags"),
AddTestCase (new TcpDctcpCodePointsTest (3, "ECE Functionality Test: ECE should only be sent by receiver when it receives CE flags"),
TestCase::QUICK);
}
};