blob: d5d02060b4d790a4683f9220c71c0de8c8e64ca3 [file] [log] [blame]
/*
* Copyright (c) 2016, The OpenThread Authors.
* 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 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 the copyright holder nor the
* names of its contributors may be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER 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
* @brief
* This file defines the top-level functions for the OpenThread CoAP implementation.
*/
#ifndef OPENTHREAD_COAP_H_
#define OPENTHREAD_COAP_H_
#include <stdint.h>
#include <openthread/ip6.h>
#include <openthread/message.h>
#ifdef __cplusplus
extern "C" {
#endif
/**
* @addtogroup api-coap
*
* @brief
* This module includes functions that control CoAP communication.
*
* The functions in this module are available when CoAP API feature (`OPENTHREAD_CONFIG_COAP_API_ENABLE`) is enabled.
*
* @{
*
*/
#define OT_DEFAULT_COAP_PORT 5683 ///< Default CoAP port, as specified in RFC 7252
#define OT_COAP_DEFAULT_TOKEN_LENGTH 2 ///< Default token length.
#define OT_COAP_MAX_TOKEN_LENGTH 8 ///< Max token length as specified (RFC 7252).
#define OT_COAP_MAX_RETRANSMIT 20 ///< Max retransmit supported by OpenThread.
#define OT_COAP_MIN_ACK_TIMEOUT 1000 ///< Minimal ACK timeout in milliseconds supported by OpenThread.
/**
* CoAP Type values (2 bit unsigned integer).
*
*/
typedef enum otCoapType
{
OT_COAP_TYPE_CONFIRMABLE = 0, ///< Confirmable
OT_COAP_TYPE_NON_CONFIRMABLE = 1, ///< Non-confirmable
OT_COAP_TYPE_ACKNOWLEDGMENT = 2, ///< Acknowledgment
OT_COAP_TYPE_RESET = 3, ///< Reset
} otCoapType;
/**
* Helper macro to define CoAP Code values.
*
*/
#define OT_COAP_CODE(c, d) ((((c)&0x7) << 5) | ((d)&0x1f))
/**
* CoAP Code values.
*
*/
typedef enum otCoapCode
{
OT_COAP_CODE_EMPTY = OT_COAP_CODE(0, 0), ///< Empty message code
OT_COAP_CODE_GET = OT_COAP_CODE(0, 1), ///< Get
OT_COAP_CODE_POST = OT_COAP_CODE(0, 2), ///< Post
OT_COAP_CODE_PUT = OT_COAP_CODE(0, 3), ///< Put
OT_COAP_CODE_DELETE = OT_COAP_CODE(0, 4), ///< Delete
OT_COAP_CODE_RESPONSE_MIN = OT_COAP_CODE(2, 0), ///< 2.00
OT_COAP_CODE_CREATED = OT_COAP_CODE(2, 1), ///< Created
OT_COAP_CODE_DELETED = OT_COAP_CODE(2, 2), ///< Deleted
OT_COAP_CODE_VALID = OT_COAP_CODE(2, 3), ///< Valid
OT_COAP_CODE_CHANGED = OT_COAP_CODE(2, 4), ///< Changed
OT_COAP_CODE_CONTENT = OT_COAP_CODE(2, 5), ///< Content
OT_COAP_CODE_CONTINUE = OT_COAP_CODE(2, 31), ///< RFC7959 Continue
OT_COAP_CODE_BAD_REQUEST = OT_COAP_CODE(4, 0), ///< Bad Request
OT_COAP_CODE_UNAUTHORIZED = OT_COAP_CODE(4, 1), ///< Unauthorized
OT_COAP_CODE_BAD_OPTION = OT_COAP_CODE(4, 2), ///< Bad Option
OT_COAP_CODE_FORBIDDEN = OT_COAP_CODE(4, 3), ///< Forbidden
OT_COAP_CODE_NOT_FOUND = OT_COAP_CODE(4, 4), ///< Not Found
OT_COAP_CODE_METHOD_NOT_ALLOWED = OT_COAP_CODE(4, 5), ///< Method Not Allowed
OT_COAP_CODE_NOT_ACCEPTABLE = OT_COAP_CODE(4, 6), ///< Not Acceptable
OT_COAP_CODE_REQUEST_INCOMPLETE = OT_COAP_CODE(4, 8), ///< RFC7959 Request Entity Incomplete
OT_COAP_CODE_PRECONDITION_FAILED = OT_COAP_CODE(4, 12), ///< Precondition Failed
OT_COAP_CODE_REQUEST_TOO_LARGE = OT_COAP_CODE(4, 13), ///< Request Entity Too Large
OT_COAP_CODE_UNSUPPORTED_FORMAT = OT_COAP_CODE(4, 15), ///< Unsupported Content-Format
OT_COAP_CODE_INTERNAL_ERROR = OT_COAP_CODE(5, 0), ///< Internal Server Error
OT_COAP_CODE_NOT_IMPLEMENTED = OT_COAP_CODE(5, 1), ///< Not Implemented
OT_COAP_CODE_BAD_GATEWAY = OT_COAP_CODE(5, 2), ///< Bad Gateway
OT_COAP_CODE_SERVICE_UNAVAILABLE = OT_COAP_CODE(5, 3), ///< Service Unavailable
OT_COAP_CODE_GATEWAY_TIMEOUT = OT_COAP_CODE(5, 4), ///< Gateway Timeout
OT_COAP_CODE_PROXY_NOT_SUPPORTED = OT_COAP_CODE(5, 5), ///< Proxying Not Supported
} otCoapCode;
/**
* CoAP Option Numbers
*/
typedef enum otCoapOptionType
{
OT_COAP_OPTION_IF_MATCH = 1, ///< If-Match
OT_COAP_OPTION_URI_HOST = 3, ///< Uri-Host
OT_COAP_OPTION_E_TAG = 4, ///< ETag
OT_COAP_OPTION_IF_NONE_MATCH = 5, ///< If-None-Match
OT_COAP_OPTION_OBSERVE = 6, ///< Observe [RFC7641]
OT_COAP_OPTION_URI_PORT = 7, ///< Uri-Port
OT_COAP_OPTION_LOCATION_PATH = 8, ///< Location-Path
OT_COAP_OPTION_URI_PATH = 11, ///< Uri-Path
OT_COAP_OPTION_CONTENT_FORMAT = 12, ///< Content-Format
OT_COAP_OPTION_MAX_AGE = 14, ///< Max-Age
OT_COAP_OPTION_URI_QUERY = 15, ///< Uri-Query
OT_COAP_OPTION_ACCEPT = 17, ///< Accept
OT_COAP_OPTION_LOCATION_QUERY = 20, ///< Location-Query
OT_COAP_OPTION_BLOCK2 = 23, ///< Block2 (RFC7959)
OT_COAP_OPTION_BLOCK1 = 27, ///< Block1 (RFC7959)
OT_COAP_OPTION_SIZE2 = 28, ///< Size2 (RFC7959)
OT_COAP_OPTION_PROXY_URI = 35, ///< Proxy-Uri
OT_COAP_OPTION_PROXY_SCHEME = 39, ///< Proxy-Scheme
OT_COAP_OPTION_SIZE1 = 60, ///< Size1
} otCoapOptionType;
/**
* Represents a CoAP option.
*
*/
typedef struct otCoapOption
{
uint16_t mNumber; ///< Option Number
uint16_t mLength; ///< Option Length
} otCoapOption;
/**
* Acts as an iterator for CoAP options
*
*/
typedef struct otCoapOptionIterator
{
const otMessage *mMessage; ///< CoAP message
otCoapOption mOption; ///< CoAP message option
uint16_t mNextOptionOffset; ///< Byte offset of next option
} otCoapOptionIterator;
/**
* CoAP Content Format codes. The full list is documented at
* https://www.iana.org/assignments/core-parameters/core-parameters.xhtml#content-formats
*/
typedef enum otCoapOptionContentFormat
{
/**
* text/plain; charset=utf-8: [RFC2046][RFC3676][RFC5147]
*/
OT_COAP_OPTION_CONTENT_FORMAT_TEXT_PLAIN = 0,
/**
* application/cose; cose-type="cose-encrypt0": [RFC8152]
*/
OT_COAP_OPTION_CONTENT_FORMAT_COSE_ENCRYPT0 = 16,
/**
* application/cose; cose-type="cose-mac0": [RFC8152]
*/
OT_COAP_OPTION_CONTENT_FORMAT_COSE_MAC0 = 17,
/**
* application/cose; cose-type="cose-sign1": [RFC8152]
*/
OT_COAP_OPTION_CONTENT_FORMAT_COSE_SIGN1 = 18,
/**
* application/link-format: [RFC6690]
*/
OT_COAP_OPTION_CONTENT_FORMAT_LINK_FORMAT = 40,
/**
* application/xml: [RFC3023]
*/
OT_COAP_OPTION_CONTENT_FORMAT_XML = 41,
/**
* application/octet-stream: [RFC2045][RFC2046]
*/
OT_COAP_OPTION_CONTENT_FORMAT_OCTET_STREAM = 42,
/**
* application/exi:
* ["Efficient XML Interchange (EXI) Format 1.0 (Second Edition)", February 2014]
*/
OT_COAP_OPTION_CONTENT_FORMAT_EXI = 47,
/**
* application/json: [RFC7159]
*/
OT_COAP_OPTION_CONTENT_FORMAT_JSON = 50,
/**
* application/json-patch+json: [RFC6902]
*/
OT_COAP_OPTION_CONTENT_FORMAT_JSON_PATCH_JSON = 51,
/**
* application/merge-patch+json: [RFC7396]
*/
OT_COAP_OPTION_CONTENT_FORMAT_MERGE_PATCH_JSON = 52,
/**
* application/cbor: [RFC7049]
*/
OT_COAP_OPTION_CONTENT_FORMAT_CBOR = 60,
/**
* application/cwt: [RFC8392]
*/
OT_COAP_OPTION_CONTENT_FORMAT_CWT = 61,
/**
* application/cose; cose-type="cose-encrypt": [RFC8152]
*/
OT_COAP_OPTION_CONTENT_FORMAT_COSE_ENCRYPT = 96,
/**
* application/cose; cose-type="cose-mac": [RFC8152]
*/
OT_COAP_OPTION_CONTENT_FORMAT_COSE_MAC = 97,
/**
* application/cose; cose-type="cose-sign": [RFC8152]
*/
OT_COAP_OPTION_CONTENT_FORMAT_COSE_SIGN = 98,
/**
* application/cose-key: [RFC8152]
*/
OT_COAP_OPTION_CONTENT_FORMAT_COSE_KEY = 101,
/**
* application/cose-key-set: [RFC8152]
*/
OT_COAP_OPTION_CONTENT_FORMAT_COSE_KEY_SET = 102,
/**
* application/senml+json: [RFC8428]
*/
OT_COAP_OPTION_CONTENT_FORMAT_SENML_JSON = 110,
/**
* application/sensml+json: [RFC8428]
*/
OT_COAP_OPTION_CONTENT_FORMAT_SENSML_JSON = 111,
/**
* application/senml+cbor: [RFC8428]
*/
OT_COAP_OPTION_CONTENT_FORMAT_SENML_CBOR = 112,
/**
* application/sensml+cbor: [RFC8428]
*/
OT_COAP_OPTION_CONTENT_FORMAT_SENSML_CBOR = 113,
/**
* application/senml-exi: [RFC8428]
*/
OT_COAP_OPTION_CONTENT_FORMAT_SENML_EXI = 114,
/**
* application/sensml-exi: [RFC8428]
*/
OT_COAP_OPTION_CONTENT_FORMAT_SENSML_EXI = 115,
/**
* application/coap-group+json: [RFC7390]
*/
OT_COAP_OPTION_CONTENT_FORMAT_COAP_GROUP_JSON = 256,
/**
* application/senml+xml: [RFC8428]
*/
OT_COAP_OPTION_CONTENT_FORMAT_SENML_XML = 310,
/**
* application/sensml+xml: [RFC8428]
*/
OT_COAP_OPTION_CONTENT_FORMAT_SENSML_XML = 311
} otCoapOptionContentFormat;
/**
* CoAP Block Size Exponents
*/
typedef enum otCoapBlockSzx
{
OT_COAP_OPTION_BLOCK_SZX_16 = 0,
OT_COAP_OPTION_BLOCK_SZX_32 = 1,
OT_COAP_OPTION_BLOCK_SZX_64 = 2,
OT_COAP_OPTION_BLOCK_SZX_128 = 3,
OT_COAP_OPTION_BLOCK_SZX_256 = 4,
OT_COAP_OPTION_BLOCK_SZX_512 = 5,
OT_COAP_OPTION_BLOCK_SZX_1024 = 6
} otCoapBlockSzx;
/**
* Pointer is called when a CoAP response is received or on the request timeout.
*
* @param[in] aContext A pointer to application-specific context.
* @param[in] aMessage A pointer to the message buffer containing the response. NULL if no response was received.
* @param[in] aMessageInfo A pointer to the message info for @p aMessage. NULL if no response was received.
* @param[in] aResult A result of the CoAP transaction.
*
* @retval OT_ERROR_NONE A response was received successfully.
* @retval OT_ERROR_ABORT A CoAP transaction was reset by peer.
* @retval OT_ERROR_RESPONSE_TIMEOUT No response or acknowledgment received during timeout period.
*
*/
typedef void (*otCoapResponseHandler)(void *aContext,
otMessage *aMessage,
const otMessageInfo *aMessageInfo,
otError aResult);
/**
* Pointer is called when a CoAP request with a given Uri-Path is received.
*
* @param[in] aContext A pointer to arbitrary context information.
* @param[in] aMessage A pointer to the message.
* @param[in] aMessageInfo A pointer to the message info for @p aMessage.
*
*/
typedef void (*otCoapRequestHandler)(void *aContext, otMessage *aMessage, const otMessageInfo *aMessageInfo);
/**
* Pointer is called when a CoAP message with a block-wise transfer option is received.
*
* Is available when OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE configuration
* is enabled.
*
* @param[in] aContext A pointer to application-specific context.
* @param[in] aBlock A pointer to the block segment.
* @param[in] aPosition The position of @p aBlock in a sequence in bytes.
* @param[in] aBlockLength The length of the block segment in bytes.
* @param[in] aMore Flag if more block segments are following.
* @param[in] aTotalLength The total length in bytes of the transferred information (indicated by a Size1 or Size2
* option).
*
* @retval OT_ERROR_NONE Block segment was stored successfully.
* @retval OT_ERROR_NO_BUFS No more memory to store blocks.
* @retval OT_ERROR_NO_FRAME_RECEIVED Block segment missing.
*
*/
typedef otError (*otCoapBlockwiseReceiveHook)(void *aContext,
const uint8_t *aBlock,
uint32_t aPosition,
uint16_t aBlockLength,
bool aMore,
uint32_t aTotalLength);
/**
* Pointer is called before the next block in a block-wise transfer is sent.
*
* Is available when OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE configuration
* is enabled.
*
* @param[in] aContext A pointer to application-specific context.
* @param[in,out] aBlock A pointer to where the block segment can be written to.
* @param[in] aPosition The position in a sequence from which to obtain the block segment.
* @param[in,out] aBlockLength On entry, the maximum block segment length in bytes.
* @param[out] aMore A pointer to the flag if more block segments will follow.
*
* @warning By changing the value of aBlockLength, the block size of the whole exchange is
* renegotiated. It is recommended to do this after the first block has been received as
* later changes could cause problems with other CoAP implementations.
*
* @retval OT_ERROR_NONE No error occurred.
* @retval OT_ERROR_INVALID_ARGS Block at @p aPosition does not exist.
*
*/
typedef otError (*otCoapBlockwiseTransmitHook)(void *aContext,
uint8_t *aBlock,
uint32_t aPosition,
uint16_t *aBlockLength,
bool *aMore);
/**
* Represents a CoAP resource.
*
*/
typedef struct otCoapResource
{
const char *mUriPath; ///< The URI Path string
otCoapRequestHandler mHandler; ///< The callback for handling a received request
void *mContext; ///< Application-specific context
struct otCoapResource *mNext; ///< The next CoAP resource in the list
} otCoapResource;
/**
* Represents a CoAP resource with block-wise transfer.
*
*/
typedef struct otCoapBlockwiseResource
{
const char *mUriPath; ///< The URI Path string
otCoapRequestHandler mHandler; ///< The callback for handling a received request
/** The callback for handling incoming block-wise transfer.
* This callback is available when OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
* configuration is enabled.
*/
otCoapBlockwiseReceiveHook mReceiveHook;
/** The callback for handling outgoing block-wise transfer.
* This callback is available when OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE
* configuration is enabled.
*/
otCoapBlockwiseTransmitHook mTransmitHook;
void *mContext; ///< Application-specific context
struct otCoapBlockwiseResource *mNext; ///< The next CoAP resource in the list
} otCoapBlockwiseResource;
/**
* Represents the CoAP transmission parameters.
*
* @note mAckTimeout * ((2 ** (mMaxRetransmit + 1)) - 1) * (mAckRandomFactorNumerator / mAckRandomFactorDenominator)
* must not exceed what can be represented by a uint32_t (0xffffffff). This limitation allows OpenThread to
* avoid 64-bit arithmetic.
*
*/
typedef struct otCoapTxParameters
{
/**
* Minimum spacing before first retransmission when ACK is not received, in milliseconds (RFC7252 default value is
* 2000ms).
*
*/
uint32_t mAckTimeout;
/**
* Numerator of ACK_RANDOM_FACTOR used to calculate maximum spacing before first retransmission when ACK is not
* received (RFC7252 default value of ACK_RANDOM_FACTOR is 1.5; must not be decreased below 1).
*
*/
uint8_t mAckRandomFactorNumerator;
/**
* Denominator of ACK_RANDOM_FACTOR used to calculate maximum spacing before first retransmission when ACK is not
* received (RFC7252 default value of ACK_RANDOM_FACTOR is 1.5; must not be decreased below 1).
*
*/
uint8_t mAckRandomFactorDenominator;
/**
* Maximum number of retransmissions for CoAP Confirmable messages (RFC7252 default value is 4).
*
*/
uint8_t mMaxRetransmit;
} otCoapTxParameters;
/**
* Initializes the CoAP header.
*
* @param[in,out] aMessage A pointer to the CoAP message to initialize.
* @param[in] aType CoAP message type.
* @param[in] aCode CoAP message code.
*
*/
void otCoapMessageInit(otMessage *aMessage, otCoapType aType, otCoapCode aCode);
/**
* Initializes a response message.
*
* @note Both message ID and token are set according to @p aRequest.
*
* @param[in,out] aResponse A pointer to the CoAP response message.
* @param[in] aRequest A pointer to the CoAP request message.
* @param[in] aType CoAP message type.
* @param[in] aCode CoAP message code.
*
* @retval OT_ERROR_NONE Successfully initialized the response message.
* @retval OT_ERROR_NO_BUFS Insufficient message buffers available to initialize the response message.
*
*/
otError otCoapMessageInitResponse(otMessage *aResponse, const otMessage *aRequest, otCoapType aType, otCoapCode aCode);
/**
* Sets the Token value and length in a header.
*
* @param[in,out] aMessage A pointer to the CoAP message.
* @param[in] aToken A pointer to the Token value.
* @param[in] aTokenLength The Length of @p aToken.
*
* @retval OT_ERROR_NONE Successfully set the Token value.
* @retval OT_ERROR_NO_BUFS Insufficient buffers to set the Token value.
*
*/
otError otCoapMessageSetToken(otMessage *aMessage, const uint8_t *aToken, uint8_t aTokenLength);
/**
* Sets the Token length and randomizes its value.
*
* @param[in,out] aMessage A pointer to the CoAP message.
* @param[in] aTokenLength The Length of a Token to set.
*
*/
void otCoapMessageGenerateToken(otMessage *aMessage, uint8_t aTokenLength);
/**
* Appends the Content Format CoAP option as specified in
* https://tools.ietf.org/html/rfc7252#page-92. This *must* be called before
* setting otCoapMessageSetPayloadMarker if a payload is to be included in the
* message.
*
* The function is a convenience wrapper around otCoapMessageAppendUintOption,
* and if the desired format type code isn't listed in otCoapOptionContentFormat,
* this base function should be used instead.
*
* @param[in,out] aMessage A pointer to the CoAP message.
* @param[in] aContentFormat One of the content formats listed in
* otCoapOptionContentFormat above.
*
* @retval OT_ERROR_NONE Successfully appended the option.
* @retval OT_ERROR_INVALID_ARGS The option type is not equal or greater than the last option type.
* @retval OT_ERROR_NO_BUFS The option length exceeds the buffer size.
*
*/
otError otCoapMessageAppendContentFormatOption(otMessage *aMessage, otCoapOptionContentFormat aContentFormat);
/**
* Appends a CoAP option in a header.
*
* @param[in,out] aMessage A pointer to the CoAP message.
* @param[in] aNumber The CoAP Option number.
* @param[in] aLength The CoAP Option length.
* @param[in] aValue A pointer to the CoAP value.
*
* @retval OT_ERROR_NONE Successfully appended the option.
* @retval OT_ERROR_INVALID_ARGS The option type is not equal or greater than the last option type.
* @retval OT_ERROR_NO_BUFS The option length exceeds the buffer size.
*
*/
otError otCoapMessageAppendOption(otMessage *aMessage, uint16_t aNumber, uint16_t aLength, const void *aValue);
/**
* Appends an unsigned integer CoAP option as specified in
* https://tools.ietf.org/html/rfc7252#section-3.2
*
* @param[in,out] aMessage A pointer to the CoAP message.
* @param[in] aNumber The CoAP Option number.
* @param[in] aValue The CoAP Option unsigned integer value.
*
* @retval OT_ERROR_NONE Successfully appended the option.
* @retval OT_ERROR_INVALID_ARGS The option type is not equal or greater than the last option type.
* @retval OT_ERROR_NO_BUFS The option length exceeds the buffer size.
*
* @see otCoapMessageGetOptionUintValue
*/
otError otCoapMessageAppendUintOption(otMessage *aMessage, uint16_t aNumber, uint32_t aValue);
/**
* Appends an Observe option.
*
* @param[in,out] aMessage A pointer to the CoAP message.
* @param[in] aObserve Observe field value.
*
* @retval OT_ERROR_NONE Successfully appended the option.
* @retval OT_ERROR_INVALID_ARGS The option type is not equal or greater than the last option type.
* @retval OT_ERROR_NO_BUFS The option length exceeds the buffer size.
*
*/
otError otCoapMessageAppendObserveOption(otMessage *aMessage, uint32_t aObserve);
/**
* Appends a Uri-Path option.
*
* @param[in,out] aMessage A pointer to the CoAP message.
* @param[in] aUriPath A pointer to a NULL-terminated string.
*
* @retval OT_ERROR_NONE Successfully appended the option.
* @retval OT_ERROR_INVALID_ARGS The option type is not equal or greater than the last option type.
* @retval OT_ERROR_NO_BUFS The option length exceeds the buffer size.
*
*/
otError otCoapMessageAppendUriPathOptions(otMessage *aMessage, const char *aUriPath);
/**
* Converts a CoAP Block option SZX field to the actual block size
*
* @param[in] aSize Block size exponent.
*
* @returns The actual size exponent value.
*
*/
uint16_t otCoapBlockSizeFromExponent(otCoapBlockSzx aSize);
/**
* Appends a Block2 option
*
* @param[in,out] aMessage A pointer to the CoAP message.
* @param[in] aNum Current block number.
* @param[in] aMore Boolean to indicate more blocks are to be sent.
* @param[in] aSize Block Size Exponent.
*
* @retval OT_ERROR_NONE Successfully appended the option.
* @retval OT_ERROR_INVALID_ARGS The option type is not equal or greater than the last option type.
* @retval OT_ERROR_NO_BUFS The option length exceeds the buffer size.
*
*/
otError otCoapMessageAppendBlock2Option(otMessage *aMessage, uint32_t aNum, bool aMore, otCoapBlockSzx aSize);
/**
* Appends a Block1 option
*
* @param[in,out] aMessage A pointer to the CoAP message.
* @param[in] aNum Current block number.
* @param[in] aMore Boolean to indicate more blocks are to be sent.
* @param[in] aSize Block Size Exponent.
*
* @retval OT_ERROR_NONE Successfully appended the option.
* @retval OT_ERROR_INVALID_ARGS The option type is not equal or greater than the last option type.
* @retval OT_ERROR_NO_BUFS The option length exceeds the buffer size.
*
*/
otError otCoapMessageAppendBlock1Option(otMessage *aMessage, uint32_t aNum, bool aMore, otCoapBlockSzx aSize);
/**
* Appends a Proxy-Uri option.
*
* @param[in,out] aMessage A pointer to the CoAP message.
* @param[in] aUriPath A pointer to a NULL-terminated string.
*
* @retval OT_ERROR_NONE Successfully appended the option.
* @retval OT_ERROR_INVALID_ARGS The option type is not equal or greater than the last option type.
* @retval OT_ERROR_NO_BUFS The option length exceeds the buffer size.
*
*/
otError otCoapMessageAppendProxyUriOption(otMessage *aMessage, const char *aUriPath);
/**
* Appends a Max-Age option.
*
* @param[in,out] aMessage A pointer to the CoAP message.
* @param[in] aMaxAge The Max-Age value.
*
* @retval OT_ERROR_NONE Successfully appended the option.
* @retval OT_ERROR_INVALID_ARGS The option type is not equal or greater than the last option type.
* @retval OT_ERROR_NO_BUFS The option length exceeds the buffer size.
*
*/
otError otCoapMessageAppendMaxAgeOption(otMessage *aMessage, uint32_t aMaxAge);
/**
* Appends a single Uri-Query option.
*
* @param[in,out] aMessage A pointer to the CoAP message.
* @param[in] aUriQuery A pointer to NULL-terminated string, which should contain a single key=value pair.
*
* @retval OT_ERROR_NONE Successfully appended the option.
* @retval OT_ERROR_INVALID_ARGS The option type is not equal or greater than the last option type.
* @retval OT_ERROR_NO_BUFS The option length exceeds the buffer size.
*/
otError otCoapMessageAppendUriQueryOption(otMessage *aMessage, const char *aUriQuery);
/**
* Adds Payload Marker indicating beginning of the payload to the CoAP header.
*
* @param[in,out] aMessage A pointer to the CoAP message.
*
* @retval OT_ERROR_NONE Payload Marker successfully added.
* @retval OT_ERROR_NO_BUFS Header Payload Marker exceeds the buffer size.
*
*/
otError otCoapMessageSetPayloadMarker(otMessage *aMessage);
/**
* Returns the Type value.
*
* @param[in] aMessage A pointer to the CoAP message.
*
* @returns The Type value.
*
*/
otCoapType otCoapMessageGetType(const otMessage *aMessage);
/**
* Returns the Code value.
*
* @param[in] aMessage A pointer to the CoAP message.
*
* @returns The Code value.
*
*/
otCoapCode otCoapMessageGetCode(const otMessage *aMessage);
/**
* Sets the Code value.
*
* @param[in,out] aMessage A pointer to the CoAP message to initialize.
* @param[in] aCode CoAP message code.
*
*/
void otCoapMessageSetCode(otMessage *aMessage, otCoapCode aCode);
/**
* Returns the CoAP Code as human readable string.
*
* @param[in] aMessage A pointer to the CoAP message.
*
* @ returns The CoAP Code as string.
*
*/
const char *otCoapMessageCodeToString(const otMessage *aMessage);
/**
* Returns the Message ID value.
*
* @param[in] aMessage A pointer to the CoAP message.
*
* @returns The Message ID value.
*
*/
uint16_t otCoapMessageGetMessageId(const otMessage *aMessage);
/**
* Returns the Token length.
*
* @param[in] aMessage A pointer to the CoAP message.
*
* @returns The Token length.
*
*/
uint8_t otCoapMessageGetTokenLength(const otMessage *aMessage);
/**
* Returns a pointer to the Token value.
*
* @param[in] aMessage A pointer to the CoAP message.
*
* @returns A pointer to the Token value.
*
*/
const uint8_t *otCoapMessageGetToken(const otMessage *aMessage);
/**
* Initialises an iterator for the options in the given message.
*
* @param[in,out] aIterator A pointer to the CoAP message option iterator.
* @param[in] aMessage A pointer to the CoAP message.
*
* @retval OT_ERROR_NONE Successfully initialised.
* @retval OT_ERROR_PARSE Message state is inconsistent.
*
*/
otError otCoapOptionIteratorInit(otCoapOptionIterator *aIterator, const otMessage *aMessage);
/**
* Returns a pointer to the first option matching the specified option number.
*
* @param[in] aIterator A pointer to the CoAP message option iterator.
* @param[in] aOption The option number sought.
*
* @returns A pointer to the first matching option. If no matching option is present NULL pointer is returned.
*
*/
const otCoapOption *otCoapOptionIteratorGetFirstOptionMatching(otCoapOptionIterator *aIterator, uint16_t aOption);
/**
* Returns a pointer to the first option.
*
* @param[in,out] aIterator A pointer to the CoAP message option iterator.
*
* @returns A pointer to the first option. If no option is present NULL pointer is returned.
*
*/
const otCoapOption *otCoapOptionIteratorGetFirstOption(otCoapOptionIterator *aIterator);
/**
* Returns a pointer to the next option matching the specified option number.
*
* @param[in] aIterator A pointer to the CoAP message option iterator.
* @param[in] aOption The option number sought.
*
* @returns A pointer to the next matching option. If no further matching option is present NULL pointer is returned.
*
*/
const otCoapOption *otCoapOptionIteratorGetNextOptionMatching(otCoapOptionIterator *aIterator, uint16_t aOption);
/**
* Returns a pointer to the next option.
*
* @param[in,out] aIterator A pointer to the CoAP message option iterator.
*
* @returns A pointer to the next option. If no more options are present NULL pointer is returned.
*
*/
const otCoapOption *otCoapOptionIteratorGetNextOption(otCoapOptionIterator *aIterator);
/**
* Fills current option value into @p aValue assuming the current value is an unsigned integer encoded
* according to https://tools.ietf.org/html/rfc7252#section-3.2
*
* @param[in,out] aIterator A pointer to the CoAP message option iterator.
* @param[out] aValue A pointer to an unsigned integer to receive the option value.
*
* @retval OT_ERROR_NONE Successfully filled value.
* @retval OT_ERROR_NOT_FOUND No current option.
* @retval OT_ERROR_NO_BUFS Value is too long to fit in a uint64_t.
*
* @see otCoapMessageAppendUintOption
*/
otError otCoapOptionIteratorGetOptionUintValue(otCoapOptionIterator *aIterator, uint64_t *aValue);
/**
* Fills current option value into @p aValue.
*
* @param[in,out] aIterator A pointer to the CoAP message option iterator.
* @param[out] aValue A pointer to a buffer to receive the option value.
*
* @retval OT_ERROR_NONE Successfully filled value.
* @retval OT_ERROR_NOT_FOUND No current option.
*
*/
otError otCoapOptionIteratorGetOptionValue(otCoapOptionIterator *aIterator, void *aValue);
/**
* Creates a new CoAP message.
*
* @note If @p aSettings is 'NULL', the link layer security is enabled and the message priority is set to
* OT_MESSAGE_PRIORITY_NORMAL by default.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aSettings A pointer to the message settings or NULL to set default settings.
*
* @returns A pointer to the message buffer or NULL if no message buffers are available or parameters are invalid.
*
*/
otMessage *otCoapNewMessage(otInstance *aInstance, const otMessageSettings *aSettings);
/**
* Sends a CoAP request with custom transmission parameters.
*
* If a response for a request is expected, respective function and context information should be provided.
* If no response is expected, these arguments should be NULL pointers.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aMessage A pointer to the message to send.
* @param[in] aMessageInfo A pointer to the message info associated with @p aMessage.
* @param[in] aHandler A function pointer that shall be called on response reception or timeout.
* @param[in] aContext A pointer to arbitrary context information. May be NULL if not used.
* @param[in] aTxParameters A pointer to transmission parameters for this request. Use NULL for defaults.
* Otherwise, parameters given must meet the following conditions:
* 1. mMaxRetransmit is no more than OT_COAP_MAX_RETRANSMIT.
* 2. mAckRandomFactorNumerator / mAckRandomFactorDenominator must not be below 1.0.
* 3. The calculated exchange life time must not overflow uint32_t.
*
* @retval OT_ERROR_NONE Successfully sent CoAP message.
* @retval OT_ERROR_NO_BUFS Failed to allocate retransmission data.
* @retval OT_ERROR_INVALID_ARGS Invalid arguments are given.
*
*/
otError otCoapSendRequestWithParameters(otInstance *aInstance,
otMessage *aMessage,
const otMessageInfo *aMessageInfo,
otCoapResponseHandler aHandler,
void *aContext,
const otCoapTxParameters *aTxParameters);
/**
* Sends a CoAP request block-wise with custom transmission parameters.
*
* Is available when OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE configuration
* is enabled.
*
* If a response for a request is expected, respective function and context information should be provided.
* If the response is expected to be block-wise, a respective hook function should be provided.
* If no response is expected, these arguments should be NULL pointers.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aMessage A pointer to the message to send.
* @param[in] aMessageInfo A pointer to the message info associated with @p aMessage.
* @param[in] aHandler A function pointer that shall be called on response reception or timeout.
* @param[in] aContext A pointer to arbitrary context information. May be NULL if not used.
* @param[in] aTxParameters A pointer to transmission parameters for this request. Use NULL for defaults.
* @param[in] aTransmitHook A pointer to a hook function for outgoing block-wise transfer.
* @param[in] aReceiveHook A pointer to a hook function for incoming block-wise transfer.
*
* @retval OT_ERROR_NONE Successfully sent CoAP message.
* @retval OT_ERROR_NO_BUFS Failed to allocate retransmission data.
* @retval OT_ERROR_INVALID_ARGS Invalid arguments are given.
*
*/
otError otCoapSendRequestBlockWiseWithParameters(otInstance *aInstance,
otMessage *aMessage,
const otMessageInfo *aMessageInfo,
otCoapResponseHandler aHandler,
void *aContext,
const otCoapTxParameters *aTxParameters,
otCoapBlockwiseTransmitHook aTransmitHook,
otCoapBlockwiseReceiveHook aReceiveHook);
/**
* Sends a CoAP request block-wise.
*
* Is available when OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE configuration
* is enabled.
*
* If a response for a request is expected, respective function and context information should be provided.
* If the response is expected to be block-wise, a respective hook function should be provided.
* If no response is expected, these arguments should be NULL pointers.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aMessage A pointer to the message to send.
* @param[in] aMessageInfo A pointer to the message info associated with @p aMessage.
* @param[in] aHandler A function pointer that shall be called on response reception or timeout.
* @param[in] aContext A pointer to arbitrary context information. May be NULL if not used.
* @param[in] aTransmitHook A pointer to a hook function for outgoing block-wise transfer.
* @param[in] aReceiveHook A pointer to a hook function for incoming block-wise transfer.
*
* @retval OT_ERROR_NONE Successfully sent CoAP message.
* @retval OT_ERROR_NO_BUFS Failed to allocate retransmission data.
*
*/
static inline otError otCoapSendRequestBlockWise(otInstance *aInstance,
otMessage *aMessage,
const otMessageInfo *aMessageInfo,
otCoapResponseHandler aHandler,
void *aContext,
otCoapBlockwiseTransmitHook aTransmitHook,
otCoapBlockwiseReceiveHook aReceiveHook)
{
// NOLINTNEXTLINE(modernize-use-nullptr)
return otCoapSendRequestBlockWiseWithParameters(aInstance, aMessage, aMessageInfo, aHandler, aContext, NULL,
aTransmitHook, aReceiveHook);
}
/**
* Sends a CoAP request.
*
* If a response for a request is expected, respective function and context information should be provided.
* If no response is expected, these arguments should be NULL pointers.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aMessage A pointer to the message to send.
* @param[in] aMessageInfo A pointer to the message info associated with @p aMessage.
* @param[in] aHandler A function pointer that shall be called on response reception or timeout.
* @param[in] aContext A pointer to arbitrary context information. May be NULL if not used.
*
* @retval OT_ERROR_NONE Successfully sent CoAP message.
* @retval OT_ERROR_NO_BUFS Failed to allocate retransmission data.
*
*/
static inline otError otCoapSendRequest(otInstance *aInstance,
otMessage *aMessage,
const otMessageInfo *aMessageInfo,
otCoapResponseHandler aHandler,
void *aContext)
{
// NOLINTNEXTLINE(modernize-use-nullptr)
return otCoapSendRequestWithParameters(aInstance, aMessage, aMessageInfo, aHandler, aContext, NULL);
}
/**
* Starts the CoAP server.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aPort The local UDP port to bind to.
*
* @retval OT_ERROR_NONE Successfully started the CoAP server.
* @retval OT_ERROR_FAILED Failed to start the CoAP server.
*
*/
otError otCoapStart(otInstance *aInstance, uint16_t aPort);
/**
* Stops the CoAP server.
*
* @param[in] aInstance A pointer to an OpenThread instance.
*
* @retval OT_ERROR_NONE Successfully stopped the CoAP server.
*
*/
otError otCoapStop(otInstance *aInstance);
/**
* Adds a resource to the CoAP server.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aResource A pointer to the resource.
*
*/
void otCoapAddResource(otInstance *aInstance, otCoapResource *aResource);
/**
* Removes a resource from the CoAP server.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aResource A pointer to the resource.
*
*/
void otCoapRemoveResource(otInstance *aInstance, otCoapResource *aResource);
/**
* Adds a block-wise resource to the CoAP server.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aResource A pointer to the resource.
*
*/
void otCoapAddBlockWiseResource(otInstance *aInstance, otCoapBlockwiseResource *aResource);
/**
* Removes a block-wise resource from the CoAP server.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aResource A pointer to the resource.
*
*/
void otCoapRemoveBlockWiseResource(otInstance *aInstance, otCoapBlockwiseResource *aResource);
/**
* Sets the default handler for unhandled CoAP requests.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aHandler A function pointer that shall be called when an unhandled request arrives.
* @param[in] aContext A pointer to arbitrary context information. May be NULL if not used.
*
*/
void otCoapSetDefaultHandler(otInstance *aInstance, otCoapRequestHandler aHandler, void *aContext);
/**
* Sends a CoAP response from the server with custom transmission parameters.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aMessage A pointer to the CoAP response to send.
* @param[in] aMessageInfo A pointer to the message info associated with @p aMessage.
* @param[in] aTxParameters A pointer to transmission parameters for this response. Use NULL for defaults.
*
* @retval OT_ERROR_NONE Successfully enqueued the CoAP response message.
* @retval OT_ERROR_NO_BUFS Insufficient buffers available to send the CoAP response.
* @retval OT_ERROR_INVALID_ARGS Invalid arguments are given.
*
*/
otError otCoapSendResponseWithParameters(otInstance *aInstance,
otMessage *aMessage,
const otMessageInfo *aMessageInfo,
const otCoapTxParameters *aTxParameters);
/**
* Sends a CoAP response block-wise from the server with custom transmission parameters.
*
* Is available when OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE configuration
* is enabled.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aMessage A pointer to the CoAP response to send.
* @param[in] aMessageInfo A pointer to the message info associated with @p aMessage.
* @param[in] aTxParameters A pointer to transmission parameters for this response. Use NULL for defaults.
* @param[in] aContext A pointer to arbitrary context information. May be NULL if not used.
* @param[in] aTransmitHook A pointer to a hook function for outgoing block-wise transfer.
*
* @retval OT_ERROR_NONE Successfully enqueued the CoAP response message.
* @retval OT_ERROR_NO_BUFS Insufficient buffers available to send the CoAP response.
* @retval OT_ERROR_INVALID_ARGS Invalid arguments are given.
*
*/
otError otCoapSendResponseBlockWiseWithParameters(otInstance *aInstance,
otMessage *aMessage,
const otMessageInfo *aMessageInfo,
const otCoapTxParameters *aTxParameters,
void *aContext,
otCoapBlockwiseTransmitHook aTransmitHook);
/**
* Sends a CoAP response block-wise from the server.
*
* Is available when OPENTHREAD_CONFIG_COAP_BLOCKWISE_TRANSFER_ENABLE configuration
* is enabled.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aMessage A pointer to the CoAP response to send.
* @param[in] aMessageInfo A pointer to the message info associated with @p aMessage.
* @param[in] aContext A pointer to arbitrary context information. May be NULL if not used.
* @param[in] aTransmitHook A pointer to a hook function for outgoing block-wise transfer.
*
* @retval OT_ERROR_NONE Successfully enqueued the CoAP response message.
* @retval OT_ERROR_NO_BUFS Insufficient buffers available to send the CoAP response.
*
*/
static inline otError otCoapSendResponseBlockWise(otInstance *aInstance,
otMessage *aMessage,
const otMessageInfo *aMessageInfo,
void *aContext,
otCoapBlockwiseTransmitHook aTransmitHook)
{
// NOLINTNEXTLINE(modernize-use-nullptr)
return otCoapSendResponseBlockWiseWithParameters(aInstance, aMessage, aMessageInfo, NULL, aContext, aTransmitHook);
}
/**
* Sends a CoAP response from the server.
*
* @param[in] aInstance A pointer to an OpenThread instance.
* @param[in] aMessage A pointer to the CoAP response to send.
* @param[in] aMessageInfo A pointer to the message info associated with @p aMessage.
*
* @retval OT_ERROR_NONE Successfully enqueued the CoAP response message.
* @retval OT_ERROR_NO_BUFS Insufficient buffers available to send the CoAP response.
*
*/
static inline otError otCoapSendResponse(otInstance *aInstance, otMessage *aMessage, const otMessageInfo *aMessageInfo)
{
// NOLINTNEXTLINE(modernize-use-nullptr)
return otCoapSendResponseWithParameters(aInstance, aMessage, aMessageInfo, NULL);
}
/**
* @}
*
*/
#ifdef __cplusplus
} // extern "C"
#endif
#endif /* OPENTHREAD_COAP_H_ */