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
ipv4-header-test.cc
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2010 Hajime Tazaki
3
*
4
* SPDX-License-Identifier: GPL-2.0-only
5
*
6
* Author: John Abraham <john.abraham@gatech.edu>
7
* Adapted from: ipv4-raw-test.cc
8
*/
9
10
#include "ns3/arp-l3-protocol.h"
11
#include "ns3/boolean.h"
12
#include "ns3/icmpv4-l4-protocol.h"
13
#include "ns3/inet-socket-address.h"
14
#include "ns3/internet-stack-helper.h"
15
#include "ns3/ipv4-l3-protocol.h"
16
#include "ns3/ipv4-list-routing.h"
17
#include "ns3/ipv4-raw-socket-factory.h"
18
#include "ns3/ipv4-static-routing.h"
19
#include "ns3/log.h"
20
#include "ns3/node.h"
21
#include "ns3/simple-channel.h"
22
#include "ns3/simple-net-device.h"
23
#include "ns3/simulator.h"
24
#include "ns3/socket-factory.h"
25
#include "ns3/socket.h"
26
#include "ns3/test.h"
27
#include "ns3/traffic-control-layer.h"
28
29
#ifdef __WIN32__
30
#include "ns3/win32-internet.h"
31
#else
32
#include <netinet/in.h>
33
#include <sys/socket.h>
34
#endif
35
36
#include <limits>
37
#include <sstream>
38
#include <string>
39
#include <sys/types.h>
40
41
using namespace
ns3
;
42
43
/**
44
* @ingroup internet-test
45
*
46
* @brief IPv4 Header Test
47
*/
48
class
Ipv4HeaderTest
:
public
TestCase
49
{
50
Ptr<Packet>
m_receivedPacket
;
//!< Received packet.
51
Ipv4Header
m_receivedHeader
;
//!< Received header.
52
53
/**
54
* @brief Send a packet with specific DSCP and ECN fields.
55
* @param socket The source socket.
56
* @param to The destination address.
57
* @param dscp The DSCP field.
58
* @param ecn The ECN field.
59
*/
60
void
DoSendData_IpHdr_Dscp
(
Ptr<Socket>
socket,
61
std::string to,
62
Ipv4Header::DscpType
dscp
,
63
Ipv4Header::EcnType
ecn
);
64
65
/**
66
* @brief Send a packet with specific DSCP and ECN fields.
67
* @param socket The source socket.
68
* @param to The destination address.
69
* @param dscp The DSCP field.
70
* @param ecn The ECN field.
71
*/
72
void
SendData_IpHdr_Dscp
(
Ptr<Socket>
socket,
73
std::string to,
74
Ipv4Header::DscpType
dscp
,
75
Ipv4Header::EcnType
ecn
);
76
77
public
:
78
void
DoRun
()
override
;
79
Ipv4HeaderTest
();
80
81
/**
82
* @brief Receives a packet.
83
* @param socket The receiving socket.
84
* @param packet The packet.
85
* @param from The source address.
86
*/
87
void
ReceivePacket
(
Ptr<Socket>
socket,
Ptr<Packet>
packet,
const
Address
& from);
88
/**
89
* @brief Receives a packet.
90
* @param socket The receiving socket.
91
*/
92
void
ReceivePkt
(
Ptr<Socket>
socket);
93
};
94
95
Ipv4HeaderTest::Ipv4HeaderTest
()
96
:
TestCase
(
"IPv4 Header Test"
)
97
{
98
}
99
100
void
101
Ipv4HeaderTest::ReceivePacket
(
Ptr<Socket>
socket,
Ptr<Packet>
packet,
const
Address
& from)
102
{
103
m_receivedPacket
= packet;
104
}
105
106
void
107
Ipv4HeaderTest::ReceivePkt
(
Ptr<Socket>
socket)
108
{
109
uint32_t
availableData
;
110
availableData
= socket->GetRxAvailable();
111
m_receivedPacket
= socket->Recv(2,
MSG_PEEK
);
112
NS_TEST_ASSERT_MSG_EQ
(
m_receivedPacket
->GetSize(),
113
2,
114
"Received packet size is not equal to 2"
);
115
m_receivedPacket
= socket->Recv(std::numeric_limits<uint32_t>::max(), 0);
116
NS_TEST_ASSERT_MSG_EQ
(
availableData
,
117
m_receivedPacket
->GetSize(),
118
"Received packet size is not equal to Rx buffer size"
);
119
m_receivedPacket
->PeekHeader(
m_receivedHeader
);
120
}
121
122
void
123
Ipv4HeaderTest::DoSendData_IpHdr_Dscp
(
Ptr<Socket>
socket,
124
std::string to,
125
Ipv4Header::DscpType
dscp
,
126
Ipv4Header::EcnType
ecn
)
127
{
128
Address
realTo
=
InetSocketAddress
(
Ipv4Address
(to.c_str()), 0);
129
socket->SetAttribute(
"IpHeaderInclude"
,
BooleanValue
(
true
));
130
Ptr<Packet>
p =
Create<Packet>
(123);
131
Ipv4Header
ipHeader
;
132
ipHeader
.
SetSource
(
Ipv4Address
(
"10.0.0.2"
));
133
ipHeader
.SetDestination(
Ipv4Address
(to.c_str()));
134
ipHeader
.SetProtocol(0);
135
ipHeader
.SetPayloadSize(p->GetSize());
136
ipHeader
.SetTtl(255);
137
ipHeader
.SetDscp(
dscp
);
138
ipHeader
.SetEcn(
ecn
);
139
p->AddHeader(
ipHeader
);
140
141
NS_TEST_EXPECT_MSG_EQ
(socket->SendTo(p, 0,
realTo
), 143, to);
142
socket->SetAttribute(
"IpHeaderInclude"
,
BooleanValue
(
false
));
143
}
144
145
void
146
Ipv4HeaderTest::SendData_IpHdr_Dscp
(
Ptr<Socket>
socket,
147
std::string to,
148
Ipv4Header::DscpType
dscp
,
149
Ipv4Header::EcnType
ecn
)
150
{
151
m_receivedPacket
=
Create<Packet>
();
152
Simulator::ScheduleWithContext
(socket->GetNode()->GetId(),
153
Seconds
(0),
154
&
Ipv4HeaderTest::DoSendData_IpHdr_Dscp
,
155
this
,
156
socket,
157
to,
158
dscp
,
159
ecn
);
160
Simulator::Run
();
161
}
162
163
void
164
Ipv4HeaderTest::DoRun
()
165
{
166
// Create topology
167
168
InternetStackHelper
internet;
169
internet.SetIpv6StackInstall(
false
);
170
171
// Receiver Node
172
Ptr<Node>
rxNode
=
CreateObject<Node>
();
173
internet.Install(
rxNode
);
174
175
Ptr<SimpleNetDevice>
rxDev1
;
176
Ptr<SimpleNetDevice>
rxDev2
;
177
{
// first interface
178
rxDev1
=
CreateObject<SimpleNetDevice>
();
179
rxDev1
->SetAddress(
Mac48Address::ConvertFrom
(
Mac48Address::Allocate
()));
180
rxNode
->AddDevice(
rxDev1
);
181
Ptr<Ipv4>
ipv4 =
rxNode
->GetObject<
Ipv4
>();
182
uint32_t
netdev_idx
= ipv4->AddInterface(
rxDev1
);
183
Ipv4InterfaceAddress
ipv4Addr
=
184
Ipv4InterfaceAddress
(
Ipv4Address
(
"10.0.0.1"
),
Ipv4Mask
(0xffff0000U));
185
ipv4->AddAddress(
netdev_idx
,
ipv4Addr
);
186
ipv4->SetUp(
netdev_idx
);
187
}
188
189
// Sender Node
190
Ptr<Node>
txNode
=
CreateObject<Node>
();
191
internet.Install(
txNode
);
192
Ptr<SimpleNetDevice>
txDev1
;
193
{
194
txDev1
=
CreateObject<SimpleNetDevice>
();
195
txDev1
->SetAddress(
Mac48Address::ConvertFrom
(
Mac48Address::Allocate
()));
196
txNode
->AddDevice(
txDev1
);
197
Ptr<Ipv4>
ipv4 =
txNode
->GetObject<
Ipv4
>();
198
uint32_t
netdev_idx
= ipv4->AddInterface(
txDev1
);
199
Ipv4InterfaceAddress
ipv4Addr
=
200
Ipv4InterfaceAddress
(
Ipv4Address
(
"10.0.0.2"
),
Ipv4Mask
(0xffff0000U));
201
ipv4->AddAddress(
netdev_idx
,
ipv4Addr
);
202
ipv4->SetUp(
netdev_idx
);
203
}
204
205
// link the two nodes
206
Ptr<SimpleChannel>
channel1
=
CreateObject<SimpleChannel>
();
207
rxDev1
->SetChannel(
channel1
);
208
txDev1
->SetChannel(
channel1
);
209
210
// Create the IPv4 Raw sockets
211
Ptr<SocketFactory>
rxSocketFactory
=
rxNode
->GetObject<
Ipv4RawSocketFactory
>();
212
Ptr<Socket>
rxSocket
=
rxSocketFactory
->CreateSocket();
213
NS_TEST_EXPECT_MSG_EQ
(
rxSocket
->Bind(
InetSocketAddress
(
Ipv4Address
(
"0.0.0.0"
), 0)),
214
0,
215
"trivial"
);
216
rxSocket
->SetRecvCallback(
MakeCallback
(&
Ipv4HeaderTest::ReceivePkt
,
this
));
217
218
Ptr<SocketFactory>
txSocketFactory
=
txNode
->GetObject<
Ipv4RawSocketFactory
>();
219
Ptr<Socket>
txSocket
=
txSocketFactory
->CreateSocket();
220
221
// ------ Now the tests ------------
222
223
// Dscp Tests
224
std::cout <<
"Dscp Test\n"
;
225
226
std::vector<Ipv4Header::DscpType>
vDscpTypes
;
227
vDscpTypes
.push_back(
Ipv4Header::DscpDefault
);
228
vDscpTypes
.push_back(
Ipv4Header::DSCP_CS1
);
229
vDscpTypes
.push_back(
Ipv4Header::DSCP_AF11
);
230
vDscpTypes
.push_back(
Ipv4Header::DSCP_AF12
);
231
vDscpTypes
.push_back(
Ipv4Header::DSCP_AF13
);
232
vDscpTypes
.push_back(
Ipv4Header::DSCP_CS2
);
233
vDscpTypes
.push_back(
Ipv4Header::DSCP_AF21
);
234
vDscpTypes
.push_back(
Ipv4Header::DSCP_AF22
);
235
vDscpTypes
.push_back(
Ipv4Header::DSCP_AF23
);
236
vDscpTypes
.push_back(
Ipv4Header::DSCP_CS3
);
237
vDscpTypes
.push_back(
Ipv4Header::DSCP_AF31
);
238
vDscpTypes
.push_back(
Ipv4Header::DSCP_AF32
);
239
vDscpTypes
.push_back(
Ipv4Header::DSCP_AF33
);
240
vDscpTypes
.push_back(
Ipv4Header::DSCP_CS4
);
241
vDscpTypes
.push_back(
Ipv4Header::DSCP_AF41
);
242
vDscpTypes
.push_back(
Ipv4Header::DSCP_AF42
);
243
vDscpTypes
.push_back(
Ipv4Header::DSCP_AF43
);
244
vDscpTypes
.push_back(
Ipv4Header::DSCP_CS5
);
245
vDscpTypes
.push_back(
Ipv4Header::DSCP_EF
);
246
vDscpTypes
.push_back(
Ipv4Header::DSCP_CS6
);
247
vDscpTypes
.push_back(
Ipv4Header::DSCP_CS7
);
248
249
for
(
uint32_t
i
= 0;
i
<
vDscpTypes
.size();
i
++)
250
{
251
SendData_IpHdr_Dscp
(
txSocket
,
"10.0.0.1"
,
vDscpTypes
[
i
],
Ipv4Header::ECN_ECT1
);
252
NS_TEST_EXPECT_MSG_EQ
(
m_receivedPacket
->GetSize(), 143,
"recv(hdrincl): 10.0.0.1"
);
253
NS_TEST_EXPECT_MSG_EQ
(
m_receivedHeader
.
GetDscp
(),
vDscpTypes
[
i
],
"recv(hdrincl): 10.0.0.1"
);
254
m_receivedHeader
.
Print
(std::cout);
255
std::cout << std::endl;
256
m_receivedPacket
->RemoveAllByteTags();
257
m_receivedPacket
=
nullptr
;
258
}
259
260
// Ecn tests
261
std::cout <<
"Ecn Test\n"
;
262
std::vector<Ipv4Header::EcnType>
vEcnTypes
;
263
vEcnTypes
.push_back(
Ipv4Header::ECN_NotECT
);
264
vEcnTypes
.push_back(
Ipv4Header::ECN_ECT1
);
265
vEcnTypes
.push_back(
Ipv4Header::ECN_ECT0
);
266
vEcnTypes
.push_back(
Ipv4Header::ECN_CE
);
267
268
for
(
uint32_t
i
= 0;
i
<
vEcnTypes
.size();
i
++)
269
{
270
SendData_IpHdr_Dscp
(
txSocket
,
"10.0.0.1"
,
Ipv4Header::DscpDefault
,
vEcnTypes
[
i
]);
271
NS_TEST_EXPECT_MSG_EQ
(
m_receivedPacket
->GetSize(), 143,
"recv(hdrincl): 10.0.0.1"
);
272
NS_TEST_EXPECT_MSG_EQ
(
m_receivedHeader
.
GetEcn
(),
vEcnTypes
[
i
],
"recv(hdrincl): 10.0.0.1"
);
273
m_receivedHeader
.
Print
(std::cout);
274
std::cout << std::endl;
275
m_receivedPacket
->RemoveAllByteTags();
276
m_receivedPacket
=
nullptr
;
277
}
278
279
Simulator::Destroy
();
280
}
281
282
/**
283
* @ingroup internet-test
284
*
285
* @brief IPv4 Header TestSuite
286
*/
287
class
Ipv4HeaderTestSuite
:
public
TestSuite
288
{
289
public
:
290
Ipv4HeaderTestSuite
()
291
:
TestSuite
(
"ipv4-header"
,
Type
::
UNIT
)
292
{
293
AddTestCase
(
new
Ipv4HeaderTest
, TestCase::Duration::QUICK);
294
}
295
};
296
297
static
Ipv4HeaderTestSuite
g_ipv4HeaderTestSuite
;
//!< Static variable for test initialization
Ipv4HeaderTest
IPv4 Header Test.
Definition
ipv4-header-test.cc:49
Ipv4HeaderTest::DoRun
void DoRun() override
Implementation to actually run this TestCase.
Definition
ipv4-header-test.cc:164
Ipv4HeaderTest::m_receivedPacket
Ptr< Packet > m_receivedPacket
Received packet.
Definition
ipv4-header-test.cc:50
Ipv4HeaderTest::m_receivedHeader
Ipv4Header m_receivedHeader
Received header.
Definition
ipv4-header-test.cc:51
Ipv4HeaderTest::ReceivePacket
void ReceivePacket(Ptr< Socket > socket, Ptr< Packet > packet, const Address &from)
Receives a packet.
Definition
ipv4-header-test.cc:101
Ipv4HeaderTest::Ipv4HeaderTest
Ipv4HeaderTest()
Definition
ipv4-header-test.cc:95
Ipv4HeaderTest::DoSendData_IpHdr_Dscp
void DoSendData_IpHdr_Dscp(Ptr< Socket > socket, std::string to, Ipv4Header::DscpType dscp, Ipv4Header::EcnType ecn)
Send a packet with specific DSCP and ECN fields.
Definition
ipv4-header-test.cc:123
Ipv4HeaderTest::ReceivePkt
void ReceivePkt(Ptr< Socket > socket)
Receives a packet.
Definition
ipv4-header-test.cc:107
Ipv4HeaderTest::SendData_IpHdr_Dscp
void SendData_IpHdr_Dscp(Ptr< Socket > socket, std::string to, Ipv4Header::DscpType dscp, Ipv4Header::EcnType ecn)
Send a packet with specific DSCP and ECN fields.
Definition
ipv4-header-test.cc:146
Ipv4HeaderTestSuite
IPv4 Header TestSuite.
Definition
ipv4-header-test.cc:288
Ipv4HeaderTestSuite::Ipv4HeaderTestSuite
Ipv4HeaderTestSuite()
Definition
ipv4-header-test.cc:290
ns3::Address
a polymophic address class
Definition
address.h:90
ns3::BooleanValue
AttributeValue implementation for Boolean.
Definition
boolean.h:26
ns3::InetSocketAddress
an Inet address class
Definition
inet-socket-address.h:31
ns3::InternetStackHelper
aggregate IP/TCP/UDP functionality to existing Nodes.
Definition
internet-stack-helper.h:81
ns3::Ipv4Address
Ipv4 addresses are stored in host order in this class.
Definition
ipv4-address.h:31
ns3::Ipv4Header
Packet header for IPv4.
Definition
ipv4-header.h:23
ns3::Ipv4Header::Print
void Print(std::ostream &os) const override
Definition
ipv4-header.cc:336
ns3::Ipv4Header::GetEcn
EcnType GetEcn() const
Definition
ipv4-header.cc:158
ns3::Ipv4Header::EcnType
EcnType
ECN Type defined in RFC 3168
Definition
ipv4-header.h:103
ns3::Ipv4Header::ECN_ECT0
@ ECN_ECT0
Definition
ipv4-header.h:107
ns3::Ipv4Header::ECN_NotECT
@ ECN_NotECT
Definition
ipv4-header.h:105
ns3::Ipv4Header::ECN_ECT1
@ ECN_ECT1
Definition
ipv4-header.h:106
ns3::Ipv4Header::ECN_CE
@ ECN_CE
Definition
ipv4-header.h:108
ns3::Ipv4Header::GetDscp
DscpType GetDscp() const
Definition
ipv4-header.cc:97
ns3::Ipv4Header::DscpType
DscpType
DiffServ codepoints.
Definition
ipv4-header.h:61
ns3::Ipv4Header::DSCP_AF23
@ DSCP_AF23
Definition
ipv4-header.h:73
ns3::Ipv4Header::DSCP_CS2
@ DSCP_CS2
Definition
ipv4-header.h:70
ns3::Ipv4Header::DscpDefault
@ DscpDefault
Definition
ipv4-header.h:62
ns3::Ipv4Header::DSCP_AF31
@ DSCP_AF31
Definition
ipv4-header.h:76
ns3::Ipv4Header::DSCP_AF32
@ DSCP_AF32
Definition
ipv4-header.h:77
ns3::Ipv4Header::DSCP_AF13
@ DSCP_AF13
Definition
ipv4-header.h:68
ns3::Ipv4Header::DSCP_AF22
@ DSCP_AF22
Definition
ipv4-header.h:72
ns3::Ipv4Header::DSCP_AF43
@ DSCP_AF43
Definition
ipv4-header.h:83
ns3::Ipv4Header::DSCP_AF11
@ DSCP_AF11
Definition
ipv4-header.h:66
ns3::Ipv4Header::DSCP_CS3
@ DSCP_CS3
Definition
ipv4-header.h:75
ns3::Ipv4Header::DSCP_AF42
@ DSCP_AF42
Definition
ipv4-header.h:82
ns3::Ipv4Header::DSCP_AF21
@ DSCP_AF21
Definition
ipv4-header.h:71
ns3::Ipv4Header::DSCP_AF33
@ DSCP_AF33
Definition
ipv4-header.h:78
ns3::Ipv4Header::DSCP_AF12
@ DSCP_AF12
Definition
ipv4-header.h:67
ns3::Ipv4Header::DSCP_CS5
@ DSCP_CS5
Definition
ipv4-header.h:85
ns3::Ipv4Header::DSCP_EF
@ DSCP_EF
Definition
ipv4-header.h:86
ns3::Ipv4Header::DSCP_CS4
@ DSCP_CS4
Definition
ipv4-header.h:80
ns3::Ipv4Header::DSCP_CS7
@ DSCP_CS7
Definition
ipv4-header.h:89
ns3::Ipv4Header::DSCP_CS6
@ DSCP_CS6
Definition
ipv4-header.h:88
ns3::Ipv4Header::DSCP_CS1
@ DSCP_CS1
Definition
ipv4-header.h:65
ns3::Ipv4Header::DSCP_AF41
@ DSCP_AF41
Definition
ipv4-header.h:81
ns3::Ipv4Header::SetSource
void SetSource(Ipv4Address source)
Definition
ipv4-header.cc:284
ns3::Ipv4
Access to the IPv4 forwarding table, interfaces, and configuration.
Definition
ipv4.h:69
ns3::Ipv4InterfaceAddress
a class to store IPv4 address information on an interface
Definition
ipv4-interface-address.h:34
ns3::Ipv4Mask
a class to represent an Ipv4 address mask
Definition
ipv4-address.h:246
ns3::Ipv4RawSocketFactory
API to create RAW socket instances.
Definition
ipv4-raw-socket-factory.h:28
ns3::Mac48Address::ConvertFrom
static Mac48Address ConvertFrom(const Address &address)
Definition
mac48-address.cc:84
ns3::Mac48Address::Allocate
static Mac48Address Allocate()
Allocate a new Mac48Address.
Definition
mac48-address.cc:94
ns3::Ptr
Smart pointer class similar to boost::intrusive_ptr.
Definition
ptr.h:66
ns3::Simulator::Destroy
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition
simulator.cc:131
ns3::Simulator::ScheduleWithContext
static void ScheduleWithContext(uint32_t context, const Time &delay, FUNC f, Ts &&... args)
Schedule an event with the given context.
Definition
simulator.h:577
ns3::Simulator::Run
static void Run()
Run the simulation.
Definition
simulator.cc:167
ns3::TestCase
encapsulates test code
Definition
test.h:1050
ns3::TestCase::AddTestCase
void AddTestCase(TestCase *testCase, Duration duration=Duration::QUICK)
Add an individual child TestCase to this test suite.
Definition
test.cc:292
ns3::TestSuite
A suite of tests to run.
Definition
test.h:1267
ns3::TestSuite::Type
Type
Type of test.
Definition
test.h:1274
ns3::TestSuite::UNIT
static constexpr auto UNIT
Definition
test.h:1291
uint32_t
ns3::Create
Ptr< T > Create(Ts &&... args)
Create class instances by constructors with varying numbers of arguments and return them by Ptr.
Definition
ptr.h:436
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:134
NS_TEST_EXPECT_MSG_EQ
#define NS_TEST_EXPECT_MSG_EQ(actual, limit, msg)
Test that an actual and expected (limit) value are equal and report if not.
Definition
test.h:241
ns3::Seconds
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition
nstime.h:1344
g_ipv4HeaderTestSuite
static Ipv4HeaderTestSuite g_ipv4HeaderTestSuite
Static variable for test initialization.
Definition
ipv4-header-test.cc:297
ns3
Every class exported by the ns3 library is enclosed in the ns3 namespace.
ns3::MakeCallback
Callback< R, Args... > MakeCallback(R(T::*memPtr)(Args...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition
callback.h:684
src
internet
test
ipv4-header-test.cc
Generated on Mon Dec 15 2025 15:21:54 for ns-3 by
1.9.8