options.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2024-2025 Carl Seifert
3  * Copyright (C) 2024-2025 TU Dresden
4  *
5  * This file is subject to the terms and conditions of the GNU Lesser General
6  * Public License v2.1. See the file LICENSE in the top level directory for
7  * more details.
8  */
9 
10 #pragma once
11 
12 #include <stdint.h>
13 #include <stdbool.h>
14 #include <string.h>
15 #include <assert.h>
16 #include <errno.h>
17 #include <sys/types.h>
18 
19 #include "byteorder.h"
20 
21 #include "net/unicoap/constants.h"
23 
62 #ifdef __cplusplus
63 extern "C" {
64 #endif
65 
66 /* MARK: - Essentials */
74 typedef struct {
79  uint8_t* data;
80 
84  uint16_t size;
85 
91 
100 typedef struct {
101  /* TODO: OSCORE: read-only due to options stored in two different buffers */
102 
106  size_t storage_size;
107 
114 
122 
128  size_t option_count;
130 
139 static inline void unicoap_options_init(unicoap_options_t* options, uint8_t* storage,
140  size_t capacity)
141 {
142  options->entries->data = storage;
143  options->option_count = 0;
144  options->storage_size = 0;
145  options->storage_capacity = capacity;
146 }
147 
160 
167 static inline void unicoap_options_clear(unicoap_options_t* options)
168 {
169  options->option_count = 0;
170  options->storage_size = 0;
171 }
174 /* MARK: - Allocating option buffers */
179 #ifndef DOXYGEN
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, \
185  };
186 #endif
187 
200 #define UNICOAP_OPTIONS_ALLOC(name, capacity) \
201  _UNICOAP_OPTIONS_ALLOC(_CONCAT3(name, _storage, __LINE__), name, capacity,)
202 
215 #define UNICOAP_OPTIONS_ALLOC_STATIC(name, capacity) \
216  _UNICOAP_OPTIONS_ALLOC(_CONCAT3(name, _storage, __LINE__), name, capacity, static)
217 
229 #define UNICOAP_OPTIONS_ALLOC_DEFAULT(name) \
230  UNICOAP_OPTIONS_ALLOC(name, CONFIG_UNICOAP_OPTIONS_BUFFER_DEFAULT_CAPACITY)
231 
243 #define UNICOAP_OPTIONS_ALLOC_STATIC_DEFAULT(name) \
244  UNICOAP_OPTIONS_ALLOC_STATIC(name, CONFIG_UNICOAP_OPTIONS_BUFFER_DEFAULT_CAPACITY)
247 /* MARK: - Option characteristics */
262 static inline bool unicoap_option_is_critical(unicoap_option_number_t option_number)
263 {
264  return option_number & 1;
265 }
266 
276 {
277  return (option_number & 2) == 0;
278 }
279 
291 {
292  return ((option_number & 0x1e) == 0x1c);
293 }
294 
305 static inline bool unicoap_option_is_cache_key(unicoap_option_number_t option_number)
306 {
307  return ((option_number & 0x1e) != 0x1c);
308 }
311 /* MARK: - Tools */
322 
335 ssize_t unicoap_options_swap_storage(unicoap_options_t* options, uint8_t* destination,
336  size_t capacity);
337 
345 static inline uint8_t* unicoap_options_data(const unicoap_options_t* options)
346 {
347  return options->entries->data;
348 }
349 
357 static inline size_t unicoap_options_size(const unicoap_options_t* options)
358 {
359  return options->storage_size;
360 }
363 /* MARK: - Auxiliary constants */
369 #if !defined(EBADOPT) || defined(DOXYGEN)
370 # define EBADOPT 151
371 #endif
372 
374 #if !defined(EPAYLD) || defined(DOXYGEN)
375 # define EPAYLD 152
376 #endif
377 
379 #define UNICOAP_UINT24_MAX (0xffffff)
380 
382 #define UNICOAP_UINT24_SIZE (3)
383 
390 #define UNICOAP_UINT_MAX (14 + 255 + 0xffff)
393 /* MARK: - Generic Option Methods - */
400 /* MARK: - Repeatable options */
423  const uint8_t* value, size_t value_size);
424 
446  const uint8_t* buffer, size_t size, uint8_t separator);
447 
468  unicoap_option_number_t number, uint8_t* buffer,
469  size_t capacity, uint8_t separator);
470 
487 /* MARK: - Non-repeatable options */
507  const uint8_t** value);
508 
524  uint8_t* dest, size_t capacity);
525 
539  const uint8_t* value, size_t value_size);
540 
553 {
554  /* reuse unicoap_options_remove_all, helps decrease binary size */
555  return unicoap_options_remove_all(options, number);
556 }
559 /* MARK: - Enumerating options */
582 typedef struct {
587 
591  size_t index;
593 
602  unicoap_options_t* options)
603 {
604  assert(iterator);
605  assert(options);
606  assert(options->entries->data);
607  iterator->options = options;
608  iterator->index = 0;
609 }
610 
626  unicoap_option_number_t* number, const uint8_t** value);
627 
644  unicoap_option_number_t number, const uint8_t** value);
645 
672  unicoap_option_number_t number, const char* name,
673  const char** value);
674 
684 /* MARK: - Strings */
705  unicoap_option_number_t number, const char* string,
706  size_t count)
707 {
708  return unicoap_options_set(options, number, (uint8_t*)string,
709  ((count > 0) && string) ? count : strlen(string));
710 }
711 
731  unicoap_option_number_t number, const char* string,
732  size_t count)
733 {
734  return unicoap_options_add(options, number, (uint8_t*)string,
735  ((count > 0) && string) ? count : strlen(string));
736 }
739 /* MARK: - Unsigned integers */
744 #ifndef DOXYGEN
761 ssize_t _unicoap_options_get_variable_uint(const unicoap_options_t* options,
762  unicoap_option_number_t number, uint32_t* uint,
763  size_t max_size);
764 #endif
765 
783 static inline ssize_t unicoap_options_get_uint32(const unicoap_options_t* options,
784  unicoap_option_number_t number, uint32_t* uint)
785 {
786  return _unicoap_options_get_variable_uint(options, number, uint, sizeof(uint32_t));
787 }
788 
806 static inline ssize_t unicoap_options_get_uint24(const unicoap_options_t* options,
807  unicoap_option_number_t number, uint32_t* uint)
808 {
809  return _unicoap_options_get_variable_uint(options, number, uint, UNICOAP_UINT24_SIZE);
810 }
811 
829 static inline ssize_t unicoap_options_get_uint16(const unicoap_options_t* options,
830  unicoap_option_number_t number, uint16_t* uint)
831 {
832  uint32_t _uint = 0;
833  int res = _unicoap_options_get_variable_uint(options, number, &_uint, sizeof(uint16_t));
834  *uint = (uint16_t)_uint;
835  return res;
836 }
837 
856 static inline ssize_t unicoap_options_get_uint8(const unicoap_options_t* options,
857  unicoap_option_number_t number, uint8_t* uint)
858 {
859  return unicoap_options_copy_value(options, number, uint, sizeof(uint8_t));
860 }
861 
877  uint32_t value);
878 
897  uint32_t value);
901 /* MARK: - Predefined Options - */
902 
910 /* MARK: - Uri-Host */
927 static inline ssize_t unicoap_options_get_uri_host(const unicoap_options_t* options,
928  const char** host)
929 {
930  return unicoap_options_get(options, UNICOAP_OPTION_URI_HOST, (const uint8_t**)host);
931 }
932 
948 static inline ssize_t unicoap_options_set_uri_host(unicoap_options_t* options, char* host,
949  size_t length)
950 {
951  assert(length > 0 && length <= 255);
952  return unicoap_options_set(options, UNICOAP_OPTION_URI_HOST, (uint8_t*)host, length);
953 }
954 
971 static inline ssize_t unicoap_options_set_uri_host_string(unicoap_options_t* options, char* host)
972 {
973  return unicoap_options_set_uri_host(options, host, strlen(host));
974 }
975 
985 {
987 } /* Uri-Host */
989 
990 /* MARK: - If-None-Match */
1006 static inline bool unicoap_options_get_if_none_match(const unicoap_options_t* options)
1007 {
1009 }
1010 
1021 static inline ssize_t unicoap_options_set_if_none_match(unicoap_options_t* options, bool value)
1022 {
1023  if (value) {
1025  }
1026  else {
1027  return unicoap_options_set(options, UNICOAP_OPTION_IF_NONE_MATCH, NULL, 0);
1028  }
1029 } /* If-None-Match */
1031 
1032 /* MARK: - Uri-Port */
1049 static inline ssize_t unicoap_options_get_uri_port(const unicoap_options_t* options, uint16_t* port)
1050 {
1051  return unicoap_options_get_uint16(options, UNICOAP_OPTION_URI_PORT, port);
1052 }
1053 
1064 static inline ssize_t unicoap_options_set_uri_port(unicoap_options_t* options, uint16_t port)
1065 {
1066  return unicoap_options_set_uint(options, UNICOAP_OPTION_URI_PORT, (uint32_t)port);
1067 }
1068 
1078 {
1080 } /* Uri-Port */
1082 
1083 /* MARK: - Content-Format */
1100 static inline ssize_t unicoap_options_get_content_format(const unicoap_options_t* options,
1101  unicoap_content_format_t* format)
1102 {
1103  return unicoap_options_get_uint16(options, UNICOAP_OPTION_CONTENT_FORMAT, (uint16_t*)format);
1104 }
1105 
1117  unicoap_content_format_t format)
1118 {
1119  return unicoap_options_set_uint(options, UNICOAP_OPTION_CONTENT_FORMAT, (uint32_t)format);
1120 }
1121 
1131 {
1133 } /* Content-Format */
1135 
1136 /* MARK: - Max-Age */
1153 static inline ssize_t unicoap_options_get_max_age(const unicoap_options_t* options, uint32_t* age)
1154 {
1155  return unicoap_options_get_uint32(options, UNICOAP_OPTION_MAX_AGE, age);
1156 }
1157 
1168 static inline ssize_t unicoap_options_set_max_age(unicoap_options_t* options, uint32_t age)
1169 {
1170  return unicoap_options_set_uint(options, UNICOAP_OPTION_MAX_AGE, age);
1171 }
1172 
1182 {
1184 } /* Max-Age */
1186 
1187 /* MARK: - Accept */
1204 static inline ssize_t unicoap_options_get_accept(const unicoap_options_t* options,
1205  unicoap_content_format_t* format)
1206 {
1207  return unicoap_options_get_uint16(options, UNICOAP_OPTION_ACCEPT, (uint16_t*)format);
1208 }
1209 
1220 static inline ssize_t unicoap_options_set_accept(unicoap_options_t* options,
1221  unicoap_content_format_t format)
1222 {
1223  return unicoap_options_set_uint(options, UNICOAP_OPTION_ACCEPT, (uint32_t)format);
1224 }
1225 
1235 {
1237 } /* Accept */
1239 
1240 /* MARK: - Proxy-Scheme */
1257 static inline ssize_t unicoap_options_get_proxy_scheme(const unicoap_options_t* options,
1258  const char** scheme)
1259 {
1260  return unicoap_options_get(options, UNICOAP_OPTION_PROXY_SCHEME, (const uint8_t**)scheme);
1261 }
1262 
1276 static inline ssize_t unicoap_options_set_proxy_scheme(unicoap_options_t* options, char* scheme,
1277  size_t length)
1278 {
1279  return unicoap_options_set(options, UNICOAP_OPTION_PROXY_SCHEME, (uint8_t*)scheme, length);
1280 }
1281 
1297  char* scheme)
1298 {
1299  return unicoap_options_set_proxy_scheme(options, scheme, strlen(scheme));
1300 }
1301 
1311 {
1313 } /* Proxy-Scheme */
1315 
1316 /* MARK: - Proxy-Uri */
1333 static inline ssize_t unicoap_options_get_proxy_uri(const unicoap_options_t* options,
1334  const char** uri)
1335 {
1336  return unicoap_options_get(options, UNICOAP_OPTION_PROXY_URI, (const uint8_t**)uri);
1337 }
1338 
1354 static inline ssize_t unicoap_options_set_proxy_uri(unicoap_options_t* options, char* uri,
1355  size_t length)
1356 {
1357  assert(length > 0 && length <= 1034);
1358  return unicoap_options_set(options, UNICOAP_OPTION_PROXY_URI, (uint8_t*)uri, length);
1359 }
1360 
1377 static inline ssize_t unicoap_options_set_proxy_uri_string(unicoap_options_t* options, char* uri)
1378 {
1379  return unicoap_options_set_proxy_uri(options, uri, strlen(uri));
1380 }
1381 
1391 {
1393 } /* Proxy-Uri */
1395 
1396 /* MARK: - No-Response */
1413 static inline ssize_t unicoap_options_get_no_response(const unicoap_options_t* options,
1414  uint8_t* value)
1415 {
1416  return unicoap_options_get_uint8(options, UNICOAP_OPTION_NO_RESPONSE, value);
1417 }
1418 
1429 static inline ssize_t unicoap_options_set_no_response(unicoap_options_t* options, uint8_t value)
1430 {
1431  return unicoap_options_set_uint(options, UNICOAP_OPTION_NO_RESPONSE, (uint32_t)value);
1432 }
1433 
1443 {
1445 } /* No-Response */
1447 
1448 /* MARK: - If-Match */
1465 static inline ssize_t unicoap_options_get_first_if_match(const unicoap_options_t* options,
1466  const uint8_t** value)
1467 {
1468  return unicoap_options_get(options, UNICOAP_OPTION_IF_MATCH, value);
1469 }
1470 
1485  const uint8_t** value)
1486 {
1488 }
1489 
1503 static inline ssize_t unicoap_options_add_if_match(unicoap_options_t* options, uint8_t* value,
1504  size_t size)
1505 {
1506  assert(size <= 8);
1507  return unicoap_options_add(options, UNICOAP_OPTION_IF_MATCH, value, size);
1508 }
1509 
1519 {
1521 } /* If-Match */
1523 
1524 /* MARK: - ETag */
1541 static inline ssize_t unicoap_options_get_first_etag(const unicoap_options_t* options,
1542  const uint8_t** etag)
1543 {
1544  return unicoap_options_get(options, UNICOAP_OPTION_ETAG, etag);
1545 }
1546 
1561  const uint8_t** etag)
1562 {
1564 }
1565 
1580 static inline ssize_t unicoap_options_add_etag(unicoap_options_t* options, uint8_t* etag,
1581  size_t size)
1582 {
1583  assert(size > 0 && size <= 8);
1584  return unicoap_options_add(options, UNICOAP_OPTION_ETAG, etag, size);
1585 }
1586 
1596 {
1598 } /* ETag */
1600 
1601 /* MARK: - Location-Path */
1618 static inline ssize_t
1620  const char** component)
1621 {
1622  return unicoap_options_get(options, UNICOAP_OPTION_LOCATION_PATH, (const uint8_t**)component);
1623 }
1624 
1638 static inline ssize_t
1640  const char** component)
1641 {
1643  (const uint8_t**)component);
1644 }
1645 
1665 static inline ssize_t unicoap_options_copy_location_path(const unicoap_options_t* options,
1666  char* path, size_t capacity)
1667 {
1668  assert(capacity > 0);
1669  *path = '/';
1670  path += 1;
1671  capacity -= 1;
1673  (uint8_t*)path, capacity, '/');
1674  return res < 0 ? res : res + 1;
1675 }
1676 
1691  char* component, size_t length)
1692 {
1693  return unicoap_options_add(options, UNICOAP_OPTION_LOCATION_PATH, (uint8_t*)component, length);
1694 }
1695 
1711  char* component)
1712 {
1713  return unicoap_options_add_location_path_component(options, component, strlen(component));
1714 }
1715 
1731 static inline ssize_t unicoap_options_add_location_path(unicoap_options_t* options, char* path,
1732  size_t length)
1733 {
1734  return unicoap_options_add_values_joined(options, UNICOAP_OPTION_LOCATION_PATH, (uint8_t*)path,
1735  length, '/');
1736 }
1737 
1755  char* path)
1756 {
1757  return unicoap_options_add_location_path(options, path, strlen(path));
1758 }
1759 
1769 {
1771 } /* Location-Path */
1773 
1774 /* MARK: - Uri-Path */
1792  const char** component)
1793 {
1794  return unicoap_options_get(options, UNICOAP_OPTION_URI_PATH, (const uint8_t**)component);
1795 }
1796 
1810 static inline ssize_t
1812  const char** component)
1813 {
1815  (const uint8_t**)component);
1816 }
1817 
1837 static inline ssize_t unicoap_options_copy_uri_path(const unicoap_options_t* options, char* path,
1838  size_t capacity)
1839 {
1840  assert(capacity > 0);
1841  *path = '/';
1842  path += 1;
1843  capacity -= 1;
1844  int res = unicoap_options_copy_values_joined(options, UNICOAP_OPTION_URI_PATH, (uint8_t*)path,
1845  capacity, '/');
1846  return res < 0 ? res : res + 1;
1847 }
1848 
1864  char* component, size_t length)
1865 {
1866  assert(length <= 255);
1867  return unicoap_options_add(options, UNICOAP_OPTION_URI_PATH, (uint8_t*)component, length);
1868 }
1869 
1886  char* component)
1887 {
1888  return unicoap_options_add_uri_path_component(options, component, strlen(component));
1889 }
1890 
1907 static inline ssize_t unicoap_options_add_uri_path(unicoap_options_t* options, char* path,
1908  size_t length)
1909 {
1910  return unicoap_options_add_values_joined(options, UNICOAP_OPTION_URI_PATH, (uint8_t*)path,
1911  length, '/');
1912 }
1913 
1931 static inline ssize_t unicoap_options_add_uri_path_string(unicoap_options_t* options, char* path)
1932 {
1933  return unicoap_options_add_uri_path(options, path, strlen(path));
1934 }
1935 
1945 {
1947 } /* Uri-Path */
1949 
1950 /* MARK: - Uri-Query */
1967 static inline ssize_t unicoap_options_get_first_uri_query(const unicoap_options_t* options,
1968  const char** query)
1969 {
1970  return unicoap_options_get(options, UNICOAP_OPTION_URI_QUERY, (const uint8_t**)query);
1971 }
1972 
1987  const char** query)
1988 {
1990  (const uint8_t**)query);
1991 }
1992 
2010 static inline ssize_t
2012  const char** value)
2013 {
2015 }
2016 
2036  const char* name,
2037  const char** value)
2038 {
2039  unicoap_options_iterator_t iterator;
2040  unicoap_options_iterator_init(&iterator, options);
2041  return unicoap_options_get_next_uri_query_by_name(&iterator, name, value);
2042 }
2043 
2060 static inline ssize_t unicoap_options_copy_uri_queries(const unicoap_options_t* options,
2061  char* queries, size_t capacity)
2062 {
2063  return unicoap_options_copy_values_joined(options, UNICOAP_OPTION_URI_QUERY, (uint8_t*)queries,
2064  capacity, '&');
2065 }
2066 
2081 static inline ssize_t unicoap_options_add_uri_query(unicoap_options_t* options, char* query,
2082  size_t length)
2083 {
2084  assert(length <= 255);
2085  return unicoap_options_add(options, UNICOAP_OPTION_URI_QUERY, (uint8_t*)query, length);
2086 }
2087 
2103 static inline ssize_t unicoap_options_add_uri_query_string(unicoap_options_t* options, char* query)
2104 {
2105  return unicoap_options_add_uri_query(options, query, strlen(query));
2106 }
2107 
2124 static inline ssize_t unicoap_options_add_uri_queries(unicoap_options_t* options, char* queries,
2125  size_t length)
2126 {
2127  return unicoap_options_add_values_joined(options, UNICOAP_OPTION_URI_QUERY, (uint8_t*)queries,
2128  length, '&');
2129 }
2130 
2149  char* queries)
2150 {
2151  return unicoap_options_add_uri_queries(options, queries, strlen(queries));
2152 }
2153 
2163 {
2165 } /* Uri-Query */
2167 
2168 /* MARK: - Location-Query */
2186  const char** query)
2187 {
2188  return unicoap_options_get(options, UNICOAP_OPTION_LOCATION_QUERY, (const uint8_t**)query);
2189 }
2190 
2205  const char** query)
2206 {
2208  (const uint8_t**)query);
2209 }
2210 
2228 static inline ssize_t
2230  const char* name, const char** value)
2231 {
2233  value);
2234 }
2235 
2255  const char* name,
2256  const char** value)
2257 {
2258  unicoap_options_iterator_t iterator;
2259  unicoap_options_iterator_init(&iterator, options);
2260  return unicoap_options_get_next_location_query_by_name(&iterator, name, value);
2261 }
2262 
2279 static inline ssize_t unicoap_options_copy_location_queries(const unicoap_options_t* options,
2280  char* queries, size_t capacity)
2281 {
2283  (uint8_t*)queries, capacity, '&');
2284 }
2285 
2300 static inline ssize_t unicoap_options_add_location_query(unicoap_options_t* options, char* query,
2301  size_t length)
2302 {
2303  assert(length <= 255);
2304  return unicoap_options_add(options, UNICOAP_OPTION_LOCATION_QUERY, (uint8_t*)query, length);
2305 }
2306 
2323  char* query)
2324 {
2325  return unicoap_options_add_location_query(options, query, strlen(query));
2326 }
2327 
2345  char* queries, size_t length)
2346 {
2348  (uint8_t*)queries, length, '&');
2349 }
2350 
2369  char* queries)
2370 {
2371  return unicoap_options_add_location_queries(options, queries, strlen(queries));
2372 }
2373 
2383 {
2385 } /* Location-Query */
2387 
2388 /* MARK: - Observe */
2395 #define UNICOAP_OBSERVE_OPTION_REGISTER (0)
2396 
2398 #define UNICOAP_OBSERVE_OPTION_DEREGISTER (1)
2399 
2411 static inline ssize_t unicoap_options_get_observe(const unicoap_options_t* options,
2412  uint32_t* observe)
2413 {
2414  return unicoap_options_get_uint24(options, UNICOAP_OPTION_OBSERVE, observe);
2415 }
2416 
2427 static inline ssize_t unicoap_options_set_observe(unicoap_options_t* options, uint32_t observe)
2428 {
2429  return unicoap_options_set_uint(options, UNICOAP_OPTION_OBSERVE, observe);
2430 }
2431 
2441 {
2443 }
2444 
2455  /* Observe */
2457 
2458 /* MARK: - Block-wise Transfers */
2469 #define UNICOAP_BLOCK_OPTION_NONE (0x0f000000)
2470 
2474 typedef uint32_t unicoap_block_option_t;
2475 
2488 static inline ssize_t unicoap_options_get_block(const unicoap_options_t* options,
2489  unicoap_option_number_t number,
2490  unicoap_block_option_t* block)
2491 {
2492  return unicoap_options_get_uint24(options, number, block);
2493 }
2494 
2507  unicoap_option_number_t number,
2508  unicoap_block_option_t block)
2509 {
2510  assert(block <= UNICOAP_UINT24_MAX);
2511  return unicoap_options_set_uint(options, number, block);
2512 }
2513 
2525 static inline ssize_t unicoap_options_get_block1(const unicoap_options_t* options,
2526  unicoap_block_option_t* block)
2527 {
2528  return unicoap_options_get_block(options, UNICOAP_OPTION_BLOCK1, block);
2529 }
2530 
2541 static inline ssize_t unicoap_options_set_block1(unicoap_options_t* options,
2542  unicoap_block_option_t block)
2543 {
2544  return unicoap_options_set_block(options, UNICOAP_OPTION_BLOCK1, block);
2545 }
2546 
2556 {
2558 }
2559 
2571 static inline ssize_t unicoap_options_get_block2(const unicoap_options_t* options,
2572  unicoap_block_option_t* block)
2573 {
2574  return unicoap_options_get_block(options, UNICOAP_OPTION_BLOCK2, block);
2575 }
2576 
2587 static inline ssize_t unicoap_options_set_block2(unicoap_options_t* options,
2588  unicoap_block_option_t block)
2589 {
2590  return unicoap_options_set_block(options, UNICOAP_OPTION_BLOCK2, block);
2591 }
2592 
2602 {
2604 }
2605 
2617 static inline ssize_t unicoap_options_get_size1(const unicoap_options_t* options, uint32_t* size)
2618 {
2619  return unicoap_options_get_uint32(options, UNICOAP_OPTION_SIZE1, size);
2620 }
2621 
2632 static inline ssize_t unicoap_options_set_size1(unicoap_options_t* options, uint32_t size)
2633 {
2634  return unicoap_options_set_uint(options, UNICOAP_OPTION_SIZE1, size);
2635 }
2636 
2646 {
2648 }
2649 
2661 static inline ssize_t unicoap_options_get_size2(const unicoap_options_t* options, uint32_t* size)
2662 {
2663  return unicoap_options_get_uint32(options, UNICOAP_OPTION_SIZE2, size);
2664 }
2665 
2676 static inline ssize_t unicoap_options_set_size2(unicoap_options_t* options, uint32_t size)
2677 {
2678  return unicoap_options_set_uint(options, UNICOAP_OPTION_SIZE2, size);
2679 }
2680 
2690 {
2692 } /* Block-wise Transfers */
2694 
2697 #ifdef __cplusplus
2698 }
2699 #endif
2700 
POSIX.1-2008 compliant version of the assert macro.
#define assert(cond)
abort the program if assertion is false
Definition: assert.h:135
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.
Definition: config.h:56
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.
Definition: options.h:856
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.
Definition: options.h:829
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.
Definition: options.h:601
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.
Definition: options.h:806
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.
Definition: options.h:552
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.
Definition: options.h:730
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.
Definition: options.h:704
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.
Definition: options.h:783
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.
Definition: options.h:1931
uint32_t unicoap_block_option_t
Block1 and Block2 option value
Definition: options.h:2474
static ssize_t unicoap_options_get_proxy_scheme(const unicoap_options_t *options, const char **scheme)
Retrieves the Proxy-Scheme option, if present.
Definition: options.h:1257
static ssize_t unicoap_options_set_size2(unicoap_options_t *options, uint32_t size)
Sets the Size2 option.
Definition: options.h:2676
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.
Definition: options.h:1967
static ssize_t unicoap_options_set_proxy_scheme_string(unicoap_options_t *options, char *scheme)
Sets the Proxy-Scheme option from null-terminated string.
Definition: options.h:1296
static int unicoap_options_remove_observe(unicoap_options_t *options)
Removes the Observe option, if present.
Definition: options.h:2440
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.
Definition: options.h:1665
static ssize_t unicoap_options_set_if_none_match(unicoap_options_t *options, bool value)
Sets the If-None-Match option.
Definition: options.h:1021
static int unicoap_options_remove_block1(unicoap_options_t *options)
Removes the Block1 option, if present.
Definition: options.h:2555
static int unicoap_options_remove_location_queries(unicoap_options_t *options)
Removes all Location-Query options, if any.
Definition: options.h:2382
static ssize_t unicoap_options_add_uri_query_string(unicoap_options_t *options, char *query)
Adds Uri-Query option from null-terminated string.
Definition: options.h:2103
static ssize_t unicoap_options_set_uri_port(unicoap_options_t *options, uint16_t port)
Sets the Uri-Port option.
Definition: options.h:1064
static ssize_t unicoap_options_set_proxy_uri(unicoap_options_t *options, char *uri, size_t length)
Sets the Proxy-Uri option.
Definition: options.h:1354
static ssize_t unicoap_options_set_proxy_uri_string(unicoap_options_t *options, char *uri)
Sets the Proxy-Uri option from null-terminated string.
Definition: options.h:1377
static ssize_t unicoap_options_set_proxy_scheme(unicoap_options_t *options, char *scheme, size_t length)
Sets the Proxy-Scheme option.
Definition: options.h:1276
static int unicoap_options_remove_accept(unicoap_options_t *options)
Removes the Accept option, if present.
Definition: options.h:1234
static ssize_t unicoap_options_set_accept(unicoap_options_t *options, unicoap_content_format_t format)
Sets the Accept option.
Definition: options.h:1220
static ssize_t unicoap_options_add_location_queries(unicoap_options_t *options, char *queries, size_t length)
Adds multiple Location-Query options from string.
Definition: options.h:2344
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.
Definition: options.h:2506
static ssize_t unicoap_options_add_location_path_component_string(unicoap_options_t *options, char *component)
Adds Location-Path option from null-terminated string.
Definition: options.h:1710
static ssize_t unicoap_options_add_uri_queries(unicoap_options_t *options, char *queries, size_t length)
Adds multiple Uri-Query options from string.
Definition: options.h:2124
static ssize_t unicoap_options_add_if_match(unicoap_options_t *options, uint8_t *value, size_t size)
Adds If-Match option.
Definition: options.h:1503
static ssize_t unicoap_options_add_uri_query(unicoap_options_t *options, char *query, size_t length)
Adds Uri-Query option.
Definition: options.h:2081
static ssize_t unicoap_options_set_no_response(unicoap_options_t *options, uint8_t value)
Sets the No-Response option.
Definition: options.h:1429
static ssize_t unicoap_options_set_block1(unicoap_options_t *options, unicoap_block_option_t block)
Sets the Block1 option.
Definition: options.h:2541
static ssize_t unicoap_options_add_location_path(unicoap_options_t *options, char *path, size_t length)
Adds multiple Location-Path options from string.
Definition: options.h:1731
static ssize_t unicoap_options_set_observe(unicoap_options_t *options, uint32_t observe)
Sets the Observe option.
Definition: options.h:2427
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.
Definition: options.h:2488
static ssize_t unicoap_options_get_max_age(const unicoap_options_t *options, uint32_t *age)
Retrieves the Max-Age option, if present.
Definition: options.h:1153
static int unicoap_options_remove_max_age(unicoap_options_t *options)
Removes the Max-Age option, if present.
Definition: options.h:1181
static ssize_t unicoap_options_add_location_path_component(unicoap_options_t *options, char *component, size_t length)
Adds Location-Path option.
Definition: options.h:1690
static ssize_t unicoap_options_get_first_etag(const unicoap_options_t *options, const uint8_t **etag)
Retrieves the first ETag option, if present.
Definition: options.h:1541
static ssize_t unicoap_options_get_block2(const unicoap_options_t *options, unicoap_block_option_t *block)
Retrieves the Block2 option, if present.
Definition: options.h:2571
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.
Definition: options.h:2279
static ssize_t unicoap_options_add_uri_path(unicoap_options_t *options, char *path, size_t length)
Adds multiple Uri-Path options from string.
Definition: options.h:1907
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.
Definition: options.h:2185
unicoap_content_format_t
Content-Format option values
Definition: constants.h:713
static ssize_t unicoap_options_set_uri_host_string(unicoap_options_t *options, char *host)
Sets the Uri-Host option from null-terminated string.
Definition: options.h:971
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.
Definition: options.h:1465
static int unicoap_options_remove_no_response(unicoap_options_t *options)
Removes the No-Response option, if present.
Definition: options.h:1442
static ssize_t unicoap_options_add_location_query_string(unicoap_options_t *options, char *query)
Adds Location-Query option from null-terminated string.
Definition: options.h:2322
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.
Definition: options.h:1986
static int unicoap_options_remove_all_if_match(unicoap_options_t *options)
Removes all If-Match options, if any.
Definition: options.h:1518
static int unicoap_options_remove_uri_host(unicoap_options_t *options)
Removes the Uri-Host option, if present.
Definition: options.h:984
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.
Definition: options.h:1791
static int unicoap_options_remove_content_format(unicoap_options_t *options)
Removes the Content-Format option, if present.
Definition: options.h:1130
static ssize_t unicoap_options_set_max_age(unicoap_options_t *options, uint32_t age)
Sets the Max-Age option.
Definition: options.h:1168
static ssize_t unicoap_options_get_no_response(const unicoap_options_t *options, uint8_t *value)
Retrieves the No-Response option, if present.
Definition: options.h:1413
static ssize_t unicoap_options_set_block2(unicoap_options_t *options, unicoap_block_option_t block)
Sets the Block2 option.
Definition: options.h:2587
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.
Definition: options.h:1639
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.
Definition: options.h:1560
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.
Definition: options.h:1484
static ssize_t unicoap_options_get_uri_port(const unicoap_options_t *options, uint16_t *port)
Retrieves the Uri-Port option, if present.
Definition: options.h:1049
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...
Definition: options.h:2229
static int unicoap_options_remove_size2(unicoap_options_t *options)
Removes the Size2 option, if present.
Definition: options.h:2689
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.
Definition: options.h:1944
static ssize_t unicoap_options_get_size1(const unicoap_options_t *options, uint32_t *size)
Retrieves the Size1 option, if present.
Definition: options.h:2617
static bool unicoap_options_get_if_none_match(const unicoap_options_t *options)
Determines whether the If-None-Match option is present.
Definition: options.h:1006
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.
Definition: options.h:2060
static ssize_t unicoap_options_add_location_query(unicoap_options_t *options, char *query, size_t length)
Adds Location-Query option.
Definition: options.h:2300
static ssize_t unicoap_options_get_size2(const unicoap_options_t *options, uint32_t *size)
Retrieves the Size2 option, if present.
Definition: options.h:2661
static ssize_t unicoap_options_get_accept(const unicoap_options_t *options, unicoap_content_format_t *format)
Retrieves the Accept option, if present.
Definition: options.h:1204
static ssize_t unicoap_options_add_uri_path_component(unicoap_options_t *options, char *component, size_t length)
Adds Uri-Path option.
Definition: options.h:1863
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.
Definition: options.h:2011
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.
Definition: options.h:2204
static int unicoap_options_remove_etags(unicoap_options_t *options)
Removes all ETag options, if any.
Definition: options.h:1595
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.
Definition: options.h:1837
static ssize_t unicoap_options_add_etag(unicoap_options_t *options, uint8_t *etag, size_t size)
Adds ETag option.
Definition: options.h:1580
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.
Definition: options.h:1100
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.
Definition: options.h:2035
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.
Definition: options.h:2254
static int unicoap_options_remove_proxy_scheme(unicoap_options_t *options)
Removes the Proxy-Scheme option, if present.
Definition: options.h:1310
static ssize_t unicoap_options_add_location_queries_string(unicoap_options_t *options, char *queries)
Adds multiple Location-Query options from null-terminated string.
Definition: options.h:2368
static int unicoap_options_remove_uri_queries(unicoap_options_t *options)
Removes all Uri-Query options, if any.
Definition: options.h:2162
static ssize_t unicoap_options_add_uri_queries_string(unicoap_options_t *options, char *queries)
Adds multiple Uri-Query options from null-terminated string.
Definition: options.h:2148
static ssize_t unicoap_options_add_uri_path_component_string(unicoap_options_t *options, char *component)
Adds Uri-Path option from null-terminated string.
Definition: options.h:1885
static ssize_t unicoap_options_get_block1(const unicoap_options_t *options, unicoap_block_option_t *block)
Retrieves the Block1 option, if present.
Definition: options.h:2525
static ssize_t unicoap_options_get_proxy_uri(const unicoap_options_t *options, const char **uri)
Retrieves the Proxy-Uri option, if present.
Definition: options.h:1333
static ssize_t unicoap_options_get_uri_host(const unicoap_options_t *options, const char **host)
Retrieves the Uri-Host option, if present.
Definition: options.h:927
static int unicoap_options_remove_location_path(unicoap_options_t *options)
Removes all Location-Path options, if any.
Definition: options.h:1768
static ssize_t unicoap_options_add_location_path_string(unicoap_options_t *options, char *path)
Adds multiple Location-Path options from null-terminated string.
Definition: options.h:1754
static ssize_t unicoap_options_set_content_format(unicoap_options_t *options, unicoap_content_format_t format)
Sets the Content-Format option.
Definition: options.h:1116
static int unicoap_options_remove_block2(unicoap_options_t *options)
Removes the Block2 option, if present.
Definition: options.h:2601
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.
Definition: options.h:1811
static int unicoap_options_remove_size1(unicoap_options_t *options)
Removes the Size1 option, if present.
Definition: options.h:2645
static ssize_t unicoap_options_set_uri_host(unicoap_options_t *options, char *host, size_t length)
Sets the Uri-Host option.
Definition: options.h:948
static ssize_t unicoap_options_get_observe(const unicoap_options_t *options, uint32_t *observe)
Retrieves the Observe option, if present.
Definition: options.h:2411
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.
Definition: options.h:1619
static ssize_t unicoap_options_set_size1(unicoap_options_t *options, uint32_t size)
Sets the Size1 option.
Definition: options.h:2632
static int unicoap_options_remove_uri_port(unicoap_options_t *options)
Removes the Uri-Port option, if present.
Definition: options.h:1077
static int unicoap_options_remove_proxy_uri(unicoap_options_t *options)
Removes the Proxy-Uri option, if present.
Definition: options.h:1390
unicoap_option_number_t
CoAP option number.
Definition: constants.h:419
#define UNICOAP_UINT24_SIZE
Size in bytes of number representable with 24 bits (3 bytes)
Definition: options.h:382
static uint8_t * unicoap_options_data(const unicoap_options_t *options)
Retrieves storage buffer.
Definition: options.h:345
static void unicoap_options_clear(unicoap_options_t *options)
Removes all options.
Definition: options.h:167
static size_t unicoap_options_size(const unicoap_options_t *options)
Retrieves total size of options in buffer.
Definition: options.h:357
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.
Definition: options.h:290
static bool unicoap_option_is_critical(unicoap_option_number_t option_number)
Determines whether the given option is considered critical.
Definition: options.h:262
static void unicoap_options_init(unicoap_options_t *options, uint8_t *storage, size_t capacity)
Initializes the given options structure.
Definition: options.h:139
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.
Definition: options.h:275
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)
Definition: options.h:379
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.
Definition: options.h:305
@ UNICOAP_OPTION_URI_PORT
Uri-Port
Definition: constants.h:460
@ UNICOAP_OPTION_MAX_AGE
Max-Age option
Definition: constants.h:498
@ UNICOAP_OPTION_URI_HOST
Uri-Host option
Definition: constants.h:432
@ UNICOAP_OPTION_CONTENT_FORMAT
Content-Format option
Definition: constants.h:491
@ UNICOAP_OPTION_OBSERVE
Observe option
Definition: constants.h:453
@ UNICOAP_OPTION_IF_MATCH
If-Match option
Definition: constants.h:425
@ UNICOAP_OPTION_NO_RESPONSE
suppress CoAP response
Definition: constants.h:632
@ UNICOAP_OPTION_PROXY_URI
Proxy-Uri option
Definition: constants.h:595
@ UNICOAP_OPTION_BLOCK2
Block2 option
Definition: constants.h:558
@ UNICOAP_OPTION_SIZE2
Size2 option.
Definition: constants.h:579
@ UNICOAP_OPTION_URI_PATH
Uri-Path option
Definition: constants.h:484
@ UNICOAP_OPTION_BLOCK1
Block1 option
Definition: constants.h:567
@ UNICOAP_OPTION_ETAG
ETag option
Definition: constants.h:439
@ UNICOAP_OPTION_LOCATION_QUERY
Location-Query option
Definition: constants.h:539
@ UNICOAP_OPTION_IF_NONE_MATCH
If-None-Match option
Definition: constants.h:446
@ UNICOAP_OPTION_LOCATION_PATH
Location-Path option
Definition: constants.h:467
@ UNICOAP_OPTION_SIZE1
Size1 option.
Definition: constants.h:616
@ UNICOAP_OPTION_PROXY_SCHEME
Proxy-Scheme option
Definition: constants.h:602
@ UNICOAP_OPTION_URI_QUERY
Uri-Query option
Definition: constants.h:507
@ UNICOAP_OPTION_ACCEPT
Accept option
Definition: constants.h:523
Helper struct for options parser.
Definition: options.h:74
uint16_t size
Number of bytes this option is comprised of.
Definition: options.h:84
uint8_t * data
Pointer into options storage where this option starts.
Definition: options.h:79
unicoap_option_number_t number
Option number.
Definition: options.h:89
The iterator you use to retrieve option values in-order.
Definition: options.h:582
size_t index
Current option's index.
Definition: options.h:591
unicoap_options_t * options
Options.
Definition: options.h:586
CoAP options container.
Definition: options.h:100
size_t storage_size
Current size of encoded options.
Definition: options.h:106
size_t option_count
Number of options present.
Definition: options.h:128
unicoap_option_entry_t entries[CONFIG_UNICOAP_OPTIONS_MAX]
Helper array used to encode and decode options into options storage.
Definition: options.h:121
size_t storage_capacity
Available capacity in options storage buffer.
Definition: options.h:113
Utility macros for unicoap