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  // 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> ();
214  Ptr<LogDistancePropagationLossModel> propModel = CreateObject<LogDistancePropagationLossModel> ();
215  Ptr<ConstantSpeedPropagationDelayModel> delayModel = CreateObject<ConstantSpeedPropagationDelayModel> ();
216  channel->AddPropagationLossModel (propModel);
217  channel->SetPropagationDelayModel (delayModel);
218 
221 
222  // To complete configuration, a LrWpanNetDevice must be added to a node
223  n0->AddDevice (m_dev0);
224  n1->AddDevice (m_dev1);
225 
226  Ptr<ConstantPositionMobilityModel> sender0Mobility = CreateObject<ConstantPositionMobilityModel> ();
227  sender0Mobility->SetPosition (Vector (0,0,0));
228  m_dev0->GetPhy ()->SetMobility (sender0Mobility);
229  Ptr<ConstantPositionMobilityModel> sender1Mobility = CreateObject<ConstantPositionMobilityModel> ();
230  // Configure position 10 m distance
231  sender1Mobility->SetPosition (Vector (0,10,0));
232  m_dev1->GetPhy ()->SetMobility (sender1Mobility);
233 
236  m_dev0->GetMac ()->SetMcpsDataConfirmCallback (cb0);
237 
240  m_dev0->GetMac ()->SetMcpsDataIndicationCallback (cb1);
241 
244  m_dev1->GetMac ()->SetMcpsDataConfirmCallback (cb2);
245 
248  m_dev1->GetMac ()->SetMcpsDataIndicationCallback (cb3);
249 
250  Ptr<Packet> p0 = Create<Packet> (50); // 50 bytes of dummy data
251  McpsDataRequestParams params;
252  uint8_t expectedAckCount = 0;
253  switch (m_mode)
254  {
256  params.m_srcAddrMode = SHORT_ADDR;
257  params.m_dstAddrMode = SHORT_ADDR;
258  params.m_dstAddr = Mac16Address ("00:02");
259  expectedAckCount = 1;
260  break;
262  params.m_srcAddrMode = SHORT_ADDR;
263  params.m_dstAddrMode = SHORT_ADDR;
264  params.m_dstAddr = Mac16Address::GetMulticast (Ipv6Address::GetAllNodesMulticast ());
265  expectedAckCount = 0;
266  break;
268  params.m_srcAddrMode = SHORT_ADDR;
269  params.m_dstAddrMode = SHORT_ADDR;
270  params.m_dstAddr = Mac16Address::GetBroadcast ();
271  expectedAckCount = 0;
272  break;
274  params.m_srcAddrMode = EXT_ADDR;
275  params.m_dstAddrMode = EXT_ADDR;
276  params.m_dstExtAddr = Mac64Address ("00:00:00:00:00:00:00:02");
277  expectedAckCount = 1;
278  break;
279  }
280  params.m_dstPanId = 0;
281  params.m_msduHandle = 0;
282  params.m_txOptions = TX_OPTION_ACK;
284  Simulator::ScheduleNow (&LrWpanMac::McpsDataRequest, m_dev0->GetMac (), params, p0);
285 
287  Simulator::Run ();
288 
289  std::ifstream traceFile (CreateTempDirFilename (m_prefix)+"-0-0.tr");
290  uint8_t ackCounter = 0;
291  std::string sub ("Frame Type = 2");
292  for( std::string line; getline ( traceFile, line ); )
293  {
294  if (line.find(sub, 0) != std::string::npos)
295  {
296  ackCounter++;
297  }
298  }
299  traceFile.close ();
300 
301  // Note: the packet being correctly sent includes receiving an ACK in case of for unicact packets.
302  NS_TEST_EXPECT_MSG_LT (m_requestTime, m_replyTime, "Sent the request before the reply (as expected)");
303  NS_TEST_EXPECT_MSG_GT (m_requestSentTime, Time (0), "The request was sent (as expected)");
304  NS_TEST_EXPECT_MSG_LT (m_requestSentTime, m_replyArrivalTime, "The request was sent before the reply arrived (as expected)");
305  NS_TEST_EXPECT_MSG_LT (m_replySentTime, m_replyArrivalTime, "The reply was sent before the reply arrived (as expected)");
306  NS_TEST_EXPECT_MSG_EQ (ackCounter, expectedAckCount, "The right amount of ACKs have been seen on the channel (as expected)");
307 
308  m_dev0 = 0;
309  m_dev1 = 0;
310 
311  Simulator::Destroy ();
312 }
313 
314 
322 {
323 public:
325 };
326 
328  : TestSuite ("lr-wpan-ack", UNIT)
329 {
330  AddTestCase (new LrWpanAckTestCase ("short-unicast", LrWpanAckTestCase::SHORT_ADDRESS_UNICAST), TestCase::QUICK);
331  AddTestCase (new LrWpanAckTestCase ("short-multicast", LrWpanAckTestCase::SHORT_ADDRESS_MULTICAST), TestCase::QUICK);
332  AddTestCase (new LrWpanAckTestCase ("short-broadcast", LrWpanAckTestCase::SHORT_ADDRESS_BROADCAST), TestCase::QUICK);
333  AddTestCase (new LrWpanAckTestCase ("extended-unicast", LrWpanAckTestCase::EXTENDED_ADDRESS_UNICAST), TestCase::QUICK);
334 }
335 
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