123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663 |
- /**
- * Copyright (c) 2014 - 2019, Nordic Semiconductor ASA
- *
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without modification,
- * are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form, except as embedded into a Nordic
- * Semiconductor ASA integrated circuit in a product or a software update for
- * such product, must reproduce the above copyright notice, this list of
- * conditions and the following disclaimer in the documentation and/or other
- * materials provided with the distribution.
- *
- * 3. Neither the name of Nordic Semiconductor ASA nor the names of its
- * contributors may be used to endorse or promote products derived from this
- * software without specific prior written permission.
- *
- * 4. This software, with or without modification, must only be used with a
- * Nordic Semiconductor ASA integrated circuit.
- *
- * 5. Any software provided in binary form under this license must not be reverse
- * engineered, decompiled, modified and/or disassembled.
- *
- * THIS SOFTWARE IS PROVIDED BY NORDIC SEMICONDUCTOR ASA "AS IS" AND ANY EXPRESS
- * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
- * OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL NORDIC SEMICONDUCTOR ASA OR CONTRIBUTORS BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
- * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
- * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
- * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *
- */
- /** @file coap_api.h
- *
- * @defgroup iot_sdk_coap_api CoAP Application Programming Interface
- * @ingroup iot_sdk_coap
- * @{
- * @brief Public API of Nordic's CoAP implementation.
- *
- */
- #ifndef COAP_API_H__
- #define COAP_API_H__
- #include <stdint.h>
- #include "coap_transport.h"
- #include "coap_codes.h"
- #include "sdk_config.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- /**@defgroup COAP_CONTENT_TYPE_MASK Resource content type bitmask values
- * @{ */
- #define COAP_CT_MASK_PLAIN_TEXT 0x01 /**< Content type Plain text supported in the endpoint resource. */
- #define COAP_CT_MASK_CHARSET_UTF8 0x02 /**< Content type Charset-UTF8 supported in the endpoint resource. */
- #define COAP_CT_MASK_APP_LINK_FORMAT 0x04 /**< Content type Application/link-format supported in the endpoint resource. */
- #define COAP_CT_MASK_APP_XML 0x08 /**< Content type Application/xml supported in the endpoint resource. */
- #define COAP_CT_MASK_APP_OCTET_STREAM 0x10 /**< Content type Application/octet-stream supported in the endpoint resource. */
- #define COAP_CT_MASK_APP_EXI 0x20 /**< Content type Application/exi supported in the endpoint resource. */
- #define COAP_CT_MASK_APP_JSON 0x40 /**< Content type Application/json supported in the endpoint resource. */
- /**@} */
- /**@defgroup COAP_METHOD_PERMISSION Resource method permission bitmask values
- * @{ */
- #define COAP_PERM_NONE 0x0000 /**< Permission by default. Do not allow any method in the COAP/COAPS endpoint resource. */
- #define COAP_PERM_GET 0x0001 /**< Permission to allow GET method in the COAP endpoint resource. */
- #define COAP_PERM_POST 0x0002 /**< Permission to allow POST method in the COAP endpoint resource. */
- #define COAP_PERM_PUT 0x0004 /**< Permission to allow PUT method in the COAP endpoint resource. */
- #define COAP_PERM_DELETE 0x0008 /**< Permission to allow DELETE method in the COAP endpoint resource. */
- #define COAPS_PERM_GET 0x0010 /**< Permission to allow GET method in the COAPS endpoint resource. */
- #define COAPS_PERM_POST 0x0020 /**< Permission to allow POST method in the COAPS endpoint resource. */
- #define COAPS_PERM_PUT 0x0040 /**< Permission to allow PUT method in the COAPS endpoint resource. */
- #define COAPS_PERM_DELETE 0x0080 /**< Permission to allow DELETE method in the COAPS endpoint resource. */
- #define COAP_PERM_OBSERVE 0x0100 /**< Permission to allow OBSERVE of the endpoint resource. */
- /**@} */
- /**@cond */
- // Forward declare structs.
- typedef struct coap_message_t coap_message_t;
- typedef struct coap_resource_t coap_resource_t;
- /**@endcond */
- /**@brief Callback function to call upon undefined behaviour.
- *
- * @param[in] error_code Error code from CoAP module.
- * @param[in] p_message CoAP message processed when error ocoured. Could be NULL.
- */
- typedef void (*coap_error_callback_t)(uint32_t error_code, coap_message_t * p_message);
- /**@brief Callback function to be registered with CoAP messages.
- *
- * @param[in] status Response status. Possible status codes:
- * NRF_SUCCESS If response was successfully received,
- * COAP_TRANSMISSION_RESET_BY_PEER if a reset response was recieved or,
- * COAP_TRANSMISSION_TIMEOUT if transmission
- * @param[in] p_arg Miscellaneous pointer to application provided data that is associated with
- * the message.
- * @param[in] p_message Pointer to a CoAP Response message.
- */
- typedef void (*coap_response_callback_t)(uint32_t status, void * p_arg, coap_message_t * p_message);
- /**@brief Handler function for manually handling all incoming requests.
- *
- * @details If the function is set, the error code given back will trigger error messages
- * to be sent back by CoAP to indicate failure. Default error message will be 4.00
- * BAD REQUEST. On success, it is expected that the callback has already sent a
- * response message.
- *
- * @param[in] p_request Pointer to a CoAP Request message.
- *
- * @retval NRF_SUCCESS If the message was successfully has been handled.
- * @retval NRF_ERROR_NOT_FOUND If the message did not match any recognized resources, and a
- * 4.04 NOT FOUND error message should be sent back to the requester.
- * @retval NRF_ERROR_NULL If the message resolved the resource and operation not permitted,
- * and a 4.05 METHOD NOT ALLOWED error message should be sent back to
- * the reqester.
- *
- */
- typedef uint32_t (*coap_request_handler_t)(coap_message_t * p_request);
- #ifdef COAP_AUTOMODE
- /**@brief Callback function to be registered with CoAP endpoint resources. in auto-mode.
- *
- * @details The callback needs to implement any action based on the request. The p_response message
- * will automatically be sent as response when the callback function returns. The memory
- * is allocated by the caller, so the application does not have to free up the memory used
- * for the response.
- *
- * @param[in] p_resource Pointer to the request message's target resource.
- * @param[in] p_request Pointer to the request message.
- * @param[out] p_response Pointer to the prepared response message. The Application can override
- * its values.
- */
- typedef void (*coap_method_callback_t) (coap_resource_t * p_resource, coap_message_t * p_request, coap_message_t * p_response);
- #else // COAP_AUTOMODE
- /**@brief Callback function to be registered with CoAP endpoint resources. in auto-mode.
- *
- * @details The callback needs to implement any action based on the request. The callback is
- * responsible of handling the sending of any response back to the requester. The memory
- * for p_request will be freed up by the coap module after the callback has been
- * completed.
- *
- * @param[in] p_resource Pointer to the request message's target resource.
- * @param[in] p_request Pointer to the request message.
- */
- typedef void (*coap_method_callback_t) (coap_resource_t * p_resource, coap_message_t * p_request);
- #endif // COAP_AUTOMODE
- /**@brief Enumeration of CoAP content types. */
- typedef enum
- {
- COAP_CT_PLAIN_TEXT = 0, /**< Plain text content format number. Default. */
- COAP_CT_APP_LINK_FORMAT = 40, /**< Application/link-format content format number. */
- COAP_CT_APP_XML = 41, /**< Application/xml content format number. */
- COAP_CT_APP_OCTET_STREAM = 42, /**< Application/octet-stream content format number. */
- COAP_CT_APP_EXI = 47, /**< Application/exi content format number. */
- COAP_CT_APP_JSON = 50 /**< Application/json content format number. */
- } coap_content_type_t;
- /**@brief Enumeration of CoAP options numbers. */
- #define COAP_OPT_RESERVED0 0 /**< Reserved option number. */
- #define COAP_OPT_IF_MATCH 1 /**< If-Match option number. */
- #define COAP_OPT_URI_HOST 3 /**< URI-Host option number. */
- #define COAP_OPT_ETAG 4 /**< ETag option number. */
- #define COAP_OPT_IF_NONE_MATCH 5 /**< If-None-Match option number. */
- #define COAP_OPT_URI_PORT 7 /**< URI-Port option number. */
- #define COAP_OPT_LOCATION_PATH 8 /**< Location-Path option number. */
- #define COAP_OPT_URI_PATH 11 /**< URI-Path option number. */
- #define COAP_OPT_CONTENT_FORMAT 12 /**< Content-Format option number. */
- #define COAP_OPT_MAX_AGE 14 /**< Max-Age option number. */
- #define COAP_OPT_URI_QUERY 15 /**< URI-Query option number. */
- #define COAP_OPT_ACCEPT 17 /**< Accept option number. */
- #define COAP_OPT_LOCATION_QUERY 20 /**< Location-Query option number. */
- #define COAP_OPT_BLOCK2 23 /**< Block2 option number. */
- #define COAP_OPT_BLOCK1 27 /**< Block1 option number. */
- #define COAP_OPT_SIZE2 28 /**< Size2 option number. */
- #define COAP_OPT_PROXY_URI 35 /**< Proxy-URI option number. */
- #define COAP_OPT_PROXY_SCHEME 39 /**< Proxy-Scheme option number. */
- #define COAP_OPT_SIZE1 60 /**< Size1 option number. */
- #define COAP_OPT_RESERVED1 128 /**< Reserved option number. */
- #define COAP_OPT_RESERVED2 132 /**< Reserved option number. */
- #define COAP_OPT_RESERVED3 136 /**< Reserved option number. */
- #define COAP_OPT_RESERVED4 140 /**< Reserved option number. */
- /**@brief Enumeration of CoAP message types. */
- typedef enum
- {
- COAP_TYPE_CON = 0, /**< Confirmable Message type. */
- COAP_TYPE_NON, /**< Non-Confirmable Message type. */
- COAP_TYPE_ACK, /**< Acknowledge Message type. */
- COAP_TYPE_RST /**< Reset Message type. */
- } coap_msg_type_t;
- /**@brief Structure to hold a CoAP option.
- */
- typedef struct
- {
- uint16_t number; /**< Option number (including the extended delta value if any). */
- uint16_t length; /**< Option length (including the extended length value in any). */
- uint8_t * p_data; /**< Pointer to the memory where the data of the option is located. */
- } coap_option_t;
- /**@brief Structure to hold a CoAP message configuration.
- *
- * @details The structure is used when calling the \ref coap_message_new API function.
- * All data supplied will be copied to the created message.
- */
- typedef struct
- {
- coap_response_callback_t response_callback; /**< Callback function to be called when a response matching the token is identified. */
- uint8_t token[8]; /**< Message token. token_len must be set to indicate how many of the bytes should be used in the token. */
- uint8_t token_len; /**< Token size in bytes. */
- uint16_t id; /**< Message ID. If 0 is given, the library will replace this number with an autogenerated value. */
- coap_msg_type_t type; /**< Message type: COAP_TYPE_CON, COAP_TYPE_NON, COAP_TYPE_ACK, or COAP_TYPE_RST. */
- coap_msg_code_t code; /**< Message code (definitions found in coap_msg_code_t). */
- coap_port_t port; /**< Transport layer variable to associate the message with an underlying Transport Layer socket descriptor. */
- } coap_message_conf_t;
- /**@brief Structure to hold a CoAP message header.
- *
- * @details This structure holds the 4-byte mandatory CoAP header. The structure uses bitfields
- * to save memory footprint.
- */
- typedef struct
- {
- uint8_t version :2; /**< CoAP version number. The current specification RFC7252 mandates this to be version 1. The version number can be modified in sdk_config.h. */
- uint8_t type :2; /**< Message type: COAP_TYPE_CON, COAP_TYPE_NON, COAP_TYPE_ACK, or COAP_TYPE_RST. */
- uint8_t token_len :4; /**< Length of the message token. */
- uint8_t code; /**< Message code (definitions found in @ref coap_msg_code_t). */
- uint16_t id; /**< Message ID in little-endian format. Convertion to Network Byte Order will be handled by the library. */
- } coap_message_header_t;
- /**@brief Structure to hold a CoAP message.
- *
- * @details The CoAP message structure contains both internal and public members to
- * serialize and deserialize data supplied from the application to a byte buffer sent
- * over UDP. The message structure is used both in transmission and reception, which
- * makes it easy to handle in an application. Updating the message should be done
- * using the provided APIs, not by manually assigning new values to the members directly.
- * Reading the members, on the other hand, is fine.
- */
- struct coap_message_t
- {
- coap_remote_t remote; /**< Public. Structure containing address information and port number to the remote. */
- coap_remote_t local; /**< Public. Structure containing local destination address information and port number. */
- coap_message_header_t header; /**< Public. Header structure containing the mandatory CoAP 4-byte header fields. */
- uint8_t * p_payload; /**< Public. Pointer to the payload buffer in the message. */
- uint16_t payload_len; /**< Public. Size of the payload in the message. */
- uint8_t options_count; /**< Public. The number of options in the message. */
- coap_option_t options[COAP_MAX_NUMBER_OF_OPTIONS]; /**< Public. Array options in the message. */
- void * p_arg; /**< Public. Miscellaneous pointer to application provided data that is associated with the message. */
- coap_response_callback_t response_callback; /**< Internal. Function callback set by the application to be called when a response to this message is received. Should be set by the application through a configuration parameter. */
- uint8_t token[8]; /**< Internal. Array holding the variable-sized message token. Should be set by the application through a configuration parameter. */
- coap_port_t port; /**< Internal. Transport layer variable to associate the message with an underlying Transport Layer socket descriptor. */
- uint16_t options_len; /**< Internal. Length of the options including the mandatory header with extension bytes and option data. Accumulated every time a new options is added. */
- uint16_t options_offset; /**< Internal. Index to where the next option or payload can be added in the message's data buffer */
- uint16_t options_delta; /**< Internal. Current option number. Used to calculate the next option delta when adding new options to the message. */
- uint8_t * p_data; /**< Internal. Data buffer for adding dynamically sized options and payload. */
- uint16_t data_len; /**< Internal. Length of the provided data buffer for options and payload. */
- };
- /**@brief Structure to hold a CoAP endpoint resource.
- */
- struct coap_resource_t
- {
- uint8_t child_count; /**< Number of children in the linked list. */
- uint16_t permission; /**< Bitmask to tell which methods are permitted on the resource. Bit values available can be seen in \ref COAP_METHOD_PERMISSION. */
- coap_resource_t * p_sibling; /**< Sibling pointer to the next element in the list. */
- coap_resource_t * p_front; /**< Pointer to the beginning of the linked list. */
- coap_resource_t * p_tail; /**< Pointer to the last added child in the list. */
- coap_method_callback_t callback; /**< Callback to the resource handler. */
- uint32_t ct_support_mask; /**< Bitmask to tell which content types are supported by the resource. Bit values available can be seen in \ref COAP_CONTENT_TYPE_MASK. */
- uint32_t max_age; /**< Max age of resource endpoint value. */
- uint32_t expire_time; /**< Number of seconds until expire. */
- char name[COAP_RESOURCE_MAX_NAME_LEN+1]; /**< Name of the resource. Must be zero terminated. */
- };
- /**@brief Initializes the CoAP module.
- *
- * @details Initializes the library module and resets internal queues and resource registrations.
- *
- * @param[in] token_rand_seed Random number seed to be used to generate the token numbers.
- * @param[in] p_transport_params Pointer to transport parameters. Providing the list of ports
- * to be used by CoAP.
- *
- * @retval NRF_SUCCESS If initialization succeeded.
- */
- uint32_t coap_init(uint32_t token_rand_seed, coap_transport_init_t * p_transport_params);
- /**@brief Register error handler callback to the CoAP module.
- *
- * @param[in] error_callback Function to be called upon unknown messages and failure.
- *
- * @retval NRF_SUCCESS If registration was successful.
- */
- uint32_t coap_error_handler_register(coap_error_callback_t error_callback);
- /**@brief Register request handler which should handle all incoming requests.
- *
- * @details Setting this request handler redirects all requests to the application provided
- * callback routine. The callback handler might be cleared by NULL, making coap
- * module handle the requests and do resource lookup in order to process the
- * requests.
- *
- * @param[in] p_request_handler Function pointer to the provided request handler.
- *
- * @retval NRF_SUCCESS If registration was successful.
- */
- uint32_t coap_request_handler_register(coap_request_handler_t p_request_handler);
- /**@brief Sends a CoAP message.
- *
- * @details Sends out a request using the underlying transport layer. Before sending, the
- * \ref coap_message_t structure is serialized and added to an internal message queue
- * in the library. The handle returned can be used to abort the message from being
- * retransmitted at any time.
- *
- * @param[out] p_handle Handle to the message if CoAP CON/ACK messages has been used. Returned
- * by reference.
- * @param[in] p_message Message to be sent.
- *
- * @retval NRF_SUCCESS If the message was successfully encoded and scheduled for transmission.
- */
- uint32_t coap_message_send(uint32_t * p_handle, coap_message_t * p_message);
- /**@brief Abort a CoAP message.
- *
- * @details Aborts an ongoing transmission. If the message has not yet been sent, it will be
- * deleted from the message queue as well as stop any ongoing re-transmission of the
- * message.
- *
- * @param[in] handle Handle of the message to abort.
- *
- * @retval NRF_SUCCESS If the message was successfully aborted and removed from the
- * message queue.
- * @retval NRF_ERROR_NOT_FOUND If the message with the given handle was not located in the
- * message queue.
- */
- uint32_t coap_message_abort(uint32_t handle);
- /**@brief Creates CoAP message, initializes, and allocates the needed memory.
- *
- * @details Creates a CoAP message. This is an intermediate representation of the message,
- * because the message will be serialized by the library before it is transmitted. The structure
- * is verbose to facilitate configuring the message. Options, payload, and
- * remote address information can be added using API function calls.
- *
- * @param[inout] p_request Pointer to be filled by the allocated CoAP message structures.
- * @param[in] p_config Configuration for the message to be created. Manual configuration
- * can be performed after the message creation, except for the CLIENT port
- * association.
- *
- * @retval NRF_SUCCESS If the request was successfully allocated and initialized.
- * @retval NRF_ERROR_INVALID_PARAM If local port number was not configured.
- */
- uint32_t coap_message_new(coap_message_t ** p_request, coap_message_conf_t * p_config);
- /**@brief Deletes the CoAP request message.
- *
- * @details Frees up memory associated with the request message.
- *
- * @param[in] p_message Pointer to the request message to delete.
- */
- uint32_t coap_message_delete(coap_message_t * p_message);
- /**@brief Adds a payload to a CoAP message.
- *
- * @details Sets a data payload to a request or response message.
- *
- * This function must be called after all CoAP options have been added.
- * Due to internal buffers in the library, the payload will be added after any options
- * in the buffer. If an option is added after the payload, this option will over-write
- * the payload in the internal buffer.
- *
- * @param[inout] p_message Pointer to the message to add the payload to.
- * @param[in] p_payload Pointer to the payload to be added.
- * @param[in] payload_len Size of the payload to be added.
- *
- * @retval NRF_SUCCESS If the payload was successfully added to the message.
- * @retval NRF_ERROR_NO_MEM If the payload could not fit within the allocated payload memory
- * defined by sdk_config.h COAP_MESSAGE_DATA_MAX_SIZE.
- */
- uint32_t coap_message_payload_set(coap_message_t * p_message,
- void * p_payload,
- uint16_t payload_len);
- /**@brief Adds an empty CoAP option to the message.
- *
- * Option numbers must be in ascending order, adding the one with the smallest number
- * first and greatest last. If the order is incorrect, the delta number calculation will
- * result in an invalid or wrong delta number for the option.
- *
- * @param[inout] p_message Pointer to the message to add the option to. Should not be NULL.
- * @param[in] option_num The option number to add to the message.
- *
- * @retval NRF_SUCCESS If the empty option was successfully added to the message.
- * @retval NRF_ERROR_DATA_SIZE If the data exceeds the available message buffer data size.
- * @retval NRF_ERROR_NO_MEM If the maximum number of options that can be added to a message has been reached.
- */
- uint32_t coap_message_opt_empty_add(coap_message_t * p_message, uint16_t option_num);
- /**@brief Adds a uint CoAP option to the message.
- *
- * Option numbers must be in ascending order, adding the one with the smallest number
- * first and greatest last. If the order is incorrect, the delta number calculation will
- * result in an invalid or wrong delta number for the option.
- *
- * @param[inout] p_message Pointer to the message to add the option to. Should not be NULL.
- * @param[in] option_num The option number to add to the message.
- * @param[in] data An unsigned value (8-bit, 16-bit, or 32-bit) casted to uint32_t.
- * The value of the data is used to determine how many bytes
- * CoAP must use to represent this option value.
- *
- * @retval NRF_SUCCESS If the unsigned integer option was successfully added to the message.
- * @retval NRF_ERROR_DATA_SIZE If the data exceeds the available message buffer data size.
- * @retval NRF_ERROR_NO_MEM If the maximum number of options that can be added to a message has been reached.
- */
- uint32_t coap_message_opt_uint_add(coap_message_t * p_message, uint16_t option_num, uint32_t data);
- /**@brief Adds a string CoAP option to the message.
- *
- * Option numbers must be in ascending order, adding the one with the smallest number
- * first and greatest last. If the order is incorrect, the delta number calculation will
- * result in an invalid or wrong delta number for the option.
- *
- * @param[inout] p_message Pointer to the message to add the option to. Should not be NULL.
- * @param[in] option_num The option number to add to the message.
- * @param[in] p_data Pointer to a string buffer to be used as value for the option.
- * Should not be NULL.
- * @param[in] length Length of the string buffer provided.
- *
- * @retval NRF_SUCCESS If the string option was successfully added to the message.
- * @retval NRF_ERROR_DATA_SIZE If the data exceeds the available message buffer data size.
- * @retval NRF_ERROR_NO_MEM If the maximum number of options that can be added to a message has been reached.
- */
- uint32_t coap_message_opt_str_add(coap_message_t * p_message, uint16_t option_num, uint8_t * p_data, uint16_t length);
- /**@brief Adds an opaque CoAP option to the message.
- *
- * Option numbers must be in ascending order, adding the one with the smallest number
- * first and greatest last. If the order is incorrect, the delta number calculation will
- * result in an invalid or wrong delta number for the option.
- *
- * @param[inout] p_message Pointer to the message to add the option to. Should not be NULL.
- * @param[in] option_num The option number to add to the message.
- * @param[in] p_data Pointer to an opaque buffer to be used as value for the option.
- * Should not be NULL.
- * @param[in] length Length of the opaque buffer provided.
- *
- * @retval NRF_SUCCESS If the opaque option was successfully added to the message.
- * @retval NRF_ERROR_DATA_SIZE If the data exceeds the available message buffer data size.
- * @retval NRF_ERROR_NO_MEM If the maximum number of options that can be added to a message has been reached.
- */
- uint32_t coap_message_opt_opaque_add(coap_message_t * p_message, uint16_t option_num, uint8_t * p_data, uint16_t length);
- /**@brief Sets a remote address and port number to a CoAP message.
- *
- * @details Copies the content of the provided pointer into the CoAP message.
- *
- * @param[inout] p_message Pointer to the message to add the address information to.
- * Should not be NULL.
- * @param[in] p_address Pointer to a structure holding the address information for the remote server or client.
- * Should not be NULL.
- *
- * @retval NRF_SUCCESS When copying the content has finished.
- */
- uint32_t coap_message_remote_addr_set(coap_message_t * p_message, coap_remote_t * p_address);
- /**@brief Creates a CoAP endpoint resource.
- *
- * @details Initializes the \ref coap_resource_t members.
- *
- * The first resource that is created will be set as the root of the resource
- * hierarchy.
- *
- * @param[in] p_resource Pointer to coap_resource_t passed in by reference.
- * This variable must be stored in non-volatile memory.
- * Should not be NULL.
- * @param[in] name Verbose name of the service (zero-terminated
- * string). The maximum length of a name is defined
- * by COAP_RESOURCE_MAX_NAME_LEN in @c sdk_config.h
- * and can be adjusted if needed. Should not be NULL.
- * @retval NRF_ERROR_DATA_SIZE If the provided name is larger than the available name buffer.
- * @retval NRF_ERROR_NULL If the pointer to the resource or the provided
- * name buffer is NULL.
- */
- uint32_t coap_resource_create(coap_resource_t * p_resource, const char * name);
- /**@brief Adds a child resource.
- *
- * @details The hierarchy is constructed as a linked list with a maximum number of children.
- * COAP_RESOURCE_MAX_DEPTH in @c sdk_config.h sets the maximum depth. The maximum
- * number of children can be adjusted if more levels are needed.
- *
- * @param[in] p_parent Resource to attach the child to. Should not be NULL.
- * @param[in] p_child Child resource to attach. Should not be NULL.
- *
- * @retval NRF_SUCCESS If the child was successfully added.
- * @retval COAP_ERROR_MAX_DEPTH_REACHED If the child is exceeding the maximum depth defined.
- */
- uint32_t coap_resource_child_add(coap_resource_t * p_parent, coap_resource_t * p_child);
- /**@brief Generates .well-known/core string.
- *
- * @details This is a helper function for generating a CoRE link-format encoded string used for
- * CoAP discovery. The function traverse the resource hierarchy recursively.
- * The result will be resources listed in link-format. This function can be called when
- * all resources have been added by the application.
- *
- * @param[inout] string Buffer to use for the .well-known/core string. Should not be NULL.
- * @param[inout] length Length of the string buffer. Returns the used number of bytes from
- * the provided buffer.
- *
- * @retval NRF_SUCCESS If string generation was successful.
- * @retval NRF_ERROR_NULL If the string buffer was a NULL pointer.
- * @retval NRF_ERROR_DATA_SIZE If the size of the generated string exceeds the given buffer size.
- * @retval NRF_ERROR_INVALID_STATE If no resource has been registered.
- */
- uint32_t coap_resource_well_known_generate(uint8_t * string, uint16_t * length);
- /**@brief Get the root resource pointer.
- *
- * @param[out] pp_resource Pointer to be filled with pointer to the root resource.
- *
- * @retval NRF_SUCCESS If root resource was located.
- * @retval NRF_ERROR_NOT_FOUND If root resource was not located.
- * @retval NRF_ERROR_NULL If output pointer was NULL.
- */
- uint32_t coap_resource_root_get(coap_resource_t ** pp_resource);
- /**@brief Check whether a message contains a given CoAP Option.
- *
- * @param[in] p_message Pointer to the to check for the CoAP Option.
- * Should not be NULL.
- * @param[in] option CoAP Option to check for in the CoAP message.
- *
- * @retval NRF_SUCCESS If the CoAP Option is present in the message.
- * @retval NRF_ERROR_NULL If the pointer to the message is NULL.
- * @retval NRF_ERROR_NOT_FOUND If the CoAP Option is not present in the message.
- */
- uint32_t coap_message_opt_present(coap_message_t * p_message, uint16_t option);
- /**@brief Check whether a message contains a given CoAP Option and return the index of the entry
- * in the message option list.
- *
- * @param[in] p_index Value by reference to fill the resolved index into. Should not be NULL.
- * @param[in] p_message Pointer to the to check for the CoAP Option.
- * Should not be NULL.
- * @param[in] option CoAP Option to check for in the CoAP message.
- *
- * @retval NRF_SUCCESS If the CoAP Option is present in the message.
- * @retval NRF_ERROR_NULL If the pointer to the message or the p_index is NULL.
- * @retval NRF_ERROR_NOT_FOUND If the CoAP Option is not present in the message.
- */
- uint32_t coap_message_opt_index_get(uint8_t * p_index, coap_message_t * p_message, uint16_t option);
- /**@brief Find common content type between the CoAP message and the resource.
- *
- * @details The return value will be the first match between the ACCEPT options and the supported
- * content types in the resource. The priority is by content-format ID starting going
- * from the lowest value to the highest.
- *
- * @param[out] p_ct Resolved content type given by reference. Should not be NULL.
- * @param[in] p_message Pointer to the message. Should not be NULL.
- * @param[in] p_resource Pointer to the resource. Should not be NULL.
- *
- * @retval NRF_SUCCESS If match was found.
- * @retval NRF_ERROR_NOT_FOUND If no match was found.
- */
- uint32_t coap_message_ct_match_select(coap_content_type_t * p_ct, coap_message_t * p_message, coap_resource_t * p_resource);
- /**@brief CoAP time tick used for retransmitting any message in the queue if needed.
- *
- * @retval NRF_SUCCESS If time tick update was successfully handled.
- */
- uint32_t coap_time_tick(void);
- #if (COAP_DISABLE_DTLS_API == 0)
- /**@brief Setup secure DTLS session.
- *
- * @details For the client role, this API triggers a DTLS handshake. Until the handshake is complete
- * with the remote, \ref coap_message_send will fail.
- * For the server role, this API does not create any DTLS session. A DTLS session is
- * created each time a new client remote endpoint sends a request on the local port of the
- * server.
- *
- * @note The success of this function does not imply that the DTLS handshake is successfull.
- *
- * @note Only one DTLS session is permitted between a local and remote endpoint. Therefore, in case
- * a DTLS session was established between the local and remote endpoint, the existing DTLS
- * session will be reused irrespective of the role and number of times this API was called.
- * In case the application desires a fresh security setup, it must first call the
- * \ref coap_security_destroy to tear down the existing setup.
- *
- * @param[in] local_port Local port to bind the session to.
- * @param[in] role Role of the session. DTLS server or client defined in the enumeration
- * \ref nrf_tls_role_t.
- * @param[in] p_remote Pointer to a structure holding the address information for the remote
- * endpoint. If a the device is acting as a server, a NULL pointer shall be
- * given as a parameter. Rationale: The server is not envisioned to be
- * bound a pre-known client endpoint. Therefore, security server settings
- * shall be setup irrespective of the remote client.
- * @param[in] p_settings Pointer to a structure holding the DTLS credentials.
- *
- * @retval NRF_SUCCESS If setup of the secure DTLS session was successfull.
- */
- uint32_t coap_security_setup(uint16_t local_port,
- nrf_tls_role_t role,
- coap_remote_t * const p_remote,
- nrf_tls_key_settings_t * const p_settings);
- /**@brief Destroy a secure DTLS session.
- *
- * @details Terminate and clean up any session associated with the local port and the remote.
- *
- * @param[in] local_port Local port to unbind the session from.
- * @param[in] p_remote Pointer to a structure holding the address information for the remote
- * endpoint. Providing a NULL as p_remote will clean up all DTLS sessions
- * associated with the local port.
- *
- * @retval NRF_SUCCESS If the destruction of the secure DTLS session was successfull.
- */
- uint32_t coap_security_destroy(uint16_t local_port,
- coap_remote_t * const p_remote);
- #endif // COAP_DISABLE_DTLS_API
- /**@brief Process loop when using coap BSD socket transport implementation.
- *
- * @details This is blocking call. The function unblock is only
- * triggered upon an socket event registered to select() by coap transport.
- * This function must be called as often as possible in order to dispatch incoming
- * socket events. Preferred to be put in the application's main loop or similar.
- **/
- void coap_input(void);
- #ifdef __cplusplus
- }
- #endif
- #endif // COAP_API_H__
- /** @} */
|