Loading...
Searching...
No Matches
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
23
55
61
62#ifdef __cplusplus
63extern "C" {
64#endif
65
66/* MARK: - Essentials */
74typedef struct {
79 uint8_t* data;
80
84 uint16_t size;
85
91
100typedef struct {
101 /* TODO: OSCORE: read-only due to options stored in two different buffers */
102
107
114
122
130
139static 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
167static inline void unicoap_options_clear(unicoap_options_t* options)
168{
169 options->option_count = 0;
170 options->storage_size = 0;
171}
172
173
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)
245
246
247/* MARK: - Option characteristics */
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
306{
307 return ((option_number & 0x1e) != 0x1c);
308}
309
310
311/* MARK: - Tools */
322
335ssize_t unicoap_options_swap_storage(unicoap_options_t* options, uint8_t* destination,
336 size_t capacity);
337
345static inline uint8_t* unicoap_options_data(const unicoap_options_t* options)
346{
347 return options->entries->data;
348}
349
357static inline size_t unicoap_options_size(const unicoap_options_t* options)
358{
359 return options->storage_size;
360}
361
362
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)
392
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
486
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}
557
558
559/* MARK: - Enumerating options */
593
603{
604 assert(iterator);
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
683
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}
737
738
739/* MARK: - Unsigned integers */
744#ifndef DOXYGEN
761ssize_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
783static 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
806static 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
829static 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
856static 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);
900
901/* MARK: - Predefined Options - */
902
909
910/* MARK: - Uri-Host */
915
927static 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
948static 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
971static 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
988 /* Uri-Host */
989
990/* MARK: - If-None-Match */
995
1007{
1009}
1010
1021static 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}
1030 /* If-None-Match */
1031
1032/* MARK: - Uri-Port */
1037
1049static inline ssize_t unicoap_options_get_uri_port(const unicoap_options_t* options, uint16_t* port)
1050{
1052}
1053
1064static 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}
1081 /* Uri-Port */
1082
1083/* MARK: - Content-Format */
1088
1100static inline ssize_t unicoap_options_get_content_format(const unicoap_options_t* options,
1102{
1103 return unicoap_options_get_uint16(options, UNICOAP_OPTION_CONTENT_FORMAT, (uint16_t*)format);
1104}
1105
1118{
1119 return unicoap_options_set_uint(options, UNICOAP_OPTION_CONTENT_FORMAT, (uint32_t)format);
1120}
1121
1134 /* Content-Format */
1135
1136/* MARK: - Max-Age */
1141
1153static inline ssize_t unicoap_options_get_max_age(const unicoap_options_t* options, uint32_t* age)
1154{
1156}
1157
1168static inline ssize_t unicoap_options_set_max_age(unicoap_options_t* options, uint32_t age)
1169{
1171}
1172
1182{
1184}
1185 /* Max-Age */
1186
1187/* MARK: - Accept */
1192
1204static inline ssize_t unicoap_options_get_accept(const unicoap_options_t* options,
1206{
1207 return unicoap_options_get_uint16(options, UNICOAP_OPTION_ACCEPT, (uint16_t*)format);
1208}
1209
1220static inline ssize_t unicoap_options_set_accept(unicoap_options_t* options,
1222{
1223 return unicoap_options_set_uint(options, UNICOAP_OPTION_ACCEPT, (uint32_t)format);
1224}
1225
1235{
1237}
1238 /* Accept */
1239
1240/* MARK: - Proxy-Scheme */
1245
1257static 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
1276static 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
1314 /* Proxy-Scheme */
1315
1316/* MARK: - Proxy-Uri */
1321
1333static 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
1354static 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
1377static 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}
1394 /* Proxy-Uri */
1395
1396/* MARK: - No-Response */
1401
1413static inline ssize_t unicoap_options_get_no_response(const unicoap_options_t* options,
1414 uint8_t* value)
1415{
1417}
1418
1429static 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
1446 /* No-Response */
1447
1448/* MARK: - If-Match */
1453
1465static 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{
1487 return unicoap_options_get_next_by_number(iterator, UNICOAP_OPTION_IF_MATCH, value);
1488}
1489
1503static 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
1522 /* If-Match */
1523
1524/* MARK: - ETag */
1529
1541static 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{
1563 return unicoap_options_get_next_by_number(iterator, UNICOAP_OPTION_ETAG, etag);
1564}
1565
1580static 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}
1599 /* ETag */
1600
1601/* MARK: - Location-Path */
1606
1618static inline ssize_t
1620 const char** component)
1621{
1622 return unicoap_options_get(options, UNICOAP_OPTION_LOCATION_PATH, (const uint8_t**)component);
1623}
1624
1638static inline ssize_t
1640 const char** component)
1641{
1642 return unicoap_options_get_next_by_number(iterator, UNICOAP_OPTION_LOCATION_PATH,
1643 (const uint8_t**)component);
1644}
1645
1665static 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
1731static inline ssize_t unicoap_options_add_location_path(unicoap_options_t* options, char* path,
1732 size_t length)
1733{
1735 length, '/');
1736}
1737
1755 char* path)
1756{
1757 return unicoap_options_add_location_path(options, path, strlen(path));
1758}
1759
1772 /* Location-Path */
1773
1774/* MARK: - Uri-Path */
1779
1792 const char** component)
1793{
1794 return unicoap_options_get(options, UNICOAP_OPTION_URI_PATH, (const uint8_t**)component);
1795}
1796
1810static inline ssize_t
1812 const char** component)
1813{
1814 return unicoap_options_get_next_by_number(iterator, UNICOAP_OPTION_URI_PATH,
1815 (const uint8_t**)component);
1816}
1817
1837static 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
1907static 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
1931static 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
1948 /* Uri-Path */
1949
1950/* MARK: - Uri-Query */
1955
1967static 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{
1989 return unicoap_options_get_next_by_number(iterator, UNICOAP_OPTION_URI_QUERY,
1990 (const uint8_t**)query);
1991}
1992
2010static inline ssize_t
2012 const char** value)
2013{
2014 return unicoap_options_get_next_query_by_name(iterator, UNICOAP_OPTION_URI_QUERY, name, value);
2015}
2016
2036 const char* name,
2037 const char** value)
2038{
2040 unicoap_options_iterator_init(&iterator, options);
2041 return unicoap_options_get_next_uri_query_by_name(&iterator, name, value);
2042}
2043
2060static 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
2081static 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
2103static 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
2124static 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
2166 /* Uri-Query */
2167
2168/* MARK: - Location-Query */
2173
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{
2207 return unicoap_options_get_next_by_number(iterator, UNICOAP_OPTION_LOCATION_QUERY,
2208 (const uint8_t**)query);
2209}
2210
2228static inline ssize_t
2230 const char* name, const char** value)
2231{
2232 return unicoap_options_get_next_query_by_name(iterator, UNICOAP_OPTION_LOCATION_QUERY, name,
2233 value);
2234}
2235
2255 const char* name,
2256 const char** value)
2257{
2259 unicoap_options_iterator_init(&iterator, options);
2260 return unicoap_options_get_next_location_query_by_name(&iterator, name, value);
2261}
2262
2280 char* queries, size_t capacity)
2281{
2283 (uint8_t*)queries, capacity, '&');
2284}
2285
2300static 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
2386 /* Location-Query */
2387
2388/* MARK: - Observe */
2393
2395#define UNICOAP_OBSERVE_OPTION_REGISTER (0)
2396
2398#define UNICOAP_OBSERVE_OPTION_DEREGISTER (1)
2399
2411static 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
2427static 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 */
2463
2469#define UNICOAP_BLOCK_OPTION_NONE (0x0f000000)
2470
2474typedef uint32_t unicoap_block_option_t;
2475
2488static inline ssize_t unicoap_options_get_block(const unicoap_options_t* options,
2491{
2492 return unicoap_options_get_uint24(options, number, block);
2493}
2494
2509{
2510 assert(block <= UNICOAP_UINT24_MAX);
2511 return unicoap_options_set_uint(options, number, block);
2512}
2513
2525static inline ssize_t unicoap_options_get_block1(const unicoap_options_t* options,
2527{
2528 return unicoap_options_get_block(options, UNICOAP_OPTION_BLOCK1, block);
2529}
2530
2541static inline ssize_t unicoap_options_set_block1(unicoap_options_t* options,
2543{
2544 return unicoap_options_set_block(options, UNICOAP_OPTION_BLOCK1, block);
2545}
2546
2556{
2558}
2559
2571static inline ssize_t unicoap_options_get_block2(const unicoap_options_t* options,
2573{
2574 return unicoap_options_get_block(options, UNICOAP_OPTION_BLOCK2, block);
2575}
2576
2587static inline ssize_t unicoap_options_set_block2(unicoap_options_t* options,
2589{
2590 return unicoap_options_set_block(options, UNICOAP_OPTION_BLOCK2, block);
2591}
2592
2602{
2604}
2605
2617static 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
2632static 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
2661static 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
2676static 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}
2693 /* Block-wise Transfers */
2694
2696
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:146
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
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
const char * unicoap_string_from_option_number(unicoap_option_number_t number)
Returns label of option corresponding to the given number.
@ 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