Loading...
Searching...
No Matches
nanocoap.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2016-18 Kaspar Schleiser <kaspar@schleiser.de>
3 * 2018 Freie Universität Berlin
4 * 2018 Inria
5 * 2018 Ken Bannister <kb2ma@runbox.com>
6 *
7 * This file is subject to the terms and conditions of the GNU Lesser
8 * General Public License v2.1. See the file LICENSE in the top level
9 * directory for more details.
10 */
11
77#ifndef NET_NANOCOAP_H
78#define NET_NANOCOAP_H
79
80#include <assert.h>
81#include <errno.h>
82#include <stdint.h>
83#include <stdbool.h>
84#include <stddef.h>
85#include <string.h>
86#include <unistd.h>
87
88#ifdef RIOT_VERSION
89#include "bitarithm.h"
90#include "bitfield.h"
91#include "byteorder.h"
92#include "iolist.h"
93#include "macros/utils.h"
94#include "net/coap.h"
95#include "modules.h"
96#else
97#include "coap.h"
98#include <arpa/inet.h>
99#endif
100
101#if defined(MODULE_SOCK_UDP) || defined(DOXYGEN)
102#include "net/sock/udp.h"
103#else
104typedef void sock_udp_ep_t;
105#endif
106
107#if defined(MODULE_NANOCOAP_RESOURCES)
108#include "xfa.h"
109#endif
110
111#ifdef __cplusplus
112extern "C" {
113#endif
114
120#define COAP_GET (0x01)
121#define COAP_POST (0x02)
122#define COAP_PUT (0x04)
123#define COAP_DELETE (0x08)
124#define COAP_FETCH (0x10)
125#define COAP_PATCH (0x20)
126#define COAP_IPATCH (0x40)
127#define COAP_IGNORE (0xFF)
129#define COAP_MATCH_SUBTREE (0x8000)
136#define COAP_FORMAT_NONE (UINT16_MAX)
137
145#ifndef CONFIG_NANOCOAP_NOPTS_MAX
146#define CONFIG_NANOCOAP_NOPTS_MAX (16)
147#endif
148
153#ifndef CONFIG_NANOCOAP_URI_MAX
154#define CONFIG_NANOCOAP_URI_MAX (64)
155#endif
156
160#ifndef CONFIG_NANOCOAP_BLOCK_SIZE_EXP_MAX
161#define CONFIG_NANOCOAP_BLOCK_SIZE_EXP_MAX (6)
162#endif
163
167#ifndef CONFIG_NANOCOAP_BLOCKSIZE_DEFAULT
168#define CONFIG_NANOCOAP_BLOCKSIZE_DEFAULT COAP_BLOCKSIZE_64
169#endif
170
172#ifndef CONFIG_NANOCOAP_QS_MAX
173#define CONFIG_NANOCOAP_QS_MAX (64)
174#endif
182#ifndef CONFIG_NANOCOAP_BLOCK_HEADER_MAX
183#define CONFIG_NANOCOAP_BLOCK_HEADER_MAX (80)
184#endif
185
193#define COAP_OPT_FINISH_NONE (0x0000)
195#define COAP_OPT_FINISH_PAYLOAD (0x0001)
201typedef struct __attribute__((packed)) {
202 uint8_t ver_t_tkl;
203 uint8_t code;
204 uint16_t id;
205} coap_hdr_t;
206
210typedef struct {
211 uint16_t opt_num;
212 uint16_t offset;
214
232typedef struct {
234 uint8_t *payload;
236 uint16_t payload_len;
237 uint16_t options_len;
240#ifdef MODULE_GCOAP
241 uint32_t observe_value;
242#endif
243} coap_pkt_t;
244
249
272typedef ssize_t (*coap_handler_t)(coap_pkt_t *pkt, uint8_t *buf, size_t len,
273 coap_request_ctx_t *context);
274
287typedef int (*coap_blockwise_cb_t)(void *arg, size_t offset, uint8_t *buf, size_t len, int more);
288
299typedef int (*coap_request_cb_t)(void *arg, coap_pkt_t *pkt);
300
306typedef uint16_t coap_method_flags_t;
307
317
321typedef const struct {
323 const size_t resources_numof;
325
333
341#if defined(MODULE_GCOAP) || DOXYGEN
348 uint32_t tl_type;
349#endif
350};
351
360
369
379
389
393typedef struct {
394 size_t offset;
395 uint32_t blknum;
396 uint8_t szx;
397 int8_t more;
400
404typedef struct {
405 size_t start;
406 size_t end;
407 size_t cur;
408 uint8_t *opt;
410
411#if defined(MODULE_NANOCOAP_RESOURCES) || DOXYGEN
417#define NANOCOAP_RESOURCE(name) \
418 XFA_CONST(coap_resources_xfa, 0) coap_resource_t CONCAT(coap_resource_, name) =
419#else
425extern const coap_resource_t coap_resources[];
426
432extern const unsigned coap_resources_numof;
433#endif
434
449static inline uint8_t coap_code(unsigned cls, unsigned detail)
450{
451 return (cls << 5) | detail;
452}
453
461static inline unsigned coap_get_code_class(const coap_pkt_t *pkt)
462{
463 return pkt->hdr->code >> 5;
464}
465
473static inline unsigned coap_get_code_detail(const coap_pkt_t *pkt)
474{
475 return pkt->hdr->code & 0x1f;
476}
477
485static inline unsigned coap_get_code_decimal(const coap_pkt_t *pkt)
486{
487 return (coap_get_code_class(pkt) * 100) + coap_get_code_detail(pkt);
488}
489
497static inline unsigned coap_get_code_raw(const coap_pkt_t *pkt)
498{
499 return (unsigned)pkt->hdr->code;
500}
501
509static inline coap_method_t coap_get_method(const coap_pkt_t *pkt)
510{
511 return pkt->hdr->code;
512}
513
521static inline unsigned coap_get_id(const coap_pkt_t *pkt)
522{
523 return ntohs(pkt->hdr->id);
524}
525
536static inline unsigned coap_get_token_len(const coap_pkt_t *pkt)
537{
538 uint8_t tkl = pkt->hdr->ver_t_tkl & 0xf;
539
540 if (!IS_USED(MODULE_NANOCOAP_TOKEN_EXT)) {
541 return tkl;
542 }
543
544 void *ext = pkt->hdr + 1;
545 switch (tkl) {
546 case 13:
547 return tkl + *(uint8_t *)ext;
548 case 14:
549 return tkl + 255 + byteorder_bebuftohs(ext);
550 case 15:
551 assert(0);
552 /* fall-through */
553 default:
554 return tkl;
555 }
556}
557
558static inline uint8_t *coap_hdr_data_ptr(const coap_hdr_t *hdr);
559
567static inline void *coap_get_token(const coap_pkt_t *pkt)
568{
569 return coap_hdr_data_ptr(pkt->hdr);
570}
571
579static inline unsigned coap_get_total_hdr_len(const coap_pkt_t *pkt)
580{
581 return sizeof(coap_hdr_t) + coap_get_token_len(pkt);
582}
583
593static inline unsigned coap_get_total_len(const coap_pkt_t *pkt)
594{
595 return (uintptr_t)pkt->payload - (uintptr_t)pkt->hdr + pkt->payload_len;
596}
597
608static inline unsigned coap_get_type(const coap_pkt_t *pkt)
609{
610 return (pkt->hdr->ver_t_tkl & 0x30) >> 4;
611}
612
620static inline unsigned coap_get_ver(const coap_pkt_t *pkt)
621{
622 return (pkt->hdr->ver_t_tkl & 0x60) >> 6;
623}
624
635static inline uint8_t coap_hdr_tkl_ext_len(const coap_hdr_t *hdr)
636{
637 if (!IS_USED(MODULE_NANOCOAP_TOKEN_EXT)) {
638 return 0;
639 }
640
641 switch (hdr->ver_t_tkl & 0xf) {
642 case 13:
643 return 1;
644 case 14:
645 return 2;
646 case 15:
647 assert(0);
648 /* fall-through */
649 default:
650 return 0;
651 }
652}
653
661static inline uint8_t *coap_hdr_data_ptr(const coap_hdr_t *hdr)
662{
663 return ((uint8_t *)hdr) + sizeof(coap_hdr_t) + coap_hdr_tkl_ext_len(hdr);
664}
665
672static inline void coap_hdr_set_code(coap_hdr_t *hdr, uint8_t code)
673{
674 hdr->code = code;
675}
676
685static inline void coap_hdr_set_type(coap_hdr_t *hdr, unsigned type)
686{
687 /* assert correct range of type */
688 assert(!(type & ~0x3));
689
690 hdr->ver_t_tkl &= ~0x30;
691 hdr->ver_t_tkl |= type << 4;
692}
721uint8_t *coap_find_option(coap_pkt_t *pkt, unsigned opt_num);
722
735uint8_t *coap_iterate_option(coap_pkt_t *pkt, unsigned opt_num,
736 uint8_t **opt_pos, int *opt_len);
737
747
757
770int coap_opt_get_uint(coap_pkt_t *pkt, uint16_t optnum, uint32_t *value);
771
789ssize_t coap_opt_get_string(coap_pkt_t *pkt, uint16_t optnum,
790 uint8_t *target, size_t max_len, char separator);
791
807static inline ssize_t coap_get_location_path(coap_pkt_t *pkt,
808 uint8_t *target, size_t max_len)
809{
810 return coap_opt_get_string(pkt, COAP_OPT_LOCATION_PATH,
811 target, max_len, '/');
812}
813
829static inline ssize_t coap_get_location_query(coap_pkt_t *pkt,
830 uint8_t *target, size_t max_len)
831{
832 return coap_opt_get_string(pkt, COAP_OPT_LOCATION_QUERY,
833 target, max_len, '&');
834}
835
850static inline ssize_t coap_get_uri_path(coap_pkt_t *pkt, uint8_t *target)
851{
852 return coap_opt_get_string(pkt, COAP_OPT_URI_PATH, target,
854}
855
869static inline ssize_t coap_get_uri_query_string(coap_pkt_t *pkt, char *target,
870 size_t max_len)
871{
872 return coap_opt_get_string(pkt, COAP_OPT_URI_QUERY,
873 (uint8_t *)target, max_len, '&');
874}
875
890bool coap_find_uri_query(coap_pkt_t *pkt, const char *key,
891 const char **value, size_t *len);
892
923 uint8_t **value, bool init_opt);
924
941ssize_t coap_opt_get_opaque(coap_pkt_t *pkt, unsigned opt_num, uint8_t **value);
956static inline ssize_t coap_get_proxy_uri(coap_pkt_t *pkt, char **target)
957{
958 return coap_opt_get_opaque(pkt, COAP_OPT_PROXY_URI, (uint8_t **)target);
959}
960
978void coap_block_object_init(coap_block1_t *block, size_t blknum, size_t blksize,
979 int more);
980
996bool coap_block_finish(coap_block_slicer_t *slicer, uint16_t option);
997
1012static inline bool coap_block1_finish(coap_block_slicer_t *slicer)
1013{
1014 return coap_block_finish(slicer, COAP_OPT_BLOCK1);
1015}
1016
1031static inline bool coap_block2_finish(coap_block_slicer_t *slicer)
1032{
1033 return coap_block_finish(slicer, COAP_OPT_BLOCK2);
1034}
1035
1046
1057 size_t blksize);
1058
1073size_t coap_blockwise_put_bytes(coap_block_slicer_t *slicer, uint8_t *bufpos,
1074 const void *c, size_t len);
1075
1089size_t coap_blockwise_put_char(coap_block_slicer_t *slicer, uint8_t *bufpos, char c);
1090
1109int coap_get_block(coap_pkt_t *pkt, coap_block1_t *block, uint16_t option);
1110
1128static inline int coap_get_block1(coap_pkt_t *pkt, coap_block1_t *block)
1129{
1130 return coap_get_block(pkt, block, COAP_OPT_BLOCK1);
1131}
1132
1142static inline int coap_get_block2(coap_pkt_t *pkt, coap_block1_t *block)
1143{
1144 return coap_get_block(pkt, block, COAP_OPT_BLOCK2);
1145}
1146
1159int coap_get_blockopt(coap_pkt_t *pkt, uint16_t option, uint32_t *blknum, uint8_t *szx);
1160
1179
1187#define coap_szx2size(szx) (1U << ((szx) + 4))
1188
1196static inline unsigned coap_size2szx(unsigned len)
1197{
1198 assert(len >= 16);
1199 return bitarithm_msb(len >> 4);
1200}
1234 bool more, uint16_t option);
1235
1254static inline ssize_t coap_opt_add_block1(coap_pkt_t *pkt,
1255 coap_block_slicer_t *slicer, bool more)
1256{
1257 return coap_opt_add_block(pkt, slicer, more, COAP_OPT_BLOCK1);
1258}
1259
1278static inline ssize_t coap_opt_add_block2(coap_pkt_t *pkt,
1279 coap_block_slicer_t *slicer, bool more)
1280{
1281 return coap_opt_add_block(pkt, slicer, more, COAP_OPT_BLOCK2);
1282}
1297ssize_t coap_opt_add_uint(coap_pkt_t *pkt, uint16_t optnum, uint32_t value);
1298
1312static inline ssize_t coap_opt_add_block1_control(coap_pkt_t *pkt, coap_block1_t *block) {
1313 return coap_opt_add_uint(pkt, COAP_OPT_BLOCK1,
1314 (block->blknum << 4) | block->szx | (block->more ? 0x8 : 0));
1315}
1316
1330static inline ssize_t coap_opt_add_block2_control(coap_pkt_t *pkt, coap_block1_t *block) {
1331 /* block.more must be zero, so no need to 'or' it in */
1332 return coap_opt_add_uint(pkt, COAP_OPT_BLOCK2,
1333 (block->blknum << 4) | block->szx);
1334}
1335
1349static inline ssize_t coap_opt_add_accept(coap_pkt_t *pkt, uint16_t format)
1350{
1351 return coap_opt_add_uint(pkt, COAP_OPT_ACCEPT, format);
1352}
1353
1367static inline ssize_t coap_opt_add_format(coap_pkt_t *pkt, uint16_t format)
1368{
1369 return coap_opt_add_uint(pkt, COAP_OPT_CONTENT_FORMAT, format);
1370}
1371
1387ssize_t coap_opt_add_opaque(coap_pkt_t *pkt, uint16_t optnum, const void *val, size_t val_len);
1388
1406ssize_t coap_opt_add_uri_query2(coap_pkt_t *pkt, const char *key, size_t key_len,
1407 const char *val, size_t val_len);
1408
1425static inline ssize_t coap_opt_add_uri_query(coap_pkt_t *pkt, const char *key,
1426 const char *val)
1427{
1428 return coap_opt_add_uri_query2(pkt, key, strlen(key), val, val ? strlen(val) : 0);
1429}
1430
1445ssize_t coap_opt_add_proxy_uri(coap_pkt_t *pkt, const char *uri);
1446
1465ssize_t coap_opt_add_chars(coap_pkt_t *pkt, uint16_t optnum, const char *chars,
1466 size_t chars_len, char separator);
1467
1485static inline ssize_t coap_opt_add_string(coap_pkt_t *pkt, uint16_t optnum,
1486 const char *string, char separator)
1487{
1488 return coap_opt_add_chars(pkt, optnum, string, strlen(string), separator);
1489}
1490
1505static inline ssize_t coap_opt_add_uri_path(coap_pkt_t *pkt, const char *path)
1506{
1507 return coap_opt_add_string(pkt, COAP_OPT_URI_PATH, path, '/');
1508}
1509
1525static inline ssize_t coap_opt_add_uri_path_buffer(coap_pkt_t *pkt,
1526 const char *path,
1527 size_t path_len)
1528{
1529 return coap_opt_add_chars(pkt, COAP_OPT_URI_PATH, path, path_len, '/');
1530}
1531
1544ssize_t coap_opt_finish(coap_pkt_t *pkt, uint16_t flags);
1545
1563ssize_t coap_opt_remove(coap_pkt_t *pkt, uint16_t optnum);
1591size_t coap_opt_put_block(uint8_t *buf, uint16_t lastonum, coap_block_slicer_t *slicer,
1592 bool more, uint16_t option);
1593
1609static inline size_t coap_opt_put_block1(uint8_t *buf, uint16_t lastonum,
1610 coap_block_slicer_t *slicer, bool more)
1611{
1612 return coap_opt_put_block(buf, lastonum, slicer, more, COAP_OPT_BLOCK1);
1613}
1614
1630static inline size_t coap_opt_put_block2(uint8_t *buf, uint16_t lastonum,
1631 coap_block_slicer_t *slicer, bool more)
1632{
1633 return coap_opt_put_block(buf, lastonum, slicer, more, COAP_OPT_BLOCK2);
1634}
1635
1647size_t coap_opt_put_uint(uint8_t *buf, uint16_t lastonum, uint16_t onum,
1648 uint32_t value);
1649
1659static inline size_t coap_opt_put_block1_control(uint8_t *buf, uint16_t lastonum,
1660 coap_block1_t *block)
1661{
1662 return coap_opt_put_uint(buf, lastonum, COAP_OPT_BLOCK1,
1663 (block->blknum << 4) | block->szx | (block->more ? 0x8 : 0));
1664}
1665
1677static inline size_t coap_opt_put_block2_control(uint8_t *buf, uint16_t lastonum,
1678 coap_block1_t *block)
1679{
1680 /* block.more must be zero, so no need to 'or' it in */
1681 return coap_opt_put_uint(buf, lastonum, COAP_OPT_BLOCK2,
1682 (block->blknum << 4) | block->szx);
1683}
1684
1698size_t coap_opt_put_string_with_len(uint8_t *buf, uint16_t lastonum, uint16_t optnum,
1699 const char *string, size_t len, char separator);
1712static inline size_t coap_opt_put_string(uint8_t *buf, uint16_t lastonum,
1713 uint16_t optnum,
1714 const char *string, char separator)
1715{
1716 return coap_opt_put_string_with_len(buf, lastonum, optnum,
1717 string, strlen(string), separator);
1718}
1719
1730static inline size_t coap_opt_put_location_path(uint8_t *buf,
1731 uint16_t lastonum,
1732 const char *location)
1733{
1734 return coap_opt_put_string(buf, lastonum, COAP_OPT_LOCATION_PATH,
1735 location, '/');
1736}
1737
1748static inline size_t coap_opt_put_location_query(uint8_t *buf,
1749 uint16_t lastonum,
1750 const char *location)
1751{
1752 return coap_opt_put_string(buf, lastonum, COAP_OPT_LOCATION_QUERY,
1753 location, '&');
1754}
1755
1766static inline size_t coap_opt_put_uri_path(uint8_t *buf, uint16_t lastonum,
1767 const char *uri)
1768{
1769 return coap_opt_put_string(buf, lastonum, COAP_OPT_URI_PATH, uri, '/');
1770}
1771
1782static inline size_t coap_opt_put_uri_query(uint8_t *buf, uint16_t lastonum,
1783 const char *uri)
1784{
1785 return coap_opt_put_string(buf, lastonum, COAP_OPT_URI_QUERY, uri, '&');
1786}
1787
1806size_t coap_opt_put_uri_pathquery(uint8_t *buf, uint16_t *lastonum, const char *uri);
1807
1818static inline size_t coap_opt_put_proxy_uri(uint8_t *buf, uint16_t lastonum,
1819 const char *uri)
1820{
1821 return coap_opt_put_string(buf, lastonum, COAP_OPT_PROXY_URI, uri, '\0');
1822}
1823
1841size_t coap_put_block1_ok(uint8_t *pkt_pos, coap_block1_t *block1, uint16_t lastonum);
1842
1859size_t coap_put_option(uint8_t *buf, uint16_t lastonum, uint16_t onum, const void *odata, size_t olen);
1860
1873static inline size_t coap_put_option_block1(uint8_t *buf, uint16_t lastonum,
1874 unsigned blknum, unsigned szx, int more)
1875{
1876 return coap_opt_put_uint(buf, lastonum, COAP_OPT_BLOCK1,
1877 (blknum << 4) | szx | (more ? 0x8 : 0));
1878}
1879
1890static inline size_t coap_put_option_ct(uint8_t *buf, uint16_t lastonum,
1891 uint16_t content_type)
1892{
1893 return coap_opt_put_uint(buf, lastonum, COAP_OPT_CONTENT_FORMAT, content_type);
1894}
1920ssize_t coap_block2_build_reply(coap_pkt_t *pkt, unsigned code,
1921 uint8_t *rbuf, unsigned rlen, unsigned payload_len,
1922 coap_block_slicer_t *slicer);
1923
1938ssize_t coap_build_hdr(coap_hdr_t *hdr, unsigned type, const void *token,
1939 size_t token_len, unsigned code, uint16_t id);
1940
1969ssize_t coap_build_reply(coap_pkt_t *pkt, unsigned code,
1970 uint8_t *rbuf, unsigned rlen, unsigned payload_len);
1971
1986ssize_t coap_handle_req(coap_pkt_t *pkt, uint8_t *resp_buf, unsigned resp_buf_len,
1987 coap_request_ctx_t *ctx);
1988
2005ssize_t coap_tree_handler(coap_pkt_t *pkt, uint8_t *resp_buf,
2006 unsigned resp_buf_len, coap_request_ctx_t *ctx,
2007 const coap_resource_t *resources,
2008 size_t resources_numof);
2009
2027ssize_t coap_subtree_handler(coap_pkt_t *pkt, uint8_t *resp_buf,
2028 size_t resp_buf_len, coap_request_ctx_t *context);
2029
2037static inline coap_method_flags_t coap_method2flag(unsigned code)
2038{
2039 return (1 << (code - 1));
2040}
2041
2056int coap_parse(coap_pkt_t *pkt, uint8_t *buf, size_t len);
2057
2072void coap_pkt_init(coap_pkt_t *pkt, uint8_t *buf, size_t len, size_t header_len);
2073
2087static inline void coap_payload_advance_bytes(coap_pkt_t *pkt, size_t len)
2088{
2089 pkt->payload += len;
2090 pkt->payload_len -= len;
2091}
2092
2114ssize_t coap_payload_put_bytes(coap_pkt_t *pkt, const void *data, size_t len);
2115
2129ssize_t coap_payload_put_char(coap_pkt_t *pkt, char c);
2130
2156ssize_t coap_build_reply_header(coap_pkt_t *pkt, unsigned code,
2157 void *buf, size_t len,
2158 int ct,
2159 void **payload, size_t *payload_len_max);
2160
2183 unsigned code,
2184 uint8_t *buf, size_t len,
2185 unsigned ct,
2186 const void *payload, size_t payload_len);
2187
2193 uint8_t *buf, size_t len,
2194 coap_request_ctx_t *context);
2200#ifndef CONFIG_NANOCOAP_SERVER_WELL_KNOWN_CORE
2201#define CONFIG_NANOCOAP_SERVER_WELL_KNOWN_CORE !IS_USED(MODULE_GCOAP)
2202#endif
2203
2219int coap_match_path(const coap_resource_t *resource, uint8_t *uri);
2220
2221#if defined(MODULE_GCOAP) || defined(DOXYGEN)
2234static inline bool coap_has_observe(coap_pkt_t *pkt)
2235{
2236 return pkt->observe_value != UINT32_MAX;
2237}
2238
2244static inline void coap_clear_observe(coap_pkt_t *pkt)
2245{
2246 pkt->observe_value = UINT32_MAX;
2247}
2248
2256static inline uint32_t coap_get_observe(coap_pkt_t *pkt)
2257{
2258 return pkt->observe_value;
2259}
2261#endif
2262
2266#define COAP_WELL_KNOWN_CORE_DEFAULT_HANDLER \
2267 { \
2268 .path = "/.well-known/core", \
2269 .methods = COAP_GET, \
2270 .handler = coap_well_known_core_default_handler \
2271 }
2272
2273#ifdef __cplusplus
2274}
2275#endif
2276#endif /* NET_NANOCOAP_H */
POSIX.1-2008 compliant version of the assert macro.
#define assert(cond)
abort the program if assertion is false
Definition assert.h:137
Helper functions for bit arithmetic.
static unsigned bitarithm_msb(unsigned v)
Returns the number of the highest '1' bit in a value.
Definition bitarithm.h:153
bitfields operations on bitfields of arbitrary length
Functions to work with different byte orders.
static uint16_t ntohs(uint16_t v)
Convert from network byte order to host byte order, 16 bit.
Definition byteorder.h:536
static uint16_t byteorder_bebuftohs(const uint8_t *buf)
Read a big endian encoded unsigned integer from a buffer into host byte order encoded variable,...
Definition byteorder.h:551
Various helper macros.
coap_method_t
CoAP method codes used in request.
Definition coap.h:171
#define CONFIG_NANOCOAP_NOPTS_MAX
Maximum number of Options in a message.
Definition nanocoap.h:146
#define CONFIG_NANOCOAP_URI_MAX
Maximum length of a resource path string read from or written to a message.
Definition nanocoap.h:154
uint32_t coap_request_ctx_get_tl_type(const coap_request_ctx_t *ctx)
Get transport the packet was received over.
uint8_t * coap_find_option(coap_pkt_t *pkt, unsigned opt_num)
Get pointer to an option field by type.
static ssize_t coap_opt_add_uri_query(coap_pkt_t *pkt, const char *key, const char *val)
Adds a single Uri-Query option in the form 'key=value' into pkt.
Definition nanocoap.h:1425
static size_t coap_opt_put_uri_query(uint8_t *buf, uint16_t lastonum, const char *uri)
Convenience function for inserting URI_QUERY option into buffer.
Definition nanocoap.h:1782
size_t coap_opt_put_block(uint8_t *buf, uint16_t lastonum, coap_block_slicer_t *slicer, bool more, uint16_t option)
Insert block option into buffer.
static size_t coap_opt_put_block2_control(uint8_t *buf, uint16_t lastonum, coap_block1_t *block)
Insert block2 option into buffer in control usage.
Definition nanocoap.h:1677
static ssize_t coap_opt_add_block2(coap_pkt_t *pkt, coap_block_slicer_t *slicer, bool more)
Add block2 option in descriptive use from a slicer object.
Definition nanocoap.h:1278
static unsigned coap_get_code_raw(const coap_pkt_t *pkt)
Get a message's raw code (class + detail)
Definition nanocoap.h:497
ssize_t coap_build_reply_header(coap_pkt_t *pkt, unsigned code, void *buf, size_t len, int ct, void **payload, size_t *payload_len_max)
Create CoAP reply header (convenience function)
void coap_pkt_init(coap_pkt_t *pkt, uint8_t *buf, size_t len, size_t header_len)
Initialize a packet struct, to build a message buffer.
static size_t coap_opt_put_block1(uint8_t *buf, uint16_t lastonum, coap_block_slicer_t *slicer, bool more)
Insert block1 option into buffer.
Definition nanocoap.h:1609
static ssize_t coap_opt_add_format(coap_pkt_t *pkt, uint16_t format)
Append a Content-Format option to the pkt buffer.
Definition nanocoap.h:1367
static uint8_t coap_code(unsigned cls, unsigned detail)
Encode given code class and code detail to raw code.
Definition nanocoap.h:449
bool coap_has_unprocessed_critical_options(const coap_pkt_t *pkt)
Check whether any of the packet's options that are critical.
static ssize_t coap_opt_add_uri_path(coap_pkt_t *pkt, const char *path)
Adds one or multiple Uri-Path options in the form '/path' into pkt.
Definition nanocoap.h:1505
static ssize_t coap_get_uri_query_string(coap_pkt_t *pkt, char *target, size_t max_len)
Convenience function for getting the packet's URI_QUERY option.
Definition nanocoap.h:869
ssize_t coap_handle_req(coap_pkt_t *pkt, uint8_t *resp_buf, unsigned resp_buf_len, coap_request_ctx_t *ctx)
Handle incoming CoAP request.
static unsigned coap_get_id(const coap_pkt_t *pkt)
Get the message ID of the given CoAP packet.
Definition nanocoap.h:521
static ssize_t coap_get_location_query(coap_pkt_t *pkt, uint8_t *target, size_t max_len)
Convenience function for getting the packet's LOCATION_QUERY option.
Definition nanocoap.h:829
static size_t coap_opt_put_uri_path(uint8_t *buf, uint16_t lastonum, const char *uri)
Convenience function for inserting URI_PATH option into buffer.
Definition nanocoap.h:1766
ssize_t coap_build_reply(coap_pkt_t *pkt, unsigned code, uint8_t *rbuf, unsigned rlen, unsigned payload_len)
Build reply to CoAP request.
static ssize_t coap_opt_add_accept(coap_pkt_t *pkt, uint16_t format)
Append an Accept option to the pkt buffer.
Definition nanocoap.h:1349
ssize_t coap_opt_get_string(coap_pkt_t *pkt, uint16_t optnum, uint8_t *target, size_t max_len, char separator)
Read a full option as null terminated string into the target buffer.
size_t coap_opt_put_uint(uint8_t *buf, uint16_t lastonum, uint16_t onum, uint32_t value)
Encode the given uint option into buffer.
void coap_request_ctx_init(coap_request_ctx_t *ctx, sock_udp_ep_t *remote)
Initialize CoAP request context.
static void coap_hdr_set_code(coap_hdr_t *hdr, uint8_t code)
Write the given raw message code to given CoAP header.
Definition nanocoap.h:672
ssize_t coap_payload_put_bytes(coap_pkt_t *pkt, const void *data, size_t len)
Add payload data to the CoAP request.
uint8_t * coap_iterate_option(coap_pkt_t *pkt, unsigned opt_num, uint8_t **opt_pos, int *opt_len)
Get pointer to an option field, can be called in a loop if there are multiple options with the same n...
int coap_opt_get_uint(coap_pkt_t *pkt, uint16_t optnum, uint32_t *value)
Get a uint32 option value.
unsigned coap_get_accept(coap_pkt_t *pkt)
Get the Accept option value from a packet if present.
static size_t coap_opt_put_string(uint8_t *buf, uint16_t lastonum, uint16_t optnum, const char *string, char separator)
Encode the given string as multi-part option into buffer.
Definition nanocoap.h:1712
uint16_t coap_method_flags_t
Method flag type.
Definition nanocoap.h:306
int coap_get_block(coap_pkt_t *pkt, coap_block1_t *block, uint16_t option)
Block option getter.
static unsigned coap_get_ver(const coap_pkt_t *pkt)
Get the CoAP version number.
Definition nanocoap.h:620
ssize_t coap_opt_get_next(const coap_pkt_t *pkt, coap_optpos_t *opt, uint8_t **value, bool init_opt)
Iterate over a packet's options.
static size_t coap_opt_put_block2(uint8_t *buf, uint16_t lastonum, coap_block_slicer_t *slicer, bool more)
Insert block2 option into buffer.
Definition nanocoap.h:1630
int coap_match_path(const coap_resource_t *resource, uint8_t *uri)
Checks if a CoAP resource path matches a given URI.
static bool coap_block2_finish(coap_block_slicer_t *slicer)
Finish a block2 response.
Definition nanocoap.h:1031
size_t coap_blockwise_put_bytes(coap_block_slicer_t *slicer, uint8_t *bufpos, const void *c, size_t len)
Add a byte array to a block2 reply.
static uint8_t coap_hdr_tkl_ext_len(const coap_hdr_t *hdr)
Get the size of the extended Token length field (RFC 8974)
Definition nanocoap.h:635
static coap_method_t coap_get_method(const coap_pkt_t *pkt)
Get a request's method type.
Definition nanocoap.h:509
static unsigned coap_get_total_hdr_len(const coap_pkt_t *pkt)
Get the total header length (4-byte header + token length)
Definition nanocoap.h:579
ssize_t coap_subtree_handler(coap_pkt_t *pkt, uint8_t *resp_buf, size_t resp_buf_len, coap_request_ctx_t *context)
Generic coap subtree handler.
static unsigned coap_get_code_class(const coap_pkt_t *pkt)
Get a message's code class (3 most significant bits of code)
Definition nanocoap.h:461
static int coap_get_block2(coap_pkt_t *pkt, coap_block1_t *block)
Block2 option getter.
Definition nanocoap.h:1142
ssize_t coap_block2_build_reply(coap_pkt_t *pkt, unsigned code, uint8_t *rbuf, unsigned rlen, unsigned payload_len, coap_block_slicer_t *slicer)
Build reply to CoAP block2 request.
void coap_block_slicer_init(coap_block_slicer_t *slicer, size_t blknum, size_t blksize)
Initialize a block slicer struct from content information.
static ssize_t coap_get_location_path(coap_pkt_t *pkt, uint8_t *target, size_t max_len)
Convenience function for getting the packet's LOCATION_PATH option.
Definition nanocoap.h:807
size_t coap_opt_put_string_with_len(uint8_t *buf, uint16_t lastonum, uint16_t optnum, const char *string, size_t len, char separator)
Encode the given string as multi-part option into buffer.
static ssize_t coap_opt_add_string(coap_pkt_t *pkt, uint16_t optnum, const char *string, char separator)
Encode the given string as option(s) into pkt.
Definition nanocoap.h:1485
bool coap_block_finish(coap_block_slicer_t *slicer, uint16_t option)
Finish a block request (block1 or block2)
static unsigned coap_get_code_detail(const coap_pkt_t *pkt)
Get a message's code detail (5 least significant bits of code)
Definition nanocoap.h:473
ssize_t coap_reply_simple(coap_pkt_t *pkt, unsigned code, uint8_t *buf, size_t len, unsigned ct, const void *payload, size_t payload_len)
Create CoAP reply (convenience function)
static int coap_get_block1(coap_pkt_t *pkt, coap_block1_t *block)
Block1 option getter.
Definition nanocoap.h:1128
void coap_block2_init(coap_pkt_t *pkt, coap_block_slicer_t *slicer)
Initialize a block2 slicer struct for writing the payload.
static uint8_t * coap_hdr_data_ptr(const coap_hdr_t *hdr)
Get the start of data after the header.
Definition nanocoap.h:661
ssize_t(* coap_handler_t)(coap_pkt_t *pkt, uint8_t *buf, size_t len, coap_request_ctx_t *context)
Resource handler type.
Definition nanocoap.h:272
ssize_t coap_payload_put_char(coap_pkt_t *pkt, char c)
Add a single character to the payload data of the CoAP request.
ssize_t coap_well_known_core_default_handler(coap_pkt_t *pkt, uint8_t *buf, size_t len, coap_request_ctx_t *context)
Reference to the default .well-known/core handler defined by the application.
static size_t coap_opt_put_proxy_uri(uint8_t *buf, uint16_t lastonum, const char *uri)
Convenience function for inserting PROXY_URI option into buffer.
Definition nanocoap.h:1818
static void coap_hdr_set_type(coap_hdr_t *hdr, unsigned type)
Set the message type for the given CoAP header.
Definition nanocoap.h:685
static void coap_payload_advance_bytes(coap_pkt_t *pkt, size_t len)
Advance the payload pointer.
Definition nanocoap.h:2087
bool coap_find_uri_query(coap_pkt_t *pkt, const char *key, const char **value, size_t *len)
Find a URI query option of the packet.
static uint32_t coap_get_observe(coap_pkt_t *pkt)
Get the value of the observe option from the given packet.
Definition nanocoap.h:2256
static size_t coap_put_option_block1(uint8_t *buf, uint16_t lastonum, unsigned blknum, unsigned szx, int more)
Insert block1 option into buffer.
Definition nanocoap.h:1873
static ssize_t coap_opt_add_block2_control(coap_pkt_t *pkt, coap_block1_t *block)
Encode the given block2 option in control use.
Definition nanocoap.h:1330
static unsigned coap_get_type(const coap_pkt_t *pkt)
Get the message type.
Definition nanocoap.h:608
static unsigned coap_get_code_decimal(const coap_pkt_t *pkt)
Get a message's code in decimal format ((class * 100) + detail)
Definition nanocoap.h:485
ssize_t coap_opt_get_opaque(coap_pkt_t *pkt, unsigned opt_num, uint8_t **value)
Retrieve the value for an option as an opaque array of bytes.
size_t coap_put_option(uint8_t *buf, uint16_t lastonum, uint16_t onum, const void *odata, size_t olen)
Insert a CoAP option into buffer.
ssize_t coap_opt_add_opaque(coap_pkt_t *pkt, uint16_t optnum, const void *val, size_t val_len)
Encode the given buffer as an opaque data option into pkt.
static ssize_t coap_opt_add_uri_path_buffer(coap_pkt_t *pkt, const char *path, size_t path_len)
Adds one or multiple Uri-Path options in the form '/path' into pkt.
Definition nanocoap.h:1525
static void * coap_get_token(const coap_pkt_t *pkt)
Get pointer to a message's token.
Definition nanocoap.h:567
static size_t coap_opt_put_location_query(uint8_t *buf, uint16_t lastonum, const char *location)
Convenience function for inserting LOCATION_QUERY option into buffer.
Definition nanocoap.h:1748
int coap_get_blockopt(coap_pkt_t *pkt, uint16_t option, uint32_t *blknum, uint8_t *szx)
Generic block option getter.
size_t coap_blockwise_put_char(coap_block_slicer_t *slicer, uint8_t *bufpos, char c)
Add a single character to a block2 reply.
static size_t coap_opt_put_location_path(uint8_t *buf, uint16_t lastonum, const char *location)
Convenience function for inserting LOCATION_PATH option into buffer.
Definition nanocoap.h:1730
static bool coap_block1_finish(coap_block_slicer_t *slicer)
Finish a block1 request.
Definition nanocoap.h:1012
void * coap_request_ctx_get_context(const coap_request_ctx_t *ctx)
Get resource context associated with a CoAP request.
static size_t coap_put_option_ct(uint8_t *buf, uint16_t lastonum, uint16_t content_type)
Insert content type option into buffer.
Definition nanocoap.h:1890
ssize_t coap_opt_add_proxy_uri(coap_pkt_t *pkt, const char *uri)
Adds a single Proxy-URI option into pkt.
int(* coap_blockwise_cb_t)(void *arg, size_t offset, uint8_t *buf, size_t len, int more)
Coap blockwise request callback descriptor.
Definition nanocoap.h:287
static unsigned coap_size2szx(unsigned len)
Helper to encode byte size into next equal or smaller SZX value.
Definition nanocoap.h:1196
int(* coap_request_cb_t)(void *arg, coap_pkt_t *pkt)
Coap request callback descriptor.
Definition nanocoap.h:299
static size_t coap_opt_put_block1_control(uint8_t *buf, uint16_t lastonum, coap_block1_t *block)
Insert block1 option into buffer in control usage.
Definition nanocoap.h:1659
const char * coap_request_ctx_get_path(const coap_request_ctx_t *ctx)
Get resource path associated with a CoAP request.
ssize_t coap_opt_add_block(coap_pkt_t *pkt, coap_block_slicer_t *slicer, bool more, uint16_t option)
Add block option in descriptive use from a slicer object.
const sock_udp_ep_t * coap_request_ctx_get_remote_udp(const coap_request_ctx_t *ctx)
Get the remote endpoint from which the request was received.
int coap_parse(coap_pkt_t *pkt, uint8_t *buf, size_t len)
Parse a CoAP PDU.
void coap_block_object_init(coap_block1_t *block, size_t blknum, size_t blksize, int more)
Initialize a block struct from content information.
ssize_t coap_opt_add_chars(coap_pkt_t *pkt, uint16_t optnum, const char *chars, size_t chars_len, char separator)
Encode the given array of characters as option(s) into pkt.
ssize_t coap_opt_remove(coap_pkt_t *pkt, uint16_t optnum)
Removes an option previously added with function in the coap_opt_add_...() group.
unsigned coap_get_content_type(coap_pkt_t *pkt)
Get content type from packet.
static ssize_t coap_get_proxy_uri(coap_pkt_t *pkt, char **target)
Convenience function for getting the packet's Proxy-Uri option.
Definition nanocoap.h:956
static ssize_t coap_get_uri_path(coap_pkt_t *pkt, uint8_t *target)
Convenience function for getting the packet's URI_PATH.
Definition nanocoap.h:850
ssize_t coap_opt_add_uint(coap_pkt_t *pkt, uint16_t optnum, uint32_t value)
Encode the given uint option into pkt.
static unsigned coap_get_total_len(const coap_pkt_t *pkt)
Get the total length of a CoAP packet in the packet buffer.
Definition nanocoap.h:593
static bool coap_has_observe(coap_pkt_t *pkt)
Identifies a packet containing an observe option.
Definition nanocoap.h:2234
ssize_t coap_build_hdr(coap_hdr_t *hdr, unsigned type, const void *token, size_t token_len, unsigned code, uint16_t id)
Builds a CoAP header.
size_t coap_put_block1_ok(uint8_t *pkt_pos, coap_block1_t *block1, uint16_t lastonum)
Insert block1 option into buffer (from coap_block1_t)
static ssize_t coap_opt_add_block1(coap_pkt_t *pkt, coap_block_slicer_t *slicer, bool more)
Add block1 option in descriptive use from a slicer object.
Definition nanocoap.h:1254
static coap_method_flags_t coap_method2flag(unsigned code)
Convert message code (request method) into a corresponding bit field.
Definition nanocoap.h:2037
size_t coap_opt_put_uri_pathquery(uint8_t *buf, uint16_t *lastonum, const char *uri)
Convenience function for inserting URI_PATH and URI_QUERY into buffer This function will automaticall...
static ssize_t coap_opt_add_block1_control(coap_pkt_t *pkt, coap_block1_t *block)
Encode the given block1 option in control use.
Definition nanocoap.h:1312
ssize_t coap_tree_handler(coap_pkt_t *pkt, uint8_t *resp_buf, unsigned resp_buf_len, coap_request_ctx_t *ctx, const coap_resource_t *resources, size_t resources_numof)
Pass a coap request to a matching handler.
static unsigned coap_get_token_len(const coap_pkt_t *pkt)
Get a message's token length [in byte].
Definition nanocoap.h:536
static void coap_clear_observe(coap_pkt_t *pkt)
Clears the observe option value from a packet.
Definition nanocoap.h:2244
ssize_t coap_opt_finish(coap_pkt_t *pkt, uint16_t flags)
Finalizes options as required and prepares for payload.
ssize_t coap_opt_add_uri_query2(coap_pkt_t *pkt, const char *key, size_t key_len, const char *val, size_t val_len)
Adds a single Uri-Query option in the form 'key=value' into pkt.
struct _sock_tl_ep sock_udp_ep_t
An end point for a UDP sock object.
Definition udp.h:293
Definitions for internet operations.
iolist scatter / gather IO
Common macros and compiler attributes/pragmas configuration.
#define IS_USED(module)
Checks whether a module is being used or not.
Definition modules.h:71
Generic CoAP values as defined by RFC7252.
UDP sock definitions.
CoAP resource request handler context.
Definition nanocoap.h:338
const coap_resource_t * resource
resource of the request
Definition nanocoap.h:339
sock_udp_ep_t * remote
remote endpoint of the request
Definition nanocoap.h:340
uint32_t tl_type
transport the packet was received over
Definition nanocoap.h:348
Common IP-based transport layer end point.
Definition sock.h:215
Block1 helper struct.
Definition nanocoap.h:393
int8_t more
-1 for no option, 0 for last block, 1 for more blocks coming
Definition nanocoap.h:397
uint32_t blknum
block number
Definition nanocoap.h:395
size_t offset
offset of received data
Definition nanocoap.h:394
uint8_t szx
szx value
Definition nanocoap.h:396
Blockwise transfer helper struct.
Definition nanocoap.h:404
uint8_t * opt
Pointer to the placed option
Definition nanocoap.h:408
size_t end
End offset of the current block
Definition nanocoap.h:406
size_t start
Start offset of the current block
Definition nanocoap.h:405
size_t cur
Offset of the generated content
Definition nanocoap.h:407
Raw CoAP PDU header structure.
Definition nanocoap.h:201
uint8_t ver_t_tkl
version, token, token length
Definition nanocoap.h:202
uint8_t code
CoAP code (e.g.m 205)
Definition nanocoap.h:203
uint16_t id
Req/resp ID
Definition nanocoap.h:204
CoAP option array entry.
Definition nanocoap.h:210
uint16_t offset
offset in packet
Definition nanocoap.h:212
uint16_t opt_num
full CoAP option number
Definition nanocoap.h:211
CoAP PDU parsing context structure.
Definition nanocoap.h:232
uint8_t * payload
pointer to end of the header
Definition nanocoap.h:234
uint16_t payload_len
length of payload
Definition nanocoap.h:236
coap_hdr_t * hdr
pointer to raw packet
Definition nanocoap.h:233
uint16_t options_len
length of options array
Definition nanocoap.h:237
BITFIELD(opt_crit, CONFIG_NANOCOAP_NOPTS_MAX)
unhandled critical option
iolist_t * snips
payload snips (optional)
Definition nanocoap.h:235
Type for CoAP resource subtrees.
Definition nanocoap.h:321
const size_t resources_numof
number of entries in array
Definition nanocoap.h:323
const coap_resource_t * resources
ptr to resource array
Definition nanocoap.h:322
Type for CoAP resource entry.
Definition nanocoap.h:311
const char * path
URI path of resource
Definition nanocoap.h:312
coap_method_flags_t methods
OR'ed methods this resource allows.
Definition nanocoap.h:313
coap_handler_t handler
ptr to resource handler
Definition nanocoap.h:314
void * context
ptr to user defined context data
Definition nanocoap.h:315
iolist structure definition
Definition iolist.h:39
Cross File Arrays.