A Discrete-Event Network Simulator
QKDNetSim v2.0 (NS-3 v3.41) @ (+)
API
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
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 
25 using namespace ns3;
26 
27 NS_LOG_COMPONENT_DEFINE("TcpNewRenoCongAvoidTest");
28 
55 {
56  public:
66  uint32_t packetSize,
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;
80  void Check();
81 
82  void ConfigureEnvironment() override;
83  void ConfigureProperties() override;
84 
85  private:
86  uint32_t m_segmentSize;
87  uint32_t m_packetSize;
88  uint32_t m_packets;
89  uint32_t m_increment;
91  bool m_initial;
92 };
93 
95  uint32_t packetSize,
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 
109 void
111 {
112  TcpGeneralTest::ConfigureEnvironment();
115  SetMTU(1500);
116 }
117 
118 void
120 {
121  TcpGeneralTest::ConfigureProperties();
124 }
125 
126 void
127 TcpNewRenoCongAvoidNormalTest::CWndTrace(uint32_t oldValue, uint32_t newValue)
128 {
129  if (m_initial)
130  {
131  m_initial = false;
132  return;
133  }
134 
135  if (!m_event.IsRunning())
136  {
137  m_event = Simulator::Schedule(Seconds(1.0), &TcpNewRenoCongAvoidNormalTest::Check, this);
138  }
139 
140  m_increment += newValue - oldValue;
141 }
142 
143 void
145 {
146  NS_FATAL_ERROR("Drop on the queue; cannot validate congestion avoidance");
147 }
148 
149 void
151 {
152  NS_FATAL_ERROR("Drop on the phy: cannot validate congestion avoidance");
153 }
154 
155 void
157 {
158  uint32_t segSize = GetSegSize(TcpGeneralTest::SENDER);
159 
160  if (m_increment != 0)
161  {
163  segSize,
164  "Increment exceeded segment size in one RTT");
165  }
166 
167  m_increment = 0;
168 
169  m_event = Simulator::Schedule(Seconds(1.0), &TcpNewRenoCongAvoidNormalTest::Check, this);
170 }
171 
172 void
174 {
175  if (who == SENDER)
176  {
177  m_event.Cancel();
178  }
179 }
180 
187 {
188  public:
190  : TestSuite("tcp-cong-avoid-test", UNIT)
191  {
192  std::list<TypeId> types = {
193  TcpNewReno::GetTypeId(),
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::QUICK);
210  1000,
211  i,
212  t,
213  "cong avoid MSS=500, pkt_size=1000," +
214  typeName),
215  TestCase::QUICK);
216  }
217  }
218  }
219 };
220 
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
void NormalClose(SocketWho who) override
void PhyDrop(SocketWho who) override
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
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
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.
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.
void SetSegmentSize(SocketWho who, uint32_t segmentSize)
Forcefully set the segment size.
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:301
std::string GetName() const
Definition: test.cc:373
A suite of tests to run.
Definition: test.h:1256
@ UNIT
This test suite implements a Unit Test.
Definition: test.h:1265
a unique identifier for an interface.
Definition: type-id.h:59
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:750
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1326
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.