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-sack-permitted-test.cc
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2016 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
19
#include "
tcp-general-test.h
"
20
21
#include "ns3/log.h"
22
#include "ns3/node.h"
23
#include "ns3/tcp-header.h"
24
#include "ns3/tcp-option-sack-permitted.h"
25
26
using namespace
ns3
;
27
28
NS_LOG_COMPONENT_DEFINE
(
"SackPermittedTestSuite"
);
29
36
class
SackPermittedTestCase
:
public
TcpGeneralTest
37
{
38
public
:
40
enum
Configuration
41
{
42
DISABLED
,
43
ENABLED_RECEIVER
,
44
ENABLED_SENDER
,
45
ENABLED
46
};
47
52
SackPermittedTestCase
(
SackPermittedTestCase::Configuration
conf
);
53
54
protected
:
55
Ptr<TcpSocketMsgBase>
CreateReceiverSocket
(
Ptr<Node>
node)
override
;
56
Ptr<TcpSocketMsgBase>
CreateSenderSocket
(
Ptr<Node>
node)
override
;
57
58
void
Tx
(
const
Ptr<const Packet>
p,
const
TcpHeader
& h,
SocketWho
who)
override
;
59
60
Configuration
m_configuration
;
61
};
62
63
SackPermittedTestCase::SackPermittedTestCase
(
SackPermittedTestCase::Configuration
conf
)
64
:
TcpGeneralTest
(
"Testing the TCP Sack Permitted option"
)
65
{
66
m_configuration
=
conf
;
67
}
68
69
Ptr<TcpSocketMsgBase>
70
SackPermittedTestCase::CreateReceiverSocket
(
Ptr<Node>
node)
71
{
72
Ptr<TcpSocketMsgBase>
socket =
TcpGeneralTest::CreateReceiverSocket
(node);
73
74
switch
(
m_configuration
)
75
{
76
case
DISABLED
:
77
socket->SetAttribute(
"Sack"
,
BooleanValue
(
false
));
78
break
;
79
80
case
ENABLED_RECEIVER
:
81
socket->SetAttribute(
"Sack"
,
BooleanValue
(
true
));
82
break
;
83
84
case
ENABLED_SENDER
:
85
socket->SetAttribute(
"Sack"
,
BooleanValue
(
false
));
86
break
;
87
88
case
ENABLED
:
89
socket->SetAttribute(
"Sack"
,
BooleanValue
(
true
));
90
break
;
91
}
92
93
return
socket;
94
}
95
96
Ptr<TcpSocketMsgBase>
97
SackPermittedTestCase::CreateSenderSocket
(
Ptr<Node>
node)
98
{
99
Ptr<TcpSocketMsgBase>
socket =
TcpGeneralTest::CreateSenderSocket
(node);
100
101
switch
(
m_configuration
)
102
{
103
case
DISABLED
:
104
socket->SetAttribute(
"Sack"
,
BooleanValue
(
false
));
105
break
;
106
107
case
ENABLED_RECEIVER
:
108
socket->SetAttribute(
"Sack"
,
BooleanValue
(
false
));
109
break
;
110
111
case
ENABLED_SENDER
:
112
socket->SetAttribute(
"Sack"
,
BooleanValue
(
true
));
113
break
;
114
115
case
ENABLED
:
116
socket->SetAttribute(
"Sack"
,
BooleanValue
(
true
));
117
break
;
118
}
119
120
return
socket;
121
}
122
123
void
124
SackPermittedTestCase::Tx
(
const
Ptr<const Packet>
p,
const
TcpHeader
& h,
SocketWho
who)
125
{
126
if
(!(h.
GetFlags
() &
TcpHeader::SYN
))
127
{
128
NS_TEST_ASSERT_MSG_EQ
(h.
HasOption
(
TcpOption::SACKPERMITTED
),
129
false
,
130
"SackPermitted in non-SYN segment"
);
131
return
;
132
}
133
134
if
(
m_configuration
==
DISABLED
)
135
{
136
NS_TEST_ASSERT_MSG_EQ
(h.
HasOption
(
TcpOption::SACKPERMITTED
),
137
false
,
138
"SackPermitted disabled but option enabled"
);
139
}
140
else
if
(
m_configuration
==
ENABLED
)
141
{
142
NS_TEST_ASSERT_MSG_EQ
(h.
HasOption
(
TcpOption::SACKPERMITTED
),
143
true
,
144
"SackPermitted enabled but option disabled"
);
145
}
146
147
NS_LOG_INFO
(h);
148
if
(who ==
SENDER
)
149
{
150
if
(h.
GetFlags
() &
TcpHeader::SYN
)
151
{
152
if
(
m_configuration
==
ENABLED_RECEIVER
)
153
{
154
NS_TEST_ASSERT_MSG_EQ
(h.
HasOption
(
TcpOption::SACKPERMITTED
),
155
false
,
156
"SackPermitted disabled but option enabled"
);
157
}
158
else
if
(
m_configuration
==
ENABLED_SENDER
)
159
{
160
NS_TEST_ASSERT_MSG_EQ
(h.
HasOption
(
TcpOption::SACKPERMITTED
),
161
true
,
162
"SackPermitted enabled but option disabled"
);
163
}
164
}
165
else
166
{
167
if
(
m_configuration
!=
ENABLED
)
168
{
169
NS_TEST_ASSERT_MSG_EQ
(h.
HasOption
(
TcpOption::SACKPERMITTED
),
170
false
,
171
"SackPermitted disabled but option enabled"
);
172
}
173
}
174
}
175
else
if
(who ==
RECEIVER
)
176
{
177
if
(h.
GetFlags
() &
TcpHeader::SYN
)
178
{
179
// Sender has not sent SackPermitted, so implementation should disable ts
180
if
(
m_configuration
==
ENABLED_RECEIVER
)
181
{
182
NS_TEST_ASSERT_MSG_EQ
(h.
HasOption
(
TcpOption::SACKPERMITTED
),
183
false
,
184
"sender has not ts, but receiver sent anyway"
);
185
}
186
else
if
(
m_configuration
==
ENABLED_SENDER
)
187
{
188
NS_TEST_ASSERT_MSG_EQ
(h.
HasOption
(
TcpOption::SACKPERMITTED
),
189
false
,
190
"receiver has not ts enabled but sent anyway"
);
191
}
192
}
193
else
194
{
195
if
(
m_configuration
!=
ENABLED
)
196
{
197
NS_TEST_ASSERT_MSG_EQ
(h.
HasOption
(
TcpOption::SACKPERMITTED
),
198
false
,
199
"SackPermitted disabled but option enabled"
);
200
}
201
}
202
}
203
}
204
211
class
TcpSackPermittedTestSuite
:
public
TestSuite
212
{
213
public
:
215
TcpSackPermittedTestSuite
()
216
:
TestSuite
(
"tcp-sack-permitted"
,
UNIT
)
217
{
218
AddTestCase
(
new
SackPermittedTestCase
(
SackPermittedTestCase::DISABLED
),
TestCase::QUICK
);
219
AddTestCase
(
new
SackPermittedTestCase
(
SackPermittedTestCase::ENABLED_RECEIVER
),
220
TestCase::QUICK
);
221
AddTestCase
(
new
SackPermittedTestCase
(
SackPermittedTestCase::ENABLED_SENDER
),
222
TestCase::QUICK
);
223
AddTestCase
(
new
SackPermittedTestCase
(
SackPermittedTestCase::ENABLED
),
TestCase::QUICK
);
224
}
225
};
226
227
static
TcpSackPermittedTestSuite
228
g_tcpSackPermittedTestSuite
;
SackPermittedTestCase
Test case for checking the SACK-PERMITTED option.
Definition:
tcp-sack-permitted-test.cc:37
SackPermittedTestCase::Configuration
Configuration
Configuration of the test.
Definition:
tcp-sack-permitted-test.cc:41
SackPermittedTestCase::ENABLED_RECEIVER
@ ENABLED_RECEIVER
Definition:
tcp-sack-permitted-test.cc:43
SackPermittedTestCase::ENABLED
@ ENABLED
Definition:
tcp-sack-permitted-test.cc:45
SackPermittedTestCase::DISABLED
@ DISABLED
Definition:
tcp-sack-permitted-test.cc:42
SackPermittedTestCase::ENABLED_SENDER
@ ENABLED_SENDER
Definition:
tcp-sack-permitted-test.cc:44
SackPermittedTestCase::SackPermittedTestCase
SackPermittedTestCase(SackPermittedTestCase::Configuration conf)
Constructor.
Definition:
tcp-sack-permitted-test.cc:63
SackPermittedTestCase::CreateSenderSocket
Ptr< TcpSocketMsgBase > CreateSenderSocket(Ptr< Node > node) override
Create and install the socket to install on the sender.
Definition:
tcp-sack-permitted-test.cc:97
SackPermittedTestCase::Tx
void Tx(const Ptr< const Packet > p, const TcpHeader &h, SocketWho who) override
Packet transmitted down to IP layer.
Definition:
tcp-sack-permitted-test.cc:124
SackPermittedTestCase::CreateReceiverSocket
Ptr< TcpSocketMsgBase > CreateReceiverSocket(Ptr< Node > node) override
Create and install the socket to install on the receiver.
Definition:
tcp-sack-permitted-test.cc:70
SackPermittedTestCase::m_configuration
Configuration m_configuration
The configuration.
Definition:
tcp-sack-permitted-test.cc:60
TcpSackPermittedTestSuite
The test case for testing the TCP SACK PERMITTED option.
Definition:
tcp-sack-permitted-test.cc:212
TcpSackPermittedTestSuite::TcpSackPermittedTestSuite
TcpSackPermittedTestSuite()
Constructor.
Definition:
tcp-sack-permitted-test.cc:215
ns3::BooleanValue
AttributeValue implementation for Boolean.
Definition:
boolean.h:37
ns3::Ptr
Smart pointer class similar to boost::intrusive_ptr.
Definition:
ptr.h:78
ns3::TcpGeneralTest
General infrastructure for TCP testing.
Definition:
tcp-general-test.h:255
ns3::TcpGeneralTest::CreateSenderSocket
virtual Ptr< TcpSocketMsgBase > CreateSenderSocket(Ptr< Node > node)
Create and install the socket to install on the sender.
Definition:
tcp-general-test.cc:338
ns3::TcpGeneralTest::SocketWho
SocketWho
Used as parameter of methods, specifies on what node the caller is interested (e.g.
Definition:
tcp-general-test.h:273
ns3::TcpGeneralTest::RECEIVER
@ RECEIVER
Receiver node.
Definition:
tcp-general-test.h:275
ns3::TcpGeneralTest::SENDER
@ SENDER
Sender node.
Definition:
tcp-general-test.h:274
ns3::TcpGeneralTest::CreateReceiverSocket
virtual Ptr< TcpSocketMsgBase > CreateReceiverSocket(Ptr< Node > node)
Create and install the socket to install on the receiver.
Definition:
tcp-general-test.cc:344
ns3::TcpHeader
Header for the Transmission Control Protocol.
Definition:
tcp-header.h:46
ns3::TcpHeader::SYN
@ SYN
SYN.
Definition:
tcp-header.h:282
ns3::TcpHeader::HasOption
bool HasOption(uint8_t kind) const
Check if the header has the option specified.
Definition:
tcp-header.cc:502
ns3::TcpHeader::GetFlags
uint8_t GetFlags() const
Get the flags.
Definition:
tcp-header.cc:167
ns3::TcpOption::SACKPERMITTED
@ SACKPERMITTED
SACKPERMITTED.
Definition:
tcp-option.h:62
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
NS_LOG_INFO
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition:
log.h:275
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
conf
Definition:
conf.py:1
ns3
Every class exported by the ns3 library is enclosed in the ns3 namespace.
tcp-general-test.h
g_tcpSackPermittedTestSuite
static TcpSackPermittedTestSuite g_tcpSackPermittedTestSuite
Static variable for test initialization.
Definition:
tcp-sack-permitted-test.cc:228
src
internet
test
tcp-sack-permitted-test.cc
Generated on Sun Jul 2 2023 18:21:44 for ns-3 by
1.9.6