A Discrete-Event Network Simulator
API
lr-wpan-fields.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2019 Ritsumeikan University, Shiga, Japan.
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: Alberto Gallegos Ramonet <ramonet@fc.ritsumei.ac.jp>
19  */
20 
21 
22 
23 #include "lr-wpan-fields.h"
24 #include <ns3/log.h>
25 #include <ns3/address-utils.h>
26 
27 namespace ns3 {
28 
30 {
31  SetBeaconOrder (15);
32  SetSuperframeOrder (15);
33  SetFinalCapSlot (0);
34  SetBattLifeExt (false);
35  SetPanCoor (false);
36  SetAssocPermit (false);
37 }
38 
39 void
40 SuperframeField::SetSuperframe (uint16_t superFrmSpec)
41 {
42  m_sspecBcnOrder = (superFrmSpec) & (0x0F); //Bits 0-3
43  m_sspecSprFrmOrder = (superFrmSpec >> 4) & (0x0F); //Bits 4-7
44  m_sspecFnlCapSlot = (superFrmSpec >> 8) & (0x0F); //Bits 8-11
45  m_sspecBatLifeExt = (superFrmSpec >> 12) & (0x01); //Bit 12
46  //Bit 13 (Reserved)
47  m_sspecPanCoor = (superFrmSpec >> 14) & (0x01); //Bit 14
48  m_sspecAssocPermit = (superFrmSpec >> 15) & (0x01); //Bit 15
49 }
50 
51 void
53 {
54  if (bcnOrder > 15)
55  {
56  std::cout << "SuperframeField Beacon Order value must be 15 or less\n";
57  }
58  else
59  {
60  m_sspecBcnOrder = bcnOrder;
61  }
62 }
63 
64 void
66 {
67  if (frmOrder > 15)
68  {
69  std::cout << "SuperframeField Frame Order value must be 15 or less\n";
70  }
71  else
72  {
73  m_sspecSprFrmOrder = frmOrder;
74  }
75 }
76 
77 void
79 {
80  if (capSlot > 15)
81  {
82  std::cout << "The final slot cannot greater than the slots in a CAP (15)\n";
83  }
84  else
85  {
86  m_sspecFnlCapSlot = capSlot;
87  }
88 }
89 
90 void
92 {
93  m_sspecBatLifeExt = battLifeExt;
94 }
95 
96 void
98 {
99  m_sspecPanCoor = panCoor;
100 }
101 
102 void
104 {
105  m_sspecAssocPermit = assocPermit;
106 }
107 
108 uint8_t
110 {
111  return m_sspecBcnOrder;
112 }
113 
114 uint8_t
116 {
117  return m_sspecSprFrmOrder;
118 }
119 
120 uint8_t
122 {
123  return m_sspecFnlCapSlot;
124 }
125 
126 bool
128 {
129  return m_sspecBatLifeExt;
130 }
131 
132 bool
134 {
135  return m_sspecPanCoor;
136 }
137 
138 bool
140 {
141  return m_sspecAssocPermit;
142 }
143 
144 uint16_t
146 {
147  uint16_t superframe;
148 
149  superframe = m_sspecBcnOrder & (0x0F); // Bits 0-3
150  superframe |= (m_sspecSprFrmOrder << 4) & (0x0F << 4); // Bits 4-7
151  superframe |= (m_sspecFnlCapSlot << 8) & (0x0F << 8); // Bits 8-11
152  superframe |= (m_sspecBatLifeExt << 12) & (0x01 << 12); // Bit 12
153  // Bit 13 (Reserved)
154  superframe |= (m_sspecPanCoor << 14) & (0x01 << 14); // Bit 14
155  superframe |= (m_sspecAssocPermit << 15) & (0x01 << 15); // Bit 15
156 
157  return superframe;
158 }
159 
160 uint32_t
162 {
163  return 2; // 2 Octets (superframeSpec)
164 }
165 
168 {
170  return i;
171 }
172 
175 {
176  uint16_t superframe = i.ReadLsbtohU16 ();
177  SetSuperframe (superframe);
178 
179  return i;
180 }
181 
182 std::ostream &
183 operator << (std::ostream &os, const SuperframeField &superframeField)
184 {
185  os << " Beacon Order = " << uint32_t (superframeField.GetBeaconOrder ())
186  << ", Frame Order = " << uint32_t (superframeField.GetFrameOrder ())
187  << ", Final CAP slot = " << uint32_t (superframeField.GetFinalCapSlot ())
188  << ", Battery Life Ext = " << bool (superframeField.IsBattLifeExt ())
189  << ", PAN Coordinator = " << bool (superframeField.IsPanCoor ())
190  << ", Association Permit = " << bool (superframeField.IsAssocPermit ());
191  return os;
192 }
193 
194 /***********************************************************
195  * Guaranteed Time Slots (GTS) Fields
196  ***********************************************************/
197 
199 {
200  // GTS Specification Field
201  m_gtsSpecDescCount = 0;
202  m_gtsSpecPermit = 0;
203  // GTS Direction Field
204  m_gtsDirMask = 0;
205 }
206 
207 uint8_t
209 {
210  uint8_t gtsSpecField;
211 
212  gtsSpecField = m_gtsSpecDescCount & (0x07); // Bits 0-2
213  // Bits 3-6 (Reserved)
214  gtsSpecField |= (m_gtsSpecPermit << 7) & (0x01 << 7); // Bit 7
215 
216  return gtsSpecField;
217 }
218 
219 uint8_t
221 {
222  uint8_t gtsDirectionField;
223 
224  gtsDirectionField = m_gtsDirMask & (0x7F); // Bit 0-6
225  // Bit 7 (Reserved)
226  return gtsDirectionField;
227 }
228 
229 void
230 GtsFields::SetGtsSpecField (uint8_t gtsSpec)
231 {
232  m_gtsSpecDescCount = (gtsSpec) & (0x07); // Bits 0-2
233  // Bits 3-6 (Reserved)
234  m_gtsSpecPermit = (gtsSpec >> 7) & (0x01); // Bit 7
235 }
236 
237 void
239 {
240  m_gtsDirMask = (gtsDir) & (0x7F); // Bits 0-6
241  // Bit 7 (Reserved)
242 }
243 
244 uint32_t
246 {
247  uint32_t size;
248 
249  size = 1; // 1 octet GTS Specification Field
250  if (m_gtsSpecDescCount > 0)
251  {
252  size += 1; // 1 octet GTS Direction Field
253  size += (m_gtsSpecDescCount * 3); // 3 octets per GTS descriptor
254  }
255 
256  return size;
257 }
258 
261 {
262  i.WriteU8 (GetGtsSpecField ());
263 
264  if (m_gtsSpecDescCount > 0)
265  {
266  uint8_t gtsDescStartAndLenght;
268 
269  for (int j = 0; j < m_gtsSpecDescCount; j++)
270  {
271  WriteTo (i,m_gtsList[j].m_gtsDescDevShortAddr);
272 
273  gtsDescStartAndLenght = m_gtsList[j].m_gtsDescStartSlot & (0x0F);
274  gtsDescStartAndLenght = (m_gtsList[j].m_gtsDescLength << 4) & (0x0F);
275 
276  i.WriteU8 (gtsDescStartAndLenght);
277  }
278  }
279  return i;
280 }
281 
284 {
285 
286  uint8_t gtsSpecField = i.ReadU8 ();
287  SetGtsSpecField (gtsSpecField);
288 
289  if (m_gtsSpecDescCount > 0)
290  {
291  uint8_t gtsDirectionField = i.ReadU8 ();
292  SetGtsDirectionField (gtsDirectionField);
293 
294  uint8_t gtsDescStartAndLenght;
295  for (int j = 0; j < m_gtsSpecDescCount; j++)
296  {
297  ReadFrom (i, m_gtsList[j].m_gtsDescDevShortAddr);
298 
299  gtsDescStartAndLenght = i.ReadU8 ();
300  m_gtsList[j].m_gtsDescStartSlot = (gtsDescStartAndLenght) & (0x0F);
301  m_gtsList[j].m_gtsDescLength = (gtsDescStartAndLenght >> 4) & (0x0F);
302  }
303  }
304  return i;
305 }
306 
307 std::ostream &
308 operator << (std::ostream &os, const GtsFields &gtsFields)
309 {
310  os << " GTS specification = " << uint32_t (gtsFields.GetGtsSpecField ())
311  << ", GTS direction = " << uint32_t (gtsFields.GetGtsDirectionField ());
312  return os;
313 }
314 
315 /***********************************************************
316  * Pending Address Fields
317  ***********************************************************/
318 
320 {
323 }
324 
325 
326 uint8_t
328 {
330 }
331 
332 
333 uint8_t
335 {
337 }
338 
339 uint8_t
341 {
342  uint8_t pndAddrSpecField;
343 
344  pndAddrSpecField = m_pndAddrSpecNumShortAddr & (0x07); // Bits 0-2
345  // Bit 3 (Reserved)
346  pndAddrSpecField |= (m_pndAddrSpecNumExtAddr << 4) & (0x07 << 4); // Bits 4-6
347  // Bit 7 (Reserved)
348 
349  return pndAddrSpecField;
350 }
351 
352 void
354 {
355  uint8_t totalPendAddr = m_pndAddrSpecNumShortAddr + m_pndAddrSpecNumExtAddr;
356 
357  if (totalPendAddr == 7)
358  {
359  return;
360  }
361  else
362  {
365  }
366 }
367 
368 void
370 {
371  uint8_t totalPendAddr = m_pndAddrSpecNumShortAddr + m_pndAddrSpecNumExtAddr;
372 
373  if (totalPendAddr == 7)
374  {
375  return;
376  }
377  else
378  {
381  }
382 }
383 
384 bool
386 {
387  for (int j = 0; j <= m_pndAddrSpecNumShortAddr; j++)
388  {
389  if (shortAddr == m_shortAddrList[j])
390  {
391  return true;
392  }
393  }
394 
395  return false;
396 }
397 
398 
399 bool
401 {
402  for (int j = 0; j <= m_pndAddrSpecNumExtAddr; j++)
403  {
404  if (extAddr == m_extAddrList[j])
405  {
406  return true;
407  }
408  }
409 
410  return false;
411 }
412 
413 
414 void
415 PendingAddrFields::SetPndAddrSpecField (uint8_t pndAddrSpecField)
416 {
417  m_pndAddrSpecNumShortAddr = (pndAddrSpecField) & (0x07); // Bit 0-2
418  // Bit 3
419  m_pndAddrSpecNumExtAddr = (pndAddrSpecField >> 4) & (0x07); // Bit 4-6
420  // Bit 7
421 }
422 
423 
424 uint32_t
426 {
427  uint32_t size;
428 
429  size = 1; // 1 octet (Pending Address Specification Field)
430  size = size + (m_pndAddrSpecNumShortAddr * 2); // X octets (Short Pending Address List)
431  size = size + (m_pndAddrSpecNumExtAddr * 8); // X octets (Extended Pending Address List)
432 
433  return size;
434 }
435 
438 {
440 
441  for (int j = 0; j < m_pndAddrSpecNumShortAddr; j++)
442  {
443  WriteTo (i,m_shortAddrList[j]);
444  }
445 
446  for (int k = 0; k < m_pndAddrSpecNumExtAddr; k++ )
447  {
448  WriteTo (i,m_extAddrList[k]);
449  }
450 
451  return i;
452 }
453 
456 {
457  uint8_t pndAddrSpecField = i.ReadU8 ();
458 
459  SetPndAddrSpecField (pndAddrSpecField);
460 
461  for (int j = 0; j < m_pndAddrSpecNumShortAddr; j++)
462  {
463  ReadFrom (i, m_shortAddrList[j]);
464  }
465 
466  for (int k = 0; k < m_pndAddrSpecNumExtAddr; k++)
467  {
468  ReadFrom (i, m_extAddrList[k]);
469  }
470 
471  return i;
472 }
473 
474 std::ostream &
475 operator << (std::ostream &os, const PendingAddrFields &pendingAddrFields)
476 {
477  os << " Num. Short Addr = " << uint32_t (pendingAddrFields.GetNumShortAddr ())
478  << ", Num. Ext Addr = " << uint32_t (pendingAddrFields.GetNumExtAddr ());
479  return os;
480 }
481 
482 } // ns-3 namespace
ns3::SuperframeField::SetFinalCapSlot
void SetFinalCapSlot(uint8_t capSlot)
Set the superframe specification Final CAP slot field.
Definition: lr-wpan-fields.cc:78
ns3::PendingAddrFields::GetNumShortAddr
uint8_t GetNumShortAddr(void) const
Get the number of Short Pending Address indicated in the Pending Address Specification Field.
Definition: lr-wpan-fields.cc:327
ns3::SuperframeField::GetBeaconOrder
uint8_t GetBeaconOrder(void) const
Get the Superframe Specification Beacon Order field.
Definition: lr-wpan-fields.cc:109
ns3::SuperframeField::IsBattLifeExt
bool IsBattLifeExt(void) const
Check if the Battery Life Extension bit is enabled.
Definition: lr-wpan-fields.cc:127
ns3::SuperframeField::m_sspecBatLifeExt
bool m_sspecBatLifeExt
Superframe Specification field Battery Life Extension (Bit 12) Superframe Specification field Reserve...
Definition: lr-wpan-fields.h:154
ns3::SuperframeField::SetBattLifeExt
void SetBattLifeExt(bool battLifeExt)
Set the Superframe Specification Battery Life Extension (BLE).
Definition: lr-wpan-fields.cc:91
ns3::SuperframeField::m_sspecPanCoor
bool m_sspecPanCoor
Superframe Specification field PAN Coordinator (Bit 14)
Definition: lr-wpan-fields.h:156
ns3::Buffer::Iterator::WriteHtolsbU16
void WriteHtolsbU16(uint16_t data)
Definition: buffer.cc:911
ns3::PendingAddrFields::GetPndAddrSpecField
uint8_t GetPndAddrSpecField(void) const
Get the whole Pending Address Specification Field from the Pending Address Fields.
Definition: lr-wpan-fields.cc:340
ns3::GtsFields::m_gtsList
gtsDescriptor m_gtsList[7]
GTS List field (maximum descriptors stored == 7)
Definition: lr-wpan-fields.h:237
ns3::SuperframeField::m_sspecBcnOrder
uint8_t m_sspecBcnOrder
Superframe Specification field Beacon Order (Bit 0-3)
Definition: lr-wpan-fields.h:151
ns3
Every class exported by the ns3 library is enclosed in the ns3 namespace.
ns3::SuperframeField::SetSuperframeOrder
void SetSuperframeOrder(uint8_t frmOrder)
Set the superframe specification Superframe Order field.
Definition: lr-wpan-fields.cc:65
ns3::PendingAddrFields
Represent the Pending Address Specification field.
Definition: lr-wpan-fields.h:258
ns3::SuperframeField::SuperframeField
SuperframeField()
Definition: lr-wpan-fields.cc:29
ns3::Mac16Address
This class can contain 16 bit addresses.
Definition: mac16-address.h:42
ns3::Buffer::Iterator::ReadU8
uint8_t ReadU8(void)
Definition: buffer.h:1021
ns3::SuperframeField::GetFrameOrder
uint8_t GetFrameOrder(void) const
Get the Superframe Specification Frame Order field.
Definition: lr-wpan-fields.cc:115
ns3::SuperframeField::SetBeaconOrder
void SetBeaconOrder(uint8_t bcnOrder)
Set the superframe specification Beacon Order field.
Definition: lr-wpan-fields.cc:52
ns3::Buffer::Iterator::WriteU8
void WriteU8(uint8_t data)
Definition: buffer.h:869
ns3::GtsFields::SetGtsSpecField
void SetGtsSpecField(uint8_t gtsSpec)
Set the GTS Specification Field to the GTS Fields.
Definition: lr-wpan-fields.cc:230
ns3::GtsFields::m_gtsSpecPermit
uint8_t m_gtsSpecPermit
GTS specification field GTS Permit (Bit 7)
Definition: lr-wpan-fields.h:232
ns3::SuperframeField
Represent the Superframe Specification information field.
Definition: lr-wpan-fields.h:55
ns3::SuperframeField::GetSerializedSize
uint32_t GetSerializedSize(void) const
Get the size of the serialized Superframe specification information field.
Definition: lr-wpan-fields.cc:161
ns3::PendingAddrFields::SetPndAddrSpecField
void SetPndAddrSpecField(uint8_t pndAddrSpecField)
Set the whole Pending Address Specification field.
Definition: lr-wpan-fields.cc:415
ns3::PendingAddrFields::m_pndAddrSpecNumExtAddr
uint8_t m_pndAddrSpecNumExtAddr
Pending Address Specification field Number of Extended Address (Bits 4-6) Pending Address Specificati...
Definition: lr-wpan-fields.h:328
ns3::SuperframeField::m_sspecFnlCapSlot
uint8_t m_sspecFnlCapSlot
Superframe Specification field Final CAP slot (Bit 8-11)
Definition: lr-wpan-fields.h:153
ns3::Mac64Address
an EUI-64 address
Definition: mac64-address.h:44
ns3::SuperframeField::SetPanCoor
void SetPanCoor(bool panCoor)
Set the Superframe Specification PAN coordinator field.
Definition: lr-wpan-fields.cc:97
ns3::PendingAddrFields::Serialize
Buffer::Iterator Serialize(Buffer::Iterator i) const
Serialize the entire Pending Address Fields.
Definition: lr-wpan-fields.cc:437
ns3::GtsFields::SetGtsDirectionField
void SetGtsDirectionField(uint8_t gtsDir)
Set the GTS direction field to the GTS Fields.
Definition: lr-wpan-fields.cc:238
ns3::PendingAddrFields::Deserialize
Buffer::Iterator Deserialize(Buffer::Iterator i)
Deserialize the all the Pending Address Fields.
Definition: lr-wpan-fields.cc:455
ns3::SuperframeField::SetSuperframe
void SetSuperframe(uint16_t superFrm)
Set the whole Superframe Specification Information field.
Definition: lr-wpan-fields.cc:40
bianchi11ax.k
int k
Definition: bianchi11ax.py:129
ns3::SuperframeField::IsPanCoor
bool IsPanCoor(void) const
Check if the PAN Coordinator bit is enabled.
Definition: lr-wpan-fields.cc:133
ns3::PendingAddrFields::m_pndAddrSpecNumShortAddr
uint8_t m_pndAddrSpecNumShortAddr
Pending Address Specification field Number of Short Address (Bits 0-2) Pending Address Specification ...
Definition: lr-wpan-fields.h:326
ns3::SuperframeField::m_sspecSprFrmOrder
uint8_t m_sspecSprFrmOrder
Superframe Specification field Superframe Order (Bit 4-7)
Definition: lr-wpan-fields.h:152
ns3::GtsFields::Deserialize
Buffer::Iterator Deserialize(Buffer::Iterator i)
Deserialize the entire GTS fields.
Definition: lr-wpan-fields.cc:283
ns3::SuperframeField::m_sspecAssocPermit
bool m_sspecAssocPermit
Superframe Specification field Association Permit (Bit 15)
Definition: lr-wpan-fields.h:157
ns3::GtsFields::GetGtsDirectionField
uint8_t GetGtsDirectionField(void) const
Get the GTS Direction Field from the GTS Fields.
Definition: lr-wpan-fields.cc:220
ns3::GtsFields
Represent the GTS information fields.
Definition: lr-wpan-fields.h:176
ns3::SuperframeField::Serialize
Buffer::Iterator Serialize(Buffer::Iterator i) const
Serialize the entire superframe specification field.
Definition: lr-wpan-fields.cc:167
ns3::PendingAddrFields::GetSerializedSize
uint32_t GetSerializedSize(void) const
Get the size of the serialized Pending Address Fields.
Definition: lr-wpan-fields.cc:425
ns3::Buffer::Iterator::ReadLsbtohU16
uint16_t ReadLsbtohU16(void)
Definition: buffer.cc:1066
ns3::Buffer::Iterator
iterator in a Buffer instance
Definition: buffer.h:99
ns3::GtsFields::Serialize
Buffer::Iterator Serialize(Buffer::Iterator i) const
Serialize the entire GTS fields.
Definition: lr-wpan-fields.cc:260
lr-wpan-fields.h
ns3::SuperframeField::Deserialize
Buffer::Iterator Deserialize(Buffer::Iterator i)
Deserialize the entire superframe specification field.
Definition: lr-wpan-fields.cc:174
ns3::PendingAddrFields::SearchAddress
bool SearchAddress(Mac16Address shortAddr)
Search for the short Pending Address in the Address List.
Definition: lr-wpan-fields.cc:385
ns3::WriteTo
void WriteTo(Buffer::Iterator &i, Ipv4Address ad)
Write an Ipv4Address to a Buffer.
Definition: address-utils.cc:28
ns3::SuperframeField::SetAssocPermit
void SetAssocPermit(bool assocPermit)
Set the Superframe Specification Association Permit field.
Definition: lr-wpan-fields.cc:103
ns3::GtsFields::gtsDescriptor::m_gtsDescLength
uint8_t m_gtsDescLength
GTS Descriptor GTS Length (Bit 20-23)
Definition: lr-wpan-fields.h:226
ns3::PendingAddrFields::AddAddress
void AddAddress(Mac16Address shortAddr)
Add a short Pending Address to the Address List.
Definition: lr-wpan-fields.cc:353
ns3::GtsFields::m_gtsDirMask
uint8_t m_gtsDirMask
GTS Direction field Directions Mask (Bit 0-6)
Definition: lr-wpan-fields.h:234
ns3::GtsFields::gtsDescriptor::m_gtsDescStartSlot
uint8_t m_gtsDescStartSlot
GTS Descriptor GTS Starting Slot(Bit 16-19)
Definition: lr-wpan-fields.h:225
ns3::GtsFields::m_gtsSpecDescCount
uint8_t m_gtsSpecDescCount
GTS specification field Descriptor Count (Bit 0-2)
Definition: lr-wpan-fields.h:230
ns3::PendingAddrFields::m_shortAddrList
std::array< Mac16Address, 7 > m_shortAddrList
Pending Short Address List.
Definition: lr-wpan-fields.h:331
ns3::PendingAddrFields::m_extAddrList
std::array< Mac64Address, 7 > m_extAddrList
Pending Extended Address List.
Definition: lr-wpan-fields.h:332
ns3::SuperframeField::GetFinalCapSlot
uint8_t GetFinalCapSlot(void) const
Get the the Final CAP Slot.
Definition: lr-wpan-fields.cc:121
ns3::GtsFields::GetGtsSpecField
uint8_t GetGtsSpecField(void) const
Get the GTS Specification Field from the GTS Fields.
Definition: lr-wpan-fields.cc:208
ns3::PendingAddrFields::GetNumExtAddr
uint8_t GetNumExtAddr(void) const
Get the number of Extended Pending Address indicated in the Pending Address Specification Field.
Definition: lr-wpan-fields.cc:334
ns3::operator<<
std::ostream & operator<<(std::ostream &os, const Angles &a)
Definition: angles.cc:137
ns3::GtsFields::GetSerializedSize
uint32_t GetSerializedSize(void) const
Get the size of the serialized GTS fields.
Definition: lr-wpan-fields.cc:245
ns3::SuperframeField::IsAssocPermit
bool IsAssocPermit(void) const
Check if the Association Permit bit is enabled.
Definition: lr-wpan-fields.cc:139
ns3::SuperframeField::GetSuperframe
uint16_t GetSuperframe(void) const
Get the Superframe specification information field.
Definition: lr-wpan-fields.cc:145
ns3::GtsFields::GtsFields
GtsFields()
Definition: lr-wpan-fields.cc:198
ns3::PendingAddrFields::PendingAddrFields
PendingAddrFields()
Definition: lr-wpan-fields.cc:319
ns3::ReadFrom
void ReadFrom(Buffer::Iterator &i, Ipv4Address &ad)
Read an Ipv4Address from a Buffer.
Definition: address-utils.cc:70