A Discrete-Event Network Simulator
API
tcp-highspeed-test.cc
Go to the documentation of this file.
1/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/*
3 * Copyright (c) 2015 Natale Patriciello, <natale.patriciello@gmail.com>
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 */
19
20#include "ns3/test.h"
21#include "ns3/log.h"
22#include "ns3/tcp-congestion-ops.h"
23#include "ns3/tcp-socket-base.h"
24#include "ns3/tcp-highspeed.h"
25
26using namespace ns3;
27
28NS_LOG_COMPONENT_DEFINE ("TcpHighSpeedTestSuite");
29
37{
38public:
46 const std::string &name);
47
48private:
49 virtual void DoRun (void);
50
54};
55
58 const std::string &name)
59 : TestCase (name),
60 m_cWnd (cWnd),
61 m_segmentSize (segmentSize)
62{
63}
64
65void
67{
68 m_state = CreateObject<TcpSocketState> ();
69
72
73 Ptr<TcpHighSpeed> cong = CreateObject <TcpHighSpeed> ();
74
75 uint32_t segCwnd = m_cWnd / m_segmentSize;
76 uint32_t coeffA = TcpHighSpeed::TableLookupA (segCwnd);
77
78 // Each received ACK weight is "coeffA". To see an increase of 1 MSS, we need
79 // to ACK at least segCwnd/coeffA ACK.
80
81 cong->IncreaseWindow (m_state, (segCwnd / coeffA) + 1);
82
84 "CWnd has not increased");
85}
86
94{
95public:
103 const std::string &name);
104
105private:
106 virtual void DoRun (void);
107
111};
112
115 const std::string &name)
116 : TestCase (name),
117 m_cWnd (cWnd),
118 m_segmentSize (segmentSize)
119{
120}
121
122void
124{
125 m_state = CreateObject<TcpSocketState> ();
126
129
130 Ptr<TcpHighSpeed> cong = CreateObject <TcpHighSpeed> ();
131
132 uint32_t segCwnd = m_cWnd / m_segmentSize;
133 double coeffB = 1.0 - TcpHighSpeed::TableLookupB (segCwnd);
134
135 uint32_t ret = cong->GetSsThresh (m_state, m_state->m_cWnd);
136
137 uint32_t ssThHS = std::max (2.0, segCwnd * coeffB);
138
140 "HighSpeed decrement fn not used");
141}
142
143
150static const struct HighSpeedImportantValues
151{
152 unsigned int cwnd;
153 unsigned int md;
155 { 38, 128, /* 0.50 */ },
156 { 118, 112, /* 0.44 */ },
157 { 221, 104, /* 0.41 */ },
158 { 347, 98, /* 0.38 */ },
159 { 495, 93, /* 0.37 */ },
160 { 663, 89, /* 0.35 */ },
161 { 851, 86, /* 0.34 */ },
162 { 1058, 83, /* 0.33 */ },
163 { 1284, 81, /* 0.32 */ },
164 { 1529, 78, /* 0.31 */ },
165 { 1793, 76, /* 0.30 */ },
166 { 2076, 74, /* 0.29 */ },
167 { 2378, 72, /* 0.28 */ },
168 { 2699, 71, /* 0.28 */ },
169 { 3039, 69, /* 0.27 */ },
170 { 3399, 68, /* 0.27 */ },
171 { 3778, 66, /* 0.26 */ },
172 { 4177, 65, /* 0.26 */ },
173 { 4596, 64, /* 0.25 */ },
174 { 5036, 62, /* 0.25 */ },
175 { 5497, 61, /* 0.24 */ },
176 { 5979, 60, /* 0.24 */ },
177 { 6483, 59, /* 0.23 */ },
178 { 7009, 58, /* 0.23 */ },
179 { 7558, 57, /* 0.22 */ },
180 { 8130, 56, /* 0.22 */ },
181 { 8726, 55, /* 0.22 */ },
182 { 9346, 54, /* 0.21 */ },
183 { 9991, 53, /* 0.21 */ },
184 { 10661, 52, /* 0.21 */ },
185 { 11358, 52, /* 0.20 */ },
186 { 12082, 51, /* 0.20 */ },
187 { 12834, 50, /* 0.20 */ },
188 { 13614, 49, /* 0.19 */ },
189 { 14424, 48, /* 0.19 */ },
190 { 15265, 48, /* 0.19 */ },
191 { 16137, 47, /* 0.19 */ },
192 { 17042, 46, /* 0.18 */ },
193 { 17981, 45, /* 0.18 */ },
194 { 18955, 45, /* 0.18 */ },
195 { 19965, 44, /* 0.17 */ },
196 { 21013, 43, /* 0.17 */ },
197 { 22101, 43, /* 0.17 */ },
198 { 23230, 42, /* 0.17 */ },
199 { 24402, 41, /* 0.16 */ },
200 { 25618, 41, /* 0.16 */ },
201 { 26881, 40, /* 0.16 */ },
202 { 28193, 39, /* 0.16 */ },
203 { 29557, 39, /* 0.15 */ },
204 { 30975, 38, /* 0.15 */ },
205 { 32450, 38, /* 0.15 */ },
206 { 33986, 37, /* 0.15 */ },
207 { 35586, 36, /* 0.14 */ },
208 { 37253, 36, /* 0.14 */ },
209 { 38992, 35, /* 0.14 */ },
210 { 40808, 35, /* 0.14 */ },
211 { 42707, 34, /* 0.13 */ },
212 { 44694, 33, /* 0.13 */ },
213 { 46776, 33, /* 0.13 */ },
214 { 48961, 32, /* 0.13 */ },
215 { 51258, 32, /* 0.13 */ },
216 { 53677, 31, /* 0.12 */ },
217 { 56230, 30, /* 0.12 */ },
218 { 58932, 30, /* 0.12 */ },
219 { 61799, 29, /* 0.12 */ },
220 { 64851, 28, /* 0.11 */ },
221 { 68113, 28, /* 0.11 */ },
222 { 71617, 27, /* 0.11 */ },
223 { 75401, 26, /* 0.10 */ },
224 { 79517, 26, /* 0.10 */ },
225 { 84035, 25, /* 0.10 */ },
226 { 89053, 24, /* 0.10 */ },
227};
228
229#define HIGHSPEED_VALUES_N 71
230
238{
239public:
240 TcpHighSpeedTestSuite () : TestSuite ("tcp-highspeed-test", UNIT)
241 {
242 std::stringstream ss;
243
244 for (uint32_t i = 0; i < HIGHSPEED_VALUES_N; ++i)
245 {
248 "Highspeed increment test on cWnd " + ss.str ()),
249 TestCase::QUICK);
251 "Highspeed increment test on cWnd " + ss.str ()),
252 TestCase::QUICK);
254 "Highspeed increment test on cWnd " + ss.str ()),
255 TestCase::QUICK);
257 "Highspeed Decrement test on cWnd " + ss.str ()),
258 TestCase::QUICK);
260 "Highspeed Decrement test on cWnd " + ss.str ()),
261 TestCase::QUICK);
263 "Highspeed Decrement test on cWnd " + ss.str ()),
264 TestCase::QUICK);
265 ss.flush ();
266 }
267 }
268};
269
271
#define max(a, b)
Definition: 80211b.c:43
Testing the congestion avoidance decrement on TcpHighSpeed.
uint32_t m_segmentSize
Segment size.
virtual void DoRun(void)
Implementation to actually run this TestCase.
uint32_t m_cWnd
Congestion window.
Ptr< TcpSocketState > m_state
TCP socket state.
TcpHighSpeedDecrementTest(uint32_t cWnd, uint32_t segmentSize, const std::string &name)
Constructor.
Testing the congestion avoidance increment on TcpHighSpeed.
Ptr< TcpSocketState > m_state
TCP socket state.
uint32_t m_segmentSize
Segment size.
uint32_t m_cWnd
Congestion window.
TcpHighSpeedIncrementTest(uint32_t cWnd, uint32_t segmentSize, const std::string &name)
Constructor.
virtual void DoRun(void)
Implementation to actually run this TestCase.
TCP HighSpeed TestSuite.
uint32_t m_segmentSize
Segment size.
TracedValue< uint32_t > m_cWnd
Congestion window.
encapsulates test code
Definition: test.h:994
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
A suite of tests to run.
Definition: test.h:1188
@ UNIT
This test suite implements a Unit Test.
Definition: test.h:1197
T Get(void) const
Get the underlying value.
Definition: traced-value.h:232
uint32_t segmentSize
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#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:141
static const struct HighSpeedImportantValues highSpeedImportantValues[]
List of data to be tested.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
TcpHighSpeed Congestion window values to test.
unsigned int cwnd
Congestion window.
unsigned int md
Currently unused.
static TcpHighSpeedTestSuite g_tcpHighSpeedTest
Static variable for test initialization.
#define HIGHSPEED_VALUES_N