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-click-routing-test.cc
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2010 Lalith Suresh
3
*
4
* SPDX-License-Identifier: GPL-2.0-only
5
*
6
* Authors: Lalith Suresh <suresh.lalith@gmail.com>
7
*/
8
9
#include "ns3/click-internet-stack-helper.h"
10
#include "ns3/ipv4-click-routing.h"
11
#include "ns3/ipv4-l3-protocol.h"
12
#include "ns3/log.h"
13
#include "ns3/node.h"
14
#include "ns3/simple-net-device.h"
15
#include "ns3/test.h"
16
17
#include <click/simclick.h>
18
#include <string>
19
20
using namespace
ns3
;
21
22
/**
23
* @ingroup click
24
* @defgroup click-tests click module tests
25
*/
26
27
/**
28
* @file
29
* @ingroup click-tests
30
* Click test suite.
31
*/
32
33
/**
34
* @ingroup click-tests
35
* Add Click Internet stack.
36
*
37
* @param node Node.
38
*/
39
static
void
40
AddClickInternetStack
(
Ptr<Node>
node)
41
{
42
ClickInternetStackHelper
internet;
43
internet.SetClickFile(node,
"src/click/test/nsclick-test-lan-single-interface.click"
);
44
internet.Install(node);
45
}
46
47
/**
48
* @ingroup click-tests
49
* Add network device.
50
*
51
* @param node Node.
52
* @param macaddr MAC address.
53
* @param ipv4addr IPv4 address.
54
* @param ipv4mask IPv4 mask.
55
*/
56
static
void
57
AddNetworkDevice
(
Ptr<Node>
node,
Mac48Address
macaddr
,
Ipv4Address
ipv4addr
,
Ipv4Mask
ipv4mask
)
58
{
59
Ptr<SimpleNetDevice>
rxDev1
;
60
61
rxDev1
=
CreateObject<SimpleNetDevice>
();
62
rxDev1
->SetAddress(
Mac48Address
(
macaddr
));
63
node->AddDevice(
rxDev1
);
64
65
Ptr<Ipv4>
ipv4 = node->GetObject<
Ipv4
>();
66
uint32_t
netdev_idx
= ipv4->AddInterface(
rxDev1
);
67
Ipv4InterfaceAddress
ipv4Addr
=
Ipv4InterfaceAddress
(
ipv4addr
,
ipv4mask
);
68
ipv4->AddAddress(
netdev_idx
,
ipv4Addr
);
69
ipv4->SetUp(
netdev_idx
);
70
}
71
72
/**
73
* @ingroup click-tests
74
* Click interface ID from name test.
75
*/
76
class
ClickIfidFromNameTest
:
public
TestCase
77
{
78
public
:
79
ClickIfidFromNameTest
();
80
void
DoRun
()
override
;
81
};
82
83
ClickIfidFromNameTest::ClickIfidFromNameTest
()
84
:
TestCase
(
"Test SIMCLICK_IFID_FROM_NAME"
)
85
{
86
}
87
88
void
89
ClickIfidFromNameTest::DoRun
()
90
{
91
Ptr<Node>
node =
CreateObject<Node>
();
92
AddClickInternetStack
(node);
93
AddNetworkDevice
(node,
94
Mac48Address
(
"00:00:00:00:00:01"
),
95
Ipv4Address
(
"10.1.1.1"
),
96
Ipv4Mask
(
"255.255.255.0"
));
97
Ptr<Ipv4>
ipv4 = node->GetObject<
Ipv4
>();
98
Ptr<Ipv4ClickRouting>
click =
DynamicCast<Ipv4ClickRouting>
(ipv4->GetRoutingProtocol());
99
click->DoInitialize();
100
101
int
ret
;
102
103
ret
=
simclick_sim_command
(click->m_simNode,
SIMCLICK_IFID_FROM_NAME
,
"tap0"
);
104
NS_TEST_EXPECT_MSG_EQ
(
ret
, 0,
"tap0 is interface 0"
);
105
106
ret
=
simclick_sim_command
(click->m_simNode,
SIMCLICK_IFID_FROM_NAME
,
"tun0"
);
107
NS_TEST_EXPECT_MSG_EQ
(
ret
, 0,
"tun0 is interface 0"
);
108
109
ret
=
simclick_sim_command
(click->m_simNode,
SIMCLICK_IFID_FROM_NAME
,
"eth0"
);
110
NS_TEST_EXPECT_MSG_EQ
(
ret
, 1,
"Eth0 is interface 1"
);
111
112
ret
=
simclick_sim_command
(click->m_simNode,
SIMCLICK_IFID_FROM_NAME
,
"tap1"
);
113
NS_TEST_EXPECT_MSG_EQ
(
ret
, 0,
"tap1 is interface 0"
);
114
115
ret
=
simclick_sim_command
(click->m_simNode,
SIMCLICK_IFID_FROM_NAME
,
"tun1"
);
116
NS_TEST_EXPECT_MSG_EQ
(
ret
, 0,
"tun1 is interface 0"
);
117
118
ret
=
simclick_sim_command
(click->m_simNode,
SIMCLICK_IFID_FROM_NAME
,
"eth1"
);
119
NS_TEST_EXPECT_MSG_EQ
(
ret
, -1,
"No eth1 on node"
);
120
}
121
122
/**
123
* @ingroup click-tests
124
* Click IP MAC address from name test.
125
*/
126
class
ClickIpMacAddressFromNameTest
:
public
TestCase
127
{
128
public
:
129
ClickIpMacAddressFromNameTest
();
130
void
DoRun
()
override
;
131
};
132
133
ClickIpMacAddressFromNameTest::ClickIpMacAddressFromNameTest
()
134
:
TestCase
(
"Test SIMCLICK_IPADDR_FROM_NAME"
)
135
{
136
}
137
138
void
139
ClickIpMacAddressFromNameTest::DoRun
()
140
{
141
Ptr<Node>
node =
CreateObject<Node>
();
142
AddClickInternetStack
(node);
143
AddNetworkDevice
(node,
144
Mac48Address
(
"00:00:00:00:00:01"
),
145
Ipv4Address
(
"10.1.1.1"
),
146
Ipv4Mask
(
"255.255.255.0"
));
147
AddNetworkDevice
(node,
148
Mac48Address
(
"00:00:00:00:00:02"
),
149
Ipv4Address
(
"10.1.1.2"
),
150
Ipv4Mask
(
"255.255.255.0"
));
151
Ptr<Ipv4>
ipv4 = node->GetObject<
Ipv4
>();
152
Ptr<Ipv4ClickRouting>
click =
DynamicCast<Ipv4ClickRouting>
(ipv4->GetRoutingProtocol());
153
click->DoInitialize();
154
155
char
* buf =
new
char
[255];
156
157
simclick_sim_command
(click->m_simNode,
SIMCLICK_IPADDR_FROM_NAME
,
"eth0"
, buf, 255);
158
NS_TEST_EXPECT_MSG_EQ
(std::string(buf),
"10.1.1.1"
,
"eth0 has IP 10.1.1.1"
);
159
160
simclick_sim_command
(click->m_simNode,
SIMCLICK_MACADDR_FROM_NAME
,
"eth0"
, buf, 255);
161
NS_TEST_EXPECT_MSG_EQ
(std::string(buf),
162
"00:00:00:00:00:01"
,
163
"eth0 has Mac Address 00:00:00:00:00:01"
);
164
165
simclick_sim_command
(click->m_simNode,
SIMCLICK_IPADDR_FROM_NAME
,
"eth1"
, buf, 255);
166
NS_TEST_EXPECT_MSG_EQ
(std::string(buf),
"10.1.1.2"
,
"eth1 has IP 10.1.1.2"
);
167
168
simclick_sim_command
(click->m_simNode,
SIMCLICK_MACADDR_FROM_NAME
,
"eth1"
, buf, 255);
169
NS_TEST_EXPECT_MSG_EQ
(std::string(buf),
170
"00:00:00:00:00:02"
,
171
"eth0 has Mac Address 00:00:00:00:00:02"
);
172
173
// Not sure how to test the below case, because the Ipv4ClickRouting code is to ASSERT for such
174
// inputs simclick_sim_command (click->m_simNode, SIMCLICK_IPADDR_FROM_NAME, "eth2", buf, 255);
175
// NS_TEST_EXPECT_MSG_EQ (buf, nullptr, "No eth2");
176
177
simclick_sim_command
(click->m_simNode,
SIMCLICK_IPADDR_FROM_NAME
,
"tap0"
, buf, 255);
178
NS_TEST_EXPECT_MSG_EQ
(std::string(buf),
"127.0.0.1"
,
"tun0 has IP 127.0.0.1"
);
179
180
simclick_sim_command
(click->m_simNode,
SIMCLICK_MACADDR_FROM_NAME
,
"tap0"
, buf, 255);
181
NS_TEST_EXPECT_MSG_EQ
(std::string(buf),
"00:00:00:00:00:00"
,
"tun0 has IP 127.0.0.1"
);
182
183
delete
[] buf;
184
}
185
186
/**
187
* @ingroup click-tests
188
* Click trivial test.
189
*/
190
class
ClickTrivialTest
:
public
TestCase
191
{
192
public
:
193
ClickTrivialTest
();
194
void
DoRun
()
override
;
195
};
196
197
ClickTrivialTest::ClickTrivialTest
()
198
:
TestCase
(
"Test SIMCLICK_GET_NODE_NAME and SIMCLICK_IF_READY"
)
199
{
200
}
201
202
void
203
ClickTrivialTest::DoRun
()
204
{
205
Ptr<Node>
node =
CreateObject<Node>
();
206
AddClickInternetStack
(node);
207
AddNetworkDevice
(node,
208
Mac48Address
(
"00:00:00:00:00:01"
),
209
Ipv4Address
(
"10.1.1.1"
),
210
Ipv4Mask
(
"255.255.255.0"
));
211
Ptr<Ipv4>
ipv4 = node->GetObject<
Ipv4
>();
212
Ptr<Ipv4ClickRouting>
click =
DynamicCast<Ipv4ClickRouting>
(ipv4->GetRoutingProtocol());
213
click->SetNodeName(
"myNode"
);
214
click->DoInitialize();
215
216
int
ret
= 0;
217
char
* buf =
new
char
[255];
218
219
ret
=
simclick_sim_command
(click->m_simNode,
SIMCLICK_GET_NODE_NAME
, buf, 255);
220
NS_TEST_EXPECT_MSG_EQ
(std::string(buf),
"myNode"
,
"Node name is Node"
);
221
222
ret
=
simclick_sim_command
(click->m_simNode,
SIMCLICK_IF_READY
, 0);
223
NS_TEST_EXPECT_MSG_EQ
(
ret
, 1,
"tap0 is ready"
);
224
225
ret
=
simclick_sim_command
(click->m_simNode,
SIMCLICK_IF_READY
, 1);
226
NS_TEST_EXPECT_MSG_EQ
(
ret
, 1,
"eth0 is ready"
);
227
228
ret
=
simclick_sim_command
(click->m_simNode,
SIMCLICK_IF_READY
, 2);
229
NS_TEST_EXPECT_MSG_EQ
(
ret
, 0,
"eth1 does not exist, so return 0"
);
230
231
delete
[] buf;
232
}
233
234
/**
235
* @ingroup click-tests
236
* Click interface ID from name test.
237
*/
238
class
ClickIfidFromNameTestSuite
:
public
TestSuite
239
{
240
public
:
241
ClickIfidFromNameTestSuite
()
242
:
TestSuite
(
"routing-click"
,
Type
::
UNIT
)
243
{
244
AddTestCase
(
new
ClickTrivialTest
, TestCase::Duration::QUICK);
245
AddTestCase
(
new
ClickIfidFromNameTest
, TestCase::Duration::QUICK);
246
AddTestCase
(
new
ClickIpMacAddressFromNameTest
, TestCase::Duration::QUICK);
247
}
248
};
249
250
/// Static variable for test initialization
251
static
ClickIfidFromNameTestSuite
g_ipv4ClickRoutingTestSuite
;
ClickIfidFromNameTest
Click interface ID from name test.
Definition
ipv4-click-routing-test.cc:77
ClickIfidFromNameTest::DoRun
void DoRun() override
Implementation to actually run this TestCase.
Definition
ipv4-click-routing-test.cc:89
ClickIfidFromNameTest::ClickIfidFromNameTest
ClickIfidFromNameTest()
Definition
ipv4-click-routing-test.cc:83
ClickIfidFromNameTestSuite
Click interface ID from name test.
Definition
ipv4-click-routing-test.cc:239
ClickIfidFromNameTestSuite::ClickIfidFromNameTestSuite
ClickIfidFromNameTestSuite()
Definition
ipv4-click-routing-test.cc:241
ClickIpMacAddressFromNameTest
Click IP MAC address from name test.
Definition
ipv4-click-routing-test.cc:127
ClickIpMacAddressFromNameTest::ClickIpMacAddressFromNameTest
ClickIpMacAddressFromNameTest()
Definition
ipv4-click-routing-test.cc:133
ClickIpMacAddressFromNameTest::DoRun
void DoRun() override
Implementation to actually run this TestCase.
Definition
ipv4-click-routing-test.cc:139
ClickTrivialTest
Click trivial test.
Definition
ipv4-click-routing-test.cc:191
ClickTrivialTest::ClickTrivialTest
ClickTrivialTest()
Definition
ipv4-click-routing-test.cc:197
ClickTrivialTest::DoRun
void DoRun() override
Implementation to actually run this TestCase.
Definition
ipv4-click-routing-test.cc:203
ns3::ClickInternetStackHelper
aggregate Click/IP/TCP/UDP functionality to existing Nodes.
Definition
click-internet-stack-helper.h:38
ns3::Ipv4Address
Ipv4 addresses are stored in host order in this class.
Definition
ipv4-address.h:31
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::Mac48Address
an EUI-48 address
Definition
mac48-address.h:35
ns3::Ptr
Smart pointer class similar to boost::intrusive_ptr.
Definition
ptr.h:66
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
AddNetworkDevice
static void AddNetworkDevice(Ptr< Node > node, Mac48Address macaddr, Ipv4Address ipv4addr, Ipv4Mask ipv4mask)
Add network device.
Definition
ipv4-click-routing-test.cc:57
AddClickInternetStack
static void AddClickInternetStack(Ptr< Node > node)
Add Click Internet stack.
Definition
ipv4-click-routing-test.cc:40
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_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
g_ipv4ClickRoutingTestSuite
static ClickIfidFromNameTestSuite g_ipv4ClickRoutingTestSuite
Static variable for test initialization.
Definition
ipv4-click-routing-test.cc:251
simclick_sim_command
int simclick_sim_command(simclick_node_t *simnode, int cmd,...)
Definition
ipv4-click-routing.cc:635
ns3
Every class exported by the ns3 library is enclosed in the ns3 namespace.
src
click
test
ipv4-click-routing-test.cc
Generated on Mon Dec 15 2025 15:21:49 for ns-3 by
1.9.8