A Discrete-Event Network Simulator
Home
Tutorials ▼
English
Documentation ▼
Installation
Manual
Models
Contributing
Wiki
Development ▼
API Docs
Issue Tracker
Merge Requests
API
Loading...
Searching...
No Matches
tcp-rx-buffer-test.cc
Go to the documentation of this file.
1
/*
2
* This program is free software; you can redistribute it and/or modify
3
* it under the terms of the GNU General Public License version 2 as
4
* published by the Free Software Foundation;
5
*
6
* This program is distributed in the hope that it will be useful,
7
* but WITHOUT ANY WARRANTY; without even the implied warranty of
8
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9
* GNU General Public License for more details.
10
*
11
* You should have received a copy of the GNU General Public License
12
* along with this program; if not, write to the Free Software
13
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
14
*
15
*/
16
17
#include "ns3/log.h"
18
#include "ns3/packet.h"
19
#include "ns3/tcp-rx-buffer.h"
20
#include "ns3/test.h"
21
22
using namespace
ns3
;
23
24
NS_LOG_COMPONENT_DEFINE
(
"TcpRxBufferTestSuite"
);
25
32
class
TcpRxBufferTestCase
:
public
TestCase
33
{
34
public
:
35
TcpRxBufferTestCase
();
36
37
private
:
38
void
DoRun
()
override
;
39
void
DoTeardown
()
override
;
40
44
void
TestUpdateSACKList
();
45
};
46
47
TcpRxBufferTestCase::TcpRxBufferTestCase
()
48
:
TestCase
(
"TcpRxBuffer Test"
)
49
{
50
}
51
52
void
53
TcpRxBufferTestCase::DoRun
()
54
{
55
TestUpdateSACKList
();
56
}
57
58
void
59
TcpRxBufferTestCase::TestUpdateSACKList
()
60
{
61
TcpRxBuffer
rxBuf;
62
TcpOptionSack::SackList
sackList;
63
TcpOptionSack::SackList::iterator it;
64
Ptr<Packet>
p = Create<Packet>(100);
65
TcpHeader
h;
66
67
// In order sequence
68
h.
SetSequenceNumber
(
SequenceNumber32
(1));
69
rxBuf.
SetNextRxSequence
(
SequenceNumber32
(1));
70
rxBuf.
Add
(p, h);
71
72
NS_TEST_ASSERT_MSG_EQ
(rxBuf.
NextRxSequence
(),
73
SequenceNumber32
(101),
74
"Sequence number differs from expected"
);
75
NS_TEST_ASSERT_MSG_EQ
(sackList.size(), 0,
"SACK list with an element, while should be empty"
);
76
77
// Out-of-order sequence (SACK generated)
78
h.
SetSequenceNumber
(
SequenceNumber32
(501));
79
rxBuf.
Add
(p, h);
80
81
NS_TEST_ASSERT_MSG_EQ
(rxBuf.
NextRxSequence
(),
82
SequenceNumber32
(101),
83
"Sequence number differs from expected"
);
84
sackList = rxBuf.
GetSackList
();
85
NS_TEST_ASSERT_MSG_EQ
(sackList.size(), 1,
"SACK list should contain one element"
);
86
it = sackList.begin();
87
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(501),
"SACK block different than expected"
);
88
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(601),
"SACK block different than expected"
);
89
90
// In order sequence, not greater than the previous (the old SACK still in place)
91
h.
SetSequenceNumber
(
SequenceNumber32
(101));
92
rxBuf.
Add
(p, h);
93
94
NS_TEST_ASSERT_MSG_EQ
(rxBuf.
NextRxSequence
(),
95
SequenceNumber32
(201),
96
"Sequence number differs from expected"
);
97
sackList = rxBuf.
GetSackList
();
98
NS_TEST_ASSERT_MSG_EQ
(sackList.size(), 1,
"SACK list should contain one element"
);
99
it = sackList.begin();
100
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(501),
"SACK block different than expected"
);
101
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(601),
"SACK block different than expected"
);
102
103
// Out of order sequence, merge on the right
104
h.
SetSequenceNumber
(
SequenceNumber32
(401));
105
rxBuf.
Add
(p, h);
106
107
NS_TEST_ASSERT_MSG_EQ
(rxBuf.
NextRxSequence
(),
108
SequenceNumber32
(201),
109
"Sequence number differs from expected"
);
110
sackList = rxBuf.
GetSackList
();
111
NS_TEST_ASSERT_MSG_EQ
(sackList.size(), 1,
"SACK list should contain one element"
);
112
it = sackList.begin();
113
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(401),
"SACK block different than expected"
);
114
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(601),
"SACK block different than expected"
);
115
116
// Out of order sequence, merge on the left
117
h.
SetSequenceNumber
(
SequenceNumber32
(601));
118
rxBuf.
Add
(p, h);
119
120
NS_TEST_ASSERT_MSG_EQ
(rxBuf.
NextRxSequence
(),
121
SequenceNumber32
(201),
122
"Sequence number differs from expected"
);
123
sackList = rxBuf.
GetSackList
();
124
NS_TEST_ASSERT_MSG_EQ
(sackList.size(), 1,
"SACK list should contain one element"
);
125
it = sackList.begin();
126
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(401),
"SACK block different than expected"
);
127
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(701),
"SACK block different than expected"
);
128
129
// out of order sequence, different block, check also the order (newer first)
130
h.
SetSequenceNumber
(
SequenceNumber32
(901));
131
rxBuf.
Add
(p, h);
132
133
NS_TEST_ASSERT_MSG_EQ
(rxBuf.
NextRxSequence
(),
134
SequenceNumber32
(201),
135
"Sequence number differs from expected"
);
136
sackList = rxBuf.
GetSackList
();
137
NS_TEST_ASSERT_MSG_EQ
(sackList.size(), 2,
"SACK list should contain two element"
);
138
it = sackList.begin();
139
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(901),
"SACK block different than expected"
);
140
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(1001),
"SACK block different than expected"
);
141
++it;
142
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(401),
"SACK block different than expected"
);
143
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(701),
"SACK block different than expected"
);
144
145
// another out of order seq, different block, check the order (newer first)
146
h.
SetSequenceNumber
(
SequenceNumber32
(1201));
147
rxBuf.
Add
(p, h);
148
149
NS_TEST_ASSERT_MSG_EQ
(rxBuf.
NextRxSequence
(),
150
SequenceNumber32
(201),
151
"Sequence number differs from expected"
);
152
sackList = rxBuf.
GetSackList
();
153
NS_TEST_ASSERT_MSG_EQ
(sackList.size(), 3,
"SACK list should contain three element"
);
154
it = sackList.begin();
155
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(1201),
"SACK block different than expected"
);
156
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(1301),
"SACK block different than expected"
);
157
++it;
158
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(901),
"SACK block different than expected"
);
159
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(1001),
"SACK block different than expected"
);
160
++it;
161
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(401),
"SACK block different than expected"
);
162
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(701),
"SACK block different than expected"
);
163
164
// another out of order seq, different block, check the order (newer first)
165
h.
SetSequenceNumber
(
SequenceNumber32
(1401));
166
rxBuf.
Add
(p, h);
167
168
NS_TEST_ASSERT_MSG_EQ
(rxBuf.
NextRxSequence
(),
169
SequenceNumber32
(201),
170
"Sequence number differs from expected"
);
171
sackList = rxBuf.
GetSackList
();
172
NS_TEST_ASSERT_MSG_EQ
(sackList.size(), 4,
"SACK list should contain four element"
);
173
it = sackList.begin();
174
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(1401),
"SACK block different than expected"
);
175
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(1501),
"SACK block different than expected"
);
176
++it;
177
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(1201),
"SACK block different than expected"
);
178
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(1301),
"SACK block different than expected"
);
179
++it;
180
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(901),
"SACK block different than expected"
);
181
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(1001),
"SACK block different than expected"
);
182
++it;
183
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(401),
"SACK block different than expected"
);
184
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(701),
"SACK block different than expected"
);
185
186
// in order block! See if something get stripped off..
187
h.
SetSequenceNumber
(
SequenceNumber32
(201));
188
rxBuf.
Add
(p, h);
189
190
NS_TEST_ASSERT_MSG_EQ
(rxBuf.
NextRxSequence
(),
191
SequenceNumber32
(301),
192
"Sequence number differs from expected"
);
193
sackList = rxBuf.
GetSackList
();
194
NS_TEST_ASSERT_MSG_EQ
(sackList.size(), 4,
"SACK list should contain four element"
);
195
196
// in order block! See if something get stripped off..
197
h.
SetSequenceNumber
(
SequenceNumber32
(301));
198
rxBuf.
Add
(p, h);
199
200
NS_TEST_ASSERT_MSG_EQ
(rxBuf.
NextRxSequence
(),
201
SequenceNumber32
(701),
202
"Sequence number differs from expected"
);
203
sackList = rxBuf.
GetSackList
();
204
NS_TEST_ASSERT_MSG_EQ
(sackList.size(), 3,
"SACK list should contain three element"
);
205
206
it = sackList.begin();
207
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(1401),
"SACK block different than expected"
);
208
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(1501),
"SACK block different than expected"
);
209
++it;
210
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(1201),
"SACK block different than expected"
);
211
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(1301),
"SACK block different than expected"
);
212
++it;
213
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(901),
"SACK block different than expected"
);
214
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(1001),
"SACK block different than expected"
);
215
216
// out of order block, I'm expecting a left-merge with a move on the top
217
h.
SetSequenceNumber
(
SequenceNumber32
(801));
218
rxBuf.
Add
(p, h);
219
220
NS_TEST_ASSERT_MSG_EQ
(rxBuf.
NextRxSequence
(),
221
SequenceNumber32
(701),
222
"Sequence number differs from expected"
);
223
sackList = rxBuf.
GetSackList
();
224
NS_TEST_ASSERT_MSG_EQ
(sackList.size(), 3,
"SACK list should contain three element"
);
225
226
it = sackList.begin();
227
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(801),
"SACK block different than expected"
);
228
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(1001),
"SACK block different than expected"
);
229
++it;
230
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(1401),
"SACK block different than expected"
);
231
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(1501),
"SACK block different than expected"
);
232
++it;
233
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(1201),
"SACK block different than expected"
);
234
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(1301),
"SACK block different than expected"
);
235
236
// In order block! Strip things away..
237
h.
SetSequenceNumber
(
SequenceNumber32
(701));
238
rxBuf.
Add
(p, h);
239
240
NS_TEST_ASSERT_MSG_EQ
(rxBuf.
NextRxSequence
(),
241
SequenceNumber32
(1001),
242
"Sequence number differs from expected"
);
243
sackList = rxBuf.
GetSackList
();
244
NS_TEST_ASSERT_MSG_EQ
(sackList.size(), 2,
"SACK list should contain two element"
);
245
246
it = sackList.begin();
247
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(1401),
"SACK block different than expected"
);
248
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(1501),
"SACK block different than expected"
);
249
++it;
250
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(1201),
"SACK block different than expected"
);
251
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(1301),
"SACK block different than expected"
);
252
253
// out of order... I'm expecting a right-merge with a move on top
254
h.
SetSequenceNumber
(
SequenceNumber32
(1301));
255
rxBuf.
Add
(p, h);
256
257
NS_TEST_ASSERT_MSG_EQ
(rxBuf.
NextRxSequence
(),
258
SequenceNumber32
(1001),
259
"Sequence number differs from expected"
);
260
sackList = rxBuf.
GetSackList
();
261
NS_TEST_ASSERT_MSG_EQ
(sackList.size(), 1,
"SACK list should contain one element"
);
262
263
it = sackList.begin();
264
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(1201),
"SACK block different than expected"
);
265
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(1501),
"SACK block different than expected"
);
266
267
// In order
268
h.
SetSequenceNumber
(
SequenceNumber32
(1001));
269
rxBuf.
Add
(p, h);
270
271
NS_TEST_ASSERT_MSG_EQ
(rxBuf.
NextRxSequence
(),
272
SequenceNumber32
(1101),
273
"Sequence number differs from expected"
);
274
sackList = rxBuf.
GetSackList
();
275
NS_TEST_ASSERT_MSG_EQ
(sackList.size(), 1,
"SACK list should contain one element"
);
276
277
it = sackList.begin();
278
NS_TEST_ASSERT_MSG_EQ
(it->first,
SequenceNumber32
(1201),
"SACK block different than expected"
);
279
NS_TEST_ASSERT_MSG_EQ
(it->second,
SequenceNumber32
(1501),
"SACK block different than expected"
);
280
281
// In order, empty the list
282
h.
SetSequenceNumber
(
SequenceNumber32
(1101));
283
rxBuf.
Add
(p, h);
284
285
NS_TEST_ASSERT_MSG_EQ
(rxBuf.
NextRxSequence
(),
286
SequenceNumber32
(1501),
287
"Sequence number differs from expected"
);
288
sackList = rxBuf.
GetSackList
();
289
NS_TEST_ASSERT_MSG_EQ
(sackList.size(), 0,
"SACK list should contain no element"
);
290
}
291
292
void
293
TcpRxBufferTestCase::DoTeardown
()
294
{
295
}
296
302
class
TcpRxBufferTestSuite
:
public
TestSuite
303
{
304
public
:
305
TcpRxBufferTestSuite
()
306
:
TestSuite
(
"tcp-rx-buffer"
,
UNIT
)
307
{
308
AddTestCase
(
new
TcpRxBufferTestCase
,
TestCase::QUICK
);
309
}
310
};
311
312
static
TcpRxBufferTestSuite
g_tcpRxBufferTestSuite
;
TcpRxBufferTestCase
The TcpRxBuffer Test.
Definition:
tcp-rx-buffer-test.cc:33
TcpRxBufferTestCase::TestUpdateSACKList
void TestUpdateSACKList()
Test the SACK list update.
Definition:
tcp-rx-buffer-test.cc:59
TcpRxBufferTestCase::DoRun
void DoRun() override
Implementation to actually run this TestCase.
Definition:
tcp-rx-buffer-test.cc:53
TcpRxBufferTestCase::DoTeardown
void DoTeardown() override
Implementation to do any local setup required for this TestCase.
Definition:
tcp-rx-buffer-test.cc:293
TcpRxBufferTestCase::TcpRxBufferTestCase
TcpRxBufferTestCase()
Definition:
tcp-rx-buffer-test.cc:47
TcpRxBufferTestSuite
the TestSuite for the TcpRxBuffer test case
Definition:
tcp-rx-buffer-test.cc:303
TcpRxBufferTestSuite::TcpRxBufferTestSuite
TcpRxBufferTestSuite()
Definition:
tcp-rx-buffer-test.cc:305
ns3::Ptr
Smart pointer class similar to boost::intrusive_ptr.
Definition:
ptr.h:78
ns3::SequenceNumber< uint32_t, int32_t >
ns3::TcpHeader
Header for the Transmission Control Protocol.
Definition:
tcp-header.h:46
ns3::TcpHeader::SetSequenceNumber
void SetSequenceNumber(SequenceNumber32 sequenceNumber)
Set the sequence Number.
Definition:
tcp-header.cc:95
ns3::TcpOptionSack::SackList
std::list< SackBlock > SackList
SACK list definition.
Definition:
tcp-option-sack.h:60
ns3::TcpRxBuffer
Rx reordering buffer for TCP.
Definition:
tcp-rx-buffer.h:75
ns3::TcpRxBuffer::NextRxSequence
SequenceNumber32 NextRxSequence() const
Get Next Rx Sequence number.
Definition:
tcp-rx-buffer.cc:67
ns3::TcpRxBuffer::SetNextRxSequence
void SetNextRxSequence(const SequenceNumber32 &s)
Set the Next Sequence number.
Definition:
tcp-rx-buffer.cc:73
ns3::TcpRxBuffer::Add
bool Add(Ptr< Packet > p, const TcpHeader &tcph)
Insert a packet into the buffer and update the availBytes counter to reflect the number of bytes read...
Definition:
tcp-rx-buffer.cc:147
ns3::TcpRxBuffer::GetSackList
TcpOptionSack::SackList GetSackList() const
Get the sack list.
Definition:
tcp-rx-buffer.cc:374
ns3::TestCase
encapsulates test code
Definition:
test.h:1060
ns3::TestCase::QUICK
@ QUICK
Fast test.
Definition:
test.h:1065
ns3::TestCase::AddTestCase
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition:
test.cc:301
ns3::TestSuite
A suite of tests to run.
Definition:
test.h:1256
ns3::TestSuite::UNIT
@ UNIT
This test suite implements a Unit Test.
Definition:
test.h:1265
NS_LOG_COMPONENT_DEFINE
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition:
log.h:202
ns3::SequenceNumber32
SequenceNumber< uint32_t, int32_t > SequenceNumber32
32 bit Sequence number.
Definition:
sequence-number.h:426
NS_TEST_ASSERT_MSG_EQ
#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
ns3
Every class exported by the ns3 library is enclosed in the ns3 namespace.
g_tcpRxBufferTestSuite
static TcpRxBufferTestSuite g_tcpRxBufferTestSuite
Definition:
tcp-rx-buffer-test.cc:312
src
internet
test
tcp-rx-buffer-test.cc
Generated on Sun Jul 2 2023 18:21:44 for ns-3 by
1.9.6