A Discrete-Event Network Simulator
API
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
lr-wpan-mac-header.cc
Go to the documentation of this file.
1 /* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2011 The Boeing Company
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: kwong yin <kwong-sang.yin@boeing.com>
19  */
20 #include "lr-wpan-mac-header.h"
21 #include <ns3/address-utils.h>
22 
23 namespace ns3 {
24 
25 NS_OBJECT_ENSURE_REGISTERED (LrWpanMacHeader);
26 
27 // TODO: Test Compressed PAN Id, Security Enabled, different size Key
28 
30 {
31  SetType (LRWPAN_MAC_DATA); // Assume Data frame
32  SetSecDisable (); // Assume there is No Aux Sec but
33  SetNoFrmPend (); // No Frame Pending
34  SetNoAckReq (); // No Ack Frame will be expected from recepient
35  SetNoPanIdComp (); // No PAN Id Compression since no addresses
36  SetFrmCtrlRes (0); // Initialize the 3 reserved bits to 0
37  SetDstAddrMode (NOADDR); // Assume there will be no src and dst address
39  SetFrameVer (1); //Indicates an IEEE 802.15.4 frame
40 }
41 
42 
44  uint8_t seqNum)
45 {
46  SetType (wpanMacType);
47  SetSeqNum (seqNum);
48  SetSecDisable (); // Assume there is No Aux Sec but
49  SetNoFrmPend (); // No Frame Pending
50  SetNoAckReq (); // No Ack Frame will be expected from recepient
51  SetNoPanIdComp (); // No PAN Id Compression since no addresses
52  SetFrmCtrlRes (0); // Initialize the 3 reserved bits to 0
53  SetDstAddrMode (NOADDR); // Assume there will be no src and dst address
55  SetFrameVer (1); //Indicates an IEEE 802.15.4 frame
56 }
57 
58 
60 {
61 }
62 
63 
66 {
67  switch (m_fctrlFrmType)
68  {
69  case 0:
70  return LRWPAN_MAC_BEACON;
71  break;
72  case 1:
73  return LRWPAN_MAC_DATA;
74  break;
75  case 2:
77  break;
78  case 3:
79  return LRWPAN_MAC_COMMAND;
80  break;
81  default:
82  return LRWPAN_MAC_RESERVED;
83  }
84 }
85 
86 
87 
88 uint16_t
90 {
91  uint16_t val = 0;
92 
93  val = m_fctrlFrmType & (0x07); // Bit 0-2
94  val |= (m_fctrlSecU << 3) & (0x01 << 3); // Bit 3
95  val |= (m_fctrlFrmPending << 4) & (0x01 << 4); // Bit 4
96  val |= (m_fctrlAckReq << 5) & (0x01 << 5); // Bit 5
97  val |= (m_fctrlPanIdComp << 6) & (0x01 << 6); // Bit 6
98  val |= (m_fctrlReserved << 7) & (0x07 << 7); // Bit 7-9
99  val |= (m_fctrlDstAddrMode << 10) & (0x03 << 10); // Bit 10-11
100  val |= (m_fctrlFrmVer << 12) & (0x03 << 12); // Bit 12-13
101  val |= (m_fctrlSrcAddrMode << 14) & (0x03 << 14); // Bit 14-15
102  return val;
103 
104 }
105 
106 bool
108 {
109  return (m_fctrlSecU == 1);
110 }
111 
112 bool
114 {
115  return (m_fctrlSecU == 0);
116 }
117 
118 bool
120 {
121  return (m_fctrlFrmPending == 1);
122 }
123 
124 bool
126 {
127  return (m_fctrlFrmPending == 0);
128 }
129 
130 bool
132 {
133  return (m_fctrlAckReq == 1);
134 }
135 
136 bool
138 {
139  return (m_fctrlAckReq == 0);
140 }
141 
142 bool
144 {
145  return (m_fctrlPanIdComp == 1);
146 }
147 
148 bool
150 {
151  return (m_fctrlPanIdComp == 0);
152 }
153 
154 uint8_t
156 {
157  return (m_fctrlReserved);
158 }
159 
160 uint8_t
162 {
163  return m_fctrlDstAddrMode;
164 }
165 
166 uint8_t
168 {
169  return m_fctrlFrmVer;
170 }
171 
172 uint8_t
174 {
175  return m_fctrlSrcAddrMode;
176 }
177 
178 
179 uint8_t
181 {
182  return(m_SeqNum);
183 }
184 
185 
186 uint16_t
188 {
189  return(m_addrDstPanId);
190 }
191 
192 
195 {
196  return(m_addrShortDstAddr);
197 }
200 {
201  return(m_addrExtDstAddr);
202 }
203 
204 uint16_t
206 {
207  return(m_addrSrcPanId);
208 }
209 
210 
211 
214 {
215  return(m_addrShortSrcAddr);
216 }
219 {
220  return(m_addrExtSrcAddr);
221 }
222 
223 
224 uint8_t
226 {
227  uint8_t val = 0;
228 
229  val = m_secctrlSecLevel & (0x7); // Bit 0-2
230  val |= (m_secctrlKeyIdMode << 3) & (0x3 << 3); // Bit 3-4
231  val |= (m_secctrlReserved << 5) & (0x7 << 5); // Bit 5-7
232 
233  return(val);
234 }
235 
236 uint32_t
238 {
239  return(m_auxFrmCntr);
240 }
241 
242 uint8_t
244 {
245  return (m_secctrlSecLevel);
246 }
247 
248 uint8_t
250 {
251  return(m_secctrlKeyIdMode);
252 }
253 
254 uint8_t
256 {
257  return (m_secctrlReserved);
258 }
259 
260 uint32_t
262 {
263  return(m_auxKeyIdKeySrc32);
264 }
265 
266 uint64_t
268 {
269 
270  return(m_auxKeyIdKeySrc64);
271 }
272 
273 uint8_t
275 {
276  return(m_auxKeyIdKeyIndex);
277 }
278 
279 
280 bool
282 {
284 }
285 
286 
287 
288 bool
290 {
291  return(m_fctrlFrmType == LRWPAN_MAC_DATA);
292 }
293 
294 
295 
296 bool
298 {
300 }
301 
302 
303 
304 bool
306 {
308 }
309 
310 
311 
312 void
314 {
315  m_fctrlFrmType = wpanMacType;
316 }
317 
318 
319 void
320 LrWpanMacHeader::SetFrameControl (uint16_t frameControl)
321 {
322  m_fctrlFrmType = (frameControl) & (0x07); // Bit 0-2
323  m_fctrlSecU = (frameControl >> 3) & (0x01); // Bit 3
324  m_fctrlFrmPending = (frameControl >> 4) & (0x01); // Bit 4
325  m_fctrlAckReq = (frameControl >> 5) & (0x01); // Bit 5
326  m_fctrlPanIdComp = (frameControl >> 6) & (0x01); // Bit 6
327  m_fctrlReserved = (frameControl >> 7) & (0x07); // Bit 7-9
328  m_fctrlDstAddrMode = (frameControl >> 10) & (0x03); // Bit 10-11
329  m_fctrlFrmVer = (frameControl >> 12) & (0x03); // Bit 12-13
330  m_fctrlSrcAddrMode = (frameControl >> 14) & (0x03); // Bit 14-15
331 }
332 
333 
334 void
336 {
337  m_fctrlSecU = 1;
338 }
339 
340 
341 void
343 {
344  m_fctrlSecU = 0;
345 }
346 
347 
348 void
350 {
351  m_fctrlFrmPending = 1;
352 }
353 
354 
355 void
357 {
358  m_fctrlFrmPending = 0;
359 }
360 
361 
362 void
364 {
365  m_fctrlAckReq = 1;
366 }
367 
368 
369 void
371 {
372  m_fctrlAckReq = 0;
373 }
374 
375 
376 void
378 {
379  m_fctrlPanIdComp = 1;
380 }
381 
382 
384 {
385  m_fctrlPanIdComp = 0;
386 }
387 
388 void
390 {
391  m_fctrlReserved = res;
392 }
393 
394 void
396 {
397  m_fctrlDstAddrMode = addrMode;
398 }
399 
400 
401 void
403 {
404  m_fctrlFrmVer = ver;
405 }
406 
407 
408 void
410 {
411  m_fctrlSrcAddrMode = addrMode;
412 }
413 
414 
415 void
417 {
418  m_SeqNum = seqNum;
419 }
420 
421 void
423  Mac16Address addr)
424 {
425  m_addrSrcPanId = panId;
426  m_addrShortSrcAddr = addr;
427 }
428 
429 void
431  Mac64Address addr)
432 {
433  m_addrSrcPanId = panId;
434  m_addrExtSrcAddr = addr;
435 }
436 
437 void
439  Mac16Address addr)
440 {
441  m_addrDstPanId = panId;
442  m_addrShortDstAddr = addr;
443 }
444 void
446  Mac64Address addr)
447 {
448  m_addrDstPanId = panId;
449  m_addrExtDstAddr = addr;
450 }
451 void
452 LrWpanMacHeader::SetSecControl (uint8_t secControl)
453 {
454  m_secctrlSecLevel = (secControl) & (0x07); // Bit 0-2
455  m_secctrlKeyIdMode = (secControl >> 3) & (0x03); // Bit 3-4
456  m_secctrlReserved = (secControl >> 5) & (0x07); // Bit 5-7
457 }
458 
459 void
461 {
462  m_auxFrmCntr = frmCntr;
463 }
464 
465 void
467 {
468  m_secctrlSecLevel = secLevel;
469 }
470 
471 void
472 LrWpanMacHeader::SetKeyIdMode (uint8_t keyIdMode)
473 {
474  m_secctrlKeyIdMode = keyIdMode;
475 }
476 
477 void
479 {
480  m_secctrlReserved = res;
481 }
482 
483 void
484 LrWpanMacHeader::SetKeyId (uint8_t keyIndex)
485 {
486  m_auxKeyIdKeyIndex = keyIndex;
487 }
488 
489 
490 void
491 LrWpanMacHeader::SetKeyId (uint32_t keySrc,
492  uint8_t keyIndex)
493 {
494  m_auxKeyIdKeyIndex = keyIndex;
495  m_auxKeyIdKeySrc32 = keySrc;
496 }
497 
498 
499 void
500 LrWpanMacHeader::SetKeyId (uint64_t keySrc,
501  uint8_t keyIndex)
502 {
503  m_auxKeyIdKeyIndex = keyIndex;
504  m_auxKeyIdKeySrc64 = keySrc;
505 }
506 
507 
508 std::string
510 {
511  return "LrWpan MAC Header";
512 }
513 
514 TypeId
516 {
517  static TypeId tid = TypeId ("ns3::LrWpanMacHeader")
518  .SetParent<Header> ()
519  .AddConstructor<LrWpanMacHeader> ();
520  return tid;
521 }
522 
523 
524 TypeId
526 {
527  return GetTypeId ();
528 }
529 
530 void
531 LrWpanMacHeader::PrintFrameControl (std::ostream &os) const
532 {
533  os << " Frame Type = " << (uint32_t) m_fctrlFrmType << ", Sec Enable = " << (uint32_t) m_fctrlSecU
534  << ", Frame Pending = " << (uint32_t) m_fctrlFrmPending << ", Ack Request = " << (uint32_t) m_fctrlAckReq
535  << ", PAN ID Compress = " << (uint32_t) m_fctrlPanIdComp << ", Frame Vers = " << (uint32_t) m_fctrlFrmVer
536  << ", Dst Addrs Mode = " << (uint32_t) m_fctrlDstAddrMode << ", Src Addr Mode = " << (uint32_t) m_fctrlSrcAddrMode;
537 }
538 
539 void
540 LrWpanMacHeader::Print (std::ostream &os) const
541 {
542  PrintFrameControl (os);
543  os << ", Sequence Num = " << static_cast<uint16_t> (m_SeqNum);
544 
545  switch (m_fctrlDstAddrMode)
546  {
547  case NOADDR:
548  break;
549  case SHORTADDR:
550  os << ", Dst Addr Pan ID = " << static_cast<uint16_t> (m_addrDstPanId)
551  << ", m_addrShortDstAddr = " << m_addrShortDstAddr;
552  break;
553  case EXTADDR:
554  os << ", Dst Addr Pan ID = " << static_cast<uint16_t> (m_addrDstPanId)
555  << ", m_addrExtDstAddr = " << m_addrExtDstAddr;
556  break;
557  }
558 
559  switch (m_fctrlSrcAddrMode)
560  {
561  case NOADDR:
562  break;
563  case SHORTADDR:
564  os << ", Src Addr Pan ID = " << static_cast<uint16_t> (m_addrSrcPanId)
565  << ", m_addrShortSrcAddr = " << m_addrShortSrcAddr;
566  break;
567  case EXTADDR:
568  os << ", Src Addr Pan ID = " << static_cast<uint32_t> (m_addrSrcPanId)
569  << ", m_addrExtSrcAddr = " << m_addrExtDstAddr;
570  break;
571  }
572 
573  if (IsSecEnable ())
574  {
575  os << " Security Level = " << static_cast<uint32_t> (m_secctrlSecLevel)
576  << ", Key Id Mode = " << static_cast<uint32_t> (m_secctrlKeyIdMode)
577  << ", Frame Counter = " << static_cast<uint32_t> (m_auxFrmCntr);
578 
579  switch (m_secctrlKeyIdMode)
580  {
581  case IMPLICIT:
582  break;
583  case NOKEYSOURCE:
584  os << ", Key Id - Key Index = " << static_cast<uint32_t> (m_auxKeyIdKeyIndex);
585  break;
586  case SHORTKEYSOURCE:
587  os << ", Key Id - Key Source 32 =" << static_cast<uint32_t> (m_auxKeyIdKeySrc32)
588  << ", Key Id - Key Index = " << static_cast<uint32_t> (m_auxKeyIdKeyIndex);
589  break;
590  case LONGKEYSOURCE:
591  os << ", Key Id - Key Source 64 =" << static_cast<uint64_t> (m_auxKeyIdKeySrc64)
592  << ", Key Id - Key Index = " << static_cast<uint32_t> (m_auxKeyIdKeyIndex);
593  break;
594  }
595  }
596 }
597 
598 uint32_t
600 {
601  /*
602  * Each mac header will have
603  * Frame Control : 2 octet
604  * Sequence Number : 1 Octet
605  * Dst PAN Id : 0/2 Octet
606  * Dst Address : 0/2/8 octet
607  * Src PAN Id : 0/2 octet
608  * Src Address : 0/2/8 octet
609  * Aux Sec Header : 0/5/6/10/14 octet
610  */
611 
612  uint32_t size = 3;
613 
614  switch (m_fctrlDstAddrMode)
615  {
616  case NOADDR:
617  break;
618  case SHORTADDR:
619  size += 4;
620  break;
621  case EXTADDR:
622  size += 10;
623  break;
624  }
625 
626  switch (m_fctrlSrcAddrMode)
627  {
628  case NOADDR:
629  break;
630  case SHORTADDR:
631  // check if PAN Id compression is enabled
632  if (IsNoPanIdComp ())
633  {
634  size += 4;
635  }
636  else
637  {
638  size += 2;
639  }
640  break;
641  case EXTADDR:
642  // check if PAN Id compression is enabled
643  if (IsNoPanIdComp ())
644  {
645  size += 10;
646  }
647  else
648  {
649  size += 8;
650  }
651  break;
652  }
653 
654 
655  // check if security is enabled
656  if (IsSecEnable ())
657  {
658  size += 5;
659  switch (m_secctrlKeyIdMode)
660  {
661  case IMPLICIT:
662  break;
663  case NOKEYSOURCE:
664  size += 1;
665  break;
666  case SHORTKEYSOURCE:
667  size += 5;
668  break;
669  case LONGKEYSOURCE:
670  size += 9;
671  break;
672  }
673  }
674  return (size);
675 }
676 
677 
678 void
680 {
682  uint16_t frameControl = GetFrameControl ();
683 
684  i.WriteHtolsbU16 (frameControl);
685  i.WriteU8 (GetSeqNum ());
686 
687  switch (m_fctrlDstAddrMode)
688  {
689  case NOADDR:
690  break;
691  case SHORTADDR:
694  break;
695  case EXTADDR:
698  break;
699  }
700 
701  switch (m_fctrlSrcAddrMode)
702  {
703  case NOADDR:
704  break;
705  case SHORTADDR:
706  if (IsNoPanIdComp ())
707  {
709  }
711  break;
712  case EXTADDR:
713  if (IsNoPanIdComp ())
714  {
716  }
718  break;
719  }
720 
721  if (IsSecEnable ())
722  {
723  i.WriteU8 (GetSecControl ());
725 
726  switch (m_secctrlKeyIdMode)
727  {
728  case IMPLICIT:
729  break;
730  case NOKEYSOURCE:
731  i.WriteU8 (GetKeyIdIndex ());
732  break;
733  case SHORTKEYSOURCE:
735  i.WriteU8 (GetKeyIdIndex ());
736  break;
737  case LONGKEYSOURCE:
739  i.WriteU8 (GetKeyIdIndex ());
740  break;
741  }
742  }
743 }
744 
745 
746 uint32_t
748 {
749 
751  uint16_t frameControl = i.ReadLsbtohU16 ();
752  SetFrameControl (frameControl);
753 
754  SetSeqNum (i.ReadU8 ());
755  switch (m_fctrlDstAddrMode)
756  {
757  case NOADDR:
758  break;
759  case SHORTADDR:
762  break;
763  case EXTADDR:
766  break;
767  }
768 
769  switch (m_fctrlSrcAddrMode)
770  {
771  case NOADDR:
772  break;
773  case SHORTADDR:
774  if (IsNoPanIdComp ())
775  {
777  }
778  else
779  {
780  if (m_fctrlDstAddrMode > 0)
781  {
783  }
784  }
786  break;
787  case EXTADDR:
788  if (IsNoPanIdComp ())
789  {
791  }
792  else
793  {
794  if (m_fctrlDstAddrMode > 0)
795  {
797  }
798  }
800  break;
801  }
802 
803  if (IsSecEnable ())
804  {
805  SetSecControl (i.ReadU8 ());
807 
808  switch (m_secctrlKeyIdMode)
809  {
810  case IMPLICIT:
811  break;
812  case NOKEYSOURCE:
813  SetKeyId (i.ReadU8 ());
814  break;
815  case SHORTKEYSOURCE:
816  SetKeyId (i.ReadLsbtohU32 (),i.ReadU8 ());
817  break;
818  case LONGKEYSOURCE:
819  SetKeyId (i.ReadLsbtohU64 (),i.ReadU8 ());
820  break;
821  }
822  }
823  return i.GetDistanceFrom (start);
824 }
825 
826 // ----------------------------------------------------------------------------------------------------------
827 
828 
829 } //namespace ns3
830 
831 
Protocol header serialization and deserialization.
Definition: header.h:42
std::string GetName(void) const
bool IsPanIdComp(void) const
uint8_t GetKeyIdMode(void) const
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register the class in the ns-3 factory.
Definition: object-base.h:38
void SetKeyId(uint8_t keyIndex)
void ReadFrom(Buffer::Iterator &i, Ipv4Address &ad)
Read an Ipv4Address from a Buffer.
uint32_t GetKeyIdSrc32(void) const
void WriteTo(Buffer::Iterator &i, Ipv4Address ad)
Write an Ipv4Address to a Buffer.
uint8_t GetSecLevel(void) const
Mac16Address m_addrShortDstAddr
void SetSeqNum(uint8_t seqNum)
bool IsBeacon(void) const
Mac16Address GetShortSrcAddr(void) const
void SetFrmCounter(uint32_t frmCntr)
uint32_t GetDistanceFrom(Iterator const &o) const
Definition: buffer.cc:811
bool IsNoAckReq(void) const
iterator in a Buffer instance
Definition: buffer.h:98
void SetSrcAddrFields(uint16_t panId, Mac16Address addr)
an EUI-64 address
Definition: mac64-address.h:41
bool IsData(void) const
void SetKeyIdMode(uint8_t keyIdMode)
uint8_t GetFrmCtrlRes(void) const
void Serialize(Buffer::Iterator start) const
void PrintFrameControl(std::ostream &os) const
uint8_t GetsecctrlReserved(void) const
uint16_t GetFrameControl(void) const
Mac64Address GetExtDstAddr(void) const
uint32_t GetSerializedSize(void) const
void SetFrameVer(uint8_t ver)
uint8_t GetSecControl(void) const
bool IsSecEnable(void) const
bool IsAckReq(void) const
void SetType(enum LrWpanMacType wpanMacType)
void SetFrmCtrlRes(uint8_t res)
uint8_t GetSrcAddrMode(void) const
Mac16Address m_addrShortSrcAddr
void SetDstAddrMode(uint8_t addrMode)
void Print(std::ostream &os) const
bool IsAcknowledgment(void) const
Mac16Address GetShortDstAddr(void) const
uint16_t GetSrcPanId(void) const
bool IsNoPanIdComp(void) const
uint64_t GetKeyIdSrc64(void) const
bool IsFrmPend(void) const
This class can contain 16 bit addresses.
Definition: mac16-address.h:39
void SetDstAddrFields(uint16_t panId, Mac16Address addr)
void SetSecControl(uint8_t secLevel)
void WriteHtolsbU16(uint16_t data)
Definition: buffer.cc:939
uint8_t GetFrameVer(void) const
virtual TypeId GetInstanceTypeId(void) const
Mac64Address GetExtSrcAddr(void) const
uint8_t GetKeyIdIndex(void) const
uint32_t Deserialize(Buffer::Iterator start)
uint32_t GetFrmCounter(void) const
void WriteU8(uint8_t data)
Definition: buffer.h:876
void SetsecctrlReserved(uint8_t res)
void WriteHtolsbU64(uint64_t data)
Definition: buffer.cc:955
void SetFrameControl(uint16_t frameControl)
bool IsCommand(void) const
void SetSrcAddrMode(uint8_t addrMode)
static TypeId GetTypeId(void)
uint8_t ReadU8(void)
Definition: buffer.h:1028
uint8_t GetSeqNum(void) const
bool IsNoFrmPend(void) const
uint16_t ReadLsbtohU16(void)
Definition: buffer.cc:1094
enum LrWpanMacType GetType(void) const
bool IsSecDisable(void) const
uint64_t ReadLsbtohU64(void)
Definition: buffer.cc:1122
void SetSecLevel(uint8_t secLevel)
a unique identifier for an interface.
Definition: type-id.h:49
TypeId SetParent(TypeId tid)
Definition: type-id.cc:610
uint8_t GetDstAddrMode(void) const
uint32_t ReadLsbtohU32(void)
Definition: buffer.cc:1105
uint16_t GetDstPanId(void) const
void WriteHtolsbU32(uint32_t data)
Definition: buffer.cc:946