Zephyr API Documentation  3.6.0
A Scalable Open Source RTOS
3.6.0
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
ieee802154_ie.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2023 Florian Grandel, Zephyr Project.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
23#ifndef ZEPHYR_INCLUDE_NET_IEEE802154_IE_H_
24#define ZEPHYR_INCLUDE_NET_IEEE802154_IE_H_
25
26#include <zephyr/net/buf.h>
28
45};
46
61 /* partial list, add additional ids as needed */
62};
63
65#define IEEE802154_VENDOR_SPECIFIC_IE_OUI_LEN 3
70 uint8_t vendor_oui[IEEE802154_VENDOR_SPECIFIC_IE_OUI_LEN];
72} __packed;
73
79} __packed;
80
85} __packed;
86
89 union {
92 };
93} __packed;
94
100} __packed;
101
109} __packed;
110
117} __packed;
118
121 union {
124 };
125} __packed;
126
130} __packed;
131
132/* @brief Generic Header IE, see section 7.4.2.1. */
134#if CONFIG_LITTLE_ENDIAN
135 uint16_t length : 7;
136 uint16_t element_id_low : 1; /* see enum ieee802154_header_ie_element_id */
138 uint16_t type : 1; /* always 0 */
139#else
140 uint16_t element_id_low : 1; /* see enum ieee802154_header_ie_element_id */
142 uint16_t type : 1; /* always 0 */
144#endif
145 union {
151 /* add additional supported header IEs here */
153} __packed;
154
156#define IEEE802154_HEADER_IE_HEADER_LENGTH sizeof(uint16_t)
157
158
160#define IEEE802154_DEFINE_HEADER_IE(_element_id, _length, _content, _content_type) \
161 (struct ieee802154_header_ie) { \
162 .length = (_length), \
163 .element_id_high = (_element_id) >> 1U, .element_id_low = (_element_id) & 0x01, \
164 .type = IEEE802154_IE_TYPE_HEADER, \
165 .content._content_type = _content, \
166 }
167
168#define IEEE802154_DEFINE_HEADER_IE_VENDOR_SPECIFIC_CONTENT_LEN(_vendor_specific_info_len) \
169 (IEEE802154_VENDOR_SPECIFIC_IE_OUI_LEN + (_vendor_specific_info_len))
170
171#define IEEE802154_DEFINE_HEADER_IE_VENDOR_SPECIFIC_CONTENT(_vendor_oui, _vendor_specific_info) \
172 (struct ieee802154_header_ie_vendor_specific) { \
173 .vendor_oui = _vendor_oui, .vendor_specific_info = (_vendor_specific_info), \
174 }
175
176#define IEEE802154_DEFINE_HEADER_IE_CSL_REDUCED_CONTENT(_csl_phase, _csl_period) \
177 (struct ieee802154_header_ie_csl_reduced) { \
178 .csl_phase = sys_cpu_to_le16(_csl_phase), \
179 .csl_period = sys_cpu_to_le16(_csl_period), \
180 }
181
182#define IEEE802154_DEFINE_HEADER_IE_CSL_FULL_CONTENT(_csl_phase, _csl_period, \
183 _csl_rendezvous_time) \
184 (struct ieee802154_header_ie_csl_full) { \
185 .csl_phase = sys_cpu_to_le16(_csl_phase), \
186 .csl_period = sys_cpu_to_le16(_csl_period), \
187 .csl_rendezvous_time = sys_cpu_to_le16(_csl_rendezvous_time), \
188 }
189
190#define IEEE802154_HEADER_IE_TIME_CORRECTION_NACK 0x8000
191#define IEEE802154_HEADER_IE_TIME_CORRECTION_MASK 0x0fff
192#define IEEE802154_HEADER_IE_TIME_CORRECTION_SIGN_BIT_MASK 0x0800
193
194#define IEEE802154_DEFINE_HEADER_IE_TIME_CORRECTION_CONTENT(_ack, _time_correction_us) \
195 (struct ieee802154_header_ie_time_correction) { \
196 .time_sync_info = sys_cpu_to_le16( \
197 (!(_ack) * IEEE802154_HEADER_IE_TIME_CORRECTION_NACK) | \
198 ((_time_correction_us) & IEEE802154_HEADER_IE_TIME_CORRECTION_MASK)), \
199 }
220#define IEEE802154_DEFINE_HEADER_IE_VENDOR_SPECIFIC(_vendor_oui, _vendor_specific_info, \
221 _vendor_specific_info_len) \
222 IEEE802154_DEFINE_HEADER_IE(IEEE802154_HEADER_IE_ELEMENT_ID_VENDOR_SPECIFIC_IE, \
223 IEEE802154_DEFINE_HEADER_IE_VENDOR_SPECIFIC_CONTENT_LEN( \
224 _vendor_specific_info_len), \
225 IEEE802154_DEFINE_HEADER_IE_VENDOR_SPECIFIC_CONTENT( \
226 _vendor_oui, _vendor_specific_info), \
227 vendor_specific)
228
244#define IEEE802154_DEFINE_HEADER_IE_CSL_REDUCED(_csl_phase, _csl_period) \
245 IEEE802154_DEFINE_HEADER_IE( \
246 IEEE802154_HEADER_IE_ELEMENT_ID_CSL_IE, \
247 sizeof(struct ieee802154_header_ie_csl_reduced), \
248 IEEE802154_DEFINE_HEADER_IE_CSL_REDUCED_CONTENT(_csl_phase, _csl_period), \
249 csl.reduced)
250
268#define IEEE802154_DEFINE_HEADER_IE_CSL_FULL(_csl_phase, _csl_period, _csl_rendezvous_time) \
269 IEEE802154_DEFINE_HEADER_IE(IEEE802154_HEADER_IE_ELEMENT_ID_CSL_IE, \
270 sizeof(struct ieee802154_header_ie_csl_full), \
271 IEEE802154_DEFINE_HEADER_IE_CSL_FULL_CONTENT( \
272 _csl_phase, _csl_period, _csl_rendezvous_time), \
273 csl.full)
274
291#define IEEE802154_DEFINE_HEADER_IE_TIME_CORRECTION(_ack, _time_correction_us) \
292 IEEE802154_DEFINE_HEADER_IE( \
293 IEEE802154_HEADER_IE_ELEMENT_ID_TIME_CORRECTION_IE, \
294 sizeof(struct ieee802154_header_ie_time_correction), \
295 IEEE802154_DEFINE_HEADER_IE_TIME_CORRECTION_CONTENT(_ack, _time_correction_us), \
296 time_correction)
297
306static inline int16_t
308{
309 if (ie->time_sync_info & IEEE802154_HEADER_IE_TIME_CORRECTION_SIGN_BIT_MASK) {
310 /* Negative integer */
311 return (int16_t)ie->time_sync_info | ~IEEE802154_HEADER_IE_TIME_CORRECTION_MASK;
312 }
313
314 /* Positive integer */
315 return (int16_t)ie->time_sync_info & IEEE802154_HEADER_IE_TIME_CORRECTION_MASK;
316}
317
325 uint8_t element_id)
326{
327 ie->element_id_high = element_id >> 1U;
328 ie->element_id_low = element_id & 0x01;
329}
330
339{
340 return (ie->element_id_high << 1U) | ie->element_id_low;
341}
342
344#define IEEE802154_TIME_CORRECTION_HEADER_IE_LEN \
345 (IEEE802154_HEADER_IE_HEADER_LENGTH + sizeof(struct ieee802154_header_ie_time_correction))
346
348#define IEEE802154_HEADER_TERMINATION_1_HEADER_IE_LEN IEEE802154_HEADER_IE_HEADER_LENGTH
349
356#endif /* ZEPHYR_INCLUDE_NET_IEEE802154_IE_H_ */
ieee802154_header_ie_element_id
Header Information Element IDs.
Definition: ieee802154_ie.h:53
ieee802154_ie_type
Information Element Types.
Definition: ieee802154_ie.h:42
static int16_t ieee802154_header_ie_get_time_correction_us(struct ieee802154_header_ie_time_correction *ie)
Retrieve the time correction value in microseconds from a Time Correction IE, see section 7....
Definition: ieee802154_ie.h:307
static uint8_t ieee802154_header_ie_get_element_id(struct ieee802154_header_ie *ie)
Get the element ID of a header IE.
Definition: ieee802154_ie.h:338
static void ieee802154_header_ie_set_element_id(struct ieee802154_header_ie *ie, uint8_t element_id)
Set the element ID of a header IE.
Definition: ieee802154_ie.h:324
@ IEEE802154_HEADER_IE_ELEMENT_ID_RENDEZVOUS_TIME_IE
Definition: ieee802154_ie.h:57
@ IEEE802154_HEADER_IE_ELEMENT_ID_TIME_CORRECTION_IE
Definition: ieee802154_ie.h:58
@ IEEE802154_HEADER_IE_ELEMENT_ID_HEADER_TERMINATION_1
Definition: ieee802154_ie.h:59
@ IEEE802154_HEADER_IE_ELEMENT_ID_CSL_IE
Definition: ieee802154_ie.h:55
@ IEEE802154_HEADER_IE_ELEMENT_ID_HEADER_TERMINATION_2
Definition: ieee802154_ie.h:60
@ IEEE802154_HEADER_IE_ELEMENT_ID_VENDOR_SPECIFIC_IE
Definition: ieee802154_ie.h:54
@ IEEE802154_HEADER_IE_ELEMENT_ID_RIT_IE
Definition: ieee802154_ie.h:56
@ IEEE802154_IE_TYPE_HEADER
Definition: ieee802154_ie.h:43
@ IEEE802154_IE_TYPE_PAYLOAD
Definition: ieee802154_ie.h:44
Buffer management.
__UINT8_TYPE__ uint8_t
Definition: stdint.h:88
__UINT16_TYPE__ uint16_t
Definition: stdint.h:89
__INT16_TYPE__ int16_t
Definition: stdint.h:73
Full CSL IE, see section 7.4.2.3.
Definition: ieee802154_ie.h:75
uint16_t csl_phase
Definition: ieee802154_ie.h:76
uint16_t csl_period
Definition: ieee802154_ie.h:77
uint16_t csl_rendezvous_time
Definition: ieee802154_ie.h:78
Reduced CSL IE, see section 7.4.2.3.
Definition: ieee802154_ie.h:82
uint16_t csl_phase
Definition: ieee802154_ie.h:83
uint16_t csl_period
Definition: ieee802154_ie.h:84
Generic CSL IE, see section 7.4.2.3.
Definition: ieee802154_ie.h:88
struct ieee802154_header_ie_csl_reduced reduced
Definition: ieee802154_ie.h:91
struct ieee802154_header_ie_csl_full full
Definition: ieee802154_ie.h:90
Full Rendezvous Time IE, see section 7.4.2.6 (macCslInterval is nonzero).
Definition: ieee802154_ie.h:106
uint16_t rendezvous_time
Definition: ieee802154_ie.h:107
uint16_t wakeup_interval
Definition: ieee802154_ie.h:108
Reduced Rendezvous Time IE, see section 7.4.2.6 (macCslInterval is zero).
Definition: ieee802154_ie.h:115
uint16_t rendezvous_time
Definition: ieee802154_ie.h:116
Rendezvous Time IE, see section 7.4.2.6.
Definition: ieee802154_ie.h:120
struct ieee802154_header_ie_rendezvous_time_reduced reduced
Definition: ieee802154_ie.h:123
struct ieee802154_header_ie_rendezvous_time_full full
Definition: ieee802154_ie.h:122
RIT IE, see section 7.4.2.4.
Definition: ieee802154_ie.h:96
uint8_t number_of_repeat_listen
Definition: ieee802154_ie.h:98
uint16_t repeat_listen_interval
Definition: ieee802154_ie.h:99
uint8_t time_to_first_listen
Definition: ieee802154_ie.h:97
Time Correction IE, see section 7.4.2.7.
Definition: ieee802154_ie.h:128
uint16_t time_sync_info
Definition: ieee802154_ie.h:129
Vendor Specific Header IE, see section 7.4.2.3.
Definition: ieee802154_ie.h:69
uint8_t vendor_oui[IEEE802154_VENDOR_SPECIFIC_IE_OUI_LEN]
Definition: ieee802154_ie.h:70
uint8_t * vendor_specific_info
Definition: ieee802154_ie.h:71
Definition: ieee802154_ie.h:133
struct ieee802154_header_ie_rit rit
Definition: ieee802154_ie.h:148
struct ieee802154_header_ie_time_correction time_correction
Definition: ieee802154_ie.h:150
uint16_t element_id_high
Definition: ieee802154_ie.h:143
uint16_t length
Definition: ieee802154_ie.h:141
uint16_t type
Definition: ieee802154_ie.h:142
uint16_t element_id_low
Definition: ieee802154_ie.h:140
struct ieee802154_header_ie_vendor_specific vendor_specific
Definition: ieee802154_ie.h:146
union ieee802154_header_ie::@295 content
struct ieee802154_header_ie_rendezvous_time rendezvous_time
Definition: ieee802154_ie.h:149
struct ieee802154_header_ie_csl csl
Definition: ieee802154_ie.h:147
Byte order helpers.