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::SetGroupAddress
(uint16_t groupAddress)
107
{
108
m_groupAddress
= groupAddress;
109
}
110
111
uint16_t
112
ZigbeeApsHeader::GetGroupAddress
()
const
113
{
114
return
m_groupAddress
;
115
}
116
117
void
118
ZigbeeApsHeader::SetClusterId
(uint16_t clusterId)
119
{
120
m_clusterId
= clusterId;
121
}
122
123
uint16_t
124
ZigbeeApsHeader::GetClusterId
()
const
125
{
126
return
m_clusterId
;
127
}
128
129
void
130
ZigbeeApsHeader::SetProfileId
(uint16_t profileId)
131
{
132
m_profileId
= profileId;
133
}
134
135
uint16_t
136
ZigbeeApsHeader::GetProfileId
()
const
137
{
138
return
m_profileId
;
139
}
140
141
void
142
ZigbeeApsHeader::SetSrcEndpoint
(uint8_t src)
143
{
144
m_srcEndpoint
= src;
145
}
146
147
uint8_t
148
ZigbeeApsHeader::GetSrcEndpoint
()
const
149
{
150
return
m_srcEndpoint
;
151
}
152
153
void
154
ZigbeeApsHeader::SetApsCounter
(uint8_t counter)
155
{
156
m_apsCounter
= counter;
157
}
158
159
uint8_t
160
ZigbeeApsHeader::GetApsCounter
()
const
161
{
162
return
m_apsCounter
;
163
}
164
165
void
166
ZigbeeApsHeader::Serialize
(
Buffer::Iterator
start)
const
167
{
168
Buffer::Iterator
i = start;
169
170
// Frame control field
171
uint8_t frameControl = (
m_frameType
& 0x03) | ((
m_deliveryMode
& 0x03) << 2) |
172
((
m_ackFormat
? 1 : 0) << 4) | ((
m_security
? 1 : 0) << 5) |
173
((
m_ackRequest
? 1 : 0) << 6) | ((
m_extHeaderPresent
? 1 : 0) << 7);
174
175
i.
WriteU8
(frameControl);
176
177
// Addressing fields
178
179
if
(
m_deliveryMode
==
ApsDeliveryMode::APS_UCST
||
m_deliveryMode
==
ApsDeliveryMode::APS_BCST
)
180
{
181
i.
WriteU8
(
m_dstEndpoint
);
182
}
183
184
if
(
m_deliveryMode
==
ApsDeliveryMode::APS_GROUP_ADDRESSING
)
185
{
186
i.
WriteHtolsbU16
(
m_groupAddress
);
187
}
188
189
if
(
m_frameType
==
ApsFrameType::APS_DATA
||
m_frameType
==
ApsFrameType::APS_ACK
)
190
{
191
i.
WriteHtolsbU16
(
m_clusterId
);
192
i.
WriteHtolsbU16
(
m_profileId
);
193
}
194
195
if
(
m_frameType
==
ApsFrameType::APS_DATA
)
196
{
197
i.
WriteU8
(
m_srcEndpoint
);
198
}
199
200
i.
WriteU8
(
m_apsCounter
);
201
202
// Extended Header
203
204
if
(
m_extHeaderPresent
)
205
{
206
// Extended Frame control field
207
uint8_t extFrameControl = (
m_fragmentation
& 0x03);
208
i.
WriteU8
(extFrameControl);
209
210
// Block control
211
if
(
m_fragmentation
!=
ApsFragmentation::NOT_FRAGMENTED
)
212
{
213
i.
WriteU8
(
m_blockNumber
);
214
}
215
// ACK Bitfield
216
if
(
m_frameType
==
ApsFrameType::APS_ACK
)
217
{
218
i.
WriteU8
(
m_ackBitfield
);
219
}
220
}
221
}
222
223
uint32_t
224
ZigbeeApsHeader::Deserialize
(
Buffer::Iterator
start)
225
{
226
Buffer::Iterator
i = start;
227
228
uint8_t frameControl = i.
ReadU8
();
229
m_frameType
=
static_cast<
ApsFrameType
>
(frameControl & 0x03);
230
m_deliveryMode
=
static_cast<
ApsDeliveryMode
>
((frameControl >> 2) & 0x03);
231
m_ackFormat
= (frameControl >> 4) & 0x01;
232
m_security
= (frameControl >> 5) & 0x01;
233
m_ackRequest
= (frameControl >> 6) & 0x01;
234
m_extHeaderPresent
= (frameControl >> 7) & 0x01;
235
236
// Addressing fields
237
238
if
(
m_deliveryMode
==
ApsDeliveryMode::APS_UCST
||
m_deliveryMode
==
ApsDeliveryMode::APS_BCST
)
239
{
240
m_dstEndpoint
= i.
ReadU8
();
241
}
242
243
if
(
m_deliveryMode
==
ApsDeliveryMode::APS_GROUP_ADDRESSING
)
244
{
245
m_groupAddress
= i.
ReadLsbtohU16
();
246
}
247
248
if
(
m_frameType
==
ApsFrameType::APS_DATA
||
m_frameType
==
ApsFrameType::APS_ACK
)
249
{
250
m_clusterId
= i.
ReadLsbtohU16
();
251
m_profileId
= i.
ReadLsbtohU16
();
252
}
253
254
if
(
m_frameType
==
ApsFrameType::APS_DATA
)
255
{
256
m_srcEndpoint
= i.
ReadU8
();
257
}
258
259
m_apsCounter
= i.
ReadU8
();
260
261
// Extended Header
262
263
if
(
m_extHeaderPresent
)
264
{
265
// Extended Frame control field
266
uint8_t extFrameControl = i.
ReadU8
();
267
m_fragmentation
=
static_cast<
ApsFragmentation
>
(extFrameControl & 0x03);
268
269
// Block control
270
if
(
m_fragmentation
!=
ApsFragmentation::NOT_FRAGMENTED
)
271
{
272
m_blockNumber
= i.
ReadU8
();
273
}
274
// ACK Bitfield
275
if
(
m_frameType
==
ApsFrameType::APS_ACK
)
276
{
277
m_ackBitfield
= i.
ReadU8
();
278
}
279
}
280
281
return
i.
GetDistanceFrom
(start);
282
}
283
284
uint32_t
285
ZigbeeApsHeader::GetSerializedSize
()
const
286
{
287
uint8_t totalSize;
288
// See Zigbee Specification r22.1.0
289
290
// Fixed field:
291
// Frame Control (1) + APS Counter (1)
292
totalSize = 2;
293
294
// Variable Fields:
295
// Destination EndPoint field (1) (Section 2.2.5.1.2)
296
if
(
m_deliveryMode
==
ApsDeliveryMode::APS_UCST
||
m_deliveryMode
==
ApsDeliveryMode::APS_BCST
)
297
{
298
totalSize += 1;
299
}
300
301
// Group Address field (2) (Section 2.2.5.1.3)
302
if
(
m_deliveryMode
==
ApsDeliveryMode::APS_GROUP_ADDRESSING
)
303
{
304
totalSize += 2;
305
}
306
307
// Cluster identifier field and Profile identifier field (4)
308
// (Sections 2.2.5.1.4 and 2.2.5.15)
309
if
(
m_frameType
==
ApsFrameType::APS_DATA
||
m_frameType
==
ApsFrameType::APS_ACK
)
310
{
311
totalSize += 4;
312
}
313
314
// Source Endpoint field (1) (Section 2.2.5.1.6)
315
if
(
m_frameType
==
ApsFrameType::APS_DATA
)
316
{
317
totalSize += 1;
318
}
319
320
// Extended header sub-frame (variable)
321
if
(
m_extHeaderPresent
)
322
{
323
// Extended Frame control field (1)
324
totalSize += 1;
325
326
// Block control (1)
327
if
(
m_fragmentation
!=
ApsFragmentation::NOT_FRAGMENTED
)
328
{
329
totalSize += 1;
330
}
331
// ACK Bitfield
332
if
(
m_frameType
==
ApsFrameType::APS_ACK
)
333
{
334
totalSize += 1;
335
}
336
}
337
338
return
totalSize;
339
}
340
341
TypeId
342
ZigbeeApsHeader::GetTypeId
()
343
{
344
static
TypeId
tid =
TypeId
(
"ns3::zigbee::ZigbeeApsHeader"
)
345
.
SetParent
<
Header
>()
346
.SetGroupName(
"Zigbee"
)
347
.AddConstructor<
ZigbeeApsHeader
>();
348
return
tid;
349
}
350
351
TypeId
352
ZigbeeApsHeader::GetInstanceTypeId
()
const
353
{
354
return
GetTypeId
();
355
}
356
357
void
358
ZigbeeApsHeader::Print
(std::ostream& os)
const
359
{
360
// TODO:
361
/* os << "\nAPS Frame Control = " << std::hex << std::showbase << static_cast<uint32_t>(
362
(m_frameType & 0x03) |
363
((m_deliveryMode & 0x03) << 2) |
364
((m_ackFormat ? 1 : 0) << 4) |
365
((m_security ? 1 : 0) << 5) |
366
((m_ackRequest ? 1 : 0) << 6) |
367
((m_extHeader ? 1 : 0) << 7));
368
369
os << " | Dst EP = " << static_cast<uint32_t>(m_dstEndpoint)
370
<< " | Src EP = " << static_cast<uint32_t>(m_srcEndpoint)
371
<< " | Cluster ID = " << m_clusterId
372
<< " | Profile ID = " << m_profileId
373
<< " | Counter = " << static_cast<uint32_t>(m_counter);
374
os << "\n";*/
375
}
376
377
}
// namespace zigbee
378
}
// 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:124
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::SetGroupAddress
void SetGroupAddress(uint16_t groupAddress)
Set the group address in the APS header.
Definition
zigbee-aps-header.cc:106
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:271
ns3::zigbee::ZigbeeApsHeader::GetGroupAddress
uint16_t GetGroupAddress() const
Get the group address in the APS header.
Definition
zigbee-aps-header.cc:112
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:352
ns3::zigbee::ZigbeeApsHeader::m_groupAddress
uint16_t m_groupAddress
Addressing field: Group or 16-bit address.
Definition
zigbee-aps-header.h:262
ns3::zigbee::ZigbeeApsHeader::m_fragmentation
ApsFragmentation m_fragmentation
Extended header field: Fragmentation block type.
Definition
zigbee-aps-header.h:270
ns3::zigbee::ZigbeeApsHeader::SetSrcEndpoint
void SetSrcEndpoint(uint8_t endpoint)
Set the source endpoint in the APS header.
Definition
zigbee-aps-header.cc:142
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:265
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:263
ns3::zigbee::ZigbeeApsHeader::m_deliveryMode
ApsDeliveryMode m_deliveryMode
Frame control field: Delivery mode.
Definition
zigbee-aps-header.h:254
ns3::zigbee::ZigbeeApsHeader::m_profileId
uint16_t m_profileId
Addressing field: Profile ID.
Definition
zigbee-aps-header.h:264
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:258
ns3::zigbee::ZigbeeApsHeader::GetApsCounter
uint8_t GetApsCounter() const
Get the APS counter value present in the APS header.
Definition
zigbee-aps-header.cc:160
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:154
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:118
ns3::zigbee::ZigbeeApsHeader::m_ackFormat
bool m_ackFormat
Frame control field: Acknowledgment format.
Definition
zigbee-aps-header.h:255
ns3::zigbee::ZigbeeApsHeader::GetSerializedSize
uint32_t GetSerializedSize() const override
Definition
zigbee-aps-header.cc:285
ns3::zigbee::ZigbeeApsHeader::GetSrcEndpoint
uint8_t GetSrcEndpoint() const
Get the source endpoint in the APS header.
Definition
zigbee-aps-header.cc:148
ns3::zigbee::ZigbeeApsHeader::m_dstEndpoint
uint8_t m_dstEndpoint
Addressing field: Destination endpoint.
Definition
zigbee-aps-header.h:261
ns3::zigbee::ZigbeeApsHeader::Deserialize
uint32_t Deserialize(Buffer::Iterator start) override
Definition
zigbee-aps-header.cc:224
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:257
ns3::zigbee::ZigbeeApsHeader::m_apsCounter
uint8_t m_apsCounter
APS counter field.
Definition
zigbee-aps-header.h:267
ns3::zigbee::ZigbeeApsHeader::Print
void Print(std::ostream &os) const override
Definition
zigbee-aps-header.cc:358
ns3::zigbee::ZigbeeApsHeader::m_security
bool m_security
Frame control field: Security.
Definition
zigbee-aps-header.h:256
ns3::zigbee::ZigbeeApsHeader::m_ackBitfield
uint8_t m_ackBitfield
Extended header field: Acknowledgement bit field.
Definition
zigbee-aps-header.h:272
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:130
ns3::zigbee::ZigbeeApsHeader::m_frameType
ApsFrameType m_frameType
Frame control field: Frame type.
Definition
zigbee-aps-header.h:253
ns3::zigbee::ZigbeeApsHeader::Serialize
void Serialize(Buffer::Iterator start) const override
Definition
zigbee-aps-header.cc:166
ns3::zigbee::ZigbeeApsHeader::GetTypeId
static TypeId GetTypeId()
Get the type ID.
Definition
zigbee-aps-header.cc:342
ns3::zigbee::ZigbeeApsHeader::GetProfileId
uint16_t GetProfileId() const
Get the profile ID in the APS header.
Definition
zigbee-aps-header.cc:136
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 Sun Jul 27 2025 18:22:37 for ns-3 by
1.11.0