A Discrete-Event Network Simulator
API
lr-wpan-mac-trailer.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2011 The Boeing Company
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  * kwong yin <kwong-sang.yin@boeing.com>
19  * Sascha Alexander Jopen <jopen@cs.uni-bonn.de>
20  * Erwan Livolant <erwan.livolant@inria.fr>
21  */
22 #include "lr-wpan-mac-trailer.h"
23 
24 #include <ns3/packet.h>
25 
26 namespace ns3
27 {
28 
29 NS_OBJECT_ENSURE_REGISTERED(LrWpanMacTrailer);
30 
32 constexpr uint16_t LR_WPAN_MAC_FCS_LENGTH = 2;
33 
35  : m_fcs(0),
36  m_calcFcs(false)
37 {
38 }
39 
40 TypeId
42 {
43  static TypeId tid = TypeId("ns3::LrWpanMacTrailer")
44  .SetParent<Trailer>()
45  .SetGroupName("LrWpan")
46  .AddConstructor<LrWpanMacTrailer>();
47  return tid;
48 }
49 
50 TypeId
52 {
53  return GetTypeId();
54 }
55 
56 void
57 LrWpanMacTrailer::Print(std::ostream& os) const
58 {
59  os << " FCS = " << m_fcs;
60 }
61 
62 uint32_t
64 {
66 }
67 
68 void
70 {
72  start.WriteU16(m_fcs);
73 }
74 
75 uint32_t
77 {
79  m_fcs = start.ReadU16();
80 
82 }
83 
84 uint16_t
86 {
87  return m_fcs;
88 }
89 
90 void
92 {
93  if (m_calcFcs)
94  {
95  uint16_t size = p->GetSize();
96  auto serial_packet = new uint8_t[size];
97 
98  p->CopyData(serial_packet, size);
99 
100  m_fcs = GenerateCrc16(serial_packet, size);
101  delete[] serial_packet;
102  }
103 }
104 
105 /* Be sure to have removed the trailer and only the trailer
106  * from the packet before to use CheckFcs */
107 bool
109 {
110  if (!m_calcFcs)
111  {
112  return true;
113  }
114  else
115  {
116  uint16_t checkFcs;
117  uint16_t size = p->GetSize();
118  auto serial_packet = new uint8_t[size];
119 
120  p->CopyData(serial_packet, size);
121 
122  checkFcs = GenerateCrc16(serial_packet, size);
123  delete[] serial_packet;
124  return (checkFcs == GetFcs());
125  }
126 }
127 
128 void
130 {
131  m_calcFcs = enable;
132  if (!enable)
133  {
134  m_fcs = 0;
135  }
136 }
137 
138 bool
140 {
141  return m_calcFcs;
142 }
143 
144 uint16_t
146 {
147  int i;
148  uint16_t accumulator = 0;
149 
150  for (i = 0; i < length; ++i)
151  {
152  accumulator ^= *data;
153  accumulator = (accumulator >> 8) | (accumulator << 8);
154  accumulator ^= (accumulator & 0xff00) << 4;
155  accumulator ^= (accumulator >> 8) >> 4;
156  accumulator ^= (accumulator & 0xff00) >> 5;
157  ++data;
158  }
159  return accumulator;
160 }
161 
162 } // namespace ns3
iterator in a Buffer instance
Definition: buffer.h:100
Represent the Mac Trailer with the Frame Check Sequence field.
bool m_calcFcs
Only if m_calcFcs is true, FCS values will be calculated and used in the trailer.
uint32_t GetSerializedSize() const override
static TypeId GetTypeId()
Get the type ID.
uint16_t GenerateCrc16(uint8_t *data, int length)
Calculate the 16-bit FCS value.
uint16_t m_fcs
The FCS value stored in this trailer.
LrWpanMacTrailer()
Default constructor for a MAC trailer with disabled FCS calculation.
uint32_t Deserialize(Buffer::Iterator start) override
uint16_t GetFcs() const
Get this trailers FCS value.
void SetFcs(Ptr< const Packet > p)
Calculate and set the FCS value based on the given packet.
void Serialize(Buffer::Iterator start) const override
bool CheckFcs(Ptr< const Packet > p)
Check the FCS of a given packet against the FCS value stored in the trailer.
void Print(std::ostream &os) const override
void EnableFcs(bool enable)
Enable or disable FCS calculation for this trailer.
TypeId GetInstanceTypeId() const override
Get the most derived TypeId for this Object.
bool IsFcsEnabled() const
Query if FCS calculation is enabled for this trailer.
uint32_t GetSize() const
Returns the the size in bytes of the packet (including the zero-filled initial payload).
Definition: packet.h:861
uint32_t CopyData(uint8_t *buffer, uint32_t size) const
Copy the packet contents to a byte buffer.
Definition: packet.cc:400
Protocol trailer serialization and deserialization.
Definition: trailer.h:41
a unique identifier for an interface.
Definition: type-id.h:59
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition: type-id.cc:931
#define NS_OBJECT_ENSURE_REGISTERED(type)
Register an Object subclass with the TypeId system.
Definition: object-base.h:46
Every class exported by the ns3 library is enclosed in the ns3 namespace.
constexpr uint16_t LR_WPAN_MAC_FCS_LENGTH
The length in octets of the IEEE 802.15.4 MAC FCS field.
uint8_t data[writeSize]