Morse Micro IoT SDK  2.11.2
mmutils.h
1/*
2 * Copyright 2024 Morse Micro
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
15#pragma once
16
17#include <stdarg.h>
18#include <stdint.h>
19#include <stdlib.h>
20#include <stdbool.h>
21#include <string.h>
22
23#ifdef __cplusplus
24extern "C"
25{
26#endif
27
42#define MM_MIN(x, y) (((x) < (y)) ? (x) : (y))
43
58#define MM_MAX(x, y) (((x) > (y)) ? (x) : (y))
59
65#ifndef MM_FAST_ROUND_UP
66#define MM_FAST_ROUND_UP(x, m) ((((x) - 1) | ((m) - 1)) + 1)
67#endif
68
70#define MM_UNUSED(_x) (void)(_x)
71
73#ifndef MM_PACKED
74#define MM_PACKED __attribute__((packed))
75#endif
76
78#ifndef MM_WEAK
79#define MM_WEAK __attribute__((weak))
80#endif
81
83#ifndef MM_FALLTHROUGH
84#define MM_FALLTHROUGH __attribute__((fallthrough))
85#endif
86
88#ifndef MM_ALWAYS_INLINE
89#define MM_ALWAYS_INLINE __attribute__((always_inline))
90#endif
91
92#ifndef MM_STATIC_ASSERT
104#define MM_STATIC_ASSERT(_expression, _message) _Static_assert((_expression), _message)
105#endif
106
116#define MM_ARRAY_COUNT(a) (sizeof(a) / sizeof((a)[0]))
117
126#define MM_MEMBER_SIZE(_type, _member) (sizeof(((_type *)0)->_member))
127
140static inline char mm_nibble_to_hex_char(uint8_t nibble)
141{
142 nibble &= 0x0f;
143 if (nibble < 0x0a)
144 {
145 return '0' + nibble;
146 }
147 else
148 {
149 return 'A' + nibble - 0x0a;
150 }
151}
152
163{
167 MM_AKM_SUITE_PSK = 0x506f9a02,
169 MM_AKM_SUITE_SAE = 0x000fac08,
171 MM_AKM_SUITE_OWE = 0x000fac12,
174};
175
178{
183};
184
186#ifndef MM_RSN_INFORMATION_MAX_PAIRWISE_CIPHER_SUITES
187#define MM_RSN_INFORMATION_MAX_PAIRWISE_CIPHER_SUITES (2)
188#endif
189
191#ifndef MM_RSN_INFORMATION_MAX_AKM_SUITES
192#define MM_RSN_INFORMATION_MAX_AKM_SUITES (2)
193#endif
194
196#define MM_RSN_INFORMATION_IE_TYPE (48)
198#define MM_VENDOR_SPECIFIC_IE_TYPE (221)
200#define MM_S1G_OPERATION_IE_TYPE (232)
201
205{
206 MM_ENOMEM = 12,
207 MM_EFAULT = 14,
208 MM_ENODEV = 19,
209 MM_EINVAL = 22,
210 MM_ETIMEDOUT = 110,
211};
212
219{
231 uint16_t version;
234};
235
243const char *mm_akm_suite_to_string(uint32_t akm_suite_oui);
244
261int mm_find_ie_from_offset(const uint8_t *ies,
262 uint32_t ies_len,
263 uint32_t search_offset,
264 uint8_t ie_type);
265
278static inline int mm_find_ie(const uint8_t *ies, uint32_t ies_len, uint8_t ie_type)
279{
280 return mm_find_ie_from_offset(ies, ies_len, 0, ie_type);
281}
282
301 uint32_t ies_len,
302 uint32_t search_offset,
303 const uint8_t *id,
304 size_t id_len);
305
319static inline int mm_find_vendor_specific_ie(const uint8_t *ies,
320 uint32_t ies_len,
321 const uint8_t *id,
322 size_t id_len)
323{
324 return mm_find_vendor_specific_ie_from_offset(ies, ies_len, 0, id, id_len);
325}
326
337int mm_parse_rsn_information(const uint8_t *ies,
338 uint32_t ies_len,
339 struct mm_rsn_information *output);
340
345{
356};
357
368int mm_parse_s1g_operation(const uint8_t *ies, uint32_t ies_len, struct mm_s1g_operation *output);
369
377inline bool mm_mac_addr_is_zero(const uint8_t *mac_addr)
378{
379 return (mac_addr[0] | mac_addr[1] | mac_addr[2] | mac_addr[3] | mac_addr[4] | mac_addr[5]) ==
380 0x00;
381}
382
390static inline bool mm_mac_addr_is_multicast(const uint8_t *mac_addr)
391{
392 return mac_addr[0] & 0x01;
393}
394
402inline bool mm_mac_addr_is_broadcast(const uint8_t *mac_addr)
403{
404 return (mac_addr[0] & mac_addr[1] & mac_addr[2] & mac_addr[3] & mac_addr[4] & mac_addr[5]) ==
405 0xff;
406}
407
416static inline bool mm_mac_addr_is_equal(const uint8_t *mac_addr1, const uint8_t *mac_addr2)
417{
418 return memcmp(mac_addr1, mac_addr2, 6) == 0;
419}
420
423#ifdef __cplusplus
424}
425#endif
426
#define MM_RSN_INFORMATION_MAX_AKM_SUITES
Maximum number of AKM suites our parser will process.
Definition: mmutils.h:192
static int mm_find_vendor_specific_ie(const uint8_t *ies, uint32_t ies_len, const uint8_t *id, size_t id_len)
Search through the given list of Information Elements (IEs) to find the first Vendor Specific IE that...
Definition: mmutils.h:319
mm_akm_suite_oui
Enumeration of Authentication Key Management (AKM) Suite OUIs as BE32 integers.
Definition: mmutils.h:163
bool mm_mac_addr_is_broadcast(const uint8_t *mac_addr)
Determines if a given MAC address is the broadcast address (i.e., ff:ff:ff:ff:ff:ff ).
Definition: mmutils.h:402
static int mm_find_ie(const uint8_t *ies, uint32_t ies_len, uint8_t ie_type)
Search a list of Information Elements (IEs) and find the first instance of matching the given type.
Definition: mmutils.h:278
bool mm_mac_addr_is_zero(const uint8_t *mac_addr)
Determines if a given MAC address is all zeros.
Definition: mmutils.h:377
const char * mm_akm_suite_to_string(uint32_t akm_suite_oui)
Get the name of the given AKM Suite as a string.
int mm_parse_s1g_operation(const uint8_t *ies, uint32_t ies_len, struct mm_s1g_operation *output)
Find the S1G Operation information element from within a block of IEs and extract useful information ...
static bool mm_mac_addr_is_multicast(const uint8_t *mac_addr)
Determines if a given MAC address is a multicast/broadcast address.
Definition: mmutils.h:390
static bool mm_mac_addr_is_equal(const uint8_t *mac_addr1, const uint8_t *mac_addr2)
Compares two MAC addresses and determines if they are equal.
Definition: mmutils.h:416
int mm_find_vendor_specific_ie_from_offset(const uint8_t *ies, uint32_t ies_len, uint32_t search_offset, const uint8_t *id, size_t id_len)
Search through the given list of Information Elements (IEs) from the given starting offset to find th...
mm_errno
Explicitly defined errno values to obviate the need to include errno.h.
Definition: mmutils.h:205
int mm_parse_rsn_information(const uint8_t *ies, uint32_t ies_len, struct mm_rsn_information *output)
Search through the given list of information elements to find the RSN IE then parse it to extract rel...
#define MM_RSN_INFORMATION_MAX_PAIRWISE_CIPHER_SUITES
Maximum number of pairwise cipher suites our parser will process.
Definition: mmutils.h:187
mm_cipher_suite_oui
Enumeration of Cipher Suite OUIs as BE32 integers.
Definition: mmutils.h:178
int mm_find_ie_from_offset(const uint8_t *ies, uint32_t ies_len, uint32_t search_offset, uint8_t ie_type)
Search a list of Information Elements (IEs) from the given starting offset and find the first instanc...
@ MM_AKM_SUITE_SAE
Simultaneous Authentication of Equals (SAE)
Definition: mmutils.h:169
@ MM_AKM_SUITE_NONE
Open (no security)
Definition: mmutils.h:165
@ MM_AKM_SUITE_OWE
OWE.
Definition: mmutils.h:171
@ MM_AKM_SUITE_OTHER
Another suite not in this enum.
Definition: mmutils.h:173
@ MM_AKM_SUITE_PSK
Pre-shared key (WFA OUI)
Definition: mmutils.h:167
@ MM_CIPHER_SUITE_OTHER
Another cipher suite not in this enum.
Definition: mmutils.h:182
@ MM_CIPHER_SUITE_AES_CCM
Open (no security)
Definition: mmutils.h:180
static char mm_nibble_to_hex_char(uint8_t nibble)
Convert the least significant 4 bits of the given argument to a character representing their hexadeci...
Definition: mmutils.h:140
Data structure to represent information extracted from an RSN information element.
Definition: mmutils.h:219
uint16_t num_akm_suites
Number of AKM suites in akm_suites.
Definition: mmutils.h:229
uint32_t group_cipher_suite
The group cipher suite OUI.
Definition: mmutils.h:221
uint16_t version
Version number of the RSN IE.
Definition: mmutils.h:231
uint32_t pairwise_cipher_suites[MM_RSN_INFORMATION_MAX_PAIRWISE_CIPHER_SUITES]
Pairwise cipher suite OUIs.
Definition: mmutils.h:223
uint16_t rsn_capabilities
RSN Capabilities field of the RSN IE (in host order).
Definition: mmutils.h:233
uint16_t num_pairwise_cipher_suites
Number of pairwise cipher suites in pairwise_cipher_suites.
Definition: mmutils.h:227
uint32_t akm_suites[MM_RSN_INFORMATION_MAX_AKM_SUITES]
AKM suite OUIs.
Definition: mmutils.h:225
Data structure to represent information extracted from an S1G Operation information element.
Definition: mmutils.h:345
uint8_t operating_channel_width_mhz
Width of the operating channel in MHz.
Definition: mmutils.h:349
uint8_t operating_channel_number
Channel number of the operating channel.
Definition: mmutils.h:353
uint8_t primary_channel_width_mhz
Width of the primary channel in MHz.
Definition: mmutils.h:351
uint8_t primary_channel_number
Channel number of the primary channel.
Definition: mmutils.h:355
uint8_t operating_class
Operating class.
Definition: mmutils.h:347