A Discrete-Event Network Simulator
Home
Tutorials ▼
English
Documentation ▼
Installation
Manual
Models
Contributing
Wiki
Development ▼
API Docs
Issue Tracker
Merge Requests
API
Loading...
Searching...
No Matches
zigbee-aps-header.cc
Go to the documentation of this file.
1
/*
2
* Copyright (c) 2025 Tokushima University, Japan
3
*
4
* SPDX-License-Identifier: GPL-2.0-only
5
*
6
* Authors:
7
* Alberto Gallegos Ramonet <alramonet@is.tokushima-u.ac.jp>
8
*/
9
10
#include "
zigbee-aps-header.h
"
11
12
#include "ns3/address-utils.h"
13
14
namespace
ns3
15
{
16
namespace
zigbee
17
{
18
19
ZigbeeApsHeader::ZigbeeApsHeader
()
20
{
21
m_frameType
=
ApsFrameType::APS_DATA
;
22
m_deliveryMode
=
ApsDeliveryMode::APS_UCST
;
23
m_ackFormat
=
false
;
24
m_security
=
false
;
25
m_ackRequest
=
false
;
26
m_extHeaderPresent
=
false
;
27
}
28
29
ZigbeeApsHeader::~ZigbeeApsHeader
()
30
{
31
}
32
33
void
34
ZigbeeApsHeader::SetFrameType
(
enum
ApsFrameType
type)
35
{
36
m_frameType
= type;
37
}
38
39
ApsFrameType
40
ZigbeeApsHeader::GetFrameType
()
const
41
{
42
return
m_frameType
;
43
}
44
45
void
46
ZigbeeApsHeader::SetDeliveryMode
(
enum
ApsDeliveryMode
mode)
47
{
48
m_deliveryMode
= mode;
49
}
50
51
ApsDeliveryMode
52
ZigbeeApsHeader::GetDeliveryMode
()
const
53
{
54
return
m_deliveryMode
;
55
}
56
57
void
58
ZigbeeApsHeader::SetSecurity
(
bool
enabled)
59
{
60
m_security
= enabled;
61
}
62
63
bool
64
ZigbeeApsHeader::IsSecurityEnabled
()
const
65
{
66
return
m_security
;
67
}
68
69
void
70
ZigbeeApsHeader::SetAckRequest
(
bool
ack)
71
{
72
m_ackRequest
= ack;
73
}
74
75
bool
76
ZigbeeApsHeader::IsAckRequested
()
const
77
{
78
return
m_ackRequest
;
79
}
80
81
void
82
ZigbeeApsHeader::SetExtHeaderPresent
(
bool
present)
83
{
84
m_extHeaderPresent
= present;
85
}
86
87
bool
88
ZigbeeApsHeader::IsExtHeaderPresent
()
const
89
{
90
return
m_extHeaderPresent
;
91
}
92
93
void
94
ZigbeeApsHeader::SetDstEndpoint
(uint8_t dst)
95
{
96
m_dstEndpoint
= dst;
97
}
98
99
uint8_t
100
ZigbeeApsHeader::GetDstEndpoint
()
const
101
{
102
return
m_dstEndpoint
;
103
}
104
105
void
106
ZigbeeApsHeader::SetClusterId
(uint16_t clusterId)
107
{
108
m_clusterId
= clusterId;
109
}
110
111
uint16_t
112
ZigbeeApsHeader::GetClusterId
()
const
113
{
114
return
m_clusterId
;
115
}
116
117
void
118
ZigbeeApsHeader::SetProfileId
(uint16_t profileId)
119
{
120
m_profileId
= profileId;
121
}
122
123
uint16_t
124
ZigbeeApsHeader::GetProfileId
()
const
125
{
126
return
m_profileId
;
127
}
128
129
void
130
ZigbeeApsHeader::SetSrcEndpoint
(uint8_t src)
131
{
132
m_srcEndpoint
= src;
133
}
134
135
uint8_t
136
ZigbeeApsHeader::GetSrcEndpoint
()
const
137
{
138
return
m_srcEndpoint
;
139
}
140
141
void
142
ZigbeeApsHeader::SetApsCounter
(uint8_t counter)
143
{
144
m_apsCounter
= counter;
145
}
146
147
uint8_t
148
ZigbeeApsHeader::GetApsCounter
()
const
149
{
150
return
m_apsCounter
;
151
}
152
153
void
154
ZigbeeApsHeader::Serialize
(
Buffer::Iterator
start)
const
155
{
156
Buffer::Iterator
i = start;
157
158
// Frame control field
159
uint8_t frameControl = (
m_frameType
& 0x03) | ((
m_deliveryMode
& 0x03) << 2) |
160
((
m_ackFormat
? 1 : 0) << 4) | ((
m_security
? 1 : 0) << 5) |
161
((
m_ackRequest
? 1 : 0) << 6) | ((
m_extHeaderPresent
? 1 : 0) << 7);
162
163
i.
WriteU8
(frameControl);
164
165
// Addressing fields
166
167
if
(
m_deliveryMode
==
ApsDeliveryMode::APS_UCST
||
m_deliveryMode
==
ApsDeliveryMode::APS_BCST
)
168
{
169
i.
WriteU8
(
m_dstEndpoint
);
170
}
171
172
if
(
m_deliveryMode
==
ApsDeliveryMode::APS_GROUP_ADDRESSING
)
173
{
174
i.
WriteHtolsbU16
(
m_groupAddress
);
175
}
176
177
if
(
m_frameType
==
ApsFrameType::APS_DATA
||
m_frameType
==
ApsFrameType::APS_ACK
)
178
{
179
i.
WriteHtolsbU16
(
m_clusterId
);
180
i.
WriteHtolsbU16
(
m_profileId
);
181
}
182
183
if
(
m_frameType
==
ApsFrameType::APS_DATA
)
184
{
185
i.
WriteU8
(
m_srcEndpoint
);
186
}
187
188
i.
WriteU8
(
m_apsCounter
);
189
190
// Extended Header
191
192
if
(
m_extHeaderPresent
)
193
{
194
// Extended Frame control field
195
uint8_t extFrameControl = (
m_fragmentation
& 0x03);
196
i.
WriteU8
(extFrameControl);
197
198
// Block control
199
if
(
m_fragmentation
!=
ApsFragmentation::NOT_FRAGMENTED
)
200
{
201
i.
WriteU8
(
m_blockNumber
);
202
}
203
// ACK Bitfield
204
if
(
m_frameType
==
ApsFrameType::APS_ACK
)
205
{
206
i.
WriteU8
(
m_ackBitfield
);
207
}
208
}
209
}
210
211
uint32_t
212
ZigbeeApsHeader::Deserialize
(
Buffer::Iterator
start)
213
{
214
Buffer::Iterator
i = start;
215
216
uint8_t frameControl = i.
ReadU8
();
217
m_frameType
=
static_cast<
ApsFrameType
>
(frameControl & 0x03);
218
m_deliveryMode
=
static_cast<
ApsDeliveryMode
>
((frameControl >> 2) & 0x03);
219
m_ackFormat
= (frameControl >> 4) & 0x01;
220
m_security
= (frameControl >> 5) & 0x01;
221
m_ackRequest
= (frameControl >> 6) & 0x01;
222
m_extHeaderPresent
= (frameControl >> 7) & 0x01;
223
224
// Addressing fields
225
226
if
(
m_deliveryMode
==
ApsDeliveryMode::APS_UCST
||
m_deliveryMode
==
ApsDeliveryMode::APS_BCST
)
227
{
228
m_dstEndpoint
= i.
ReadU8
();
229
}
230
231
if
(
m_deliveryMode
==
ApsDeliveryMode::APS_GROUP_ADDRESSING
)
232
{
233
m_groupAddress
= i.
ReadLsbtohU16
();
234
}
235
236
if
(
m_frameType
==
ApsFrameType::APS_DATA
||
m_frameType
==
ApsFrameType::APS_ACK
)
237
{
238
m_clusterId
= i.
ReadLsbtohU16
();
239
m_profileId
= i.
ReadLsbtohU16
();
240
}
241
242
if
(
m_frameType
==
ApsFrameType::APS_DATA
)
243
{
244
m_srcEndpoint
= i.
ReadU8
();
245
}
246
247
m_apsCounter
= i.
ReadU8
();
248
249
// Extended Header
250
251
if
(
m_extHeaderPresent
)
252
{
253
// Extended Frame control field
254
uint8_t extFrameControl = i.
ReadU8
();
255
m_fragmentation
=
static_cast<
ApsFragmentation
>
(extFrameControl & 0x03);
256
257
// Block control
258
if
(
m_fragmentation
!=
ApsFragmentation::NOT_FRAGMENTED
)
259
{
260
m_blockNumber
= i.
ReadU8
();
261
}
262
// ACK Bitfield
263
if
(
m_frameType
==
ApsFrameType::APS_ACK
)
264
{
265
m_ackBitfield
= i.
ReadU8
();
266
}
267
}
268
269
return
i.
GetDistanceFrom
(start);
270
}
271
272
uint32_t
273
ZigbeeApsHeader::GetSerializedSize
()
const
274
{
275
uint8_t totalSize;
276
// See Zigbee Specification r22.1.0
277
278
// Fixed field:
279
// Frame Control (1) + APS Counter (1)
280
totalSize = 2;
281
282
// Variable Fields:
283
// Destination EndPoint field (1) (Section 2.2.5.1.2)
284
if
(
m_deliveryMode
==
ApsDeliveryMode::APS_UCST
||
m_deliveryMode
==
ApsDeliveryMode::APS_BCST
)
285
{
286
totalSize += 1;
287
}
288
289
// Group Address field (2) (Section 2.2.5.1.3)
290
if
(
m_deliveryMode
==
ApsDeliveryMode::APS_GROUP_ADDRESSING
)
291
{
292
totalSize += 2;
293
}
294
295
// Cluster identifier field and Profile identifier field (4)
296
// (Sections 2.2.5.1.4 and 2.2.5.15)
297
if
(
m_frameType
==
ApsFrameType::APS_DATA
||
m_frameType
==
ApsFrameType::APS_ACK
)
298
{
299
totalSize += 4;
300
}
301
302
// Source Endpoint field (1) (Section 2.2.5.1.6)
303
if
(
m_frameType
==
ApsFrameType::APS_DATA
)
304
{
305
totalSize += 1;
306
}
307
308
// Extended header sub-frame (variable)
309
if
(
m_extHeaderPresent
)
310
{
311
// Extended Frame control field (1)
312
totalSize += 1;
313
314
// Block control (1)
315
if
(
m_fragmentation
!=
ApsFragmentation::NOT_FRAGMENTED
)
316
{
317
totalSize += 1;
318
}
319
// ACK Bitfield
320
if
(
m_frameType
==
ApsFrameType::APS_ACK
)
321
{
322
totalSize += 1;
323
}
324
}
325
326
return
totalSize;
327
}
328
329
TypeId
330
ZigbeeApsHeader::GetTypeId
()
331
{
332
static
TypeId
tid =
TypeId
(
"ns3::zigbee::ZigbeeApsHeader"
)
333
.
SetParent
<
Header
>()
334
.SetGroupName(
"Zigbee"
)
335
.AddConstructor<
ZigbeeApsHeader
>();
336
return
tid;
337
}
338
339
TypeId
340
ZigbeeApsHeader::GetInstanceTypeId
()
const
341
{
342
return
GetTypeId
();
343
}
344
345
void
346
ZigbeeApsHeader::Print
(std::ostream& os)
const
347
{
348
// TODO:
349
/* os << "\nAPS Frame Control = " << std::hex << std::showbase << static_cast<uint32_t>(
350
(m_frameType & 0x03) |
351
((m_deliveryMode & 0x03) << 2) |
352
((m_ackFormat ? 1 : 0) << 4) |
353
((m_security ? 1 : 0) << 5) |
354
((m_ackRequest ? 1 : 0) << 6) |
355
((m_extHeader ? 1 : 0) << 7));
356
357
os << " | Dst EP = " << static_cast<uint32_t>(m_dstEndpoint)
358
<< " | Src EP = " << static_cast<uint32_t>(m_srcEndpoint)
359
<< " | Cluster ID = " << m_clusterId
360
<< " | Profile ID = " << m_profileId
361
<< " | Counter = " << static_cast<uint32_t>(m_counter);
362
os << "\n";*/
363
}
364
365
}
// namespace zigbee
366
}
// namespace ns3
ns3::Buffer::Iterator
iterator in a Buffer instance
Definition
buffer.h:89
ns3::Buffer::Iterator::WriteHtolsbU16
void WriteHtolsbU16(uint16_t data)
Definition
buffer.cc:891
ns3::Buffer::Iterator::ReadU8
uint8_t ReadU8()
Definition
buffer.h:1016
ns3::Buffer::Iterator::WriteU8
void WriteU8(uint8_t data)
Definition
buffer.h:870
ns3::Buffer::Iterator::ReadLsbtohU16
uint16_t ReadLsbtohU16()
Definition
buffer.cc:1053
ns3::Buffer::Iterator::GetDistanceFrom
uint32_t GetDistanceFrom(const Iterator &o) const
Definition
buffer.cc:769
ns3::Header
Protocol header serialization and deserialization.
Definition
header.h:33
ns3::TypeId
a unique identifier for an interface.
Definition
type-id.h:49
ns3::TypeId::SetParent
TypeId SetParent(TypeId tid)
Set the parent TypeId.
Definition
type-id.cc:1001
ns3::zigbee::ZigbeeApsHeader
Defines the APS header use by data transfer and commands issued from the APS layer.
Definition
zigbee-aps-header.h:70
ns3::zigbee::ZigbeeApsHeader::SetSecurity
void SetSecurity(bool enabled)
Set whether or not security should be used to transmit the frame.
Definition
zigbee-aps-header.cc:58
ns3::zigbee::ZigbeeApsHeader::SetDstEndpoint
void SetDstEndpoint(uint8_t endpoint)
Set the destination endpoint in the APS header.
Definition
zigbee-aps-header.cc:94
ns3::zigbee::ZigbeeApsHeader::GetClusterId
uint16_t GetClusterId() const
Get the cluster id in the APS header.
Definition
zigbee-aps-header.cc:112
ns3::zigbee::ZigbeeApsHeader::SetDeliveryMode
void SetDeliveryMode(enum ApsDeliveryMode mode)
Defines the mode in which this frame should be transmitted.
Definition
zigbee-aps-header.cc:46
ns3::zigbee::ZigbeeApsHeader::IsExtHeaderPresent
bool IsExtHeaderPresent() const
Indicates whether or not the extended header is present in the frame.
Definition
zigbee-aps-header.cc:88
ns3::zigbee::ZigbeeApsHeader::SetFrameType
void SetFrameType(enum ApsFrameType frameType)
Set the Frame type defined in the APS layer.
Definition
zigbee-aps-header.cc:34
ns3::zigbee::ZigbeeApsHeader::m_blockNumber
uint8_t m_blockNumber
Extended header field: Block number.
Definition
zigbee-aps-header.h:257
ns3::zigbee::ZigbeeApsHeader::IsSecurityEnabled
bool IsSecurityEnabled() const
Returns whether or not security is enabled for the present frame.alignas.
Definition
zigbee-aps-header.cc:64
ns3::zigbee::ZigbeeApsHeader::GetInstanceTypeId
TypeId GetInstanceTypeId() const override
Get the most derived TypeId for this Object.
Definition
zigbee-aps-header.cc:340
ns3::zigbee::ZigbeeApsHeader::m_groupAddress
uint16_t m_groupAddress
Addressing field: Group or 16-bit address.
Definition
zigbee-aps-header.h:248
ns3::zigbee::ZigbeeApsHeader::m_fragmentation
ApsFragmentation m_fragmentation
Extended header field: Fragmentation block type.
Definition
zigbee-aps-header.h:256
ns3::zigbee::ZigbeeApsHeader::SetSrcEndpoint
void SetSrcEndpoint(uint8_t endpoint)
Set the source endpoint in the APS header.
Definition
zigbee-aps-header.cc:130
ns3::zigbee::ZigbeeApsHeader::SetExtHeaderPresent
void SetExtHeaderPresent(bool present)
Enables or disables the usage of the extended header.
Definition
zigbee-aps-header.cc:82
ns3::zigbee::ZigbeeApsHeader::m_srcEndpoint
uint8_t m_srcEndpoint
Addressing field: Source endpoint.
Definition
zigbee-aps-header.h:251
ns3::zigbee::ZigbeeApsHeader::~ZigbeeApsHeader
~ZigbeeApsHeader() override
Definition
zigbee-aps-header.cc:29
ns3::zigbee::ZigbeeApsHeader::m_clusterId
uint16_t m_clusterId
Addressing field: Cluster ID.
Definition
zigbee-aps-header.h:249
ns3::zigbee::ZigbeeApsHeader::m_deliveryMode
ApsDeliveryMode m_deliveryMode
Frame control field: Delivery mode.
Definition
zigbee-aps-header.h:240
ns3::zigbee::ZigbeeApsHeader::m_profileId
uint16_t m_profileId
Addressing field: Profile ID.
Definition
zigbee-aps-header.h:250
ns3::zigbee::ZigbeeApsHeader::GetDeliveryMode
ApsDeliveryMode GetDeliveryMode() const
Get the transmission mode set on the header.
Definition
zigbee-aps-header.cc:52
ns3::zigbee::ZigbeeApsHeader::ZigbeeApsHeader
ZigbeeApsHeader()
Definition
zigbee-aps-header.cc:19
ns3::zigbee::ZigbeeApsHeader::m_extHeaderPresent
bool m_extHeaderPresent
Frame control field: Extended header present.
Definition
zigbee-aps-header.h:244
ns3::zigbee::ZigbeeApsHeader::GetApsCounter
uint8_t GetApsCounter() const
Get the APS counter value present in the APS header.
Definition
zigbee-aps-header.cc:148
ns3::zigbee::ZigbeeApsHeader::SetApsCounter
void SetApsCounter(uint8_t counter)
Set the value of the APS counter in the APS header.
Definition
zigbee-aps-header.cc:142
ns3::zigbee::ZigbeeApsHeader::SetAckRequest
void SetAckRequest(bool request)
Set the acknowledment flag in the APS header.
Definition
zigbee-aps-header.cc:70
ns3::zigbee::ZigbeeApsHeader::SetClusterId
void SetClusterId(uint16_t clusterId)
Set the cluster id in the APS header.
Definition
zigbee-aps-header.cc:106
ns3::zigbee::ZigbeeApsHeader::m_ackFormat
bool m_ackFormat
Frame control field: Acknowledgment format.
Definition
zigbee-aps-header.h:241
ns3::zigbee::ZigbeeApsHeader::GetSerializedSize
uint32_t GetSerializedSize() const override
Definition
zigbee-aps-header.cc:273
ns3::zigbee::ZigbeeApsHeader::GetSrcEndpoint
uint8_t GetSrcEndpoint() const
Get the source endpoint in the APS header.
Definition
zigbee-aps-header.cc:136
ns3::zigbee::ZigbeeApsHeader::m_dstEndpoint
uint8_t m_dstEndpoint
Addressing field: Destination endpoint.
Definition
zigbee-aps-header.h:247
ns3::zigbee::ZigbeeApsHeader::Deserialize
uint32_t Deserialize(Buffer::Iterator start) override
Definition
zigbee-aps-header.cc:212
ns3::zigbee::ZigbeeApsHeader::GetDstEndpoint
uint8_t GetDstEndpoint() const
Get the destination endpoint in the APS header.
Definition
zigbee-aps-header.cc:100
ns3::zigbee::ZigbeeApsHeader::GetFrameType
ApsFrameType GetFrameType() const
Get the frame time present in the header.
Definition
zigbee-aps-header.cc:40
ns3::zigbee::ZigbeeApsHeader::m_ackRequest
bool m_ackRequest
Frame control field: Acknowledge requested.
Definition
zigbee-aps-header.h:243
ns3::zigbee::ZigbeeApsHeader::m_apsCounter
uint8_t m_apsCounter
APS counter field.
Definition
zigbee-aps-header.h:253
ns3::zigbee::ZigbeeApsHeader::Print
void Print(std::ostream &os) const override
Definition
zigbee-aps-header.cc:346
ns3::zigbee::ZigbeeApsHeader::m_security
bool m_security
Frame control field: Security.
Definition
zigbee-aps-header.h:242
ns3::zigbee::ZigbeeApsHeader::m_ackBitfield
uint8_t m_ackBitfield
Extended header field: Acknowledgement bit field.
Definition
zigbee-aps-header.h:258
ns3::zigbee::ZigbeeApsHeader::IsAckRequested
bool IsAckRequested() const
Indicates if the present frame requires acknowledgment.
Definition
zigbee-aps-header.cc:76
ns3::zigbee::ZigbeeApsHeader::SetProfileId
void SetProfileId(uint16_t profileId)
Set the profile ID in the APS header.
Definition
zigbee-aps-header.cc:118
ns3::zigbee::ZigbeeApsHeader::m_frameType
ApsFrameType m_frameType
Frame control field: Frame type.
Definition
zigbee-aps-header.h:239
ns3::zigbee::ZigbeeApsHeader::Serialize
void Serialize(Buffer::Iterator start) const override
Definition
zigbee-aps-header.cc:154
ns3::zigbee::ZigbeeApsHeader::GetTypeId
static TypeId GetTypeId()
Get the type ID.
Definition
zigbee-aps-header.cc:330
ns3::zigbee::ZigbeeApsHeader::GetProfileId
uint16_t GetProfileId() const
Get the profile ID in the APS header.
Definition
zigbee-aps-header.cc:124
uint32_t
ns3::zigbee::ApsFrameType
ApsFrameType
Values of the Frame Type Sub-Field.
Definition
zigbee-aps-header.h:29
ns3::zigbee::ApsDeliveryMode
ApsDeliveryMode
Values of the Delivery Mode Sub-Field.
Definition
zigbee-aps-header.h:43
ns3::zigbee::ApsFragmentation
ApsFragmentation
Table 2-22 Values of the Fragmentation Sub-Field Zigbee Specification r22.1.0, Table 2-22.
Definition
zigbee-aps-header.h:56
ns3::zigbee::APS_DATA
@ APS_DATA
Definition
zigbee-aps-header.h:30
ns3::zigbee::APS_ACK
@ APS_ACK
Definition
zigbee-aps-header.h:32
ns3::zigbee::APS_UCST
@ APS_UCST
Definition
zigbee-aps-header.h:44
ns3::zigbee::APS_BCST
@ APS_BCST
Definition
zigbee-aps-header.h:45
ns3::zigbee::APS_GROUP_ADDRESSING
@ APS_GROUP_ADDRESSING
Definition
zigbee-aps-header.h:46
ns3::zigbee::NOT_FRAGMENTED
@ NOT_FRAGMENTED
Definition
zigbee-aps-header.h:57
ns3
Every class exported by the ns3 library is enclosed in the ns3 namespace.
zigbee-aps-header.h
src
zigbee
model
zigbee-aps-header.cc
Generated on Mon Jun 16 2025 11:07:25 for ns-3 by
1.11.0