A Discrete-Event Network Simulator
Home
Tutorials ▼
English
Docs ▼
Wiki
Manual
Models
Develop ▼
API
Bugs
API
tcp-sack-permitted-test.cc
Go to the documentation of this file.
1
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2
/*
3
* Copyright (c) 2016 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 "
tcp-general-test.h
"
21
#include "ns3/node.h"
22
#include "ns3/log.h"
23
#include "ns3/tcp-option-sack-permitted.h"
24
#include "ns3/tcp-header.h"
25
26
using namespace
ns3
;
27
28
NS_LOG_COMPONENT_DEFINE
(
"SackPermittedTestSuite"
);
29
37
class
SackPermittedTestCase
:
public
TcpGeneralTest
38
{
39
public
:
41
enum
Configuration
42
{
43
DISABLED
,
44
ENABLED_RECEIVER
,
45
ENABLED_SENDER
,
46
ENABLED
47
};
48
53
SackPermittedTestCase
(
SackPermittedTestCase::Configuration
conf
);
54
protected
:
55
virtual
Ptr<TcpSocketMsgBase>
CreateReceiverSocket (
Ptr<Node>
node);
56
virtual
Ptr<TcpSocketMsgBase>
CreateSenderSocket (
Ptr<Node>
node);
57
58
virtual
void
Tx (
const
Ptr<const Packet>
p,
const
TcpHeader
&h, SocketWho who);
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
127
if
(!(h.
GetFlags
() & TcpHeader::SYN))
128
{
129
NS_TEST_ASSERT_MSG_EQ
(h.
HasOption
(TcpOption::SACKPERMITTED),
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),
false
,
137
"SackPermitted disabled but option enabled"
);
138
}
139
else
if
(
m_configuration
==
ENABLED
)
140
{
141
NS_TEST_ASSERT_MSG_EQ
(h.
HasOption
(TcpOption::SACKPERMITTED),
true
,
142
"SackPermitted enabled but option disabled"
);
143
}
144
145
NS_LOG_INFO
(h);
146
if
(who ==
SENDER
)
147
{
148
if
(h.
GetFlags
() & TcpHeader::SYN)
149
{
150
if
(
m_configuration
==
ENABLED_RECEIVER
)
151
{
152
NS_TEST_ASSERT_MSG_EQ
(h.
HasOption
(TcpOption::SACKPERMITTED),
false
,
153
"SackPermitted disabled but option enabled"
);
154
}
155
else
if
(
m_configuration
==
ENABLED_SENDER
)
156
{
157
NS_TEST_ASSERT_MSG_EQ
(h.
HasOption
(TcpOption::SACKPERMITTED),
true
,
158
"SackPermitted enabled but option disabled"
);
159
}
160
}
161
else
162
{
163
if
(
m_configuration
!=
ENABLED
)
164
{
165
NS_TEST_ASSERT_MSG_EQ
(h.
HasOption
(TcpOption::SACKPERMITTED),
false
,
166
"SackPermitted disabled but option enabled"
);
167
}
168
}
169
}
170
else
if
(who ==
RECEIVER
)
171
{
172
if
(h.
GetFlags
() & TcpHeader::SYN)
173
{
174
// Sender has not sent SackPermitted, so implementation should disable ts
175
if
(
m_configuration
==
ENABLED_RECEIVER
)
176
{
177
NS_TEST_ASSERT_MSG_EQ
(h.
HasOption
(TcpOption::SACKPERMITTED),
false
,
178
"sender has not ts, but receiver sent anyway"
);
179
}
180
else
if
(
m_configuration
==
ENABLED_SENDER
)
181
{
182
NS_TEST_ASSERT_MSG_EQ
(h.
HasOption
(TcpOption::SACKPERMITTED),
false
,
183
"receiver has not ts enabled but sent anyway"
);
184
}
185
}
186
else
187
{
188
if
(
m_configuration
!=
ENABLED
)
189
{
190
NS_TEST_ASSERT_MSG_EQ
(h.
HasOption
(TcpOption::SACKPERMITTED),
false
,
191
"SackPermitted disabled but option enabled"
);
192
}
193
}
194
}
195
}
196
203
class
TcpSackPermittedTestSuite
:
public
TestSuite
204
{
205
public
:
207
TcpSackPermittedTestSuite
()
208
:
TestSuite
(
"tcp-sack-permitted"
,
UNIT
)
209
{
210
AddTestCase
(
new
SackPermittedTestCase
(
SackPermittedTestCase::DISABLED
), TestCase::QUICK);
211
AddTestCase
(
new
SackPermittedTestCase
(
SackPermittedTestCase::ENABLED_RECEIVER
), TestCase::QUICK);
212
AddTestCase
(
new
SackPermittedTestCase
(
SackPermittedTestCase::ENABLED_SENDER
), TestCase::QUICK);
213
AddTestCase
(
new
SackPermittedTestCase
(
SackPermittedTestCase::ENABLED
), TestCase::QUICK);
214
}
215
216
};
217
218
static
TcpSackPermittedTestSuite
g_tcpSackPermittedTestSuite
;
SackPermittedTestCase::Configuration
Configuration
Configuration of the test.
Definition:
tcp-sack-permitted-test.cc:42
NS_LOG_COMPONENT_DEFINE
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition:
log.h:205
ns3::TcpGeneralTest::SocketWho
SocketWho
Used as parameter of methods, specifies on what node the caller is interested (e.g.
Definition:
tcp-general-test.h:275
ns3::TestCase::AddTestCase
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition:
test.cc:299
ns3::BooleanValue
AttributeValue implementation for Boolean.
Definition:
boolean.h:37
ns3
Every class exported by the ns3 library is enclosed in the ns3 namespace.
ns3::TcpGeneralTest::SENDER
@ SENDER
Sender node.
Definition:
tcp-general-test.h:276
TcpSackPermittedTestSuite
The test case for testing the TCP SACK PERMITTED option.
Definition:
tcp-sack-permitted-test.cc:204
ns3::ObjectBase::SetAttribute
void SetAttribute(std::string name, const AttributeValue &value)
Set a single attribute, raising fatal errors if unsuccessful.
Definition:
object-base.cc:185
g_tcpSackPermittedTestSuite
static TcpSackPermittedTestSuite g_tcpSackPermittedTestSuite
Static variable for test initialization.
Definition:
tcp-sack-permitted-test.cc:218
SackPermittedTestCase::m_configuration
Configuration m_configuration
The configuration.
Definition:
tcp-sack-permitted-test.cc:60
SackPermittedTestCase::CreateSenderSocket
virtual Ptr< TcpSocketMsgBase > CreateSenderSocket(Ptr< Node > node)
Create and install the socket to install on the sender.
Definition:
tcp-sack-permitted-test.cc:97
TcpSackPermittedTestSuite::TcpSackPermittedTestSuite
TcpSackPermittedTestSuite()
Constructor.
Definition:
tcp-sack-permitted-test.cc:207
ns3::Ptr
Smart pointer class similar to boost::intrusive_ptr.
Definition:
ptr.h:74
SackPermittedTestCase::ENABLED_RECEIVER
@ ENABLED_RECEIVER
Definition:
tcp-sack-permitted-test.cc:44
SackPermittedTestCase::ENABLED_SENDER
@ ENABLED_SENDER
Definition:
tcp-sack-permitted-test.cc:45
NS_LOG_INFO
#define NS_LOG_INFO(msg)
Use NS_LOG to output a message of level LOG_INFO.
Definition:
log.h:281
SackPermittedTestCase::Tx
virtual void Tx(const Ptr< const Packet > p, const TcpHeader &h, SocketWho who)
Packet transmitted down to IP layer.
Definition:
tcp-sack-permitted-test.cc:124
ns3::TcpGeneralTest::RECEIVER
@ RECEIVER
Receiver node.
Definition:
tcp-general-test.h:277
ns3::TcpHeader
Header for the Transmission Control Protocol.
Definition:
tcp-header.h:45
tcp-general-test.h
ns3::TcpGeneralTest
General infrastructure for TCP testing.
Definition:
tcp-general-test.h:257
ns3::TcpHeader::HasOption
bool HasOption(uint8_t kind) const
Check if the header has the option specified.
Definition:
tcp-header.cc:511
ns3::TestSuite
A suite of tests to run.
Definition:
test.h:1344
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:166
SackPermittedTestCase::SackPermittedTestCase
SackPermittedTestCase(SackPermittedTestCase::Configuration conf)
Constructor.
Definition:
tcp-sack-permitted-test.cc:63
SackPermittedTestCase::ENABLED
@ ENABLED
Definition:
tcp-sack-permitted-test.cc:46
SackPermittedTestCase::CreateReceiverSocket
virtual Ptr< TcpSocketMsgBase > CreateReceiverSocket(Ptr< Node > node)
Create and install the socket to install on the receiver.
Definition:
tcp-sack-permitted-test.cc:70
ns3::TestSuite::UNIT
@ UNIT
This test suite implements a Unit Test.
Definition:
test.h:1353
SackPermittedTestCase::DISABLED
@ DISABLED
Definition:
tcp-sack-permitted-test.cc:43
ns3::TcpHeader::GetFlags
uint8_t GetFlags() const
Get the flags.
Definition:
tcp-header.cc:173
SackPermittedTestCase
Test case for checking the SACK-PERMITTED option.
Definition:
tcp-sack-permitted-test.cc:38
conf
Definition:
conf.py:1
src
internet
test
tcp-sack-permitted-test.cc
Generated on Fri Oct 1 2021 17:03:12 for ns-3 by
1.8.20