nanocoap API More...
nanocoap API
Definition in file nanocoap.h.
#include <assert.h>
#include <errno.h>
#include <stdint.h>
#include <stdbool.h>
#include <stddef.h>
#include <string.h>
#include <unistd.h>
#include "coap.h"
#include <arpa/inet.h>
#include "net/sock/udp.h"
Go to the source code of this file.
Data Structures | |
struct | coap_hdr_t |
Raw CoAP PDU header structure. More... | |
struct | coap_optpos_t |
CoAP option array entry. More... | |
struct | coap_pkt_t |
CoAP PDU parsing context structure. More... | |
struct | coap_resource_t |
Type for CoAP resource entry. More... | |
struct | coap_resource_subtree_t |
Type for CoAP resource subtrees. More... | |
struct | _coap_request_ctx |
CoAP resource request handler context. More... | |
struct | coap_block1_t |
Block1 helper struct. More... | |
struct | coap_block_slicer_t |
Blockwise transfer helper struct. More... | |
Macros | |
#define | COAP_FORMAT_NONE (UINT16_MAX) |
nanoCoAP-specific value to indicate no format specified | |
#define | CONFIG_NANOCOAP_NOPTS_MAX (16) |
Maximum number of Options in a message. | |
#define | CONFIG_NANOCOAP_URI_MAX (64) |
Maximum length of a resource path string read from or written to a message. | |
#define | CONFIG_NANOCOAP_BLOCK_SIZE_EXP_MAX (6) |
Maximum size for a blockwise transfer as a power of 2. | |
#define | CONFIG_NANOCOAP_BLOCKSIZE_DEFAULT COAP_BLOCKSIZE_64 |
CoAP block-wise-transfer size that should be used by default. | |
#define | CONFIG_NANOCOAP_QS_MAX (64) |
Maximum length of a query string written to a message. | |
#define | CONFIG_NANOCOAP_BLOCK_HEADER_MAX (80) |
Maximum length of a CoAP header for a blockwise message. | |
#define | NANOCOAP_RESOURCE(name) XFA_CONST(coap_resource_t, coap_resources_xfa, 0) CONCAT(coap_resource_, name) = |
CoAP XFA resource entry. | |
#define | CONFIG_NANOCOAP_SERVER_WELL_KNOWN_CORE !IS_USED(MODULE_GCOAP) |
Respond to /.well-known/core to list all resources on the server. | |
#define | COAP_WELL_KNOWN_CORE_DEFAULT_HANDLER |
Resource definition for the default .well-known/core handler. | |
Typedefs | |
typedef struct _coap_request_ctx | coap_request_ctx_t |
Forward declaration of internal CoAP resource request handler context. | |
typedef ssize_t(* | coap_handler_t) (coap_pkt_t *pkt, uint8_t *buf, size_t len, coap_request_ctx_t *context) |
Resource handler type. | |
typedef int(* | coap_blockwise_cb_t) (void *arg, size_t offset, uint8_t *buf, size_t len, int more) |
Coap blockwise request callback descriptor. | |
typedef int(* | coap_request_cb_t) (void *arg, coap_pkt_t *pkt) |
Coap request callback descriptor. | |
typedef uint16_t | coap_method_flags_t |
Method flag type. | |
Functions | |
void | coap_request_ctx_init (coap_request_ctx_t *ctx, sock_udp_ep_t *remote) |
Initialize CoAP request context. | |
const char * | coap_request_ctx_get_path (const coap_request_ctx_t *ctx) |
Get resource path associated with a CoAP request. | |
void * | coap_request_ctx_get_context (const coap_request_ctx_t *ctx) |
Get resource context associated with a CoAP request. | |
uint32_t | coap_request_ctx_get_tl_type (const coap_request_ctx_t *ctx) |
Get transport the packet was received over. | |
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. | |
const sock_udp_ep_t * | coap_request_ctx_get_local_udp (const coap_request_ctx_t *ctx) |
Get the local endpoint on which the request has been received. | |
static ssize_t | coap_get_proxy_uri (coap_pkt_t *pkt, char **target) |
Convenience function for getting the packet's Proxy-Uri option. | |
int | coap_match_path (const coap_resource_t *resource, const uint8_t *uri) |
Checks if a CoAP resource path matches a given URI. | |
nanoCoAP specific CoAP method flags used in coap_handlers array | |
#define | COAP_GET (0x01) |
#define | COAP_POST (0x02) |
#define | COAP_PUT (0x04) |
#define | COAP_DELETE (0x08) |
#define | COAP_FETCH (0x10) |
#define | COAP_PATCH (0x20) |
#define | COAP_IPATCH (0x40) |
#define | COAP_IGNORE (0xFF) |
For situations where the method is not important. | |
#define | COAP_MATCH_SUBTREE (0x8000) |
Path is considered as a prefix when matching. | |
coap_opt_finish() flag parameter values | |
Directs packet/buffer updates when user finishes adding options | |
#define | COAP_OPT_FINISH_NONE (0x0000) |
no special handling required | |
#define | COAP_OPT_FINISH_PAYLOAD (0x0001) |
expect a payload to follow | |
Functions – Options for Block | |
Read Block1 (POST/PUT request) or Block2 (GET response) options, and generally useful functions to write block options. | |
#define | coap_szx2size(szx) (1U << ((szx) + 4)) |
Helper to decode SZX value to size in bytes. | |
void | coap_block_object_init (coap_block1_t *block, size_t blknum, size_t blksize, int more) |
Initialize a block struct from content information. | |
bool | coap_block_finish (coap_block_slicer_t *slicer, uint16_t option) |
Finish a block request (block1 or block2) | |
static bool | coap_block1_finish (coap_block_slicer_t *slicer) |
Finish a block1 request. | |
static bool | coap_block2_finish (coap_block_slicer_t *slicer) |
Finish a block2 response. | |
void | coap_block2_init (coap_pkt_t *pkt, coap_block_slicer_t *slicer) |
Initialize a block2 slicer struct for writing the payload. | |
void | coap_block_slicer_init (coap_block_slicer_t *slicer, size_t blknum, size_t blksize) |
Initialize a block slicer struct from content information. | |
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. | |
size_t | coap_blockwise_put_char (coap_block_slicer_t *slicer, uint8_t *bufpos, char c) |
Add a single character to a block2 reply. | |
int | coap_get_block (coap_pkt_t *pkt, coap_block1_t *block, uint16_t option) |
Block option getter. | |
static int | coap_get_block1 (coap_pkt_t *pkt, coap_block1_t *block) |
Block1 option getter. | |
static int | coap_get_block2 (coap_pkt_t *pkt, coap_block1_t *block) |
Block2 option getter. | |
int | coap_get_blockopt (coap_pkt_t *pkt, uint16_t option, uint32_t *blknum, uint8_t *szx) |
Generic block option getter. | |
bool | coap_has_unprocessed_critical_options (const coap_pkt_t *pkt) |
Check whether any of the packet's options that are critical. | |
static unsigned | coap_size2szx (unsigned len) |
Helper to encode byte size into next equal or smaller SZX value. | |
Functions – Header Read/Write | |
Includes message ID, code, type, token, CoAP version | |
static uint8_t * | coap_hdr_data_ptr (const coap_hdr_t *hdr) |
Get the start of data after the header. | |
static size_t | coap_hdr_get_token_len (const coap_hdr_t *hdr) |
Get the token length of a CoAP over UDP (DTLS) packet. | |
static uint8_t | coap_code (unsigned cls, unsigned detail) |
Encode given code class and code detail to raw code. | |
static unsigned | coap_get_code_class (const coap_pkt_t *pkt) |
Get a message's code class (3 most significant bits of code) | |
static unsigned | coap_get_code_detail (const coap_pkt_t *pkt) |
Get a message's code detail (5 least significant bits of code) | |
static unsigned | coap_get_code_decimal (const coap_pkt_t *pkt) |
Get a message's code in decimal format ((class * 100) + detail) | |
static unsigned | coap_get_code_raw (const coap_pkt_t *pkt) |
Get a message's raw code (class + detail) | |
static coap_method_t | coap_get_method (const coap_pkt_t *pkt) |
Get a request's method type. | |
static unsigned | coap_get_id (const coap_pkt_t *pkt) |
Get the message ID of the given CoAP packet. | |
static unsigned | coap_get_token_len (const coap_pkt_t *pkt) |
Get a message's token length [in byte]. | |
static void * | coap_get_token (const coap_pkt_t *pkt) |
Get pointer to a message's token. | |
static unsigned | coap_get_total_len (const coap_pkt_t *pkt) |
Get the total length of a CoAP packet in the packet buffer. | |
static unsigned | coap_get_type (const coap_pkt_t *pkt) |
Get the message type. | |
static unsigned | coap_get_ver (const coap_pkt_t *pkt) |
Get the CoAP version number. | |
static uint8_t | coap_hdr_tkl_ext_len (const coap_hdr_t *hdr) |
Get the size of the extended Token length field (RFC 8974) | |
static unsigned | coap_get_total_hdr_len (const coap_pkt_t *pkt) |
Get the total header length (4-byte header + token length) | |
static unsigned | coap_get_response_hdr_len (const coap_pkt_t *pkt) |
Get the header length a response to the given packet will have. | |
static void | coap_hdr_set_code (coap_hdr_t *hdr, uint8_t code) |
Write the given raw message code to given CoAP header. | |
static void | coap_pkt_set_code (coap_pkt_t *pkt, uint8_t code) |
Write the given raw message code to given CoAP pkt. | |
static void | coap_hdr_set_type (coap_hdr_t *hdr, unsigned type) |
Set the message type for the given CoAP header. | |
static size_t | coap_hdr_len (const coap_hdr_t *hdr) |
Get the header length of a CoAP packet. | |
Functions – Options Read | |
Read options from a parsed packet. Packets accessed through coap_find_option or any of the | |
uint8_t * | coap_find_option (coap_pkt_t *pkt, unsigned opt_num) |
Get pointer to an option field by type. | |
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 number. | |
unsigned | coap_get_content_type (coap_pkt_t *pkt) |
Get content type from packet. | |
unsigned | coap_get_accept (coap_pkt_t *pkt) |
Get the Accept option value from a packet if present. | |
int | coap_opt_get_uint (coap_pkt_t *pkt, uint16_t optnum, uint32_t *value) |
Get a uint32 option value. | |
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. | |
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. | |
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. | |
static ssize_t | coap_get_uri_path (coap_pkt_t *pkt, uint8_t *target) |
Convenience function for getting the packet's URI_PATH. | |
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. | |
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. | |
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. | |
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. | |
Functions – Options Write Packet API | |
Use a coap_pkt_t struct to manage writing Options to the PDU. The caller must monitor space remaining in the buffer; however, the API will not write past the end of the buffer, and returns -ENOSPC when it is full. | |
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. | |
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. | |
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. | |
ssize_t | coap_opt_add_uint (coap_pkt_t *pkt, uint16_t optnum, uint32_t value) |
Encode the given uint option into pkt. | |
static ssize_t | coap_opt_add_block1_control (coap_pkt_t *pkt, coap_block1_t *block) |
Encode the given block1 option in control use. | |
static ssize_t | coap_opt_add_block2_control (coap_pkt_t *pkt, coap_block1_t *block) |
Encode the given block2 option in control use. | |
static ssize_t | coap_opt_add_accept (coap_pkt_t *pkt, uint16_t format) |
Append an Accept option to the pkt buffer. | |
static ssize_t | coap_opt_add_format (coap_pkt_t *pkt, uint16_t format) |
Append a Content-Format option to the pkt 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. | |
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. | |
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. | |
ssize_t | coap_opt_add_proxy_uri (coap_pkt_t *pkt, const char *uri) |
Adds a single Proxy-URI option into pkt . | |
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. | |
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. | |
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. | |
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. | |
ssize_t | coap_opt_finish (coap_pkt_t *pkt, uint16_t flags) |
Finalizes options as required and prepares for payload. | |
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. | |
Functions – Options Write Buffer API | |
Write PDU Options directly to the array of bytes for a message. The caller must provide the last option number written as well as the buffer position. The caller is primarily responsible for tracking and managing the space remaining in the buffer. | |
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_block1 (uint8_t *buf, uint16_t lastonum, coap_block_slicer_t *slicer, bool more) |
Insert block1 option into buffer. | |
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. | |
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. | |
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. | |
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. | |
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 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. | |
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. | |
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. | |
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. | |
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. | |
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 automatically split path and query parameters. | |
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. | |
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) | |
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. | |
static size_t | coap_put_option_block1 (uint8_t *buf, uint16_t lastonum, unsigned blknum, unsigned szx, int more) |
Insert block1 option into buffer. | |
static size_t | coap_put_option_ct (uint8_t *buf, uint16_t lastonum, uint16_t content_type) |
Insert content type option into buffer. | |
Functions – Messaging | |
Functions to support sending and receiving messages. | |
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. | |
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. | |
ssize_t | coap_build_reply (coap_pkt_t *pkt, unsigned code, uint8_t *rbuf, unsigned rlen, unsigned payload_len) |
Build reply to CoAP request. | |
ssize_t | coap_build_empty_ack (coap_pkt_t *pkt, coap_hdr_t *ack) |
Build empty reply to CoAP request. | |
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. | |
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. | |
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 coap_method_flags_t | coap_method2flag (unsigned code) |
Convert message code (request method) into a corresponding bit field. | |
int | coap_parse (coap_pkt_t *pkt, uint8_t *buf, size_t len) |
Parse a CoAP PDU. | |
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 void | coap_payload_advance_bytes (coap_pkt_t *pkt, size_t len) |
Advance the payload pointer. | |
ssize_t | coap_payload_put_bytes (coap_pkt_t *pkt, const void *data, size_t len) |
Add payload data to the CoAP request. | |
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_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) | |
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) | |
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. | |
Functions – gcoap specific | |
static bool | coap_has_observe (coap_pkt_t *pkt) |
Identifies a packet containing an observe option. | |
static void | coap_clear_observe (coap_pkt_t *pkt) |
Clears the observe option value from a packet. | |
static uint32_t | coap_get_observe (coap_pkt_t *pkt) |
Get the value of the observe option from the given packet. | |