A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
tcp-cong-avoid-test.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2015 Natale Patriciello <natale.patriciello@gmail.com>
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 */
18#include "tcp-general-test.h"
19
20#include "ns3/config.h"
21#include "ns3/log.h"
22#include "ns3/simple-channel.h"
23#include "ns3/test.h"
24
25using namespace ns3;
26
27NS_LOG_COMPONENT_DEFINE("TcpNewRenoCongAvoidTest");
28
29/**
30 * \ingroup internet-test
31 *
32 * \brief Test the behavior of RFC congestion avoidance
33 *
34 * From RFC 5681:\n
35 *
36 * cwnd += min (N, SMSS) (2)
37 *
38 * During congestion avoidance, cwnd is incremented by roughly 1 full-
39 * sized segment per round-trip time (RTT). Congestion avoidance
40 * continues until congestion is detected. The basic guidelines for
41 * incrementing cwnd during congestion avoidance are:
42 *
43 * * MAY increment cwnd by SMSS bytes
44 *
45 * * SHOULD increment cwnd per equation (2) once per RTT
46 *
47 * * MUST NOT increment cwnd by more than SMSS bytes
48 *
49 * To test this behavior and these points, a tracing callback is attached
50 * to the cWnd. Each time it increases, the increment is saved. Meanwhile, a
51 * timer checks if an amount of time equals to the RTT has passed, and if yes,
52 * it checks that the increment has not passed the 1 MSS limit.
53 */
55{
56 public:
57 /**
58 * \brief Constructor.
59 * \param segmentSize Segment size.
60 * \param packetSize Size of the packets.
61 * \param packets Number of packets.
62 * \param congControl Type of congestion control.
63 * \param desc The test description.
64 */
67 uint32_t packets,
68 const TypeId& congControl,
69 const std::string& desc);
70
71 protected:
72 void CWndTrace(uint32_t oldValue, uint32_t newValue) override;
73 void QueueDrop(SocketWho who) override;
74 void PhyDrop(SocketWho who) override;
75 void NormalClose(SocketWho who) override;
76 /**
77 * \brief Called each RTT (1.0 sec in the testing environment) and check
78 * that the overall increment in this RTT is less or equal than 1 MSS
79 */
80 void Check();
81
82 void ConfigureEnvironment() override;
83 void ConfigureProperties() override;
84
85 private:
86 uint32_t m_segmentSize; //!< Segment size.
87 uint32_t m_packetSize; //!< Size of the packets.
88 uint32_t m_packets; //!< Number of packets.
89 uint32_t m_increment; //!< Congestion window increment.
90 EventId m_event; //!< Check event.
91 bool m_initial; //!< True on first run.
92};
93
96 uint32_t packets,
97 const TypeId& typeId,
98 const std::string& desc)
99 : TcpGeneralTest(desc),
100 m_segmentSize(segmentSize),
101 m_packetSize(packetSize),
102 m_packets(packets),
103 m_increment(0),
104 m_initial(true)
105{
106 m_congControlTypeId = typeId;
107}
108
109void
111{
115 SetMTU(1500);
116}
117
118void
120{
124}
125
126void
128{
129 if (m_initial)
130 {
131 m_initial = false;
132 return;
133 }
134
135 if (!m_event.IsRunning())
136 {
138 }
139
140 m_increment += newValue - oldValue;
141}
142
143void
145{
146 NS_FATAL_ERROR("Drop on the queue; cannot validate congestion avoidance");
147}
148
149void
151{
152 NS_FATAL_ERROR("Drop on the phy: cannot validate congestion avoidance");
153}
154
155void
157{
159
160 if (m_increment != 0)
161 {
163 segSize,
164 "Increment exceeded segment size in one RTT");
165 }
166
167 m_increment = 0;
168
170}
171
172void
174{
175 if (who == SENDER)
176 {
177 m_event.Cancel();
178 }
179}
180
181/**
182 * \ingroup internet-test
183 *
184 * \brief TestSuite for the behavior of RFC congestion avoidance
185 */
187{
188 public:
190 : TestSuite("tcp-cong-avoid-test", Type::UNIT)
191 {
192 std::list<TypeId> types = {
194 };
195
196 for (const auto& t : types)
197 {
198 std::string typeName = t.GetName();
199
200 for (uint32_t i = 10; i <= 50; i += 10)
201 {
203 500,
204 i,
205 t,
206 "cong avoid MSS=500, pkt_size=500," +
207 typeName),
208 TestCase::Duration::QUICK);
210 1000,
211 i,
212 t,
213 "cong avoid MSS=500, pkt_size=1000," +
214 typeName),
215 TestCase::Duration::QUICK);
216 }
217 }
218 }
219};
220
222 g_tcpCongAvoidNormalTest; //!< Static variable for test initialization
Test the behavior of RFC congestion avoidance.
void Check()
Called each RTT (1.0 sec in the testing environment) and check that the overall increment in this RTT...
uint32_t m_segmentSize
Segment size.
uint32_t m_packets
Number of packets.
void CWndTrace(uint32_t oldValue, uint32_t newValue) override
Tracks the congestion window changes.
void NormalClose(SocketWho who) override
Socket closed normally.
void PhyDrop(SocketWho who) override
Link drop.
bool m_initial
True on first run.
TcpNewRenoCongAvoidNormalTest(uint32_t segmentSize, uint32_t packetSize, uint32_t packets, const TypeId &congControl, const std::string &desc)
Constructor.
void ConfigureEnvironment() override
Change the configuration of the environment.
uint32_t m_packetSize
Size of the packets.
void ConfigureProperties() override
Change the configuration of the socket properties.
void QueueDrop(SocketWho who) override
Drop on the queue.
uint32_t m_increment
Congestion window increment.
TestSuite for the behavior of RFC congestion avoidance.
An identifier for simulation events.
Definition: event-id.h:55
void Cancel()
This method is syntactic sugar for the ns3::Simulator::Cancel method.
Definition: event-id.cc:55
bool IsRunning() const
This method is syntactic sugar for !IsExpired().
Definition: event-id.cc:76
static EventId Schedule(const Time &delay, FUNC f, Ts &&... args)
Schedule an event to expire after delay.
Definition: simulator.h:571
General infrastructure for TCP testing.
void SetAppPktCount(uint32_t pktCount)
Set app packet count.
SocketWho
Used as parameter of methods, specifies on what node the caller is interested (e.g.
void SetAppPktSize(uint32_t pktSize)
Set app packet size.
virtual void ConfigureProperties()
Change the configuration of the socket properties.
void SetMTU(uint32_t mtu)
MTU of the bottleneck link.
uint32_t GetSegSize(SocketWho who)
Get the segment size of the node specified.
TypeId m_congControlTypeId
Congestion control.
void SetInitialSsThresh(SocketWho who, uint32_t initialSsThresh)
Forcefully set the initial ssthresh.
virtual void ConfigureEnvironment()
Change the configuration of the environment.
void SetSegmentSize(SocketWho who, uint32_t segmentSize)
Forcefully set the segment size.
static TypeId GetTypeId()
Get the type ID.
void AddTestCase(TestCase *testCase, Duration duration=Duration::QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:301
A suite of tests to run.
Definition: test.h:1268
Type
Type of test.
Definition: test.h:1275
static constexpr auto UNIT
Definition: test.h:1286
a unique identifier for an interface.
Definition: type-id.h:59
std::string GetName() const
Get the name.
Definition: type-id.cc:992
uint32_t segmentSize
#define NS_FATAL_ERROR(msg)
Report a fatal error with a message and terminate.
Definition: fatal-error.h:179
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
#define NS_TEST_ASSERT_MSG_LT_OR_EQ(actual, limit, msg)
Test that an actual value is less than or equal to a limit and report and abort if not.
Definition: test.h:751
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1319
Every class exported by the ns3 library is enclosed in the ns3 namespace.
static TcpRenoCongAvoidTestSuite g_tcpCongAvoidNormalTest
Static variable for test initialization.
static const uint32_t packetSize
Packet size generated at the AP.