A Discrete-Event Network Simulator
API
Loading...
Searching...
No Matches
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
26namespace ns3
27{
28
29NS_OBJECT_ENSURE_REGISTERED(LrWpanMacTrailer);
30
32constexpr uint16_t LR_WPAN_MAC_FCS_LENGTH = 2;
33
35 : m_fcs(0),
36 m_calcFcs(false)
37{
38}
39
42{
43 static TypeId tid = TypeId("ns3::LrWpanMacTrailer")
45 .SetGroupName("LrWpan")
46 .AddConstructor<LrWpanMacTrailer>();
47 return tid;
48}
49
52{
53 return GetTypeId();
54}
55
56void
57LrWpanMacTrailer::Print(std::ostream& os) const
58{
59 os << " FCS = " << m_fcs;
60}
61
64{
66}
67
68void
70{
71 start.Prev(LR_WPAN_MAC_FCS_LENGTH);
72 start.WriteU16(m_fcs);
73}
74
77{
78 start.Prev(LR_WPAN_MAC_FCS_LENGTH);
79 m_fcs = start.ReadU16();
80
82}
83
84uint16_t
86{
87 return m_fcs;
88}
89
90void
92{
93 if (m_calcFcs)
94 {
95 uint16_t size = p->GetSize();
96 uint8_t* 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 */
107bool
109{
110 if (!m_calcFcs)
111 {
112 return true;
113 }
114 else
115 {
116 uint16_t checkFcs;
117 uint16_t size = p->GetSize();
118 uint8_t* 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
128void
130{
131 m_calcFcs = enable;
132 if (!enable)
133 {
134 m_fcs = 0;
135 }
136}
137
138bool
140{
141 return m_calcFcs;
142}
143
144uint16_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.
Smart pointer class similar to boost::intrusive_ptr.
Definition: ptr.h:78
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:936
#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]