A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
lr-wpan-ack-test.cc
Go to the documentation of this file.
1/*
2 * Copyright (c) 2014 Fraunhofer FKIE
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 * Author:
18 * Sascha Alexander Jopen <jopen@cs.uni-bonn.de>
19 * Modifications:
20 * Tommaso Pecorella <tommaso.pecorella@unifi.it>
21 */
22
23#include "ns3/rng-seed-manager.h"
24#include <ns3/constant-position-mobility-model.h>
25#include <ns3/core-module.h>
26#include <ns3/log.h>
27#include <ns3/lr-wpan-module.h>
28#include <ns3/packet.h>
29#include <ns3/propagation-delay-model.h>
30#include <ns3/propagation-loss-model.h>
31#include <ns3/simulator.h>
32#include <ns3/single-model-spectrum-channel.h>
33
34#include <fstream>
35#include <iostream>
36#include <streambuf>
37#include <string>
38
39using namespace ns3;
40using namespace ns3::lrwpan;
41
42NS_LOG_COMPONENT_DEFINE("lr-wpan-ack-test");
43
44/**
45 * \ingroup lr-wpan
46 * \defgroup lr-wpan-test LrWpan module tests
47 */
48
49/**
50 * \ingroup lr-wpan-test
51 * \ingroup tests
52 *
53 * \brief LrWpan ACK Test
54 */
56{
57 public:
58 /**
59 * Test modes
60 */
62 {
63 EXTENDED_ADDRESS_UNICAST, //!< extended addresses
64 SHORT_ADDRESS_UNICAST, //!< short addresses, unicast
65 SHORT_ADDRESS_MULTICAST, //!< short addresses, multicast
66 SHORT_ADDRESS_BROADCAST, //!< short addresses, broadcast
67 };
68
69 /**
70 * Create test case
71 *
72 * \param prefix Unique file names prefix
73 * \param mode Test mode
74 */
75 LrWpanAckTestCase(const char* const prefix, TestMode_e mode);
76
77 /**
78 * \brief Function called when DataIndication is hit on dev0.
79 * \param params The MCPS params.
80 * \param p the packet.
81 */
83 /**
84 * \brief Function called when DataIndication is hit on dev1.
85 * \param params The MCPS params.
86 * \param p the packet.
87 */
89 /**
90 * \brief Function called when DataConfirm is hit on dev0.
91 * \param params The MCPS params.
92 */
94 /**
95 * \brief Function called when DataConfirm is hit on dev1.
96 * \param params The MCPS params.
97 */
99
100 private:
101 void DoRun() override;
102
103 std::string m_prefix; //!< Filename prefix
104 Time m_requestTime; //!< Request time.
105 Time m_requestSentTime; //!< Request successfully sent time.
106 Time m_replyTime; //!< Reply time.
107 Time m_replySentTime; //!< Reply successfully sent time.
108 Time m_replyArrivalTime; //!< Reply arrival time.
109 TestMode_e m_mode; //!< Test mode.
110 Ptr<LrWpanNetDevice> m_dev0; //!< 1st LrWpanNetDevice.
111 Ptr<LrWpanNetDevice> m_dev1; //!< 2nd LrWpanNetDevice.
112};
113
115 : TestCase("Test the 802.15.4 ACK handling")
116{
117 m_prefix = prefix;
120 m_replyTime = Seconds(0);
123 m_mode = mode;
124}
125
126void
128{
130}
131
132void
134{
135 Ptr<Packet> pkt = Create<Packet>(10); // 10 bytes of dummy data
136 McpsDataRequestParams replyParams;
137 replyParams.m_dstPanId = 0;
138 replyParams.m_msduHandle = 0;
139 replyParams.m_txOptions = TX_OPTION_NONE;
140
142 {
143 replyParams.m_srcAddrMode = EXT_ADDR;
144 replyParams.m_dstAddrMode = EXT_ADDR;
145 replyParams.m_dstExtAddr = Mac64Address("00:00:00:00:00:00:00:01");
146 }
147 else
148 {
149 replyParams.m_srcAddrMode = SHORT_ADDR;
150 replyParams.m_dstAddrMode = SHORT_ADDR;
151 replyParams.m_dstAddr = Mac16Address("00:01");
152 }
154 m_dev1->GetMac()->McpsDataRequest(replyParams, pkt);
155}
156
157void
159{
161}
162
163void
165{
167}
168
169void
171{
172 // Test setup:
173 // Two nodes well in communication range.
174 // Node 1 sends a request packet to node 2 with ACK request bit set. Node 2
175 // immediately answers with a reply packet on reception of the request.
176 // We expect the ACK of the request packet to always arrive at node 1 before
177 // the reply packet sent by node 2.
178 // This, of course, unelss the packet is sent to a broadcast or multicast address
179 // in this case we don't expect any ACK.
180
181 // Enable calculation of FCS in the trailers. Only necessary when interacting with real devices
182 // or wireshark. GlobalValue::Bind ("ChecksumEnabled", BooleanValue (true));
183
184 // Set the random seed and run number for this test
187
189
190 // Helper - used to create traces
191 LrWpanHelper helper;
192 std::string asciiPrefix;
193
194 // Create 2 nodes, and a NetDevice for each one
195 Ptr<Node> n0 = CreateObject<Node>();
196 Ptr<Node> n1 = CreateObject<Node>();
197
198 m_dev0 = CreateObject<LrWpanNetDevice>();
199 m_dev1 = CreateObject<LrWpanNetDevice>();
200
201 // Make random variable stream assignment deterministic
202 m_dev0->AssignStreams(0);
203 m_dev1->AssignStreams(10);
204
205 // Add short addresses.
206 m_dev0->SetAddress(Mac16Address("00:01"));
207 m_dev1->SetAddress(Mac16Address("00:02"));
208 // Add extended addresses.
209 m_dev0->GetMac()->SetExtendedAddress(Mac64Address("00:00:00:00:00:00:00:01"));
210 m_dev1->GetMac()->SetExtendedAddress(Mac64Address("00:00:00:00:00:00:00:02"));
211
212 // Each device must be attached to the same channel
213 Ptr<SingleModelSpectrumChannel> channel = CreateObject<SingleModelSpectrumChannel>();
215 CreateObject<LogDistancePropagationLossModel>();
217 CreateObject<ConstantSpeedPropagationDelayModel>();
218 channel->AddPropagationLossModel(propModel);
219 channel->SetPropagationDelayModel(delayModel);
220
221 m_dev0->SetChannel(channel);
222 m_dev1->SetChannel(channel);
223
224 // To complete configuration, a LrWpanNetDevice must be added to a node
225 n0->AddDevice(m_dev0);
226 n1->AddDevice(m_dev1);
227
228 Ptr<ConstantPositionMobilityModel> sender0Mobility =
229 CreateObject<ConstantPositionMobilityModel>();
230 sender0Mobility->SetPosition(Vector(0, 0, 0));
231 m_dev0->GetPhy()->SetMobility(sender0Mobility);
232 Ptr<ConstantPositionMobilityModel> sender1Mobility =
233 CreateObject<ConstantPositionMobilityModel>();
234 // Configure position 10 m distance
235 sender1Mobility->SetPosition(Vector(0, 10, 0));
236 m_dev1->GetPhy()->SetMobility(sender1Mobility);
237
240 m_dev0->GetMac()->SetMcpsDataConfirmCallback(cb0);
241
244 m_dev0->GetMac()->SetMcpsDataIndicationCallback(cb1);
245
248 m_dev1->GetMac()->SetMcpsDataConfirmCallback(cb2);
249
252 m_dev1->GetMac()->SetMcpsDataIndicationCallback(cb3);
253
254 Ptr<Packet> p0 = Create<Packet>(50); // 50 bytes of dummy data
256 uint8_t expectedAckCount = 0;
257 switch (m_mode)
258 {
260 params.m_srcAddrMode = SHORT_ADDR;
261 params.m_dstAddrMode = SHORT_ADDR;
262 params.m_dstAddr = Mac16Address("00:02");
263 expectedAckCount = 1;
264 break;
266 params.m_srcAddrMode = SHORT_ADDR;
267 params.m_dstAddrMode = SHORT_ADDR;
269 expectedAckCount = 0;
270 break;
272 params.m_srcAddrMode = SHORT_ADDR;
273 params.m_dstAddrMode = SHORT_ADDR;
274 params.m_dstAddr = Mac16Address::GetBroadcast();
275 expectedAckCount = 0;
276 break;
278 params.m_srcAddrMode = EXT_ADDR;
279 params.m_dstAddrMode = EXT_ADDR;
280 params.m_dstExtAddr = Mac64Address("00:00:00:00:00:00:00:02");
281 expectedAckCount = 1;
282 break;
283 }
284 params.m_dstPanId = 0;
285 params.m_msduHandle = 0;
286 params.m_txOptions = TX_OPTION_ACK;
289
292
293 std::ifstream traceFile(CreateTempDirFilename(m_prefix) + "-0-0.tr");
294 uint8_t ackCounter = 0;
295 std::string sub("Frame Type = 2");
296 for (std::string line; getline(traceFile, line);)
297 {
298 if (line.find(sub, 0) != std::string::npos)
299 {
300 ackCounter++;
301 }
302 }
303 traceFile.close();
304
305 // Note: the packet being correctly sent includes receiving an ACK in case of for unicact
306 // packets.
309 "Sent the request before the reply (as expected)");
310 NS_TEST_EXPECT_MSG_GT(m_requestSentTime, Time(0), "The request was sent (as expected)");
313 "The request was sent before the reply arrived (as expected)");
316 "The reply was sent before the reply arrived (as expected)");
317 NS_TEST_EXPECT_MSG_EQ(ackCounter,
318 expectedAckCount,
319 "The right amount of ACKs have been seen on the channel (as expected)");
320
321 m_dev0 = nullptr;
322 m_dev1 = nullptr;
323
325}
326
327/**
328 * \ingroup lr-wpan-test
329 * \ingroup tests
330 *
331 * \brief LrWpan ACK TestSuite
332 */
334{
335 public:
337};
338
340 : TestSuite("lr-wpan-ack", Type::UNIT)
341{
343 TestCase::Duration::QUICK);
346 TestCase::Duration::QUICK);
349 TestCase::Duration::QUICK);
352 TestCase::Duration::QUICK);
353}
354
355static LrWpanAckTestSuite g_lrWpanAckTestSuite; //!< Static variable for test initialization
LrWpan ACK Test.
@ SHORT_ADDRESS_MULTICAST
short addresses, multicast
@ SHORT_ADDRESS_BROADCAST
short addresses, broadcast
@ EXTENDED_ADDRESS_UNICAST
extended addresses
@ SHORT_ADDRESS_UNICAST
short addresses, unicast
Time m_requestSentTime
Request successfully sent time.
void DataIndicationDev0(McpsDataIndicationParams params, Ptr< Packet > p)
Function called when DataIndication is hit on dev0.
Time m_requestTime
Request time.
Time m_replyTime
Reply time.
void DataIndicationDev1(McpsDataIndicationParams params, Ptr< Packet > p)
Function called when DataIndication is hit on dev1.
std::string m_prefix
Filename prefix.
Time m_replySentTime
Reply successfully sent time.
void DataConfirmDev0(McpsDataConfirmParams params)
Function called when DataConfirm is hit on dev0.
Ptr< LrWpanNetDevice > m_dev0
1st LrWpanNetDevice.
LrWpanAckTestCase(const char *const prefix, TestMode_e mode)
Create test case.
void DoRun() override
Implementation to actually run this TestCase.
TestMode_e m_mode
Test mode.
Ptr< LrWpanNetDevice > m_dev1
2nd LrWpanNetDevice.
Time m_replyArrivalTime
Reply arrival time.
void DataConfirmDev1(McpsDataConfirmParams params)
Function called when DataConfirm is hit on dev1.
LrWpan ACK TestSuite.
void EnableAscii(std::string prefix, Ptr< NetDevice > nd, bool explicitFilename=false)
Enable ascii trace output on the indicated net device.
static Ipv6Address GetAllNodesMulticast()
Get the "all nodes multicast" address.
helps to manage and create IEEE 802.15.4 NetDevice objects
This class can contain 16 bit addresses.
Definition: mac16-address.h:44
static Mac16Address GetMulticast(Ipv6Address address)
Returns the multicast address associated with an IPv6 address according to RFC 4944 Section 9.
static Mac16Address GetBroadcast()
an EUI-64 address
Definition: mac64-address.h:46
static void EnablePrinting()
Enable printing packets metadata.
Definition: packet.cc:596
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:77
static void SetRun(uint64_t run)
Set the run number of simulation.
static void SetSeed(uint32_t seed)
Set the seed.
static void Destroy()
Execute the events scheduled with ScheduleDestroy().
Definition: simulator.cc:142
static Time Now()
Return the current simulation virtual time.
Definition: simulator.cc:208
static void Run()
Run the simulation.
Definition: simulator.cc:178
static EventId ScheduleNow(FUNC f, Ts &&... args)
Schedule an event to expire Now.
Definition: simulator.h:605
encapsulates test code
Definition: test.h:1061
void AddTestCase(TestCase *testCase, Duration duration=Duration::QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:301
std::string CreateTempDirFilename(std::string filename)
Construct the full path to a file in a temporary directory.
Definition: test.cc:438
A suite of tests to run.
Definition: test.h:1268
Type
Type of test.
Definition: test.h:1275
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:105
void McpsDataRequest(McpsDataRequestParams params, Ptr< Packet > p) override
IEEE 802.15.4-2006, section 7.1.1.1 MCPS-DATA.request Request to transfer a MSDU.
Definition: lr-wpan-mac.cc:386
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:202
@ TX_OPTION_NONE
TX_OPTION_NONE.
Definition: lr-wpan-mac.h:63
@ TX_OPTION_ACK
TX_OPTION_ACK.
Definition: lr-wpan-mac.h:64
#define NS_TEST_EXPECT_MSG_LT(actual, limit, msg)
Test that an actual value is less than a limit and report if not.
Definition: test.h:791
#define NS_TEST_EXPECT_MSG_GT(actual, limit, msg)
Test that an actual value is greater than a limit and report if not.
Definition: test.h:957
#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:252
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1319
static LrWpanAckTestSuite g_lrWpanAckTestSuite
Static variable for test initialization.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
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:706
MCPS-DATA.indication params.
AddressMode m_dstAddrMode
Destination address mode.
Mac16Address m_dstAddr
Destination address.
Mac64Address m_dstExtAddr
Destination extended address.
uint16_t m_dstPanId
Destination PAN identifier.
AddressMode m_srcAddrMode
Source address mode.
uint8_t m_txOptions
Tx Options (bitfield)