A Discrete-Event Network Simulator
API
lr-wpan-ack-test.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2014 Fraunhofer FKIE
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  * Author:
19  * Sascha Alexander Jopen <jopen@cs.uni-bonn.de>
20  * Modifications:
21  * Tommaso Pecorella <tommaso.pecorella@unifi.it>
22  */
23 
24 #include <ns3/log.h>
25 #include <ns3/core-module.h>
26 #include <ns3/lr-wpan-module.h>
27 #include <ns3/propagation-loss-model.h>
28 #include <ns3/propagation-delay-model.h>
29 #include <ns3/simulator.h>
30 #include <ns3/single-model-spectrum-channel.h>
31 #include <ns3/constant-position-mobility-model.h>
32 #include <ns3/packet.h>
33 #include "ns3/rng-seed-manager.h"
34 
35 #include <iostream>
36 #include <string>
37 #include <fstream>
38 #include <streambuf>
39 
40 using namespace ns3;
41 
42 NS_LOG_COMPONENT_DEFINE ("lr-wpan-ack-test");
43 
56 {
57 public:
58 
59  typedef enum
60  {
65  } TestMode_e;
66 
73  LrWpanAckTestCase (const char * const prefix, TestMode_e mode);
74 
81  void DataIndicationDev0 (McpsDataIndicationParams params, Ptr<Packet> p);
88  void DataIndicationDev1 (McpsDataIndicationParams params, Ptr<Packet> p);
94  void DataConfirmDev0 (McpsDataConfirmParams params);
100  void DataConfirmDev1 (McpsDataConfirmParams params);
101 
102 private:
103  virtual void DoRun (void);
104 
105  std::string m_prefix;
114 };
115 
116 LrWpanAckTestCase::LrWpanAckTestCase (const char * const prefix, TestMode_e mode)
117  : TestCase ("Test the 802.15.4 ACK handling")
118 {
119  m_prefix = prefix;
120  m_requestTime = Seconds (0);
122  m_replyTime = Seconds (0);
123  m_replySentTime = Seconds (0);
125  m_mode = mode;
126 }
127 
128 void
130 {
132 }
133 
134 void
136 {
137  Ptr<Packet> pkt = Create<Packet> (10); // 10 bytes of dummy data
138  McpsDataRequestParams replyParams;
139  replyParams.m_dstPanId = 0;
140  replyParams.m_msduHandle = 0;
141  replyParams.m_txOptions = TX_OPTION_NONE;
142 
144  {
145  replyParams.m_srcAddrMode = EXT_ADDR;
146  replyParams.m_dstAddrMode = EXT_ADDR;
147  replyParams.m_dstExtAddr = Mac64Address ("00:00:00:00:00:00:00:01");
148  }
149  else
150  {
151  replyParams.m_srcAddrMode = SHORT_ADDR;
152  replyParams.m_dstAddrMode = SHORT_ADDR;
153  replyParams.m_dstAddr = Mac16Address ("00:01");
154  }
156  m_dev1->GetMac ()->McpsDataRequest (replyParams, pkt);
157 }
158 
159 void
161 {
163 }
164 
165 void
167 {
169 }
170 
171 void
173 {
174  // Test setup:
175  // Two nodes well in communication range.
176  // Node 1 sends a request packet to node 2 with ACK request bit set. Node 2
177  // immediately answers with a reply packet on reception of the request.
178  // We expect the ACK of the request packet to always arrive at node 1 before
179  // the reply packet sent by node 2.
180  // This, of course, unelss the packet is sent to a broadcast or multicast address
181  // in this case we don't expect any ACK.
182 
183  // Enable calculation of FCS in the trailers. Only necessary when interacting with real devices or wireshark.
184  // GlobalValue::Bind ("ChecksumEnabled", BooleanValue (true));
185 
186  // Set the random seed and run number for this test
187  RngSeedManager::SetSeed (1);
188  RngSeedManager::SetRun (6);
189 
190  Packet::EnablePrinting ();
191 
192  // Helper - used to create traces
193  LrWpanHelper helper;
194  std::string asciiPrefix;
195 
196  // Create 2 nodes, and a NetDevice for each one
197  Ptr<Node> n0 = CreateObject <Node> ();
198  Ptr<Node> n1 = CreateObject <Node> ();
199 
200  m_dev0 = CreateObject<LrWpanNetDevice> ();
201  m_dev1 = CreateObject<LrWpanNetDevice> ();
202 
203  // Make random variable stream assignment deterministic
204  m_dev0->AssignStreams (0);
205  m_dev1->AssignStreams (10);
206 
207  // Add short addresses.
208  m_dev0->SetAddress (Mac16Address ("00:01"));
209  m_dev1->SetAddress (Mac16Address ("00:02"));
210  // Add extended addresses.
211  m_dev0->GetMac()->SetExtendedAddress (Mac64Address ("00:00:00:00:00:00:00:01"));
212  m_dev1->GetMac()->SetExtendedAddress (Mac64Address ("00:00:00:00:00:00:00:02"));
213 
214  // Each device must be attached to the same channel
215  Ptr<SingleModelSpectrumChannel> channel = CreateObject<SingleModelSpectrumChannel> ();
216  Ptr<LogDistancePropagationLossModel> propModel = CreateObject<LogDistancePropagationLossModel> ();
217  Ptr<ConstantSpeedPropagationDelayModel> delayModel = CreateObject<ConstantSpeedPropagationDelayModel> ();
218  channel->AddPropagationLossModel (propModel);
219  channel->SetPropagationDelayModel (delayModel);
220 
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 = CreateObject<ConstantPositionMobilityModel> ();
229  sender0Mobility->SetPosition (Vector (0,0,0));
230  m_dev0->GetPhy ()->SetMobility (sender0Mobility);
231  Ptr<ConstantPositionMobilityModel> sender1Mobility = CreateObject<ConstantPositionMobilityModel> ();
232  // Configure position 10 m distance
233  sender1Mobility->SetPosition (Vector (0,10,0));
234  m_dev1->GetPhy ()->SetMobility (sender1Mobility);
235 
238  m_dev0->GetMac ()->SetMcpsDataConfirmCallback (cb0);
239 
242  m_dev0->GetMac ()->SetMcpsDataIndicationCallback (cb1);
243 
246  m_dev1->GetMac ()->SetMcpsDataConfirmCallback (cb2);
247 
250  m_dev1->GetMac ()->SetMcpsDataIndicationCallback (cb3);
251 
252  Ptr<Packet> p0 = Create<Packet> (50); // 50 bytes of dummy data
253  McpsDataRequestParams params;
254  uint8_t expectedAckCount = 0;
255  switch (m_mode)
256  {
258  params.m_srcAddrMode = SHORT_ADDR;
259  params.m_dstAddrMode = SHORT_ADDR;
260  params.m_dstAddr = Mac16Address ("00:02");
261  expectedAckCount = 1;
262  break;
264  params.m_srcAddrMode = SHORT_ADDR;
265  params.m_dstAddrMode = SHORT_ADDR;
266  params.m_dstAddr = Mac16Address::GetMulticast (Ipv6Address::GetAllNodesMulticast ());
267  expectedAckCount = 0;
268  break;
270  params.m_srcAddrMode = SHORT_ADDR;
271  params.m_dstAddrMode = SHORT_ADDR;
272  params.m_dstAddr = Mac16Address::GetBroadcast ();
273  expectedAckCount = 0;
274  break;
276  params.m_srcAddrMode = EXT_ADDR;
277  params.m_dstAddrMode = EXT_ADDR;
278  params.m_dstExtAddr = Mac64Address ("00:00:00:00:00:00:00:02");
279  expectedAckCount = 1;
280  break;
281  }
282  params.m_dstPanId = 0;
283  params.m_msduHandle = 0;
284  params.m_txOptions = TX_OPTION_ACK;
286  Simulator::ScheduleNow (&LrWpanMac::McpsDataRequest, m_dev0->GetMac (), params, p0);
287 
289  Simulator::Run ();
290 
291  std::ifstream traceFile (CreateTempDirFilename (m_prefix)+"-0-0.tr");
292  uint8_t ackCounter = 0;
293  std::string sub ("Frame Type = 2");
294  for( std::string line; getline ( traceFile, line ); )
295  {
296  if (line.find(sub, 0) != std::string::npos)
297  {
298  ackCounter++;
299  }
300  }
301  traceFile.close ();
302 
303  // Note: the packet being correctly sent includes receiving an ACK in case of for unicact packets.
304  NS_TEST_EXPECT_MSG_LT (m_requestTime, m_replyTime, "Sent the request before the reply (as expected)");
305  NS_TEST_EXPECT_MSG_GT (m_requestSentTime, Time (0), "The request was sent (as expected)");
306  NS_TEST_EXPECT_MSG_LT (m_requestSentTime, m_replyArrivalTime, "The request was sent before the reply arrived (as expected)");
307  NS_TEST_EXPECT_MSG_LT (m_replySentTime, m_replyArrivalTime, "The reply was sent before the reply arrived (as expected)");
308  NS_TEST_EXPECT_MSG_EQ (ackCounter, expectedAckCount, "The right amount of ACKs have been seen on the channel (as expected)");
309 
310  m_dev0 = 0;
311  m_dev1 = 0;
312 
313  Simulator::Destroy ();
314 }
315 
316 
324 {
325 public:
327 };
328 
330  : TestSuite ("lr-wpan-ack", UNIT)
331 {
332  AddTestCase (new LrWpanAckTestCase ("short-unicast", LrWpanAckTestCase::SHORT_ADDRESS_UNICAST), TestCase::QUICK);
333  AddTestCase (new LrWpanAckTestCase ("short-multicast", LrWpanAckTestCase::SHORT_ADDRESS_MULTICAST), TestCase::QUICK);
334  AddTestCase (new LrWpanAckTestCase ("short-broadcast", LrWpanAckTestCase::SHORT_ADDRESS_BROADCAST), TestCase::QUICK);
335  AddTestCase (new LrWpanAckTestCase ("extended-unicast", LrWpanAckTestCase::EXTENDED_ADDRESS_UNICAST), TestCase::QUICK);
336 }
337 
Time m_replySentTime
Reply successfully sent time.
static LrWpanAckTestSuite g_lrWpanAckTestSuite
Static variable for test initialization.
Ptr< LrWpanNetDevice > m_dev0
1st LrWpanNetDevice.
uint16_t m_dstPanId
Destination PAN identifier.
Definition: lr-wpan-mac.h:248
Simulation virtual time values and global simulation resolution.
Definition: nstime.h:103
A suite of tests to run.
Definition: test.h:1343
Time m_replyArrivalTime
Reply arrival time.
#define NS_LOG_COMPONENT_DEFINE(name)
Define a Log component with a specific name.
Definition: log.h:205
#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:283
encapsulates test code
Definition: test.h:1153
Ptr< LrWpanPhy > GetPhy(void) const
Get the PHY used by this NetDevice.
channel
Definition: third.py:92
virtual void SetAddress(Address address)
This method indirects to LrWpanMac::SetShortAddress ()
an EUI-64 address
Definition: mac64-address.h:43
int64_t AssignStreams(int64_t stream)
Assign a fixed random variable stream number to the random variables used by this model...
TX_OPTION_ACK.
Definition: lr-wpan-mac.h:59
Time m_requestSentTime
Request successfully sent time.
void SetChannel(Ptr< SpectrumChannel > channel)
Set the channel to which the NetDevice, and therefore the PHY, should be attached to...
void AddTestCase(TestCase *testCase, TestDuration duration=QUICK)
Add an individual child TestCase to this test suite.
Definition: test.cc:299
LrWpan ACK Test.
MCPS-DATA.confirm params.
Definition: lr-wpan-mac.h:260
Ptr< LrWpanNetDevice > m_dev1
2nd LrWpanNetDevice.
LrWpan ACK TestSuite.
TestMode_e m_mode
Test mode.
Every class exported by the ns3 library is enclosed in the ns3 namespace.
LrWpanAckTestCase(const char *const prefix, TestMode_e mode)
Create test case.
virtual void DoRun(void)
Implementation to actually run this TestCase.
This class can contain 16 bit addresses.
Definition: mac16-address.h:41
#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:1088
void SetPosition(const Vector &position)
void DataIndicationDev0(McpsDataIndicationParams params, Ptr< Packet > p)
Function called when DataIndication is hit on dev0.
void EnableAscii(std::string prefix, Ptr< NetDevice > nd, bool explicitFilename=false)
Enable ascii trace output on the indicated net device.
void DataConfirmDev1(McpsDataConfirmParams params)
Function called when DataConfirm is hit on dev1.
uint32_t AddDevice(Ptr< NetDevice > device)
Associate a NetDevice to this node.
Definition: node.cc:130
std::string CreateTempDirFilename(std::string filename)
Construct the full path to a file in a temporary directory.
Definition: test.cc:430
Time Seconds(double value)
Construct a Time in the indicated unit.
Definition: nstime.h:1289
Time m_replyTime
Reply time.
void DataConfirmDev0(McpsDataConfirmParams params)
Function called when DataConfirm is hit on dev0.
#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:901
std::string m_prefix
Filename prefix.
Time Now(void)
create an ns3::Time instance which contains the current simulation time.
Definition: simulator.cc:287
MCPS-DATA.request params.
Definition: lr-wpan-mac.h:236
helps to manage and create IEEE 802.15.4 NetDevice objects
Ptr< LrWpanMac > GetMac(void) const
Get the MAC used by this NetDevice.
Time m_requestTime
Request time.
TX_OPTION_NONE.
Definition: lr-wpan-mac.h:58
Callback< R, Ts... > MakeCallback(R(T::*memPtr)(Ts...), OBJ objPtr)
Build Callbacks for class method members which take varying numbers of arguments and potentially retu...
Definition: callback.h:1642
void DataIndicationDev1(McpsDataIndicationParams params, Ptr< Packet > p)
Function called when DataIndication is hit on dev1.
MCPS-DATA.indication params.
Definition: lr-wpan-mac.h:270