17 #include <sys/types.h>
180 # define _UNICOAP_OPTIONS_ALLOC(_buf, _name, capacity, _static) \
181 _static uint8_t _buf[capacity]; \
182 _static unicoap_options_t _name = { \
183 .entries = { { .data = _buf } }, \
184 .storage_capacity = capacity, \
200 #define UNICOAP_OPTIONS_ALLOC(name, capacity) \
201 _UNICOAP_OPTIONS_ALLOC(_CONCAT3(name, _storage, __LINE__), name, capacity,)
215 #define UNICOAP_OPTIONS_ALLOC_STATIC(name, capacity) \
216 _UNICOAP_OPTIONS_ALLOC(_CONCAT3(name, _storage, __LINE__), name, capacity, static)
229 #define UNICOAP_OPTIONS_ALLOC_DEFAULT(name) \
230 UNICOAP_OPTIONS_ALLOC(name, CONFIG_UNICOAP_OPTIONS_BUFFER_DEFAULT_CAPACITY)
243 #define UNICOAP_OPTIONS_ALLOC_STATIC_DEFAULT(name) \
244 UNICOAP_OPTIONS_ALLOC_STATIC(name, CONFIG_UNICOAP_OPTIONS_BUFFER_DEFAULT_CAPACITY)
264 return option_number & 1;
277 return (option_number & 2) == 0;
292 return ((option_number & 0x1e) == 0x1c);
307 return ((option_number & 0x1e) != 0x1c);
369 #if !defined(EBADOPT) || defined(DOXYGEN)
374 #if !defined(EPAYLD) || defined(DOXYGEN)
379 #define UNICOAP_UINT24_MAX (0xffffff)
382 #define UNICOAP_UINT24_SIZE (3)
390 #define UNICOAP_UINT_MAX (14 + 255 + 0xffff)
423 const uint8_t* value,
size_t value_size);
446 const uint8_t* buffer,
size_t size, uint8_t separator);
469 size_t capacity, uint8_t separator);
507 const uint8_t** value);
524 uint8_t* dest,
size_t capacity);
539 const uint8_t* value,
size_t value_size);
709 ((count > 0) &&
string) ? count : strlen(
string));
735 ((count > 0) &&
string) ? count : strlen(
string));
786 return _unicoap_options_get_variable_uint(options, number, uint,
sizeof(uint32_t));
833 int res = _unicoap_options_get_variable_uint(options, number, &_uint,
sizeof(uint16_t));
834 *uint = (uint16_t)_uint;
951 assert(length > 0 && length <= 255);
1258 const char** scheme)
1357 assert(length > 0 && length <= 1034);
1466 const uint8_t** value)
1485 const uint8_t** value)
1542 const uint8_t** etag)
1561 const uint8_t** etag)
1583 assert(size > 0 && size <= 8);
1618 static inline ssize_t
1620 const char** component)
1638 static inline ssize_t
1640 const char** component)
1643 (
const uint8_t**)component);
1666 char* path,
size_t capacity)
1673 (uint8_t*)path, capacity,
'/');
1674 return res < 0 ? res : res + 1;
1691 char* component,
size_t length)
1792 const char** component)
1810 static inline ssize_t
1812 const char** component)
1815 (
const uint8_t**)component);
1846 return res < 0 ? res : res + 1;
1864 char* component,
size_t length)
1990 (
const uint8_t**)query);
2010 static inline ssize_t
2061 char* queries,
size_t capacity)
2208 (
const uint8_t**)query);
2228 static inline ssize_t
2230 const char* name,
const char** value)
2280 char* queries,
size_t capacity)
2283 (uint8_t*)queries, capacity,
'&');
2345 char* queries,
size_t length)
2348 (uint8_t*)queries, length,
'&');
2395 #define UNICOAP_OBSERVE_OPTION_REGISTER (0)
2398 #define UNICOAP_OBSERVE_OPTION_DEREGISTER (1)
2469 #define UNICOAP_BLOCK_OPTION_NONE (0x0f000000)
POSIX.1-2008 compliant version of the assert macro.
#define assert(cond)
abort the program if assertion is false
Functions to work with different byte orders.
Constants used in CoAP such as option numbers and message codes.
#define CONFIG_UNICOAP_OPTIONS_MAX
Maximum number of options that can be present in a request or response.
static ssize_t unicoap_options_get_uint8(const unicoap_options_t *options, unicoap_option_number_t number, uint8_t *uint)
Retrieves an unsigned option value that takes up at most one bytes.
static ssize_t unicoap_options_get_uint16(const unicoap_options_t *options, unicoap_option_number_t number, uint16_t *uint)
Retrieves an unsigned option value that takes up at most 2 bytes.
ssize_t unicoap_options_copy_values_joined(const unicoap_options_t *options, unicoap_option_number_t number, uint8_t *buffer, size_t capacity, uint8_t separator)
Copies the values of all options with the given number joined by the given separator.
ssize_t unicoap_options_get(const unicoap_options_t *options, unicoap_option_number_t number, const uint8_t **value)
Retrieves the value of the option with given value, if present.
void unicoap_options_dump_all(const unicoap_options_t *options)
Iterates and dumps all options using printf
int unicoap_options_remove_all(unicoap_options_t *options, unicoap_option_number_t number)
Removes all options with the given number, if any.
static void unicoap_options_iterator_init(unicoap_options_iterator_t *iterator, unicoap_options_t *options)
Initializes the given iterator structure.
static ssize_t unicoap_options_get_uint24(const unicoap_options_t *options, unicoap_option_number_t number, uint32_t *uint)
Retrieves an unsigned option value that takes up at most 3 bytes.
ssize_t unicoap_options_copy_value(const unicoap_options_t *options, unicoap_option_number_t number, uint8_t *dest, size_t capacity)
Copies the value of the option with given value, if present, into a buffer.
int unicoap_options_add(unicoap_options_t *options, unicoap_option_number_t number, const uint8_t *value, size_t value_size)
Adds a repeatable option with the given value.
ssize_t unicoap_options_get_next(unicoap_options_iterator_t *iterator, unicoap_option_number_t *number, const uint8_t **value)
Gets the next option provided by the given iterator.
int unicoap_options_set(unicoap_options_t *options, unicoap_option_number_t number, const uint8_t *value, size_t value_size)
Sets the option with the given number.
int unicoap_options_set_uint(unicoap_options_t *options, unicoap_option_number_t number, uint32_t value)
Sets the option with the given number to the unsigned integer value passed.
ssize_t unicoap_options_get_next_by_number(unicoap_options_iterator_t *iterator, unicoap_option_number_t number, const uint8_t **value)
Gets the next option with the given number, potentially skipping any options in between.
static int unicoap_options_remove(unicoap_options_t *options, unicoap_option_number_t number)
Removes option with the given number, if present.
static int unicoap_options_add_string(unicoap_options_t *options, unicoap_option_number_t number, const char *string, size_t count)
Adds a repeatable option with the given string value.
ssize_t unicoap_options_get_next_query_by_name(unicoap_options_iterator_t *iterator, unicoap_option_number_t number, const char *name, const char **value)
Gets the next query option matching the given name, potentially skipping any options in between.
int unicoap_options_add_uint(unicoap_options_t *options, unicoap_option_number_t number, uint32_t value)
Adds a repeatable option with the given unsigned integer value.
static int unicoap_options_set_string(unicoap_options_t *options, unicoap_option_number_t number, const char *string, size_t count)
Sets a non-repeatable option to the given string value.
static ssize_t unicoap_options_get_uint32(const unicoap_options_t *options, unicoap_option_number_t number, uint32_t *uint)
Retrieves an unsigned option value that takes up at most 4 bytes.
int unicoap_options_add_values_joined(unicoap_options_t *options, unicoap_option_number_t number, const uint8_t *buffer, size_t size, uint8_t separator)
Splits the given value into separate values and adds them as option values.
static ssize_t unicoap_options_add_uri_path_string(unicoap_options_t *options, char *path)
Adds multiple Uri-Path options from null-terminated string.
uint32_t unicoap_block_option_t
Block1 and Block2 option value
static ssize_t unicoap_options_get_proxy_scheme(const unicoap_options_t *options, const char **scheme)
Retrieves the Proxy-Scheme option, if present.
static ssize_t unicoap_options_set_size2(unicoap_options_t *options, uint32_t size)
Sets the Size2 option.
static ssize_t unicoap_options_get_first_uri_query(const unicoap_options_t *options, const char **query)
Retrieves the first Uri-Query option, if present.
static ssize_t unicoap_options_set_proxy_scheme_string(unicoap_options_t *options, char *scheme)
Sets the Proxy-Scheme option from null-terminated string.
static int unicoap_options_remove_observe(unicoap_options_t *options)
Removes the Observe option, if present.
static ssize_t unicoap_options_copy_location_path(const unicoap_options_t *options, char *path, size_t capacity)
Copies absolute location path into the given buffer.
static ssize_t unicoap_options_set_if_none_match(unicoap_options_t *options, bool value)
Sets the If-None-Match option.
static int unicoap_options_remove_block1(unicoap_options_t *options)
Removes the Block1 option, if present.
static int unicoap_options_remove_location_queries(unicoap_options_t *options)
Removes all Location-Query options, if any.
static ssize_t unicoap_options_add_uri_query_string(unicoap_options_t *options, char *query)
Adds Uri-Query option from null-terminated string.
static ssize_t unicoap_options_set_uri_port(unicoap_options_t *options, uint16_t port)
Sets the Uri-Port option.
static ssize_t unicoap_options_set_proxy_uri(unicoap_options_t *options, char *uri, size_t length)
Sets the Proxy-Uri option.
static ssize_t unicoap_options_set_proxy_uri_string(unicoap_options_t *options, char *uri)
Sets the Proxy-Uri option from null-terminated string.
static ssize_t unicoap_options_set_proxy_scheme(unicoap_options_t *options, char *scheme, size_t length)
Sets the Proxy-Scheme option.
static int unicoap_options_remove_accept(unicoap_options_t *options)
Removes the Accept option, if present.
static ssize_t unicoap_options_set_accept(unicoap_options_t *options, unicoap_content_format_t format)
Sets the Accept option.
static ssize_t unicoap_options_add_location_queries(unicoap_options_t *options, char *queries, size_t length)
Adds multiple Location-Query options from string.
static int unicoap_options_set_block(unicoap_options_t *options, unicoap_option_number_t number, unicoap_block_option_t block)
Sets the Block1 or Block2 option.
static ssize_t unicoap_options_add_location_path_component_string(unicoap_options_t *options, char *component)
Adds Location-Path option from null-terminated string.
static ssize_t unicoap_options_add_uri_queries(unicoap_options_t *options, char *queries, size_t length)
Adds multiple Uri-Query options from string.
static ssize_t unicoap_options_add_if_match(unicoap_options_t *options, uint8_t *value, size_t size)
Adds If-Match option.
static ssize_t unicoap_options_add_uri_query(unicoap_options_t *options, char *query, size_t length)
Adds Uri-Query option.
static ssize_t unicoap_options_set_no_response(unicoap_options_t *options, uint8_t value)
Sets the No-Response option.
static ssize_t unicoap_options_set_block1(unicoap_options_t *options, unicoap_block_option_t block)
Sets the Block1 option.
static ssize_t unicoap_options_add_location_path(unicoap_options_t *options, char *path, size_t length)
Adds multiple Location-Path options from string.
static ssize_t unicoap_options_set_observe(unicoap_options_t *options, uint32_t observe)
Sets the Observe option.
static ssize_t unicoap_options_get_block(const unicoap_options_t *options, unicoap_option_number_t number, unicoap_block_option_t *block)
Retrieves a Block1 or Block2 option.
static ssize_t unicoap_options_get_max_age(const unicoap_options_t *options, uint32_t *age)
Retrieves the Max-Age option, if present.
static int unicoap_options_remove_max_age(unicoap_options_t *options)
Removes the Max-Age option, if present.
static ssize_t unicoap_options_add_location_path_component(unicoap_options_t *options, char *component, size_t length)
Adds Location-Path option.
static ssize_t unicoap_options_get_first_etag(const unicoap_options_t *options, const uint8_t **etag)
Retrieves the first ETag option, if present.
static ssize_t unicoap_options_get_block2(const unicoap_options_t *options, unicoap_block_option_t *block)
Retrieves the Block2 option, if present.
static ssize_t unicoap_options_copy_location_queries(const unicoap_options_t *options, char *queries, size_t capacity)
Copies location query string into the given buffer.
static ssize_t unicoap_options_add_uri_path(unicoap_options_t *options, char *path, size_t length)
Adds multiple Uri-Path options from string.
static ssize_t unicoap_options_get_first_location_query(const unicoap_options_t *options, const char **query)
Retrieves the first Location-Query option, if present.
unicoap_content_format_t
Content-Format option values
static ssize_t unicoap_options_set_uri_host_string(unicoap_options_t *options, char *host)
Sets the Uri-Host option from null-terminated string.
static ssize_t unicoap_options_get_first_if_match(const unicoap_options_t *options, const uint8_t **value)
Retrieves the first If-Match option, if present.
static int unicoap_options_remove_no_response(unicoap_options_t *options)
Removes the No-Response option, if present.
static ssize_t unicoap_options_add_location_query_string(unicoap_options_t *options, char *query)
Adds Location-Query option from null-terminated string.
static ssize_t unicoap_options_get_next_uri_query(unicoap_options_iterator_t *iterator, const char **query)
Gets the next Uri-Query option provided by the specified iterator.
static int unicoap_options_remove_all_if_match(unicoap_options_t *options)
Removes all If-Match options, if any.
static int unicoap_options_remove_uri_host(unicoap_options_t *options)
Removes the Uri-Host option, if present.
static ssize_t unicoap_options_get_first_uri_path_component(const unicoap_options_t *options, const char **component)
Retrieves the first Uri-Path option, if present.
static int unicoap_options_remove_content_format(unicoap_options_t *options)
Removes the Content-Format option, if present.
static ssize_t unicoap_options_set_max_age(unicoap_options_t *options, uint32_t age)
Sets the Max-Age option.
static ssize_t unicoap_options_get_no_response(const unicoap_options_t *options, uint8_t *value)
Retrieves the No-Response option, if present.
static ssize_t unicoap_options_set_block2(unicoap_options_t *options, unicoap_block_option_t block)
Sets the Block2 option.
static ssize_t unicoap_options_get_next_location_path_component(unicoap_options_iterator_t *iterator, const char **component)
Gets the next Location-Path option provided by the specified iterator.
static ssize_t unicoap_options_get_next_etag(unicoap_options_iterator_t *iterator, const uint8_t **etag)
Gets the next ETag option provided by the specified iterator.
static ssize_t unicoap_options_get_next_if_match(unicoap_options_iterator_t *iterator, const uint8_t **value)
Gets the next If-Match option provided by the specified iterator.
static ssize_t unicoap_options_get_uri_port(const unicoap_options_t *options, uint16_t *port)
Retrieves the Uri-Port option, if present.
static ssize_t unicoap_options_get_next_location_query_by_name(unicoap_options_iterator_t *iterator, const char *name, const char **value)
Gets the next Location-Query option matching the given name, potentially skipping any options in betw...
static int unicoap_options_remove_size2(unicoap_options_t *options)
Removes the Size2 option, if present.
int unicoap_options_set_observe_generated(unicoap_options_t *options)
Sets the Observe option to a randomly generated value.
static int unicoap_options_remove_uri_path(unicoap_options_t *options)
Removes all Uri-Path options, if any.
static ssize_t unicoap_options_get_size1(const unicoap_options_t *options, uint32_t *size)
Retrieves the Size1 option, if present.
static bool unicoap_options_get_if_none_match(const unicoap_options_t *options)
Determines whether the If-None-Match option is present.
static ssize_t unicoap_options_copy_uri_queries(const unicoap_options_t *options, char *queries, size_t capacity)
Copies URI query string into the given buffer.
static ssize_t unicoap_options_add_location_query(unicoap_options_t *options, char *query, size_t length)
Adds Location-Query option.
static ssize_t unicoap_options_get_size2(const unicoap_options_t *options, uint32_t *size)
Retrieves the Size2 option, if present.
static ssize_t unicoap_options_get_accept(const unicoap_options_t *options, unicoap_content_format_t *format)
Retrieves the Accept option, if present.
static ssize_t unicoap_options_add_uri_path_component(unicoap_options_t *options, char *component, size_t length)
Adds Uri-Path option.
static ssize_t unicoap_options_get_next_uri_query_by_name(unicoap_options_iterator_t *iterator, const char *name, const char **value)
Gets the next Uri-Query option matching the given name, potentially skipping any options in between.
static ssize_t unicoap_options_get_next_location_query(unicoap_options_iterator_t *iterator, const char **query)
Gets the next Location-Query option provided by the specified iterator.
static int unicoap_options_remove_etags(unicoap_options_t *options)
Removes all ETag options, if any.
static ssize_t unicoap_options_copy_uri_path(const unicoap_options_t *options, char *path, size_t capacity)
Copies absolute URI path into the given buffer.
static ssize_t unicoap_options_add_etag(unicoap_options_t *options, uint8_t *etag, size_t size)
Adds ETag option.
static ssize_t unicoap_options_get_content_format(const unicoap_options_t *options, unicoap_content_format_t *format)
Retrieves the Content-Format option, if present.
static ssize_t unicoap_options_get_first_uri_query_by_name(unicoap_options_t *options, const char *name, const char **value)
Retrieves the first Uri-Query option matching the given name, if present.
static ssize_t unicoap_options_get_first_location_query_by_name(unicoap_options_t *options, const char *name, const char **value)
Retrieves the first Location-Query option matching the given name, if present.
static int unicoap_options_remove_proxy_scheme(unicoap_options_t *options)
Removes the Proxy-Scheme option, if present.
static ssize_t unicoap_options_add_location_queries_string(unicoap_options_t *options, char *queries)
Adds multiple Location-Query options from null-terminated string.
static int unicoap_options_remove_uri_queries(unicoap_options_t *options)
Removes all Uri-Query options, if any.
static ssize_t unicoap_options_add_uri_queries_string(unicoap_options_t *options, char *queries)
Adds multiple Uri-Query options from null-terminated string.
static ssize_t unicoap_options_add_uri_path_component_string(unicoap_options_t *options, char *component)
Adds Uri-Path option from null-terminated string.
static ssize_t unicoap_options_get_block1(const unicoap_options_t *options, unicoap_block_option_t *block)
Retrieves the Block1 option, if present.
static ssize_t unicoap_options_get_proxy_uri(const unicoap_options_t *options, const char **uri)
Retrieves the Proxy-Uri option, if present.
static ssize_t unicoap_options_get_uri_host(const unicoap_options_t *options, const char **host)
Retrieves the Uri-Host option, if present.
static int unicoap_options_remove_location_path(unicoap_options_t *options)
Removes all Location-Path options, if any.
static ssize_t unicoap_options_add_location_path_string(unicoap_options_t *options, char *path)
Adds multiple Location-Path options from null-terminated string.
static ssize_t unicoap_options_set_content_format(unicoap_options_t *options, unicoap_content_format_t format)
Sets the Content-Format option.
static int unicoap_options_remove_block2(unicoap_options_t *options)
Removes the Block2 option, if present.
static ssize_t unicoap_options_get_next_uri_path_component(unicoap_options_iterator_t *iterator, const char **component)
Gets the next Uri-Path option provided by the specified iterator.
static int unicoap_options_remove_size1(unicoap_options_t *options)
Removes the Size1 option, if present.
static ssize_t unicoap_options_set_uri_host(unicoap_options_t *options, char *host, size_t length)
Sets the Uri-Host option.
static ssize_t unicoap_options_get_observe(const unicoap_options_t *options, uint32_t *observe)
Retrieves the Observe option, if present.
static ssize_t unicoap_options_get_first_location_path_component(const unicoap_options_t *options, const char **component)
Retrieves the first Location-Path option, if present.
static ssize_t unicoap_options_set_size1(unicoap_options_t *options, uint32_t size)
Sets the Size1 option.
static int unicoap_options_remove_uri_port(unicoap_options_t *options)
Removes the Uri-Port option, if present.
static int unicoap_options_remove_proxy_uri(unicoap_options_t *options)
Removes the Proxy-Uri option, if present.
unicoap_option_number_t
CoAP option number.
#define UNICOAP_UINT24_SIZE
Size in bytes of number representable with 24 bits (3 bytes)
static uint8_t * unicoap_options_data(const unicoap_options_t *options)
Retrieves storage buffer.
static void unicoap_options_clear(unicoap_options_t *options)
Removes all options.
static size_t unicoap_options_size(const unicoap_options_t *options)
Retrieves total size of options in buffer.
static bool unicoap_option_is_no_cache_key(unicoap_option_number_t option_number)
Determines whether the given option is not intended to be part of the cache key.
static bool unicoap_option_is_critical(unicoap_option_number_t option_number)
Determines whether the given option is considered critical.
static void unicoap_options_init(unicoap_options_t *options, uint8_t *storage, size_t capacity)
Initializes the given options structure.
ssize_t unicoap_options_swap_storage(unicoap_options_t *options, uint8_t *destination, size_t capacity)
Copies storage and adjusts options struct.
static bool unicoap_option_is_safe_to_forward(unicoap_option_number_t option_number)
Determines whether the given option is safe to forward.
const char * unicoap_string_from_option_number(unicoap_option_number_t number)
Returns label of option corresponding to the given number.
bool unicoap_options_contains(const unicoap_options_t *options, unicoap_option_number_t number)
Determines whether the given options container has one or more options with the given number.
#define UNICOAP_UINT24_MAX
Largest number representable with 24 bits (3 bytes)
static bool unicoap_option_is_cache_key(unicoap_option_number_t option_number)
Determines whether the given option is intended to be part of the cache key.
@ UNICOAP_OPTION_URI_PORT
Uri-Port
@ UNICOAP_OPTION_MAX_AGE
Max-Age option
@ UNICOAP_OPTION_URI_HOST
Uri-Host option
@ UNICOAP_OPTION_CONTENT_FORMAT
Content-Format option
@ UNICOAP_OPTION_OBSERVE
Observe option
@ UNICOAP_OPTION_IF_MATCH
If-Match option
@ UNICOAP_OPTION_NO_RESPONSE
suppress CoAP response
@ UNICOAP_OPTION_PROXY_URI
Proxy-Uri option
@ UNICOAP_OPTION_BLOCK2
Block2 option
@ UNICOAP_OPTION_SIZE2
Size2 option.
@ UNICOAP_OPTION_URI_PATH
Uri-Path option
@ UNICOAP_OPTION_BLOCK1
Block1 option
@ UNICOAP_OPTION_ETAG
ETag option
@ UNICOAP_OPTION_LOCATION_QUERY
Location-Query option
@ UNICOAP_OPTION_IF_NONE_MATCH
If-None-Match option
@ UNICOAP_OPTION_LOCATION_PATH
Location-Path option
@ UNICOAP_OPTION_SIZE1
Size1 option.
@ UNICOAP_OPTION_PROXY_SCHEME
Proxy-Scheme option
@ UNICOAP_OPTION_URI_QUERY
Uri-Query option
@ UNICOAP_OPTION_ACCEPT
Accept option
Helper struct for options parser.
uint16_t size
Number of bytes this option is comprised of.
uint8_t * data
Pointer into options storage where this option starts.
unicoap_option_number_t number
Option number.
The iterator you use to retrieve option values in-order.
size_t index
Current option's index.
unicoap_options_t * options
Options.
size_t storage_size
Current size of encoded options.
size_t option_count
Number of options present.
unicoap_option_entry_t entries[CONFIG_UNICOAP_OPTIONS_MAX]
Helper array used to encode and decode options into options storage.
size_t storage_capacity
Available capacity in options storage buffer.
Utility macros for unicoap