A Discrete-Event Network Simulator
API
tcp-scalable-test.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2016 ResiliNets, ITTC, University of Kansas
3  *
4  * This program is free software; you can redistribute it and/or modify
5  * it under the terms of the GNU General Public License version 2 as
6  * published by the Free Software Foundation;
7  *
8  * This program is distributed in the hope that it will be useful,
9  * but WITHOUT ANY WARRANTY; without even the implied warranty of
10  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11  * GNU General Public License for more details.
12  *
13  * You should have received a copy of the GNU General Public License
14  * along with this program; if not, write to the Free Software
15  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16  *
17  * Authors: Truc Anh N. Nguyen <annguyen@ittc.ku.edu>
18 
19  * James P.G. Sterbenz <jpgs@ittc.ku.edu>, director
20  * ResiliNets Research Group https://resilinets.org/
21  * Information and Telecommunication Technology Center (ITTC)
22  * and Department of Electrical Engineering and Computer Science
23  * The University of Kansas Lawrence, KS USA.
24  *
25  */
26 
27 #include "ns3/log.h"
28 #include "ns3/tcp-congestion-ops.h"
29 #include "ns3/tcp-scalable.h"
30 #include "ns3/tcp-socket-base.h"
31 #include "ns3/test.h"
32 
33 using namespace ns3;
34 
35 NS_LOG_COMPONENT_DEFINE("TcpScalableTestSuite");
36 
43 {
44  public:
52  TcpScalableIncrementTest(uint32_t cWnd,
53  uint32_t segmentSize,
54  uint32_t segmentsAcked,
55  const std::string& name);
56 
57  private:
58  void DoRun() override;
59 
60  uint32_t m_cWnd;
61  uint32_t m_segmentSize;
62  uint32_t m_segmentsAcked;
64 };
65 
67  uint32_t segmentSize,
68  uint32_t segmentsAcked,
69  const std::string& name)
70  : TestCase(name),
71  m_cWnd(cWnd),
72  m_segmentSize(segmentSize),
73  m_segmentsAcked(segmentsAcked)
74 {
75 }
76 
77 void
79 {
80  m_state = CreateObject<TcpSocketState>();
81 
84 
85  Ptr<TcpScalable> cong = CreateObject<TcpScalable>();
86 
87  uint32_t segCwnd = m_cWnd / m_segmentSize;
88 
89  // Get default value of additive increase factor
90  UintegerValue aiFactor;
91  cong->GetAttribute("AIFactor", aiFactor);
92 
93  // To see an increase of 1 MSS, the number of segments ACKed has to be at least
94  // min (segCwnd, aiFactor).
95 
96  uint32_t w = std::min(segCwnd, (uint32_t)aiFactor.Get());
97  uint32_t delta = m_segmentsAcked / w;
98 
99  cong->IncreaseWindow(m_state, m_segmentsAcked);
100 
103  "CWnd has not increased");
104 }
105 
112 {
113  public:
120  TcpScalableDecrementTest(uint32_t cWnd, uint32_t segmentSize, const std::string& name);
121 
122  private:
123  void DoRun() override;
124 
125  uint32_t m_cWnd;
126  uint32_t m_segmentSize;
128 };
129 
131  uint32_t segmentSize,
132  const std::string& name)
133  : TestCase(name),
134  m_cWnd(cWnd),
135  m_segmentSize(segmentSize)
136 {
137 }
138 
139 void
141 {
142  m_state = CreateObject<TcpSocketState>();
143 
144  m_state->m_cWnd = m_cWnd;
146 
147  Ptr<TcpScalable> cong = CreateObject<TcpScalable>();
148 
149  uint32_t segCwnd = m_cWnd / m_segmentSize;
150 
151  // Get default value of multiplicative decrease factor
152  DoubleValue mdFactor;
153  cong->GetAttribute("MDFactor", mdFactor);
154 
155  double b = 1.0 - mdFactor.Get();
156 
157  uint32_t ssThresh = std::max(2.0, segCwnd * b);
158 
159  uint32_t ssThreshInSegments = cong->GetSsThresh(m_state, m_state->m_cWnd) / m_segmentSize;
160 
161  NS_TEST_ASSERT_MSG_EQ(ssThreshInSegments, ssThresh, "Scalable decrement fn not used");
162 }
163 
170 {
171  public:
173  : TestSuite("tcp-scalable-test", UNIT)
174  {
175  AddTestCase(
177  38 * 536,
178  536,
179  38,
180  "Scalable increment test on cWnd = 38 segments and segmentSize = 536 bytes"),
181  TestCase::QUICK);
183  38,
184  1,
185  100,
186  "Scalable increment test on cWnd = 38 segments and segmentSize = 1 byte"),
187  TestCase::QUICK);
188  AddTestCase(
190  53 * 1446,
191  1446,
192  50,
193  "Scalable increment test on cWnd = 53 segments and segmentSize = 1446 bytes"),
194  TestCase::QUICK);
195 
197  38,
198  1,
199  "Scalable decrement test on cWnd = 38 segments and segmentSize = 1 byte"),
200  TestCase::QUICK);
201  AddTestCase(
203  100 * 536,
204  536,
205  "Scalable decrement test on cWnd = 100 segments and segmentSize = 536 bytes"),
206  TestCase::QUICK);
207  AddTestCase(
209  40 * 1446,
210  1446,
211  "Scalable decrement test on cWnd = 40 segments and segmentSize = 1446 bytes"),
212  TestCase::QUICK);
213  }
214 };
215 
#define min(a, b)
Definition: 80211b.c:41
#define max(a, b)
Definition: 80211b.c:42
Testing the multiplicative decrease on TcpScalable.
uint32_t m_segmentSize
Segment size.
Ptr< TcpSocketState > m_state
TCP socket state.
TcpScalableDecrementTest(uint32_t cWnd, uint32_t segmentSize, const std::string &name)
Constructor.
uint32_t m_cWnd
Congestion window.
void DoRun() override
Implementation to actually run this TestCase.
Testing the congestion avoidance increment on TcpScalable.
TcpScalableIncrementTest(uint32_t cWnd, uint32_t segmentSize, uint32_t segmentsAcked, const std::string &name)
Constructor.
uint32_t m_segmentSize
Segment size.
Ptr< TcpSocketState > m_state
TCP socket state.
uint32_t m_segmentsAcked
Segments ACKed.
void DoRun() override
Implementation to actually run this TestCase.
uint32_t m_cWnd
Congestion window.
TcpScalable TestSuite.
This class can be used to hold variables of floating point type such as 'double' or 'float'.
Definition: double.h:42
double Get() const
Definition: double.cc:37
uint32_t m_segmentSize
Segment size.
TracedValue< uint32_t > m_cWnd
Congestion window.
encapsulates test code
Definition: test.h:1060
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:301
A suite of tests to run.
Definition: test.h:1256
@ UNIT
This test suite implements a Unit Test.
Definition: test.h:1265
T Get() const
Get the underlying value.
Definition: traced-value.h:249
Hold an unsigned integer type.
Definition: uinteger.h:45
uint64_t Get() const
Definition: uinteger.cc:37
uint32_t segmentSize
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_TEST_ASSERT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report and abort if not.
Definition: test.h:144
Every class exported by the ns3 library is enclosed in the ns3 namespace.
static TcpScalableTestSuite g_tcpScalableTest
Static variable for test initialization.