Prvni ulozeni z chegewara githubu
This commit is contained in:
213
tools/sdk/esp32/include/coap/libcoap/include/coap3/address.h
Normal file
213
tools/sdk/esp32/include/coap/libcoap/include/coap3/address.h
Normal file
@ -0,0 +1,213 @@
|
||||
/*
|
||||
* address.h -- representation of network addresses
|
||||
*
|
||||
* Copyright (C) 2010-2011,2015-2016 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file address.h
|
||||
* @brief Representation of network addresses
|
||||
*/
|
||||
|
||||
#ifndef COAP_ADDRESS_H_
|
||||
#define COAP_ADDRESS_H_
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
#include <sys/types.h>
|
||||
#include "libcoap.h"
|
||||
|
||||
#if defined(WITH_LWIP)
|
||||
|
||||
#include <lwip/ip_addr.h>
|
||||
|
||||
typedef struct coap_address_t {
|
||||
uint16_t port;
|
||||
ip_addr_t addr;
|
||||
} coap_address_t;
|
||||
|
||||
/**
|
||||
* Returns the port from @p addr in host byte order.
|
||||
*/
|
||||
COAP_STATIC_INLINE uint16_t
|
||||
coap_address_get_port(const coap_address_t *addr) {
|
||||
return ntohs(addr->port);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the port field of @p addr to @p port (in host byte order).
|
||||
*/
|
||||
COAP_STATIC_INLINE void
|
||||
coap_address_set_port(coap_address_t *addr, uint16_t port) {
|
||||
addr->port = htons(port);
|
||||
}
|
||||
|
||||
#define _coap_address_equals_impl(A, B) \
|
||||
((A)->port == (B)->port \
|
||||
&& (!!ip_addr_cmp(&(A)->addr,&(B)->addr)))
|
||||
|
||||
#define _coap_address_isany_impl(A) ip_addr_isany(&(A)->addr)
|
||||
|
||||
#define _coap_is_mcast_impl(Address) ip_addr_ismulticast(&(Address)->addr)
|
||||
|
||||
#elif defined(WITH_CONTIKI)
|
||||
|
||||
#include "uip.h"
|
||||
|
||||
typedef struct coap_address_t {
|
||||
uip_ipaddr_t addr;
|
||||
uint16_t port;
|
||||
} coap_address_t;
|
||||
|
||||
/**
|
||||
* Returns the port from @p addr in host byte order.
|
||||
*/
|
||||
COAP_STATIC_INLINE uint16_t
|
||||
coap_address_get_port(const coap_address_t *addr) {
|
||||
return uip_ntohs(addr->port);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the port field of @p addr to @p port (in host byte order).
|
||||
*/
|
||||
COAP_STATIC_INLINE void
|
||||
coap_address_set_port(coap_address_t *addr, uint16_t port) {
|
||||
addr->port = uip_htons(port);
|
||||
}
|
||||
|
||||
#define _coap_address_equals_impl(A,B) \
|
||||
((A)->port == (B)->port \
|
||||
&& uip_ipaddr_cmp(&((A)->addr),&((B)->addr)))
|
||||
|
||||
/** @todo implementation of _coap_address_isany_impl() for Contiki */
|
||||
#define _coap_address_isany_impl(A) 0
|
||||
|
||||
#define _coap_is_mcast_impl(Address) uip_is_addr_mcast(&((Address)->addr))
|
||||
|
||||
#else /* WITH_LWIP || WITH_CONTIKI */
|
||||
|
||||
/** multi-purpose address abstraction */
|
||||
typedef struct coap_address_t {
|
||||
socklen_t size; /**< size of addr */
|
||||
union {
|
||||
struct sockaddr sa;
|
||||
struct sockaddr_in sin;
|
||||
struct sockaddr_in6 sin6;
|
||||
} addr;
|
||||
} coap_address_t;
|
||||
|
||||
/**
|
||||
* Returns the port from @p addr in host byte order.
|
||||
*/
|
||||
uint16_t coap_address_get_port(const coap_address_t *addr);
|
||||
|
||||
/**
|
||||
* Set the port field of @p addr to @p port (in host byte order).
|
||||
*/
|
||||
void coap_address_set_port(coap_address_t *addr, uint16_t port);
|
||||
|
||||
/**
|
||||
* Compares given address objects @p a and @p b. This function returns @c 1 if
|
||||
* addresses are equal, @c 0 otherwise. The parameters @p a and @p b must not be
|
||||
* @c NULL;
|
||||
*/
|
||||
int coap_address_equals(const coap_address_t *a, const coap_address_t *b);
|
||||
|
||||
COAP_STATIC_INLINE int
|
||||
_coap_address_isany_impl(const coap_address_t *a) {
|
||||
/* need to compare only relevant parts of sockaddr_in6 */
|
||||
switch (a->addr.sa.sa_family) {
|
||||
case AF_INET:
|
||||
return a->addr.sin.sin_addr.s_addr == INADDR_ANY;
|
||||
case AF_INET6:
|
||||
return memcmp(&in6addr_any,
|
||||
&a->addr.sin6.sin6_addr,
|
||||
sizeof(in6addr_any)) == 0;
|
||||
default:
|
||||
;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif /* WITH_LWIP || WITH_CONTIKI */
|
||||
|
||||
/**
|
||||
* Resets the given coap_address_t object @p addr to its default values. In
|
||||
* particular, the member size must be initialized to the available size for
|
||||
* storing addresses.
|
||||
*
|
||||
* @param addr The coap_address_t object to initialize.
|
||||
*/
|
||||
void coap_address_init(coap_address_t *addr);
|
||||
|
||||
/* Convenience function to copy IPv6 addresses without garbage. */
|
||||
|
||||
COAP_STATIC_INLINE void
|
||||
coap_address_copy( coap_address_t *dst, const coap_address_t *src ) {
|
||||
#if defined(WITH_LWIP) || defined(WITH_CONTIKI)
|
||||
memcpy( dst, src, sizeof( coap_address_t ) );
|
||||
#else
|
||||
memset( dst, 0, sizeof( coap_address_t ) );
|
||||
dst->size = src->size;
|
||||
if ( src->addr.sa.sa_family == AF_INET6 ) {
|
||||
dst->addr.sin6.sin6_family = src->addr.sin6.sin6_family;
|
||||
dst->addr.sin6.sin6_addr = src->addr.sin6.sin6_addr;
|
||||
dst->addr.sin6.sin6_port = src->addr.sin6.sin6_port;
|
||||
dst->addr.sin6.sin6_scope_id = src->addr.sin6.sin6_scope_id;
|
||||
} else if ( src->addr.sa.sa_family == AF_INET ) {
|
||||
dst->addr.sin = src->addr.sin;
|
||||
} else {
|
||||
memcpy( &dst->addr, &src->addr, src->size );
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#if defined(WITH_LWIP) || defined(WITH_CONTIKI)
|
||||
/**
|
||||
* Compares given address objects @p a and @p b. This function returns @c 1 if
|
||||
* addresses are equal, @c 0 otherwise. The parameters @p a and @p b must not be
|
||||
* @c NULL;
|
||||
*/
|
||||
COAP_STATIC_INLINE int
|
||||
coap_address_equals(const coap_address_t *a, const coap_address_t *b) {
|
||||
assert(a); assert(b);
|
||||
return _coap_address_equals_impl(a, b);
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Checks if given address object @p a denotes the wildcard address. This
|
||||
* function returns @c 1 if this is the case, @c 0 otherwise. The parameters @p
|
||||
* a must not be @c NULL;
|
||||
*/
|
||||
COAP_STATIC_INLINE int
|
||||
coap_address_isany(const coap_address_t *a) {
|
||||
assert(a);
|
||||
return _coap_address_isany_impl(a);
|
||||
}
|
||||
|
||||
#if !defined(WITH_LWIP) && !defined(WITH_CONTIKI)
|
||||
|
||||
/**
|
||||
* Checks if given address @p a denotes a multicast address. This function
|
||||
* returns @c 1 if @p a is multicast, @c 0 otherwise.
|
||||
*/
|
||||
int coap_is_mcast(const coap_address_t *a);
|
||||
#else /* !WITH_LWIP && !WITH_CONTIKI */
|
||||
/**
|
||||
* Checks if given address @p a denotes a multicast address. This function
|
||||
* returns @c 1 if @p a is multicast, @c 0 otherwise.
|
||||
*/
|
||||
COAP_STATIC_INLINE int
|
||||
coap_is_mcast(const coap_address_t *a) {
|
||||
return a && _coap_is_mcast_impl(a);
|
||||
}
|
||||
#endif /* !WITH_LWIP && !WITH_CONTIKI */
|
||||
|
||||
#endif /* COAP_ADDRESS_H_ */
|
116
tools/sdk/esp32/include/coap/libcoap/include/coap3/async.h
Normal file
116
tools/sdk/esp32/include/coap/libcoap/include/coap3/async.h
Normal file
@ -0,0 +1,116 @@
|
||||
/*
|
||||
* async.h -- state management for asynchronous messages
|
||||
*
|
||||
* Copyright (C) 2010-2011 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file async.h
|
||||
* @brief State management for asynchronous messages
|
||||
*/
|
||||
|
||||
#ifndef COAP_ASYNC_H_
|
||||
#define COAP_ASYNC_H_
|
||||
|
||||
#include "net.h"
|
||||
|
||||
/**
|
||||
* @defgroup coap_async Asynchronous Messaging
|
||||
* @{
|
||||
* API functions for Async "separate" messages.
|
||||
* A coap_context_t object holds a list of coap_async_t objects that can
|
||||
* be used to generate a separate response in the case a result of a request
|
||||
* cannot be delivered immediately.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Returns @c 1 if libcoap was built with separate messages enabled,
|
||||
* @c 0 otherwise.
|
||||
*/
|
||||
int coap_async_is_supported(void);
|
||||
|
||||
/**
|
||||
* Allocates a new coap_async_t object and fills its fields according to
|
||||
* the given @p request. This function returns a pointer to the registered
|
||||
* coap_async_t object or @c NULL on error. Note that this function will
|
||||
* return @c NULL in case that an object with the same identifier is already
|
||||
* registered.
|
||||
*
|
||||
* When the delay expires, a copy of the @p request will get sent to the
|
||||
* appropriate request handler.
|
||||
*
|
||||
* @param session The session that is used for asynchronous transmissions.
|
||||
* @param request The request that is handled asynchronously.
|
||||
* @param delay The amount of time to delay before sending response, 0 means
|
||||
* wait forever.
|
||||
*
|
||||
* @return A pointer to the registered coap_async_t object or @c
|
||||
* NULL in case of an error.
|
||||
*/
|
||||
coap_async_t *
|
||||
coap_register_async(coap_session_t *session,
|
||||
const coap_pdu_t *request,
|
||||
coap_tick_t delay);
|
||||
|
||||
/**
|
||||
* Update the delay timeout, so changing when the registered @p async triggers.
|
||||
*
|
||||
* When the new delay expires, a copy of the original request will get sent to
|
||||
* the appropriate request handler.
|
||||
*
|
||||
* @param async The object to update.
|
||||
* @param delay The amount of time to delay before sending response, 0 means
|
||||
* wait forever.
|
||||
*/
|
||||
void
|
||||
coap_async_set_delay(coap_async_t *async, coap_tick_t delay);
|
||||
|
||||
/**
|
||||
* Releases the memory that was allocated by coap_register_async() for the
|
||||
* object @p async.
|
||||
*
|
||||
* @param session The session to use.
|
||||
* @param async The object to delete.
|
||||
*/
|
||||
void
|
||||
coap_free_async(coap_session_t *session, coap_async_t *async);
|
||||
|
||||
/**
|
||||
* Retrieves the object identified by @p token from the list of asynchronous
|
||||
* transactions that are registered with @p context. This function returns a
|
||||
* pointer to that object or @c NULL if not found.
|
||||
*
|
||||
* @param session The session that is used for asynchronous transmissions.
|
||||
* @param token The PDU's token of the object to retrieve.
|
||||
*
|
||||
* @return A pointer to the object identified by @p token or @c NULL if
|
||||
* not found.
|
||||
*/
|
||||
coap_async_t *coap_find_async(coap_session_t *session, coap_bin_const_t token);
|
||||
|
||||
/**
|
||||
* Set the application data pointer held in @p async. This overwrites any
|
||||
* existing data pointer.
|
||||
*
|
||||
* @param async The async state object.
|
||||
* @param app_data The pointer to the data.
|
||||
*/
|
||||
void coap_async_set_app_data(coap_async_t *async, void *app_data);
|
||||
|
||||
/**
|
||||
* Gets the application data pointer held in @p async.
|
||||
*
|
||||
* @param async The async state object.
|
||||
*
|
||||
* @return The applicaton data pointer.
|
||||
*/
|
||||
void *coap_async_get_app_data(const coap_async_t *async);
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* COAP_ASYNC_H_ */
|
348
tools/sdk/esp32/include/coap/libcoap/include/coap3/block.h
Normal file
348
tools/sdk/esp32/include/coap/libcoap/include/coap3/block.h
Normal file
@ -0,0 +1,348 @@
|
||||
/*
|
||||
* block.h -- block transfer
|
||||
*
|
||||
* Copyright (C) 2010-2012,2014-2015 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
#ifndef COAP_BLOCK_H_
|
||||
#define COAP_BLOCK_H_
|
||||
|
||||
#include "encode.h"
|
||||
#include "option.h"
|
||||
#include "pdu.h"
|
||||
|
||||
/**
|
||||
* @defgroup block Block Transfer
|
||||
* API functions for handling PDUs using CoAP BLOCK options
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef COAP_MAX_BLOCK_SZX
|
||||
/**
|
||||
* The largest value for the SZX component in a Block option.
|
||||
*/
|
||||
#define COAP_MAX_BLOCK_SZX 6
|
||||
#endif /* COAP_MAX_BLOCK_SZX */
|
||||
|
||||
/**
|
||||
* Structure of Block options.
|
||||
*/
|
||||
typedef struct {
|
||||
unsigned int num; /**< block number */
|
||||
unsigned int m:1; /**< 1 if more blocks follow, 0 otherwise */
|
||||
unsigned int szx:3; /**< block size */
|
||||
} coap_block_t;
|
||||
|
||||
#define COAP_BLOCK_USE_LIBCOAP 0x01 /* Use libcoap to do block requests */
|
||||
#define COAP_BLOCK_SINGLE_BODY 0x02 /* Deliver the data as a single body */
|
||||
|
||||
/**
|
||||
* Returns the value of the least significant byte of a Block option @p opt.
|
||||
* For zero-length options (i.e. num == m == szx == 0), COAP_OPT_BLOCK_LAST
|
||||
* returns @c NULL.
|
||||
*/
|
||||
#define COAP_OPT_BLOCK_LAST(opt) \
|
||||
(coap_opt_length(opt) ? (coap_opt_value(opt) + (coap_opt_length(opt)-1)) : 0)
|
||||
|
||||
/** Returns the value of the More-bit of a Block option @p opt. */
|
||||
#define COAP_OPT_BLOCK_MORE(opt) \
|
||||
(coap_opt_length(opt) ? (*COAP_OPT_BLOCK_LAST(opt) & 0x08) : 0)
|
||||
|
||||
/** Returns the value of the SZX-field of a Block option @p opt. */
|
||||
#define COAP_OPT_BLOCK_SZX(opt) \
|
||||
(coap_opt_length(opt) ? (*COAP_OPT_BLOCK_LAST(opt) & 0x07) : 0)
|
||||
|
||||
/**
|
||||
* Returns the value of field @c num in the given block option @p block_opt.
|
||||
*/
|
||||
unsigned int coap_opt_block_num(const coap_opt_t *block_opt);
|
||||
|
||||
/**
|
||||
* Checks if more than @p num blocks are required to deliver @p data_len
|
||||
* bytes of data for a block size of 1 << (@p szx + 4).
|
||||
*/
|
||||
COAP_STATIC_INLINE int
|
||||
coap_more_blocks(size_t data_len, unsigned int num, uint16_t szx) {
|
||||
return ((num+1) << (szx + 4)) < data_len;
|
||||
}
|
||||
|
||||
#if 0
|
||||
/** Sets the More-bit in @p block_opt */
|
||||
COAP_STATIC_INLINE void
|
||||
coap_opt_block_set_m(coap_opt_t *block_opt, int m) {
|
||||
if (m)
|
||||
*(coap_opt_value(block_opt) + (coap_opt_length(block_opt) - 1)) |= 0x08;
|
||||
else
|
||||
*(coap_opt_value(block_opt) + (coap_opt_length(block_opt) - 1)) &= ~0x08;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Initializes @p block from @p pdu. @p number must be either COAP_OPTION_BLOCK1
|
||||
* or COAP_OPTION_BLOCK2. When option @p number was found in @p pdu, @p block is
|
||||
* initialized with values from this option and the function returns the value
|
||||
* @c 1. Otherwise, @c 0 is returned.
|
||||
*
|
||||
* @param pdu The pdu to search for option @p number.
|
||||
* @param number The option number to search for (must be COAP_OPTION_BLOCK1 or
|
||||
* COAP_OPTION_BLOCK2).
|
||||
* @param block The block structure to initilize.
|
||||
*
|
||||
* @return @c 1 on success, @c 0 otherwise.
|
||||
*/
|
||||
int coap_get_block(const coap_pdu_t *pdu, coap_option_num_t number,
|
||||
coap_block_t *block);
|
||||
|
||||
/**
|
||||
* Writes a block option of type @p number to message @p pdu. If the requested
|
||||
* block size is too large to fit in @p pdu, it is reduced accordingly. An
|
||||
* exception is made for the final block when less space is required. The actual
|
||||
* length of the resource is specified in @p data_length.
|
||||
*
|
||||
* This function may change *block to reflect the values written to @p pdu. As
|
||||
* the function takes into consideration the remaining space @p pdu, no more
|
||||
* options should be added after coap_write_block_opt() has returned.
|
||||
*
|
||||
* @param block The block structure to use. On return, this object is
|
||||
* updated according to the values that have been written to
|
||||
* @p pdu.
|
||||
* @param number COAP_OPTION_BLOCK1 or COAP_OPTION_BLOCK2.
|
||||
* @param pdu The message where the block option should be written.
|
||||
* @param data_length The length of the actual data that will be added the @p
|
||||
* pdu by calling coap_add_block().
|
||||
*
|
||||
* @return @c 1 on success, or a negative value on error.
|
||||
*/
|
||||
int coap_write_block_opt(coap_block_t *block,
|
||||
coap_option_num_t number,
|
||||
coap_pdu_t *pdu,
|
||||
size_t data_length);
|
||||
|
||||
/**
|
||||
* Adds the @p block_num block of size 1 << (@p block_szx + 4) from source @p
|
||||
* data to @p pdu.
|
||||
*
|
||||
* @param pdu The message to add the block.
|
||||
* @param len The length of @p data.
|
||||
* @param data The source data to fill the block with.
|
||||
* @param block_num The actual block number.
|
||||
* @param block_szx Encoded size of block @p block_number.
|
||||
*
|
||||
* @return @c 1 on success, @c 0 otherwise.
|
||||
*/
|
||||
int coap_add_block(coap_pdu_t *pdu,
|
||||
size_t len,
|
||||
const uint8_t *data,
|
||||
unsigned int block_num,
|
||||
unsigned char block_szx);
|
||||
|
||||
/**
|
||||
* Re-assemble payloads into a body
|
||||
*
|
||||
* @param body_data The pointer to the data for the body holding the
|
||||
* representation so far or NULL if the first time.
|
||||
* @param length The length of @p data.
|
||||
* @param data The payload data to update the body with.
|
||||
* @param offset The offset of the @p data into the body.
|
||||
* @param total The estimated total size of the body.
|
||||
*
|
||||
* @return The current representation of the body or @c NULL if error.
|
||||
* If NULL, @p body_data will have been de-allocated.
|
||||
*/
|
||||
coap_binary_t *
|
||||
coap_block_build_body(coap_binary_t *body_data, size_t length,
|
||||
const uint8_t *data, size_t offset, size_t total);
|
||||
|
||||
/**
|
||||
* Adds the appropriate part of @p data to the @p response pdu. If blocks are
|
||||
* required, then the appropriate block will be added to the PDU and sent.
|
||||
* Adds a ETAG option that is the hash of the entire data if the data is to be
|
||||
* split into blocks
|
||||
* Used by a request handler.
|
||||
*
|
||||
* Note: The application will get called for every packet of a large body to
|
||||
* process. Consider using coap_add_data_response_large() instead.
|
||||
*
|
||||
* @param request The requesting pdu.
|
||||
* @param response The response pdu.
|
||||
* @param media_type The format of the data.
|
||||
* @param maxage The maxmimum life of the data. If @c -1, then there
|
||||
* is no maxage.
|
||||
* @param length The total length of the data.
|
||||
* @param data The entire data block to transmit.
|
||||
*
|
||||
*/
|
||||
void
|
||||
coap_add_data_blocked_response(const coap_pdu_t *request,
|
||||
coap_pdu_t *response,
|
||||
uint16_t media_type,
|
||||
int maxage,
|
||||
size_t length,
|
||||
const uint8_t* data);
|
||||
|
||||
/**
|
||||
* Callback handler for de-allocating the data based on @p app_ptr provided to
|
||||
* coap_add_data_large_*() functions following transmission of the supplied
|
||||
* data.
|
||||
*
|
||||
* @param session The session that this data is associated with
|
||||
* @param app_ptr The application provided pointer provided to the
|
||||
* coap_add_data_large_* functions.
|
||||
*/
|
||||
typedef void (*coap_release_large_data_t)(coap_session_t *session,
|
||||
void *app_ptr);
|
||||
|
||||
/**
|
||||
* Associates given data with the @p pdu that is passed as second parameter.
|
||||
*
|
||||
* If all the data can be transmitted in a single PDU, this is functionally
|
||||
* the same as coap_add_data() except @p release_func (if not NULL) will get
|
||||
* invoked after data transmission.
|
||||
*
|
||||
* Used for a client request.
|
||||
*
|
||||
* If the data spans multiple PDUs, then the data will get transmitted using
|
||||
* BLOCK1 option with the addition of the SIZE1 option.
|
||||
* The underlying library will handle the transmission of the individual blocks.
|
||||
* Once the body of data has been transmitted (or a failure occurred), then
|
||||
* @p release_func (if not NULL) will get called so the application can
|
||||
* de-allocate the @p data based on @p app_data. It is the responsibility of
|
||||
* the application not to change the contents of @p data until the data
|
||||
* transfer has completed.
|
||||
*
|
||||
* There is no need for the application to include the BLOCK1 option in the
|
||||
* @p pdu.
|
||||
*
|
||||
* coap_add_data_large_request() (or the alternative coap_add_data_large_*()
|
||||
* functions) must be called only once per PDU and must be the last PDU update
|
||||
* before the PDU is transmitted. The (potentially) initial data will get
|
||||
* transmitted when coap_send() is invoked.
|
||||
*
|
||||
* Note: COAP_BLOCK_USE_LIBCOAP must be set by coap_context_set_block_mode()
|
||||
* for libcoap to work correctly when using this function.
|
||||
*
|
||||
* @param session The session to associate the data with.
|
||||
* @param pdu The PDU to associate the data with.
|
||||
* @param length The length of data to transmit.
|
||||
* @param data The data to transmit.
|
||||
* @param release_func The function to call to de-allocate @p data or @c NULL
|
||||
* if the function is not required.
|
||||
* @param app_ptr A Pointer that the application can provide for when
|
||||
* release_func() is called.
|
||||
*
|
||||
* @return @c 1 if addition is successful, else @c 0.
|
||||
*/
|
||||
int coap_add_data_large_request(coap_session_t *session,
|
||||
coap_pdu_t *pdu,
|
||||
size_t length,
|
||||
const uint8_t *data,
|
||||
coap_release_large_data_t release_func,
|
||||
void *app_ptr);
|
||||
|
||||
/**
|
||||
* Associates given data with the @p response pdu that is passed as fourth
|
||||
* parameter.
|
||||
*
|
||||
* If all the data can be transmitted in a single PDU, this is functionally
|
||||
* the same as coap_add_data() except @p release_func (if not NULL) will get
|
||||
* invoked after data transmission. The MEDIA_TYPE, MAXAGE and ETAG options may
|
||||
* be added in as appropriate.
|
||||
*
|
||||
* Used by a server request handler to create the response.
|
||||
*
|
||||
* If the data spans multiple PDUs, then the data will get transmitted using
|
||||
* BLOCK2 (response) option with the addition of the SIZE2 and ETAG
|
||||
* options. The underlying library will handle the transmission of the
|
||||
* individual blocks. Once the body of data has been transmitted (or a
|
||||
* failure occurred), then @p release_func (if not NULL) will get called so the
|
||||
* application can de-allocate the @p data based on @p app_data. It is the
|
||||
* responsibility of the application not to change the contents of @p data
|
||||
* until the data transfer has completed.
|
||||
*
|
||||
* There is no need for the application to include the BLOCK2 option in the
|
||||
* @p pdu.
|
||||
*
|
||||
* coap_add_data_large_response() (or the alternative coap_add_data_large*()
|
||||
* functions) must be called only once per PDU and must be the last PDU update
|
||||
* before returning from the request handler function.
|
||||
*
|
||||
* Note: COAP_BLOCK_USE_LIBCOAP must be set by coap_context_set_block_mode()
|
||||
* for libcoap to work correctly when using this function.
|
||||
*
|
||||
* @param resource The resource the data is associated with.
|
||||
* @param session The coap session.
|
||||
* @param request The requesting pdu.
|
||||
* @param response The response pdu.
|
||||
* @param query The query taken from the (original) requesting pdu.
|
||||
* @param media_type The format of the data.
|
||||
* @param maxage The maxmimum life of the data. If @c -1, then there
|
||||
* is no maxage.
|
||||
* @param etag ETag to use if not 0.
|
||||
* @param length The total length of the data.
|
||||
* @param data The entire data block to transmit.
|
||||
* @param release_func The function to call to de-allocate @p data or NULL if
|
||||
* the function is not required.
|
||||
* @param app_ptr A Pointer that the application can provide for when
|
||||
* release_func() is called.
|
||||
*
|
||||
* @return @c 1 if addition is successful, else @c 0.
|
||||
*/
|
||||
int
|
||||
coap_add_data_large_response(coap_resource_t *resource,
|
||||
coap_session_t *session,
|
||||
const coap_pdu_t *request,
|
||||
coap_pdu_t *response,
|
||||
const coap_string_t *query,
|
||||
uint16_t media_type,
|
||||
int maxage,
|
||||
uint64_t etag,
|
||||
size_t length,
|
||||
const uint8_t *data,
|
||||
coap_release_large_data_t release_func,
|
||||
void *app_ptr);
|
||||
|
||||
/**
|
||||
* Set the context level CoAP block handling bits for handling RFC7959.
|
||||
* These bits flow down to a session when a session is created and if the peer
|
||||
* does not support something, an appropriate bit may get disabled in the
|
||||
* session block_mode.
|
||||
* The session block_mode then flows down into coap_crcv_t or coap_srcv_t where
|
||||
* again an appropriate bit may get disabled.
|
||||
*
|
||||
* Note: This function must be called before the session is set up.
|
||||
*
|
||||
* Note: COAP_BLOCK_USE_LIBCOAP must be set if libcoap is to do all the
|
||||
* block tracking and requesting, otherwise the application will have to do
|
||||
* all of this work (the default if coap_context_set_block_mode() is not
|
||||
* called).
|
||||
*
|
||||
* @param context The coap_context_t object.
|
||||
* @param block_mode Zero or more COAP_BLOCK_ or'd options
|
||||
*/
|
||||
void coap_context_set_block_mode(coap_context_t *context,
|
||||
uint8_t block_mode);
|
||||
|
||||
/**
|
||||
* Cancel an observe that is being tracked by the client large receive logic.
|
||||
* (coap_context_set_block_mode() has to be called)
|
||||
* This will trigger the sending of an observe cancel pdu to the server.
|
||||
*
|
||||
* @param session The session that is being used for the observe.
|
||||
* @param token The original token used to initiate the observation.
|
||||
* @param message_type The COAP_MESSAGE_ type (NON or CON) to send the observe
|
||||
* cancel pdu as.
|
||||
*
|
||||
* @return @c 1 if observe cancel transmission initiation is successful,
|
||||
* else @c 0.
|
||||
*/
|
||||
int coap_cancel_observe(coap_session_t *session, coap_binary_t *token,
|
||||
coap_pdu_type_t message_type);
|
||||
|
||||
/**@}*/
|
||||
|
||||
#endif /* COAP_BLOCK_H_ */
|
@ -0,0 +1,89 @@
|
||||
/*
|
||||
* coap_asn1_internal.h -- ASN.1 functions for libcoap
|
||||
*
|
||||
* Copyright (C) 2020 Jon Shallow <supjps-libcoap@jpshallow.com>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file coap_asn1_internal.h
|
||||
* @brief COAP ASN.1 internal information
|
||||
*/
|
||||
|
||||
#ifndef COAP_ASN1_INTERNAL_H_
|
||||
#define COAP_ASN1_INTERNAL_H_
|
||||
|
||||
|
||||
/**
|
||||
* @defgroup asn1 ASN.1 Support (Internal)
|
||||
* CoAP ASN.1 Structures, Enums and Functions that are not exposed to
|
||||
* applications
|
||||
* @{
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
COAP_ASN1_NONE = 0,
|
||||
COAP_ASN1_INTEGER = 2,
|
||||
COAP_ASN1_BITSTRING = 3,
|
||||
COAP_ASN1_OCTETSTRING = 4,
|
||||
COAP_ASN1_IDENTIFIER = 6,
|
||||
} coap_asn1_tag_t;
|
||||
|
||||
/**
|
||||
* Callback to validate the asn1 tag and data.
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @param data The start of the tag and data
|
||||
* @param size The size of the tag and data
|
||||
*
|
||||
* @return @c 1 if pass, else @c 0 if fail
|
||||
*/
|
||||
typedef int (*asn1_validate)(const uint8_t *data, size_t size);
|
||||
|
||||
/**
|
||||
* Get the asn1 length from the current @p ptr.
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @param ptr The current asn.1 object length pointer
|
||||
*
|
||||
* @return The length of the asn.1 object. @p ptr is updated to be after the length.
|
||||
*/
|
||||
size_t asn1_len(const uint8_t **ptr);
|
||||
|
||||
/**
|
||||
* Get the asn1 tag from the current @p ptr.
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @param ptr The current asn.1 object tag pointer
|
||||
* @param constructed 1 if current tag is constructed
|
||||
* @param class The current class of the tag
|
||||
*
|
||||
* @return The tag value.@p ptr is updated to be after the tag.
|
||||
*/
|
||||
coap_asn1_tag_t asn1_tag_c(const uint8_t **ptr, int *constructed, int *class);
|
||||
|
||||
/**
|
||||
* Get the asn1 tag and data from the current @p ptr.
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @param ltag The tag to look for
|
||||
* @param ptr The current asn.1 object pointer
|
||||
* @param tlen The remaining size oof the asn.1 data
|
||||
* @param validate Call validate to verify tag data or @c NULL
|
||||
*
|
||||
* @return The asn.1 tag and data or @c NULL if not found
|
||||
*/
|
||||
coap_binary_t *get_asn1_tag(coap_asn1_tag_t ltag, const uint8_t *ptr,
|
||||
size_t tlen, asn1_validate validate);
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* COAP_ASN1_INTERNAL_H_ */
|
@ -0,0 +1,67 @@
|
||||
/*
|
||||
* coap_async_internal.h -- state management for asynchronous messages
|
||||
*
|
||||
* Copyright (C) 2010-2021 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file coap_async_internal.h
|
||||
* @brief CoAP async internal information
|
||||
*/
|
||||
|
||||
#ifndef COAP_ASYNC_INTERNAL_H_
|
||||
#define COAP_ASYNC_INTERNAL_H_
|
||||
|
||||
#include "coap3/net.h"
|
||||
|
||||
#ifndef WITHOUT_ASYNC
|
||||
|
||||
/**
|
||||
* @defgroup coap_async_internal Asynchronous Messaging (Internal)
|
||||
* @{
|
||||
* CoAP Async Structures, Enums and Functions that are not exposed to
|
||||
* applications.
|
||||
* A coap_context_t object holds a list of coap_async_t objects that can be
|
||||
* used to generate a separate response in the case a result of a request cannot
|
||||
* be delivered immediately.
|
||||
*/
|
||||
struct coap_async_t {
|
||||
struct coap_async_t *next; /**< internally used for linking */
|
||||
coap_tick_t delay; /**< When to delay to before triggering the response
|
||||
0 indicates never trigger */
|
||||
coap_session_t *session; /**< transaction session */
|
||||
coap_pdu_t *pdu; /**< copy of request pdu */
|
||||
void* appdata; /** User definable data pointer */
|
||||
};
|
||||
|
||||
/**
|
||||
* Checks if there are any pending Async requests - if so, send them off.
|
||||
* Otherewise return the time remaining for the next Async to be triggered
|
||||
* or 0 if nothing to do.
|
||||
*
|
||||
* @param context The current context.
|
||||
* @param now The current time in ticks.
|
||||
*
|
||||
* @return The tick time before the next Async needs to go, else 0 if
|
||||
* nothing to do.
|
||||
*/
|
||||
coap_tick_t coap_check_async(coap_context_t *context, coap_tick_t now);
|
||||
|
||||
/**
|
||||
* Removes and frees off all of the async entries for the given context.
|
||||
*
|
||||
* @param context The context to remove all async entries from.
|
||||
*/
|
||||
void
|
||||
coap_delete_all_async(coap_context_t *context);
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* WITHOUT_ASYNC */
|
||||
|
||||
#endif /* COAP_ASYNC_INTERNAL_H_ */
|
@ -0,0 +1,242 @@
|
||||
/*
|
||||
* coap_block_internal.h -- Structures, Enums & Functions that are not
|
||||
* exposed to application programming
|
||||
*
|
||||
* Copyright (C) 2010-2021 Olaf Bergmann <bergmann@tzi.org>
|
||||
* Copyright (C) 2021 Jon Shallow <supjps-libcoap@jpshallow.com>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file coap_block_internal.h
|
||||
* @brief COAP block internal information
|
||||
*/
|
||||
|
||||
#ifndef COAP_BLOCK_INTERNAL_H_
|
||||
#define COAP_BLOCK_INTERNAL_H_
|
||||
|
||||
#include "coap_pdu_internal.h"
|
||||
#include "resource.h"
|
||||
|
||||
/**
|
||||
* @defgroup block_internal Block (Internal)
|
||||
* Structures, Enums and Functions that are not exposed to applications
|
||||
* @{
|
||||
*/
|
||||
|
||||
typedef enum {
|
||||
COAP_RECURSE_OK,
|
||||
COAP_RECURSE_NO
|
||||
} coap_recurse_t;
|
||||
|
||||
struct coap_lg_range {
|
||||
uint32_t begin;
|
||||
uint32_t end;
|
||||
};
|
||||
|
||||
#define COAP_RBLOCK_CNT 4
|
||||
/**
|
||||
* Structure to keep track of received blocks
|
||||
*/
|
||||
typedef struct coap_rblock_t {
|
||||
uint32_t used;
|
||||
uint32_t retry;
|
||||
struct coap_lg_range range[COAP_RBLOCK_CNT];
|
||||
coap_tick_t last_seen;
|
||||
} coap_rblock_t;
|
||||
|
||||
/**
|
||||
* Structure to keep track of block1 specific information
|
||||
* (Requests)
|
||||
*/
|
||||
typedef struct coap_l_block1_t {
|
||||
coap_binary_t *app_token; /**< original PDU token */
|
||||
uint8_t token[8]; /**< last used token */
|
||||
size_t token_length; /**< length of token */
|
||||
uint32_t count; /**< the number of packets sent for payload */
|
||||
} coap_l_block1_t;
|
||||
|
||||
/**
|
||||
* Structure to keep track of block2 specific information
|
||||
* (Responses)
|
||||
*/
|
||||
typedef struct coap_l_block2_t {
|
||||
coap_resource_t *resource; /**< associated resource */
|
||||
coap_string_t *query; /**< Associated query for the resource */
|
||||
uint64_t etag; /**< ETag value */
|
||||
coap_time_t maxage_expire; /**< When this entry expires */
|
||||
} coap_l_block2_t;
|
||||
|
||||
/**
|
||||
* Structure to hold large body (many blocks) transmission information
|
||||
*/
|
||||
struct coap_lg_xmit_t {
|
||||
struct coap_lg_xmit_t *next;
|
||||
uint8_t blk_size; /**< large block transmission size */
|
||||
uint16_t option; /**< large block transmisson CoAP option */
|
||||
int last_block; /**< last acknowledged block number */
|
||||
const uint8_t *data; /**< large data ptr */
|
||||
size_t length; /**< large data length */
|
||||
size_t offset; /**< large data next offset to transmit */
|
||||
union {
|
||||
coap_l_block1_t b1;
|
||||
coap_l_block2_t b2;
|
||||
} b;
|
||||
coap_pdu_t pdu; /**< skeletal PDU */
|
||||
coap_tick_t last_payload; /**< Last time MAX_PAYLOAD was sent or 0 */
|
||||
coap_tick_t last_used; /**< Last time all data sent or 0 */
|
||||
coap_release_large_data_t release_func; /**< large data de-alloc function */
|
||||
void *app_ptr; /**< applicaton provided ptr for de-alloc function */
|
||||
};
|
||||
|
||||
/**
|
||||
* Structure to hold large body (many blocks) client receive information
|
||||
*/
|
||||
struct coap_lg_crcv_t {
|
||||
struct coap_lg_crcv_t *next;
|
||||
uint8_t observe[3]; /**< Observe data (if set) (only 24 bits) */
|
||||
uint8_t observe_length;/**< Length of observe data */
|
||||
uint8_t observe_set; /**< Set if this is an observe receive PDU */
|
||||
uint8_t etag_set; /**< Set if ETag is in receive PDU */
|
||||
uint8_t etag_length; /**< ETag length */
|
||||
uint8_t etag[8]; /**< ETag for block checking */
|
||||
uint16_t content_format; /**< Content format for the set of blocks */
|
||||
uint8_t last_type; /**< Last request type (CON/NON) */
|
||||
uint8_t initial; /**< If set, has not been used yet */
|
||||
uint8_t szx; /**< size of individual blocks */
|
||||
size_t total_len; /**< Length as indicated by SIZE2 option */
|
||||
coap_binary_t *body_data; /**< Used for re-assembling entire body */
|
||||
coap_binary_t *app_token; /**< app requesting PDU token */
|
||||
uint8_t base_token[8]; /**< established base PDU token */
|
||||
size_t base_token_length; /**< length of token */
|
||||
uint8_t token[8]; /**< last used token */
|
||||
size_t token_length; /**< length of token */
|
||||
coap_pdu_t pdu; /**< skeletal PDU */
|
||||
coap_rblock_t rec_blocks; /** < list of received blocks */
|
||||
coap_tick_t last_used; /**< Last time all data sent or 0 */
|
||||
uint16_t block_option; /**< Block option in use */
|
||||
};
|
||||
|
||||
/**
|
||||
* Structure to hold large body (many blocks) server receive information
|
||||
*/
|
||||
struct coap_lg_srcv_t {
|
||||
struct coap_lg_srcv_t *next;
|
||||
uint8_t observe[3]; /**< Observe data (if set) (only 24 bits) */
|
||||
uint8_t observe_length;/**< Length of observe data */
|
||||
uint8_t observe_set; /**< Set if this is an observe receive PDU */
|
||||
uint8_t rtag_set; /**< Set if RTag is in receive PDU */
|
||||
uint8_t rtag_length; /**< RTag length */
|
||||
uint8_t rtag[8]; /**< RTag for block checking */
|
||||
uint16_t content_format; /**< Content format for the set of blocks */
|
||||
uint8_t last_type; /**< Last request type (CON/NON) */
|
||||
uint8_t szx; /**< size of individual blocks */
|
||||
size_t total_len; /**< Length as indicated by SIZE1 option */
|
||||
coap_binary_t *body_data; /**< Used for re-assembling entire body */
|
||||
size_t amount_so_far; /**< Amount of data seen so far */
|
||||
coap_resource_t *resource; /**< associated resource */
|
||||
coap_str_const_t *uri_path; /** set to uri_path if unknown resource */
|
||||
coap_rblock_t rec_blocks; /** < list of received blocks */
|
||||
uint8_t last_token[8]; /**< last used token */
|
||||
size_t last_token_length; /**< length of token */
|
||||
coap_mid_t last_mid; /**< Last received mid for this set of packets */
|
||||
coap_tick_t last_used; /**< Last time data sent or 0 */
|
||||
uint16_t block_option; /**< Block option in use */
|
||||
};
|
||||
|
||||
coap_lg_crcv_t * coap_block_new_lg_crcv(coap_session_t *session,
|
||||
coap_pdu_t *pdu);
|
||||
|
||||
void coap_block_delete_lg_crcv(coap_session_t *session,
|
||||
coap_lg_crcv_t *lg_crcv);
|
||||
|
||||
coap_tick_t coap_block_check_lg_crcv_timeouts(coap_session_t *session,
|
||||
coap_tick_t now);
|
||||
|
||||
void coap_block_delete_lg_srcv(coap_session_t *session,
|
||||
coap_lg_srcv_t *lg_srcv);
|
||||
|
||||
coap_tick_t coap_block_check_lg_srcv_timeouts(coap_session_t *session,
|
||||
coap_tick_t now);
|
||||
|
||||
int coap_handle_request_send_block(coap_session_t *session,
|
||||
coap_pdu_t *pdu,
|
||||
coap_pdu_t *response,
|
||||
coap_resource_t *resource,
|
||||
coap_string_t *query);
|
||||
|
||||
int coap_handle_request_put_block(coap_context_t *context,
|
||||
coap_session_t *session,
|
||||
coap_pdu_t *pdu,
|
||||
coap_pdu_t *response,
|
||||
coap_resource_t *resource,
|
||||
coap_string_t *uri_path,
|
||||
coap_opt_t *observe,
|
||||
coap_string_t *query,
|
||||
coap_method_handler_t h,
|
||||
int *added_block);
|
||||
|
||||
int coap_handle_response_send_block(coap_session_t *session, coap_pdu_t *rcvd);
|
||||
|
||||
int coap_handle_response_get_block(coap_context_t *context,
|
||||
coap_session_t *session,
|
||||
coap_pdu_t *sent,
|
||||
coap_pdu_t *rcvd,
|
||||
coap_recurse_t recursive);
|
||||
|
||||
void coap_block_delete_lg_xmit(coap_session_t *session,
|
||||
coap_lg_xmit_t *lg_xmit);
|
||||
|
||||
coap_tick_t coap_block_check_lg_xmit_timeouts(coap_session_t *session,
|
||||
coap_tick_t now);
|
||||
|
||||
/**
|
||||
* The function that does all the work for the coap_add_data_large*()
|
||||
* functions.
|
||||
*
|
||||
* @param session The session to associate the data with.
|
||||
* @param pdu The PDU to associate the data with.
|
||||
* @param resource The resource to associate the data with (BLOCK2).
|
||||
* @param query The query to associate the data with (BLOCK2).
|
||||
* @param maxage The maxmimum life of the data. If @c -1, then there
|
||||
* is no maxage (BLOCK2).
|
||||
* @param etag ETag to use if not 0 (BLOCK2).
|
||||
* @param length The length of data to transmit.
|
||||
* @param data The data to transmit.
|
||||
* @param release_func The function to call to de-allocate @p data or NULL if
|
||||
* the function is not required.
|
||||
* @param app_ptr A Pointer that the application can provide for when
|
||||
* release_func() is called.
|
||||
*
|
||||
* @return @c 1 if transmission initiation is successful, else @c 0.
|
||||
*/
|
||||
int coap_add_data_large_internal(coap_session_t *session,
|
||||
coap_pdu_t *pdu,
|
||||
coap_resource_t *resource,
|
||||
const coap_string_t *query,
|
||||
int maxage,
|
||||
uint64_t etag,
|
||||
size_t length,
|
||||
const uint8_t *data,
|
||||
coap_release_large_data_t release_func,
|
||||
void *app_ptr);
|
||||
|
||||
/**
|
||||
* The function checks that the code in a newly formed lg_xmit created by
|
||||
* coap_add_data_large_response() is updated.
|
||||
*
|
||||
* @param session The session
|
||||
* @param response The response PDU to to check
|
||||
* @param resource The requested resource
|
||||
* @param query The requested query
|
||||
*/
|
||||
void coap_check_code_lg_xmit(coap_session_t *session, coap_pdu_t *response,
|
||||
coap_resource_t *resource, coap_string_t *query);
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* COAP_BLOCK_INTERNAL_H_ */
|
232
tools/sdk/esp32/include/coap/libcoap/include/coap3/coap_cache.h
Normal file
232
tools/sdk/esp32/include/coap/libcoap/include/coap3/coap_cache.h
Normal file
@ -0,0 +1,232 @@
|
||||
/* coap_cache.h -- Caching of CoAP requests
|
||||
*
|
||||
* Copyright (C) 2020 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see
|
||||
* README for terms of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file coap_cache.h
|
||||
* @brief Provides a simple cache request storage for CoAP requests
|
||||
*/
|
||||
|
||||
#ifndef COAP_CACHE_H_
|
||||
#define COAP_CACHE_H_
|
||||
|
||||
#include "coap_forward_decls.h"
|
||||
|
||||
/**
|
||||
* @defgroup cache Cache Support
|
||||
* API functions for CoAP Caching
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Callback to free off the app data when the cache-entry is
|
||||
* being deleted / freed off.
|
||||
*
|
||||
* @param data The app data to be freed off.
|
||||
*/
|
||||
typedef void (*coap_cache_app_data_free_callback_t)(void *data);
|
||||
|
||||
typedef enum coap_cache_session_based_t {
|
||||
COAP_CACHE_NOT_SESSION_BASED,
|
||||
COAP_CACHE_IS_SESSION_BASED
|
||||
} coap_cache_session_based_t;
|
||||
|
||||
typedef enum coap_cache_record_pdu_t {
|
||||
COAP_CACHE_NOT_RECORD_PDU,
|
||||
COAP_CACHE_RECORD_PDU
|
||||
} coap_cache_record_pdu_t;
|
||||
|
||||
/**
|
||||
* Calculates a cache-key for the given CoAP PDU. See
|
||||
* https://tools.ietf.org/html/rfc7252#section-5.6
|
||||
* for an explanation of CoAP cache keys.
|
||||
*
|
||||
* Specific CoAP options can be removed from the cache-key. Examples of
|
||||
* this are the BLOCK1 and BLOCK2 options - which make no real sense including
|
||||
* them in a client or server environment, but should be included in a proxy
|
||||
* caching environment where things are cached on a per block basis.
|
||||
* This is done globally by calling the coap_cache_ignore_options()
|
||||
* function.
|
||||
*
|
||||
* NOTE: The returned cache-key needs to be freed off by the caller by
|
||||
* calling coap_cache_delete_key().
|
||||
*
|
||||
* @param session The session to add into cache-key if @p session_based
|
||||
* is set.
|
||||
* @param pdu The CoAP PDU for which a cache-key is to be
|
||||
* calculated.
|
||||
* @param session_based COAP_CACHE_IS_SESSION_BASED if session based
|
||||
* cache-key, else COAP_CACHE_NOT_SESSION_BASED.
|
||||
*
|
||||
* @return The returned cache-key or @c NULL if failure.
|
||||
*/
|
||||
coap_cache_key_t *coap_cache_derive_key(const coap_session_t *session,
|
||||
const coap_pdu_t *pdu,
|
||||
coap_cache_session_based_t session_based);
|
||||
|
||||
/**
|
||||
* Calculates a cache-key for the given CoAP PDU. See
|
||||
* https://tools.ietf.org/html/rfc7252#section-5.6
|
||||
* for an explanation of CoAP cache keys.
|
||||
*
|
||||
* Specific CoAP options can be removed from the cache-key. Examples of
|
||||
* this are the BLOCK1 and BLOCK2 options - which make no real sense including
|
||||
* them in a client or server environment, but should be included in a proxy
|
||||
* caching environment where things are cached on a per block basis.
|
||||
* This is done individually by specifying @p cache_ignore_count and
|
||||
* @p cache_ignore_options .
|
||||
*
|
||||
* NOTE: The returned cache-key needs to be freed off by the caller by
|
||||
* calling coap_cache_delete_key().
|
||||
*
|
||||
* @param session The session to add into cache-key if @p session_based
|
||||
* is set.
|
||||
* @param pdu The CoAP PDU for which a cache-key is to be
|
||||
* calculated.
|
||||
* @param session_based COAP_CACHE_IS_SESSION_BASED if session based
|
||||
* cache-key, else COAP_CACHE_NOT_SESSION_BASED.
|
||||
* @param ignore_options The array of options to ignore.
|
||||
* @param ignore_count The number of options to ignore.
|
||||
*
|
||||
* @return The returned cache-key or @c NULL if failure.
|
||||
*/
|
||||
coap_cache_key_t *coap_cache_derive_key_w_ignore(const coap_session_t *session,
|
||||
const coap_pdu_t *pdu,
|
||||
coap_cache_session_based_t session_based,
|
||||
const uint16_t *ignore_options,
|
||||
size_t ignore_count);
|
||||
|
||||
/**
|
||||
* Delete the cache-key.
|
||||
*
|
||||
* @param cache_key The cache-key to delete.
|
||||
*/
|
||||
void coap_delete_cache_key(coap_cache_key_t *cache_key);
|
||||
|
||||
/**
|
||||
* Define the CoAP options that are not to be included when calculating
|
||||
* the cache-key. Options that are defined as Non-Cache and the Observe
|
||||
* option are always ignored.
|
||||
*
|
||||
* @param context The context to save the ignored options information in.
|
||||
* @param options The array of options to ignore.
|
||||
* @param count The number of options to ignore. Use 0 to reset the
|
||||
* options matching.
|
||||
*
|
||||
* @return @return @c 1 if successful, else @c 0.
|
||||
*/
|
||||
int coap_cache_ignore_options(coap_context_t *context,
|
||||
const uint16_t *options, size_t count);
|
||||
|
||||
/**
|
||||
* Create a new cache-entry hash keyed by cache-key derived from the PDU.
|
||||
*
|
||||
* If @p session_based is set, then this cache-entry will get deleted when
|
||||
* the session is freed off.
|
||||
* If @p record_pdu is set, then the copied PDU will get freed off when
|
||||
* this cache-entry is deleted.
|
||||
*
|
||||
* The cache-entry is maintained on a context hash list.
|
||||
*
|
||||
* @param session The session to use to derive the context from.
|
||||
* @param pdu The pdu to use to generate the cache-key.
|
||||
* @param record_pdu COAP_CACHE_RECORD_PDU if to take a copy of the PDU for
|
||||
* later use, else COAP_CACHE_NOT_RECORD_PDU.
|
||||
* @param session_based COAP_CACHE_IS_SESSION_BASED if to associate this
|
||||
* cache-entry with the the session (which is embedded
|
||||
* in the cache-entry), else COAP_CACHE_NOT_SESSION_BASED.
|
||||
* @param idle_time Idle time in seconds before cache-entry is expired.
|
||||
* If set to 0, it does not expire (but will get
|
||||
* deleted if the session is deleted and it is session_based).
|
||||
*
|
||||
* @return The returned cache-key or @c NULL if failure.
|
||||
*/
|
||||
coap_cache_entry_t *coap_new_cache_entry(coap_session_t *session,
|
||||
const coap_pdu_t *pdu,
|
||||
coap_cache_record_pdu_t record_pdu,
|
||||
coap_cache_session_based_t session_based,
|
||||
unsigned int idle_time);
|
||||
|
||||
/**
|
||||
* Remove a cache-entry from the hash list and free off all the appropriate
|
||||
* contents apart from app_data.
|
||||
*
|
||||
* @param context The context to use.
|
||||
* @param cache_entry The cache-entry to remove.
|
||||
*/
|
||||
void coap_delete_cache_entry(coap_context_t *context,
|
||||
coap_cache_entry_t *cache_entry);
|
||||
|
||||
/**
|
||||
* Searches for a cache-entry identified by @p cache_key. This
|
||||
* function returns the corresponding cache-entry or @c NULL
|
||||
* if not found.
|
||||
*
|
||||
* @param context The context to use.
|
||||
* @param cache_key The cache-key to get the hashed coap-entry.
|
||||
*
|
||||
* @return The cache-entry for @p cache_key or @c NULL if not found.
|
||||
*/
|
||||
coap_cache_entry_t *coap_cache_get_by_key(coap_context_t *context,
|
||||
const coap_cache_key_t *cache_key);
|
||||
|
||||
/**
|
||||
* Searches for a cache-entry corresponding to @p pdu. This
|
||||
* function returns the corresponding cache-entry or @c NULL if not
|
||||
* found.
|
||||
*
|
||||
* @param session The session to use.
|
||||
* @param pdu The CoAP request to search for.
|
||||
* @param session_based COAP_CACHE_IS_SESSION_BASED if session based
|
||||
* cache-key to be used, else COAP_CACHE_NOT_SESSION_BASED.
|
||||
*
|
||||
* @return The cache-entry for @p request or @c NULL if not found.
|
||||
*/
|
||||
coap_cache_entry_t *coap_cache_get_by_pdu(coap_session_t *session,
|
||||
const coap_pdu_t *pdu,
|
||||
coap_cache_session_based_t session_based);
|
||||
|
||||
/**
|
||||
* Returns the PDU information stored in the @p coap_cache entry.
|
||||
*
|
||||
* @param cache_entry The CoAP cache entry.
|
||||
*
|
||||
* @return The PDU information stored in the cache_entry or NULL
|
||||
* if the PDU was not initially copied.
|
||||
*/
|
||||
const coap_pdu_t *coap_cache_get_pdu(const coap_cache_entry_t *cache_entry);
|
||||
|
||||
/**
|
||||
* Stores @p data with the given cache entry. This function
|
||||
* overwrites any value that has previously been stored with @p
|
||||
* cache_entry.
|
||||
*
|
||||
* @param cache_entry The CoAP cache entry.
|
||||
* @param data The data pointer to store with wih the cache entry. Note that
|
||||
* this data must be valid during the lifetime of @p cache_entry.
|
||||
* @param callback The callback to call to free off this data when the
|
||||
* cache-entry is deleted, or @c NULL if not required.
|
||||
*/
|
||||
void coap_cache_set_app_data(coap_cache_entry_t *cache_entry, void *data,
|
||||
coap_cache_app_data_free_callback_t callback);
|
||||
|
||||
/**
|
||||
* Returns any application-specific data that has been stored with @p
|
||||
* cache_entry using the function coap_cache_set_app_data(). This function will
|
||||
* return @c NULL if no data has been stored.
|
||||
*
|
||||
* @param cache_entry The CoAP cache entry.
|
||||
*
|
||||
* @return The data pointer previously stored or @c NULL if no data stored.
|
||||
*/
|
||||
void *coap_cache_get_app_data(const coap_cache_entry_t *cache_entry);
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* COAP_CACHE_H */
|
@ -0,0 +1,111 @@
|
||||
/*
|
||||
* coap_cache_internal.h -- Cache functions for libcoap
|
||||
*
|
||||
* Copyright (C) 2019--2020 Olaf Bergmann <bergmann@tzi.org> and others
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file coap_cache_internal.h
|
||||
* @brief COAP cache internal information
|
||||
*/
|
||||
|
||||
#ifndef COAP_CACHE_INTERNAL_H_
|
||||
#define COAP_CACHE_INTERNAL_H_
|
||||
|
||||
#include "coap_io.h"
|
||||
|
||||
/**
|
||||
* @defgroup cache_internal Cache Support (Internal)
|
||||
* CoAP Cache Structures, Enums and Functions that are not exposed to
|
||||
* applications
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* Holds a digest in binary typically sha256 except for notls */
|
||||
typedef struct coap_digest_t {
|
||||
uint8_t key[32];
|
||||
} coap_digest_t;
|
||||
|
||||
struct coap_cache_key_t {
|
||||
uint8_t key[32];
|
||||
};
|
||||
|
||||
struct coap_cache_entry_t {
|
||||
UT_hash_handle hh;
|
||||
coap_cache_key_t *cache_key;
|
||||
coap_session_t *session;
|
||||
coap_pdu_t *pdu;
|
||||
void* app_data;
|
||||
coap_tick_t expire_ticks;
|
||||
unsigned int idle_timeout;
|
||||
coap_cache_app_data_free_callback_t callback;
|
||||
};
|
||||
|
||||
/**
|
||||
* Expire coap_cache_entry_t entries
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @param context The context holding the coap-entries to exire
|
||||
*/
|
||||
void coap_expire_cache_entries(coap_context_t *context);
|
||||
|
||||
typedef void coap_digest_ctx_t;
|
||||
|
||||
/**
|
||||
* Initialize a coap_digest
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @return The digest context or @c NULL if failure.
|
||||
*/
|
||||
coap_digest_ctx_t *coap_digest_setup(void);
|
||||
|
||||
/**
|
||||
* Free off coap_digest_ctx_t. Always done by
|
||||
* coap_digest_final()
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @param digest_ctx The coap_digest context.
|
||||
*/
|
||||
void coap_digest_free(coap_digest_ctx_t *digest_ctx);
|
||||
|
||||
/**
|
||||
* Update the coap_digest information with the next chunk of data
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @param digest_ctx The coap_digest context.
|
||||
* @param data Pointer to data.
|
||||
* @param data_len Number of bytes.
|
||||
*
|
||||
* @return @c 1 success, @c 0 failure.
|
||||
*/
|
||||
int coap_digest_update(coap_digest_ctx_t *digest_ctx,
|
||||
const uint8_t *data,
|
||||
size_t data_len
|
||||
);
|
||||
|
||||
/**
|
||||
* Finalize the coap_digest information into the provided
|
||||
* @p digest_buffer.
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @param digest_ctx The coap_digest context.
|
||||
* @param digest_buffer Pointer to digest buffer to update
|
||||
*
|
||||
* @return @c 1 success, @c 0 failure.
|
||||
*/
|
||||
int coap_digest_final(coap_digest_ctx_t *digest_ctx,
|
||||
coap_digest_t *digest_buffer);
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* COAP_CACHE_INTERNAL_H_ */
|
247
tools/sdk/esp32/include/coap/libcoap/include/coap3/coap_debug.h
Normal file
247
tools/sdk/esp32/include/coap/libcoap/include/coap3/coap_debug.h
Normal file
@ -0,0 +1,247 @@
|
||||
/*
|
||||
* coap_debug.h -- debug utilities
|
||||
*
|
||||
* Copyright (C) 2010-2011,2014 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
#ifndef COAP_DEBUG_H_
|
||||
#define COAP_DEBUG_H_
|
||||
|
||||
/**
|
||||
* @defgroup logging Logging Support
|
||||
* API functions for logging support
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef COAP_DEBUG_FD
|
||||
/**
|
||||
* Used for output for @c LOG_DEBUG to @c LOG_ERR.
|
||||
*/
|
||||
#define COAP_DEBUG_FD stdout
|
||||
#endif
|
||||
|
||||
#ifndef COAP_ERR_FD
|
||||
/**
|
||||
* Used for output for @c LOG_CRIT to @c LOG_EMERG.
|
||||
*/
|
||||
#define COAP_ERR_FD stderr
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYSLOG_H
|
||||
#include <syslog.h>
|
||||
/**
|
||||
* Logging type. One of LOG_* from @b syslog.
|
||||
*/
|
||||
typedef short coap_log_t;
|
||||
/*
|
||||
LOG_DEBUG+2 gives ciphers in GnuTLS
|
||||
Use COAP_LOG_CIPHERS to output Cipher Info in OpenSSL etc.
|
||||
*/
|
||||
#define COAP_LOG_CIPHERS (LOG_DEBUG+2)
|
||||
#else /* !HAVE_SYSLOG_H */
|
||||
/** Pre-defined log levels akin to what is used in \b syslog
|
||||
with LOG_CIPHERS added. */
|
||||
|
||||
#if !defined(RIOT_VERSION)
|
||||
typedef enum {
|
||||
LOG_EMERG=0, /**< Emergency */
|
||||
LOG_ALERT, /**< Alert */
|
||||
LOG_CRIT, /**< Critical */
|
||||
LOG_ERR, /**< Error */
|
||||
LOG_WARNING, /**< Warning */
|
||||
LOG_NOTICE, /**< Notice */
|
||||
LOG_INFO, /**< Information */
|
||||
LOG_DEBUG, /**< Debug */
|
||||
COAP_LOG_CIPHERS=LOG_DEBUG+2 /**< CipherInfo */
|
||||
} coap_log_t;
|
||||
#else /* RIOT_VERSION */
|
||||
/* RIOT defines a subset of the syslog levels in log.h with different
|
||||
* numeric values. The remaining levels are defined here. Note that
|
||||
* output granularity differs from what would be expected when
|
||||
* adhering to the syslog levels.
|
||||
*/
|
||||
#include <log.h>
|
||||
typedef short coap_log_t;
|
||||
#define LOG_EMERG (0)
|
||||
#define LOG_ALERT (1)
|
||||
#define LOG_CRIT (2)
|
||||
#define LOG_ERR (3)
|
||||
/* LOG_WARNING (4) */
|
||||
#define LOG_NOTICE (5)
|
||||
/* LOG_INFO (6) */
|
||||
/* LOG_DEBUG (7) */
|
||||
#define COAP_LOG_CIPHERS (9)
|
||||
#endif /* RIOT_VERSION */
|
||||
|
||||
#endif /* !HAVE_SYSLOG_H */
|
||||
|
||||
/**
|
||||
* Get the current logging level.
|
||||
*
|
||||
* @return One of the LOG_* values.
|
||||
*/
|
||||
coap_log_t coap_get_log_level(void);
|
||||
|
||||
/**
|
||||
* Sets the log level to the specified value.
|
||||
*
|
||||
* @param level One of the LOG_* values.
|
||||
*/
|
||||
void coap_set_log_level(coap_log_t level);
|
||||
|
||||
/**
|
||||
* Logging callback handler definition.
|
||||
*
|
||||
* @param level One of the LOG_* values.
|
||||
* @param message Zero-terminated string message to log.
|
||||
*/
|
||||
typedef void (*coap_log_handler_t) (coap_log_t level, const char *message);
|
||||
|
||||
/**
|
||||
* Add a custom log callback handler.
|
||||
*
|
||||
* @param handler The logging handler to use or @p NULL to use default handler.
|
||||
*/
|
||||
void coap_set_log_handler(coap_log_handler_t handler);
|
||||
|
||||
/**
|
||||
* Get the library package name.
|
||||
*
|
||||
* @return Zero-terminated string with the name of this library.
|
||||
*/
|
||||
const char *coap_package_name(void);
|
||||
|
||||
/**
|
||||
* Get the library package version.
|
||||
*
|
||||
* @return Zero-terminated string with the library version.
|
||||
*/
|
||||
const char *coap_package_version(void);
|
||||
|
||||
/**
|
||||
* Writes the given text to @c COAP_ERR_FD (for @p level <= @c LOG_CRIT) or @c
|
||||
* COAP_DEBUG_FD (for @p level >= @c LOG_ERR). The text is output only when
|
||||
* @p level is below or equal to the log level that set by coap_set_log_level().
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @param level One of the LOG_* values.
|
||||
& @param format The format string to use.
|
||||
*/
|
||||
#if (defined(__GNUC__))
|
||||
void coap_log_impl(coap_log_t level,
|
||||
const char *format, ...) __attribute__ ((format(printf, 2, 3)));
|
||||
#else
|
||||
void coap_log_impl(coap_log_t level, const char *format, ...);
|
||||
#endif
|
||||
|
||||
#ifndef coap_log
|
||||
/**
|
||||
* Logging function.
|
||||
* Writes the given text to @c COAP_ERR_FD (for @p level <= @c LOG_CRIT) or @c
|
||||
* COAP_DEBUG_FD (for @p level >= @c LOG_ERR). The text is output only when
|
||||
* @p level is below or equal to the log level that set by coap_set_log_level().
|
||||
*
|
||||
* @param level One of the LOG_* values.
|
||||
*/
|
||||
#define coap_log(level, ...) do { \
|
||||
if ((int)((level))<=(int)coap_get_log_level()) \
|
||||
coap_log_impl((level), __VA_ARGS__); \
|
||||
} while(0)
|
||||
#endif
|
||||
|
||||
#include "pdu.h"
|
||||
|
||||
/**
|
||||
* Defines the output mode for the coap_show_pdu() function.
|
||||
*
|
||||
* @param use_fprintf @p 1 if the output is to use fprintf() (the default)
|
||||
* @p 0 if the output is to use coap_log().
|
||||
*/
|
||||
void coap_set_show_pdu_output(int use_fprintf);
|
||||
|
||||
/**
|
||||
* Display the contents of the specified @p pdu.
|
||||
* Note: The output method of coap_show_pdu() is dependent on the setting of
|
||||
* coap_set_show_pdu_output().
|
||||
*
|
||||
* @param level The required minimum logging level.
|
||||
* @param pdu The PDU to decode.
|
||||
*/
|
||||
void coap_show_pdu(coap_log_t level, const coap_pdu_t *pdu);
|
||||
|
||||
/**
|
||||
* Display the current (D)TLS library linked with and built for version.
|
||||
*
|
||||
* @param level The required minimum logging level.
|
||||
*/
|
||||
void coap_show_tls_version(coap_log_t level);
|
||||
|
||||
/**
|
||||
* Build a string containing the current (D)TLS library linked with and
|
||||
* built for version.
|
||||
*
|
||||
* @param buffer The buffer to put the string into.
|
||||
* @param bufsize The size of the buffer to put the string into.
|
||||
*
|
||||
* @return A pointer to the provided buffer.
|
||||
*/
|
||||
char *coap_string_tls_version(char *buffer, size_t bufsize);
|
||||
|
||||
/**
|
||||
* Build a string containing the current (D)TLS library support
|
||||
*
|
||||
* @param buffer The buffer to put the string into.
|
||||
* @param bufsize The size of the buffer to put the string into.
|
||||
*
|
||||
* @return A pointer to the provided buffer.
|
||||
*/
|
||||
char *coap_string_tls_support(char *buffer, size_t bufsize);
|
||||
|
||||
/**
|
||||
* Print the address into the defined buffer.
|
||||
*
|
||||
* Internal Function.
|
||||
*
|
||||
* @param address The address to print.
|
||||
* @param buffer The buffer to print into.
|
||||
* @param size The size of the buffer to print into.
|
||||
*
|
||||
* @return The amount written into the buffer.
|
||||
*/
|
||||
size_t coap_print_addr(const coap_address_t *address,
|
||||
unsigned char *buffer, size_t size);
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* Set the packet loss level for testing. This can be in one of two forms.
|
||||
*
|
||||
* Percentage : 0% to 100%. Use the specified probability.
|
||||
* 0% is send all packets, 100% is drop all packets.
|
||||
*
|
||||
* List: A comma separated list of numbers or number ranges that are the
|
||||
* packets to drop.
|
||||
*
|
||||
* @param loss_level The defined loss level (percentage or list).
|
||||
*
|
||||
* @return @c 1 If loss level set, @c 0 if there is an error.
|
||||
*/
|
||||
int coap_debug_set_packet_loss(const char *loss_level);
|
||||
|
||||
/**
|
||||
* Check to see whether a packet should be sent or not.
|
||||
*
|
||||
* Internal function
|
||||
*
|
||||
* @return @c 1 if packet is to be sent, @c 0 if packet is to be dropped.
|
||||
*/
|
||||
int coap_debug_send_packet(void);
|
||||
|
||||
|
||||
#endif /* COAP_DEBUG_H_ */
|
485
tools/sdk/esp32/include/coap/libcoap/include/coap3/coap_dtls.h
Normal file
485
tools/sdk/esp32/include/coap/libcoap/include/coap3/coap_dtls.h
Normal file
@ -0,0 +1,485 @@
|
||||
/*
|
||||
* coap_dtls.h -- (Datagram) Transport Layer Support for libcoap
|
||||
*
|
||||
* Copyright (C) 2016 Olaf Bergmann <bergmann@tzi.org>
|
||||
* Copyright (C) 2017 Jean-Claude Michelou <jcm@spinetix.com>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
#ifndef COAP_DTLS_H_
|
||||
#define COAP_DTLS_H_
|
||||
|
||||
#include "coap_time.h"
|
||||
#include "str.h"
|
||||
|
||||
/**
|
||||
* @defgroup dtls DTLS Support
|
||||
* API functions for interfacing with DTLS libraries.
|
||||
* @{
|
||||
*/
|
||||
|
||||
typedef struct coap_dtls_pki_t coap_dtls_pki_t;
|
||||
|
||||
#ifndef COAP_DTLS_HINT_LENGTH
|
||||
#define COAP_DTLS_HINT_LENGTH 128
|
||||
#endif
|
||||
#ifndef COAP_DTLS_MAX_PSK_IDENTITY
|
||||
#define COAP_DTLS_MAX_PSK_IDENTITY 64
|
||||
#endif
|
||||
#ifndef COAP_DTLS_MAX_PSK
|
||||
#define COAP_DTLS_MAX_PSK 64
|
||||
#endif
|
||||
|
||||
typedef enum coap_dtls_role_t {
|
||||
COAP_DTLS_ROLE_CLIENT, /**< Internal function invoked for client */
|
||||
COAP_DTLS_ROLE_SERVER /**< Internal function invoked for server */
|
||||
} coap_dtls_role_t;
|
||||
|
||||
#define COAP_DTLS_RPK_CERT_CN "RPK"
|
||||
|
||||
/**
|
||||
* Check whether DTLS is available.
|
||||
*
|
||||
* @return @c 1 if support for DTLS is enabled, or @c 0 otherwise.
|
||||
*/
|
||||
int coap_dtls_is_supported(void);
|
||||
|
||||
/**
|
||||
* Check whether TLS is available.
|
||||
*
|
||||
* @return @c 1 if support for TLS is enabled, or @c 0 otherwise.
|
||||
*/
|
||||
int coap_tls_is_supported(void);
|
||||
|
||||
typedef enum coap_tls_library_t {
|
||||
COAP_TLS_LIBRARY_NOTLS = 0, /**< No DTLS library */
|
||||
COAP_TLS_LIBRARY_TINYDTLS, /**< Using TinyDTLS library */
|
||||
COAP_TLS_LIBRARY_OPENSSL, /**< Using OpenSSL library */
|
||||
COAP_TLS_LIBRARY_GNUTLS, /**< Using GnuTLS library */
|
||||
COAP_TLS_LIBRARY_MBEDTLS, /**< Using Mbed TLS library */
|
||||
} coap_tls_library_t;
|
||||
|
||||
/**
|
||||
* The structure used for returning the underlying (D)TLS library
|
||||
* information.
|
||||
*/
|
||||
typedef struct coap_tls_version_t {
|
||||
uint64_t version; /**< (D)TLS runtime Library Version */
|
||||
coap_tls_library_t type; /**< Library type. One of COAP_TLS_LIBRARY_* */
|
||||
uint64_t built_version; /**< (D)TLS Built against Library Version */
|
||||
} coap_tls_version_t;
|
||||
|
||||
/**
|
||||
* Determine the type and version of the underlying (D)TLS library.
|
||||
*
|
||||
* @return The version and type of library libcoap was compiled against.
|
||||
*/
|
||||
coap_tls_version_t *coap_get_tls_library_version(void);
|
||||
|
||||
/**
|
||||
* Additional Security setup handler that can be set up by
|
||||
* coap_context_set_pki().
|
||||
* Invoked when libcoap has done the validation checks at the TLS level,
|
||||
* but the application needs to do some additional checks/changes/updates.
|
||||
*
|
||||
* @param tls_session The security session definition - e.g. SSL * for OpenSSL.
|
||||
* NULL if server callback.
|
||||
* This will be dependent on the underlying TLS library -
|
||||
* see coap_get_tls_library_version()
|
||||
* @param setup_data A structure containing setup data originally passed into
|
||||
* coap_context_set_pki() or coap_new_client_session_pki().
|
||||
*
|
||||
* @return @c 1 if successful, else @c 0.
|
||||
*/
|
||||
typedef int (*coap_dtls_security_setup_t)(void* tls_session,
|
||||
coap_dtls_pki_t *setup_data);
|
||||
|
||||
/**
|
||||
* CN Validation callback that can be set up by coap_context_set_pki().
|
||||
* Invoked when libcoap has done the validation checks at the TLS level,
|
||||
* but the application needs to check that the CN is allowed.
|
||||
* CN is the SubjectAltName in the cert, if not present, then the leftmost
|
||||
* Common Name (CN) component of the subject name.
|
||||
* NOTE: If using RPK, then the Public Key does not contain a CN, but the
|
||||
* content of COAP_DTLS_RPK_CERT_CN is presented for the @p cn parameter.
|
||||
*
|
||||
* @param cn The determined CN from the certificate
|
||||
* @param asn1_public_cert The ASN.1 DER encoded X.509 certificate
|
||||
* @param asn1_length The ASN.1 length
|
||||
* @param coap_session The CoAP session associated with the certificate update
|
||||
* @param depth Depth in cert chain. If 0, then client cert, else a CA
|
||||
* @param validated TLS layer can find no issues if 1
|
||||
* @param arg The same as was passed into coap_context_set_pki()
|
||||
* in setup_data->cn_call_back_arg
|
||||
*
|
||||
* @return @c 1 if accepted, else @c 0 if to be rejected.
|
||||
*/
|
||||
typedef int (*coap_dtls_cn_callback_t)(const char *cn,
|
||||
const uint8_t *asn1_public_cert,
|
||||
size_t asn1_length,
|
||||
coap_session_t *coap_session,
|
||||
unsigned int depth,
|
||||
int validated,
|
||||
void *arg);
|
||||
|
||||
/**
|
||||
* The enum used for determining the provided PKI ASN.1 (DER) Private Key
|
||||
* formats.
|
||||
*/
|
||||
typedef enum coap_asn1_privatekey_type_t {
|
||||
COAP_ASN1_PKEY_NONE, /**< NONE */
|
||||
COAP_ASN1_PKEY_RSA, /**< RSA type */
|
||||
COAP_ASN1_PKEY_RSA2, /**< RSA2 type */
|
||||
COAP_ASN1_PKEY_DSA, /**< DSA type */
|
||||
COAP_ASN1_PKEY_DSA1, /**< DSA1 type */
|
||||
COAP_ASN1_PKEY_DSA2, /**< DSA2 type */
|
||||
COAP_ASN1_PKEY_DSA3, /**< DSA3 type */
|
||||
COAP_ASN1_PKEY_DSA4, /**< DSA4 type */
|
||||
COAP_ASN1_PKEY_DH, /**< DH type */
|
||||
COAP_ASN1_PKEY_DHX, /**< DHX type */
|
||||
COAP_ASN1_PKEY_EC, /**< EC type */
|
||||
COAP_ASN1_PKEY_HMAC, /**< HMAC type */
|
||||
COAP_ASN1_PKEY_CMAC, /**< CMAC type */
|
||||
COAP_ASN1_PKEY_TLS1_PRF, /**< TLS1_PRF type */
|
||||
COAP_ASN1_PKEY_HKDF /**< HKDF type */
|
||||
} coap_asn1_privatekey_type_t;
|
||||
|
||||
/**
|
||||
* The enum used for determining the PKI key formats.
|
||||
*/
|
||||
typedef enum coap_pki_key_t {
|
||||
COAP_PKI_KEY_PEM = 0, /**< The PKI key type is PEM file */
|
||||
COAP_PKI_KEY_ASN1, /**< The PKI key type is ASN.1 (DER) buffer */
|
||||
COAP_PKI_KEY_PEM_BUF, /**< The PKI key type is PEM buffer */
|
||||
COAP_PKI_KEY_PKCS11, /**< The PKI key type is PKCS11 (DER) */
|
||||
} coap_pki_key_t;
|
||||
|
||||
/**
|
||||
* The structure that holds the PKI PEM definitions.
|
||||
*/
|
||||
typedef struct coap_pki_key_pem_t {
|
||||
const char *ca_file; /**< File location of Common CA in PEM format */
|
||||
const char *public_cert; /**< File location of Public Cert */
|
||||
const char *private_key; /**< File location of Private Key in PEM format */
|
||||
} coap_pki_key_pem_t;
|
||||
|
||||
/**
|
||||
* The structure that holds the PKI PEM buffer definitions.
|
||||
* The certificates and private key data must be in PEM format.
|
||||
*
|
||||
* Note: The Certs and Key should be NULL terminated strings for
|
||||
* performance reasons (to save a potential buffer copy) and the length include
|
||||
* this NULL terminator. It is not a requirement to have the NULL terminator
|
||||
* though and the length must then reflect the actual data size.
|
||||
*/
|
||||
typedef struct coap_pki_key_pem_buf_t {
|
||||
const uint8_t *ca_cert; /**< PEM buffer Common CA Cert */
|
||||
const uint8_t *public_cert; /**< PEM buffer Public Cert, or Public Key if RPK */
|
||||
const uint8_t *private_key; /**< PEM buffer Private Key
|
||||
If RPK and 'EC PRIVATE KEY' this can be used
|
||||
for both the public_cert and private_key */
|
||||
size_t ca_cert_len; /**< PEM buffer CA Cert length */
|
||||
size_t public_cert_len; /**< PEM buffer Public Cert length */
|
||||
size_t private_key_len; /**< PEM buffer Private Key length */
|
||||
} coap_pki_key_pem_buf_t;
|
||||
|
||||
/**
|
||||
* The structure that holds the PKI ASN.1 (DER) definitions.
|
||||
*/
|
||||
typedef struct coap_pki_key_asn1_t {
|
||||
const uint8_t *ca_cert; /**< ASN1 (DER) Common CA Cert */
|
||||
const uint8_t *public_cert; /**< ASN1 (DER) Public Cert, or Public Key if RPK */
|
||||
const uint8_t *private_key; /**< ASN1 (DER) Private Key */
|
||||
size_t ca_cert_len; /**< ASN1 CA Cert length */
|
||||
size_t public_cert_len; /**< ASN1 Public Cert length */
|
||||
size_t private_key_len; /**< ASN1 Private Key length */
|
||||
coap_asn1_privatekey_type_t private_key_type; /**< Private Key Type */
|
||||
} coap_pki_key_asn1_t;
|
||||
|
||||
/**
|
||||
* The structure that holds the PKI PKCS11 definitions.
|
||||
*/
|
||||
typedef struct coap_pki_key_pkcs11_t {
|
||||
const char *ca; /**< pkcs11: URI for Common CA Certificate */
|
||||
const char *public_cert; /**< pkcs11: URI for Public Cert */
|
||||
const char *private_key; /**< pkcs11: URI for Private Key */
|
||||
const char *user_pin; /**< User pin to access PKCS11. If NULL, then
|
||||
pin-value= parameter must be set in
|
||||
pkcs11: URI as a query. */
|
||||
} coap_pki_key_pkcs11_t;
|
||||
|
||||
/**
|
||||
* The structure that holds the PKI key information.
|
||||
*/
|
||||
typedef struct coap_dtls_key_t {
|
||||
coap_pki_key_t key_type; /**< key format type */
|
||||
union {
|
||||
coap_pki_key_pem_t pem; /**< for PEM file keys */
|
||||
coap_pki_key_pem_buf_t pem_buf; /**< for PEM memory keys */
|
||||
coap_pki_key_asn1_t asn1; /**< for ASN.1 (DER) memory keys */
|
||||
coap_pki_key_pkcs11_t pkcs11; /**< for PKCS11 keys */
|
||||
} key;
|
||||
} coap_dtls_key_t;
|
||||
|
||||
/**
|
||||
* Server Name Indication (SNI) Validation callback that can be set up by
|
||||
* coap_context_set_pki().
|
||||
* Invoked if the SNI is not previously seen and prior to sending a certificate
|
||||
* set back to the client so that the appropriate certificate set can be used
|
||||
* based on the requesting SNI.
|
||||
*
|
||||
* @param sni The requested SNI
|
||||
* @param arg The same as was passed into coap_context_set_pki()
|
||||
* in setup_data->sni_call_back_arg
|
||||
*
|
||||
* @return New set of certificates to use, or @c NULL if SNI is to be rejected.
|
||||
*/
|
||||
typedef coap_dtls_key_t *(*coap_dtls_pki_sni_callback_t)(const char *sni,
|
||||
void* arg);
|
||||
|
||||
|
||||
#define COAP_DTLS_PKI_SETUP_VERSION 1 /**< Latest PKI setup version */
|
||||
|
||||
/**
|
||||
* The structure used for defining the PKI setup data to be used.
|
||||
*/
|
||||
struct coap_dtls_pki_t {
|
||||
uint8_t version; /** Set to COAP_DTLS_PKI_SETUP_VERSION
|
||||
to support this version of the struct */
|
||||
|
||||
/* Options to enable different TLS functionality in libcoap */
|
||||
uint8_t verify_peer_cert; /**< 1 if peer cert is to be verified */
|
||||
uint8_t check_common_ca; /**< 1 if peer cert is to be signed by
|
||||
* the same CA as the local cert */
|
||||
uint8_t allow_self_signed; /**< 1 if self-signed certs are allowed.
|
||||
* Ignored if check_common_ca set */
|
||||
uint8_t allow_expired_certs; /**< 1 if expired certs are allowed */
|
||||
uint8_t cert_chain_validation; /**< 1 if to check cert_chain_verify_depth */
|
||||
uint8_t cert_chain_verify_depth; /**< recommended depth is 3 */
|
||||
uint8_t check_cert_revocation; /**< 1 if revocation checks wanted */
|
||||
uint8_t allow_no_crl; /**< 1 ignore if CRL not there */
|
||||
uint8_t allow_expired_crl; /**< 1 if expired crl is allowed */
|
||||
uint8_t allow_bad_md_hash; /**< 1 if unsupported MD hashes are allowed */
|
||||
uint8_t allow_short_rsa_length; /**< 1 if small RSA keysizes are allowed */
|
||||
uint8_t is_rpk_not_cert; /**< 1 is RPK instead of Public Certificate.
|
||||
* If set, PKI key format type cannot be
|
||||
* COAP_PKI_KEY_PEM */
|
||||
uint8_t reserved[3]; /**< Reserved - must be set to 0 for
|
||||
future compatibility */
|
||||
/* Size of 3 chosen to align to next
|
||||
* parameter, so if newly defined option
|
||||
* it can use one of the reserverd slot so
|
||||
* no need to change
|
||||
* COAP_DTLS_PKI_SETUP_VERSION and just
|
||||
* decrement the reserved[] count.
|
||||
*/
|
||||
|
||||
/** CN check callback function.
|
||||
* If not NULL, is called when the TLS connection has passed the configured
|
||||
* TLS options above for the application to verify if the CN is valid.
|
||||
*/
|
||||
coap_dtls_cn_callback_t validate_cn_call_back;
|
||||
void *cn_call_back_arg; /**< Passed in to the CN callback function */
|
||||
|
||||
/** SNI check callback function.
|
||||
* If not @p NULL, called if the SNI is not previously seen and prior to
|
||||
* sending a certificate set back to the client so that the appropriate
|
||||
* certificate set can be used based on the requesting SNI.
|
||||
*/
|
||||
coap_dtls_pki_sni_callback_t validate_sni_call_back;
|
||||
void *sni_call_back_arg; /**< Passed in to the sni callback function */
|
||||
|
||||
/** Additional Security callback handler that is invoked when libcoap has
|
||||
* done the standard, defined validation checks at the TLS level,
|
||||
* If not @p NULL, called from within the TLS Client Hello connection
|
||||
* setup.
|
||||
*/
|
||||
coap_dtls_security_setup_t additional_tls_setup_call_back;
|
||||
|
||||
char* client_sni; /**< If not NULL, SNI to use in client TLS setup.
|
||||
Owned by the client app and must remain valid
|
||||
during the call to coap_new_client_session_pki() */
|
||||
|
||||
coap_dtls_key_t pki_key; /**< PKI key definition */
|
||||
};
|
||||
|
||||
/**
|
||||
* The structure that holds the Client PSK information.
|
||||
*/
|
||||
typedef struct coap_dtls_cpsk_info_t {
|
||||
coap_bin_const_t identity;
|
||||
coap_bin_const_t key;
|
||||
} coap_dtls_cpsk_info_t;
|
||||
|
||||
/**
|
||||
* Identity Hint Validation callback that can be set up by
|
||||
* coap_new_client_session_psk2().
|
||||
* Invoked when libcoap has done the validation checks at the TLS level,
|
||||
* but the application needs to check that the Identity Hint is allowed,
|
||||
* and thus needs to use the appropriate PSK information for the Identity
|
||||
* Hint for the (D)TLS session.
|
||||
* Note: Identity Hint is not supported in (D)TLS1.3.
|
||||
*
|
||||
* @param hint The server provided Identity Hint
|
||||
* @param coap_session The CoAP session associated with the Identity Hint
|
||||
* @param arg The same as was passed into coap_new_client_session_psk2()
|
||||
* in setup_data->ih_call_back_arg
|
||||
*
|
||||
* @return New coap_dtls_cpsk_info_t object or @c NULL on error.
|
||||
*/
|
||||
typedef const coap_dtls_cpsk_info_t *(*coap_dtls_ih_callback_t)(
|
||||
coap_str_const_t *hint,
|
||||
coap_session_t *coap_session,
|
||||
void *arg);
|
||||
|
||||
#define COAP_DTLS_CPSK_SETUP_VERSION 1 /**< Latest CPSK setup version */
|
||||
|
||||
/**
|
||||
* The structure used for defining the Client PSK setup data to be used.
|
||||
*/
|
||||
typedef struct coap_dtls_cpsk_t {
|
||||
uint8_t version; /** Set to COAP_DTLS_CPSK_SETUP_VERSION
|
||||
to support this version of the struct */
|
||||
|
||||
/* Options to enable different TLS functionality in libcoap */
|
||||
uint8_t reserved[7]; /**< Reserved - must be set to 0 for
|
||||
future compatibility */
|
||||
/* Size of 7 chosen to align to next
|
||||
* parameter, so if newly defined option
|
||||
* it can use one of the reserverd slot so
|
||||
* no need to change
|
||||
* COAP_DTLS_CPSK_SETUP_VERSION and just
|
||||
* decrement the reserved[] count.
|
||||
*/
|
||||
|
||||
/** Identity Hint check callback function.
|
||||
* If not NULL, is called when the Identity Hint (TLS1.2 or earlier) is
|
||||
* provided by the server.
|
||||
* The appropriate Identity and Pre-shared Key to use can then be returned.
|
||||
*/
|
||||
coap_dtls_ih_callback_t validate_ih_call_back;
|
||||
void *ih_call_back_arg; /**< Passed in to the Identity Hint callback
|
||||
function */
|
||||
|
||||
char* client_sni; /**< If not NULL, SNI to use in client TLS setup.
|
||||
Owned by the client app and must remain valid
|
||||
during the call to coap_new_client_session_psk2()
|
||||
Note: Not supported by TinyDTLS. */
|
||||
|
||||
coap_dtls_cpsk_info_t psk_info; /**< Client PSK definition */
|
||||
} coap_dtls_cpsk_t;
|
||||
|
||||
/**
|
||||
* The structure that holds the Server Pre-Shared Key and Identity
|
||||
* Hint information.
|
||||
*/
|
||||
typedef struct coap_dtls_spsk_info_t {
|
||||
coap_bin_const_t hint;
|
||||
coap_bin_const_t key;
|
||||
} coap_dtls_spsk_info_t;
|
||||
|
||||
|
||||
/**
|
||||
* Identity Validation callback that can be set up by
|
||||
* coap_context_set_psk2().
|
||||
* Invoked when libcoap has done the validation checks at the TLS level,
|
||||
* but the application needs to check that the Identity is allowed,
|
||||
* and needs to use the appropriate Pre-Shared Key for the (D)TLS session.
|
||||
*
|
||||
* @param identity The client provided Identity
|
||||
* @param coap_session The CoAP session associated with the Identity Hint
|
||||
* @param arg The value as passed into coap_context_set_psk2()
|
||||
* in setup_data->id_call_back_arg
|
||||
*
|
||||
* @return New coap_bin_const_t object containing the Pre-Shared Key or
|
||||
@c NULL on error.
|
||||
* Note: This information will be duplicated into an internal
|
||||
* structure.
|
||||
*/
|
||||
typedef const coap_bin_const_t *(*coap_dtls_id_callback_t)(
|
||||
coap_bin_const_t *identity,
|
||||
coap_session_t *coap_session,
|
||||
void *arg);
|
||||
/**
|
||||
* PSK SNI callback that can be set up by coap_context_set_psk2().
|
||||
* Invoked when libcoap has done the validation checks at the TLS level
|
||||
* and the application needs to:-
|
||||
* a) check that the SNI is allowed
|
||||
* b) provide the appropriate PSK information for the (D)TLS session.
|
||||
*
|
||||
* @param sni The client provided SNI
|
||||
* @param coap_session The CoAP session associated with the SNI
|
||||
* @param arg The same as was passed into coap_context_set_psk2()
|
||||
* in setup_data->sni_call_back_arg
|
||||
*
|
||||
* @return New coap_dtls_spsk_info_t object or @c NULL on error.
|
||||
*/
|
||||
typedef const coap_dtls_spsk_info_t *(*coap_dtls_psk_sni_callback_t)(
|
||||
const char *sni,
|
||||
coap_session_t *coap_session,
|
||||
void *arg);
|
||||
|
||||
#define COAP_DTLS_SPSK_SETUP_VERSION 1 /**< Latest SPSK setup version */
|
||||
|
||||
/**
|
||||
* The structure used for defining the Server PSK setup data to be used.
|
||||
*/
|
||||
typedef struct coap_dtls_spsk_t {
|
||||
uint8_t version; /** Set to COAP_DTLS_SPSK_SETUP_VERSION
|
||||
to support this version of the struct */
|
||||
|
||||
/* Options to enable different TLS functionality in libcoap */
|
||||
uint8_t reserved[7]; /**< Reserved - must be set to 0 for
|
||||
future compatibility */
|
||||
/* Size of 7 chosen to align to next
|
||||
* parameter, so if newly defined option
|
||||
* it can use one of the reserverd slot so
|
||||
* no need to change
|
||||
* COAP_DTLS_SPSK_SETUP_VERSION and just
|
||||
* decrement the reserved[] count.
|
||||
*/
|
||||
|
||||
/** Identity check callback function.
|
||||
* If not @p NULL, is called when the Identity is provided by the client.
|
||||
* The appropriate Pre-Shared Key to use can then be returned.
|
||||
*/
|
||||
coap_dtls_id_callback_t validate_id_call_back;
|
||||
void *id_call_back_arg; /**< Passed in to the Identity callback function */
|
||||
|
||||
/** SNI check callback function.
|
||||
* If not @p NULL, called if the SNI is not previously seen and prior to
|
||||
* sending PSK information back to the client so that the appropriate
|
||||
* PSK information can be used based on the requesting SNI.
|
||||
*/
|
||||
coap_dtls_psk_sni_callback_t validate_sni_call_back;
|
||||
void *sni_call_back_arg; /**< Passed in to the SNI callback function */
|
||||
|
||||
coap_dtls_spsk_info_t psk_info; /**< Server PSK definition */
|
||||
} coap_dtls_spsk_t;
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @ingroup logging
|
||||
* Sets the (D)TLS logging level to the specified @p level.
|
||||
* Note: coap_log_level() will influence output if at a specified level.
|
||||
*
|
||||
* @param level The logging level to use - LOG_*
|
||||
*/
|
||||
void coap_dtls_set_log_level(int level);
|
||||
|
||||
/**
|
||||
* @ingroup logging
|
||||
* Get the current (D)TLS logging.
|
||||
*
|
||||
* @return The current log level (one of LOG_*).
|
||||
*/
|
||||
int coap_dtls_get_log_level(void);
|
||||
|
||||
|
||||
#endif /* COAP_DTLS_H */
|
@ -0,0 +1,345 @@
|
||||
/*
|
||||
* coap_dtls_internal.h -- (Datagram) Transport Layer Support for libcoap
|
||||
*
|
||||
* Copyright (C) 2016 Olaf Bergmann <bergmann@tzi.org>
|
||||
* Copyright (C) 2017 Jean-Claude Michelou <jcm@spinetix.com>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
#ifndef COAP_DTLS_INTERNAL_H_
|
||||
#define COAP_DTLS_INTERNAL_H_
|
||||
|
||||
/**
|
||||
* @defgroup dtls_internal DTLS Support (Internal)
|
||||
* CoAP DTLS Structures, Enums and Functions that are not exposed to
|
||||
* applications
|
||||
* @{
|
||||
*/
|
||||
|
||||
/* https://tools.ietf.org/html/rfc6347#section-4.2.4.1 */
|
||||
#ifndef COAP_DTLS_RETRANSMIT_MS
|
||||
#define COAP_DTLS_RETRANSMIT_MS 1000
|
||||
#endif
|
||||
#ifndef COAP_DTLS_RETRANSMIT_TOTAL_MS
|
||||
#define COAP_DTLS_RETRANSMIT_TOTAL_MS 60000
|
||||
#endif
|
||||
|
||||
#define COAP_DTLS_RETRANSMIT_COAP_TICKS (COAP_DTLS_RETRANSMIT_MS * COAP_TICKS_PER_SECOND / 1000)
|
||||
|
||||
/**
|
||||
* Creates a new DTLS context for the given @p coap_context. This function
|
||||
* returns a pointer to a new DTLS context object or @c NULL on error.
|
||||
*
|
||||
* @param coap_context The CoAP context where the DTLS object shall be used.
|
||||
*
|
||||
* @return A DTLS context object or @c NULL on error.
|
||||
*/
|
||||
void *
|
||||
coap_dtls_new_context(coap_context_t *coap_context);
|
||||
|
||||
/**
|
||||
* Set the DTLS context's default server PSK information.
|
||||
* This does the PSK specifics following coap_dtls_new_context().
|
||||
*
|
||||
* @param coap_context The CoAP context.
|
||||
* @param setup_data A structure containing setup data originally passed into
|
||||
* coap_context_set_psk2().
|
||||
*
|
||||
* @return @c 1 if successful, else @c 0.
|
||||
*/
|
||||
|
||||
int
|
||||
coap_dtls_context_set_spsk(coap_context_t *coap_context,
|
||||
coap_dtls_spsk_t *setup_data);
|
||||
|
||||
/**
|
||||
* Set the DTLS context's default client PSK information.
|
||||
* This does the PSK specifics following coap_dtls_new_context().
|
||||
*
|
||||
* @param coap_context The CoAP context.
|
||||
* @param setup_data A structure containing setup data originally passed into
|
||||
* coap_new_client_session_psk2().
|
||||
*
|
||||
* @return @c 1 if successful, else @c 0.
|
||||
*/
|
||||
|
||||
int
|
||||
coap_dtls_context_set_cpsk(coap_context_t *coap_context,
|
||||
coap_dtls_cpsk_t *setup_data);
|
||||
|
||||
/**
|
||||
* Set the DTLS context's default server PKI information.
|
||||
* This does the PKI specifics following coap_dtls_new_context().
|
||||
* If @p COAP_DTLS_ROLE_SERVER, then the information will get put into the
|
||||
* TLS library's context (from which sessions are derived).
|
||||
* If @p COAP_DTLS_ROLE_CLIENT, then the information will get put into the
|
||||
* TLS library's session.
|
||||
*
|
||||
* @param coap_context The CoAP context.
|
||||
* @param setup_data Setup information defining how PKI is to be setup.
|
||||
* Required parameter. If @p NULL, PKI will not be
|
||||
* set up.
|
||||
* @param role One of @p COAP_DTLS_ROLE_CLIENT or @p COAP_DTLS_ROLE_SERVER
|
||||
*
|
||||
* @return @c 1 if successful, else @c 0.
|
||||
*/
|
||||
|
||||
int
|
||||
coap_dtls_context_set_pki(coap_context_t *coap_context,
|
||||
const coap_dtls_pki_t *setup_data,
|
||||
const coap_dtls_role_t role);
|
||||
|
||||
/**
|
||||
* Set the dtls context's default Root CA information for a client or server.
|
||||
*
|
||||
* @param coap_context The current coap_context_t object.
|
||||
* @param ca_file If not @p NULL, is the full path name of a PEM encoded
|
||||
* file containing all the Root CAs to be used.
|
||||
* @param ca_dir If not @p NULL, points to a directory containing PEM
|
||||
* encoded files containing all the Root CAs to be used.
|
||||
*
|
||||
* @return @c 1 if successful, else @c 0.
|
||||
*/
|
||||
|
||||
int
|
||||
coap_dtls_context_set_pki_root_cas(coap_context_t *coap_context,
|
||||
const char *ca_file,
|
||||
const char *ca_dir);
|
||||
|
||||
/**
|
||||
* Check whether one of the coap_dtls_context_set_{psk|pki}() functions have
|
||||
* been called.
|
||||
*
|
||||
* @param coap_context The current coap_context_t object.
|
||||
*
|
||||
* @return @c 1 if coap_dtls_context_set_{psk|pki}() called, else @c 0.
|
||||
*/
|
||||
|
||||
int coap_dtls_context_check_keys_enabled(coap_context_t *coap_context);
|
||||
|
||||
/**
|
||||
* Releases the storage allocated for @p dtls_context.
|
||||
*
|
||||
* @param dtls_context The DTLS context as returned by coap_dtls_new_context().
|
||||
*/
|
||||
void coap_dtls_free_context(void *dtls_context);
|
||||
|
||||
/**
|
||||
* Create a new client-side session. This should send a HELLO to the server.
|
||||
*
|
||||
* @param coap_session The CoAP session.
|
||||
*
|
||||
* @return Opaque handle to underlying TLS library object containing security
|
||||
* parameters for the session.
|
||||
*/
|
||||
void *coap_dtls_new_client_session(coap_session_t *coap_session);
|
||||
|
||||
/**
|
||||
* Create a new DTLS server-side session.
|
||||
* Called after coap_dtls_hello() has returned @c 1, signalling that a validated
|
||||
* HELLO was received from a client.
|
||||
* This should send a HELLO to the server.
|
||||
*
|
||||
* @param coap_session The CoAP session.
|
||||
*
|
||||
* @return Opaque handle to underlying TLS library object containing security
|
||||
* parameters for the DTLS session.
|
||||
*/
|
||||
void *coap_dtls_new_server_session(coap_session_t *coap_session);
|
||||
|
||||
/**
|
||||
* Terminates the DTLS session (may send an ALERT if necessary) then frees the
|
||||
* underlying TLS library object containing security parameters for the session.
|
||||
*
|
||||
* @param coap_session The CoAP session.
|
||||
*/
|
||||
void coap_dtls_free_session(coap_session_t *coap_session);
|
||||
|
||||
/**
|
||||
* Notify of a change in the CoAP session's MTU, for example after
|
||||
* a PMTU update.
|
||||
*
|
||||
* @param coap_session The CoAP session.
|
||||
*/
|
||||
void coap_dtls_session_update_mtu(coap_session_t *coap_session);
|
||||
|
||||
/**
|
||||
* Send data to a DTLS peer.
|
||||
*
|
||||
* @param coap_session The CoAP session.
|
||||
* @param data pointer to data.
|
||||
* @param data_len Number of bytes to send.
|
||||
*
|
||||
* @return @c 0 if this would be blocking, @c -1 if there is an error or the
|
||||
* number of cleartext bytes sent.
|
||||
*/
|
||||
int coap_dtls_send(coap_session_t *coap_session,
|
||||
const uint8_t *data,
|
||||
size_t data_len);
|
||||
|
||||
/**
|
||||
* Check if timeout is handled per CoAP session or per CoAP context.
|
||||
*
|
||||
* @return @c 1 of timeout and retransmit is per context, @c 0 if it is
|
||||
* per session.
|
||||
*/
|
||||
int coap_dtls_is_context_timeout(void);
|
||||
|
||||
/**
|
||||
* Do all pending retransmits and get next timeout
|
||||
*
|
||||
* @param dtls_context The DTLS context.
|
||||
*
|
||||
* @return @c 0 if no event is pending or date of the next retransmit.
|
||||
*/
|
||||
coap_tick_t coap_dtls_get_context_timeout(void *dtls_context);
|
||||
|
||||
/**
|
||||
* Get next timeout for this session.
|
||||
*
|
||||
* @param coap_session The CoAP session.
|
||||
* @param now The current time in ticks.
|
||||
*
|
||||
* @return @c 0 If no event is pending or ticks time of the next retransmit.
|
||||
*/
|
||||
coap_tick_t coap_dtls_get_timeout(coap_session_t *coap_session,
|
||||
coap_tick_t now);
|
||||
|
||||
/**
|
||||
* Handle a DTLS timeout expiration.
|
||||
*
|
||||
* @param coap_session The CoAP session.
|
||||
*/
|
||||
void coap_dtls_handle_timeout(coap_session_t *coap_session);
|
||||
|
||||
/**
|
||||
* Handling incoming data from a DTLS peer.
|
||||
*
|
||||
* @param coap_session The CoAP session.
|
||||
* @param data Encrypted datagram.
|
||||
* @param data_len Encrypted datagram size.
|
||||
*
|
||||
* @return Result of coap_handle_dgram on the decrypted CoAP PDU
|
||||
* or @c -1 for error.
|
||||
*/
|
||||
int coap_dtls_receive(coap_session_t *coap_session,
|
||||
const uint8_t *data,
|
||||
size_t data_len);
|
||||
|
||||
/**
|
||||
* Handling client HELLO messages from a new candiate peer.
|
||||
* Note that session->tls is empty.
|
||||
*
|
||||
* @param coap_session The CoAP session.
|
||||
* @param data Encrypted datagram.
|
||||
* @param data_len Encrypted datagram size.
|
||||
*
|
||||
* @return @c 0 if a cookie verification message has been sent, @c 1 if the
|
||||
* HELLO contains a valid cookie and a server session should be created,
|
||||
* @c -1 if the message is invalid.
|
||||
*/
|
||||
int coap_dtls_hello(coap_session_t *coap_session,
|
||||
const uint8_t *data,
|
||||
size_t data_len);
|
||||
|
||||
/**
|
||||
* Get DTLS overhead over cleartext PDUs.
|
||||
*
|
||||
* @param coap_session The CoAP session.
|
||||
*
|
||||
* @return Maximum number of bytes added by DTLS layer.
|
||||
*/
|
||||
unsigned int coap_dtls_get_overhead(coap_session_t *coap_session);
|
||||
|
||||
/**
|
||||
* Create a new TLS client-side session.
|
||||
*
|
||||
* @param coap_session The CoAP session.
|
||||
* @param connected Updated with whether the connection is connected yet or not.
|
||||
* @c 0 is not connected, @c 1 is connected.
|
||||
*
|
||||
* @return Opaque handle to underlying TLS library object containing security
|
||||
* parameters for the session.
|
||||
*/
|
||||
void *coap_tls_new_client_session(coap_session_t *coap_session, int *connected);
|
||||
|
||||
/**
|
||||
* Create a TLS new server-side session.
|
||||
*
|
||||
* @param coap_session The CoAP session.
|
||||
* @param connected Updated with whether the connection is connected yet or not.
|
||||
* @c 0 is not connected, @c 1 is connected.
|
||||
*
|
||||
* @return Opaque handle to underlying TLS library object containing security
|
||||
* parameters for the session.
|
||||
*/
|
||||
void *coap_tls_new_server_session(coap_session_t *coap_session, int *connected);
|
||||
|
||||
/**
|
||||
* Terminates the TLS session (may send an ALERT if necessary) then frees the
|
||||
* underlying TLS library object containing security parameters for the session.
|
||||
*
|
||||
* @param coap_session The CoAP session.
|
||||
*/
|
||||
void coap_tls_free_session( coap_session_t *coap_session );
|
||||
|
||||
/**
|
||||
* Send data to a TLS peer, with implicit flush.
|
||||
*
|
||||
* @param coap_session The CoAP session.
|
||||
* @param data Pointer to data.
|
||||
* @param data_len Number of bytes to send.
|
||||
*
|
||||
* @return @c 0 if this should be retried, @c -1 if there is an error
|
||||
* or the number of cleartext bytes sent.
|
||||
*/
|
||||
ssize_t coap_tls_write(coap_session_t *coap_session,
|
||||
const uint8_t *data,
|
||||
size_t data_len
|
||||
);
|
||||
|
||||
/**
|
||||
* Read some data from a TLS peer.
|
||||
*
|
||||
* @param coap_session The CoAP session.
|
||||
* @param data Pointer to data.
|
||||
* @param data_len Maximum number of bytes to read.
|
||||
*
|
||||
* @return @c 0 if this should be retried, @c -1 if there is an error
|
||||
* or the number of cleartext bytes read.
|
||||
*/
|
||||
ssize_t coap_tls_read(coap_session_t *coap_session,
|
||||
uint8_t *data,
|
||||
size_t data_len
|
||||
);
|
||||
|
||||
/**
|
||||
* Initialize the underlying (D)TLS Library layer.
|
||||
*
|
||||
*/
|
||||
void coap_dtls_startup(void);
|
||||
|
||||
/**
|
||||
* Close down the underlying (D)TLS Library layer.
|
||||
*
|
||||
*/
|
||||
void coap_dtls_shutdown(void);
|
||||
|
||||
/**
|
||||
* Get the actual (D)TLS object for the session.
|
||||
*
|
||||
* @param session The session.
|
||||
* @param tls_lib Updated with the library type.
|
||||
*
|
||||
* @return The TLS information.
|
||||
*/
|
||||
void *coap_dtls_get_tls(const coap_session_t *session,
|
||||
coap_tls_library_t *tls_lib);
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* COAP_DTLS_INTERNAL_H */
|
104
tools/sdk/esp32/include/coap/libcoap/include/coap3/coap_event.h
Normal file
104
tools/sdk/esp32/include/coap/libcoap/include/coap3/coap_event.h
Normal file
@ -0,0 +1,104 @@
|
||||
/*
|
||||
* coap_event.h -- libcoap Event API
|
||||
*
|
||||
* Copyright (C) 2016 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
#ifndef COAP_EVENT_H_
|
||||
#define COAP_EVENT_H_
|
||||
|
||||
#include "libcoap.h"
|
||||
|
||||
/**
|
||||
* @defgroup events Event API
|
||||
* API functions for event delivery from lower-layer library functions.
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Scalar type to represent different events, e.g. DTLS events or
|
||||
* retransmission timeouts.
|
||||
*/
|
||||
typedef enum coap_event_t {
|
||||
/**
|
||||
* (D)TLS events for COAP_PROTO_DTLS and COAP_PROTO_TLS
|
||||
*/
|
||||
COAP_EVENT_DTLS_CLOSED = 0x0000,
|
||||
COAP_EVENT_DTLS_CONNECTED = 0x01DE,
|
||||
COAP_EVENT_DTLS_RENEGOTIATE = 0x01DF,
|
||||
COAP_EVENT_DTLS_ERROR = 0x0200,
|
||||
|
||||
/**
|
||||
* TCP events for COAP_PROTO_TCP and COAP_PROTO_TLS
|
||||
*/
|
||||
COAP_EVENT_TCP_CONNECTED = 0x1001,
|
||||
COAP_EVENT_TCP_CLOSED = 0x1002,
|
||||
COAP_EVENT_TCP_FAILED = 0x1003,
|
||||
|
||||
/**
|
||||
* CSM exchange events for reliable protocols only
|
||||
*/
|
||||
COAP_EVENT_SESSION_CONNECTED = 0x2001,
|
||||
COAP_EVENT_SESSION_CLOSED = 0x2002,
|
||||
COAP_EVENT_SESSION_FAILED = 0x2003,
|
||||
|
||||
/**
|
||||
* (Q-)BLOCK receive errors
|
||||
*/
|
||||
COAP_EVENT_PARTIAL_BLOCK = 0x3001
|
||||
} coap_event_t;
|
||||
|
||||
/**
|
||||
* Type for event handler functions that can be registered with a CoAP
|
||||
* context using the unction coap_set_event_handler(). When called by
|
||||
* the library, the first argument will be the current coap_session_t object
|
||||
* which is associated with the original CoAP context. The second parameter
|
||||
* is the event type.
|
||||
*/
|
||||
typedef int (*coap_event_handler_t)(coap_session_t *session,
|
||||
const coap_event_t event);
|
||||
|
||||
/**
|
||||
* Registers the function @p hnd as callback for events from the given
|
||||
* CoAP context @p context. Any event handler that has previously been
|
||||
* registered with @p context will be overwritten by this operation.
|
||||
*
|
||||
* @param context The CoAP context to register the event handler with.
|
||||
* @param hnd The event handler to be registered. @c NULL if to be
|
||||
* de-registered.
|
||||
*/
|
||||
void coap_register_event_handler(coap_context_t *context,
|
||||
coap_event_handler_t hnd);
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* Registers the function @p hnd as callback for events from the given
|
||||
* CoAP context @p context. Any event handler that has previously been
|
||||
* registered with @p context will be overwritten by this operation.
|
||||
*
|
||||
* @deprecated Use coap_register_event_handler() instead.
|
||||
*
|
||||
* @param context The CoAP context to register the event handler with.
|
||||
* @param hnd The event handler to be registered.
|
||||
*/
|
||||
COAP_DEPRECATED
|
||||
void coap_set_event_handler(coap_context_t *context,
|
||||
coap_event_handler_t hnd);
|
||||
|
||||
/**
|
||||
* Clears the event handler registered with @p context.
|
||||
*
|
||||
* @deprecated Use coap_register_event_handler() instead with NULL for hnd.
|
||||
*
|
||||
* @param context The CoAP context whose event handler is to be removed.
|
||||
*/
|
||||
COAP_DEPRECATED
|
||||
void coap_clear_event_handler(coap_context_t *context);
|
||||
|
||||
#endif /* COAP_EVENT_H */
|
@ -0,0 +1,107 @@
|
||||
/*
|
||||
* coap_forward_decls.h -- Forward declarations of structures that are
|
||||
* opaque to application programming that use libcoap.
|
||||
*
|
||||
* Copyright (C) 2019-2021 Jon Shallow <supjps-libcoap@jpshallow.com>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file coap_forward_decls.h
|
||||
* @brief COAP forward definitions
|
||||
*/
|
||||
|
||||
#ifndef COAP_FORWARD_DECLS_H_
|
||||
#define COAP_FORWARD_DECLS_H_
|
||||
|
||||
/*
|
||||
* Define the forward declations for the structures (even non-opaque)
|
||||
* so that applications (using coap.h) as well as libcoap builds
|
||||
* can reference them (and makes .h file dependencies a lot simpler).
|
||||
*/
|
||||
struct coap_address_t;
|
||||
struct coap_bin_const_t;
|
||||
struct coap_dtls_pki_t;
|
||||
struct coap_str_const_t;
|
||||
struct coap_string_t;
|
||||
|
||||
/*
|
||||
* typedef all the opaque structures that are defined in coap_*_internal.h
|
||||
*/
|
||||
|
||||
/* ************* coap_async_internal.h ***************** */
|
||||
|
||||
/**
|
||||
* Async Entry information.
|
||||
*/
|
||||
typedef struct coap_async_t coap_async_t;
|
||||
|
||||
/* ************* coap_block_internal.h ***************** */
|
||||
|
||||
/*
|
||||
* Block handling information.
|
||||
*/
|
||||
typedef struct coap_lg_xmit_t coap_lg_xmit_t;
|
||||
typedef struct coap_lg_crcv_t coap_lg_crcv_t;
|
||||
typedef struct coap_lg_srcv_t coap_lg_srcv_t;
|
||||
|
||||
/* ************* coap_cache_internal.h ***************** */
|
||||
|
||||
/*
|
||||
* Cache Entry information.
|
||||
*/
|
||||
typedef struct coap_cache_entry_t coap_cache_entry_t;
|
||||
typedef struct coap_cache_key_t coap_cache_key_t;
|
||||
|
||||
/* ************* coap_io_internal.h ***************** */
|
||||
|
||||
/**
|
||||
* coap_socket_t and coap_packet_t information.
|
||||
*/
|
||||
typedef struct coap_packet_t coap_packet_t;
|
||||
typedef struct coap_socket_t coap_socket_t;
|
||||
|
||||
/* ************* coap_net_internal.h ***************** */
|
||||
|
||||
/*
|
||||
* Net information.
|
||||
*/
|
||||
typedef struct coap_context_t coap_context_t;
|
||||
typedef struct coap_queue_t coap_queue_t;
|
||||
|
||||
/* ************* coap_pdu_internal.h ***************** */
|
||||
|
||||
/**
|
||||
* PDU information.
|
||||
*/
|
||||
typedef struct coap_pdu_t coap_pdu_t;
|
||||
|
||||
/* ************* coap_resource_internal.h ***************** */
|
||||
|
||||
/*
|
||||
* Resource information.
|
||||
*/
|
||||
typedef struct coap_attr_t coap_attr_t;
|
||||
typedef struct coap_resource_t coap_resource_t;
|
||||
|
||||
/* ************* coap_session_internal.h ***************** */
|
||||
|
||||
/*
|
||||
* Session information.
|
||||
*/
|
||||
typedef struct coap_addr_hash_t coap_addr_hash_t;
|
||||
typedef struct coap_endpoint_t coap_endpoint_t;
|
||||
typedef struct coap_session_t coap_session_t;
|
||||
|
||||
/* ************* coap_subscribe_internal.h ***************** */
|
||||
|
||||
/*
|
||||
* Observe subscriber information.
|
||||
*/
|
||||
typedef struct coap_subscription_t coap_subscription_t;
|
||||
|
||||
#endif /* COAP_FORWARD_DECLS_H_ */
|
@ -0,0 +1,61 @@
|
||||
/*
|
||||
* coap_hashkey.h -- definition of hash key type and helper functions
|
||||
*
|
||||
* Copyright (C) 2010-2011 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file coap_hashkey.h
|
||||
* @brief definition of hash key type and helper functions
|
||||
*/
|
||||
|
||||
#ifndef COAP_HASHKEY_H_
|
||||
#define COAP_HASHKEY_H_
|
||||
|
||||
#include "libcoap.h"
|
||||
#include "uthash.h"
|
||||
#include "str.h"
|
||||
|
||||
typedef unsigned char coap_key_t[4];
|
||||
|
||||
#ifndef coap_hash
|
||||
/**
|
||||
* Calculates a fast hash over the given string @p s of length @p len and stores
|
||||
* the result into @p h. Depending on the exact implementation, this function
|
||||
* cannot be used as one-way function to check message integrity or simlar.
|
||||
*
|
||||
* @param s The string used for hash calculation.
|
||||
* @param len The length of @p s.
|
||||
* @param h The result buffer to store the calculated hash key.
|
||||
*/
|
||||
void coap_hash_impl(const unsigned char *s, size_t len, coap_key_t h);
|
||||
|
||||
#define coap_hash(String,Length,Result) \
|
||||
coap_hash_impl((String),(Length),(Result))
|
||||
|
||||
/* This is used to control the pre-set hash-keys for resources. */
|
||||
#define COAP_DEFAULT_HASH
|
||||
#else
|
||||
#undef COAP_DEFAULT_HASH
|
||||
#endif /* coap_hash */
|
||||
|
||||
/**
|
||||
* Calls coap_hash() with given @c coap_string_t object as parameter.
|
||||
*
|
||||
* @param Str Must contain a pointer to a coap string object.
|
||||
* @param H A coap_key_t object to store the result.
|
||||
*
|
||||
* @hideinitializer
|
||||
*/
|
||||
#define coap_str_hash(Str,H) { \
|
||||
assert(Str); \
|
||||
memset((H), 0, sizeof(coap_key_t)); \
|
||||
coap_hash((Str)->s, (Str)->length, (H)); \
|
||||
}
|
||||
|
||||
#endif /* COAP_HASHKEY_H_ */
|
@ -0,0 +1,65 @@
|
||||
/*
|
||||
* coap_internal.h -- Structures, Enums & Functions that are not exposed to
|
||||
* application programming
|
||||
*
|
||||
* Copyright (C) 2019-2021 Jon Shallow <supjps-libcoap@jpshallow.com>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/*
|
||||
* All libcoap library files should include this file which then pulls in all
|
||||
* of the other appropriate header files.
|
||||
*
|
||||
* Note: This file should never be included in application code (with the
|
||||
* possible exception of internal test suites).
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file coap_internal.h
|
||||
* @brief Pulls together all the internal only header files
|
||||
*/
|
||||
|
||||
#ifndef COAP_INTERNAL_H_
|
||||
#define COAP_INTERNAL_H_
|
||||
|
||||
#include "coap_config.h"
|
||||
|
||||
/*
|
||||
* Correctly set up assert() based on NDEBUG for libcoap
|
||||
*/
|
||||
#if defined(HAVE_ASSERT_H) && !defined(assert)
|
||||
# include <assert.h>
|
||||
#endif
|
||||
|
||||
#include "coap3/coap.h"
|
||||
|
||||
/*
|
||||
* Include all the header files that are for internal use only.
|
||||
*/
|
||||
|
||||
/* Not defined in coap.h - internal usage .h files */
|
||||
#include "utlist.h"
|
||||
#include "uthash.h"
|
||||
#include "coap_hashkey.h"
|
||||
#include "coap_mutex.h"
|
||||
|
||||
/* Specifically defined internal .h files */
|
||||
#include "coap_asn1_internal.h"
|
||||
#include "coap_async_internal.h"
|
||||
#include "coap_block_internal.h"
|
||||
#include "coap_cache_internal.h"
|
||||
#include "coap_dtls_internal.h"
|
||||
#include "coap_io_internal.h"
|
||||
#include "coap_net_internal.h"
|
||||
#include "coap_pdu_internal.h"
|
||||
#include "coap_session_internal.h"
|
||||
#include "coap_resource_internal.h"
|
||||
#include "coap_session_internal.h"
|
||||
#include "coap_subscribe_internal.h"
|
||||
#include "coap_tcp_internal.h"
|
||||
|
||||
#endif /* COAP_INTERNAL_H_ */
|
72
tools/sdk/esp32/include/coap/libcoap/include/coap3/coap_io.h
Normal file
72
tools/sdk/esp32/include/coap/libcoap/include/coap3/coap_io.h
Normal file
@ -0,0 +1,72 @@
|
||||
/*
|
||||
* coap_io.h -- Default network I/O functions for libcoap
|
||||
*
|
||||
* Copyright (C) 2012-2013 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
#ifndef COAP_IO_H_
|
||||
#define COAP_IO_H_
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "address.h"
|
||||
|
||||
#ifdef RIOT_VERSION
|
||||
#include "net/gnrc.h"
|
||||
#endif /* RIOT_VERSION */
|
||||
|
||||
#ifndef COAP_RXBUFFER_SIZE
|
||||
#define COAP_RXBUFFER_SIZE 1472
|
||||
#endif /* COAP_RXBUFFER_SIZE */
|
||||
|
||||
/*
|
||||
* It may may make sense to define this larger on busy systems
|
||||
* (lots of sessions, large number of which are active), by using
|
||||
* -DCOAP_MAX_EPOLL_EVENTS=nn at compile time.
|
||||
*/
|
||||
#ifndef COAP_MAX_EPOLL_EVENTS
|
||||
#define COAP_MAX_EPOLL_EVENTS 10
|
||||
#endif /* COAP_MAX_EPOLL_EVENTS */
|
||||
|
||||
#ifdef _WIN32
|
||||
typedef SOCKET coap_fd_t;
|
||||
#define coap_closesocket closesocket
|
||||
#define COAP_SOCKET_ERROR SOCKET_ERROR
|
||||
#define COAP_INVALID_SOCKET INVALID_SOCKET
|
||||
#else
|
||||
typedef int coap_fd_t;
|
||||
#define coap_closesocket close
|
||||
#define COAP_SOCKET_ERROR (-1)
|
||||
#define COAP_INVALID_SOCKET (-1)
|
||||
#endif
|
||||
|
||||
typedef uint16_t coap_socket_flags_t;
|
||||
|
||||
typedef struct coap_addr_tuple_t {
|
||||
coap_address_t remote; /**< remote address and port */
|
||||
coap_address_t local; /**< local address and port */
|
||||
} coap_addr_tuple_t;
|
||||
|
||||
const char *coap_socket_strerror( void );
|
||||
|
||||
/**
|
||||
* Check whether TCP is available.
|
||||
*
|
||||
* @return @c 1 if support for TCP is enabled, or @c 0 otherwise.
|
||||
*/
|
||||
int coap_tcp_is_supported(void);
|
||||
|
||||
typedef enum {
|
||||
COAP_NACK_TOO_MANY_RETRIES,
|
||||
COAP_NACK_NOT_DELIVERABLE,
|
||||
COAP_NACK_RST,
|
||||
COAP_NACK_TLS_FAILED,
|
||||
COAP_NACK_ICMP_ISSUE
|
||||
} coap_nack_reason_t;
|
||||
|
||||
#endif /* COAP_IO_H_ */
|
@ -0,0 +1,168 @@
|
||||
/*
|
||||
* coap_io.h -- Default network I/O functions for libcoap
|
||||
*
|
||||
* Copyright (C) 2012-2013 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
#ifndef COAP_IO_INTERNAL_H_
|
||||
#define COAP_IO_INTERNAL_H_
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include "address.h"
|
||||
|
||||
#ifdef RIOT_VERSION
|
||||
#include "net/gnrc.h"
|
||||
#endif /* RIOT_VERSION */
|
||||
|
||||
struct coap_socket_t {
|
||||
#if defined(WITH_LWIP)
|
||||
struct udp_pcb *pcb;
|
||||
#elif defined(WITH_CONTIKI)
|
||||
void *conn;
|
||||
#else
|
||||
coap_fd_t fd;
|
||||
#endif /* WITH_LWIP */
|
||||
#if defined(RIOT_VERSION)
|
||||
gnrc_pktsnip_t *pkt; /* pointer to received packet for processing */
|
||||
#endif /* RIOT_VERSION */
|
||||
coap_socket_flags_t flags;
|
||||
coap_session_t *session; /* Used by the epoll logic for an active session. */
|
||||
coap_endpoint_t *endpoint; /* Used by the epoll logic for a listening
|
||||
endpoint. */
|
||||
};
|
||||
|
||||
/**
|
||||
* coap_socket_flags_t values
|
||||
*/
|
||||
#define COAP_SOCKET_EMPTY 0x0000 /**< the socket is not used */
|
||||
#define COAP_SOCKET_NOT_EMPTY 0x0001 /**< the socket is not empty */
|
||||
#define COAP_SOCKET_BOUND 0x0002 /**< the socket is bound */
|
||||
#define COAP_SOCKET_CONNECTED 0x0004 /**< the socket is connected */
|
||||
#define COAP_SOCKET_WANT_READ 0x0010 /**< non blocking socket is waiting for reading */
|
||||
#define COAP_SOCKET_WANT_WRITE 0x0020 /**< non blocking socket is waiting for writing */
|
||||
#define COAP_SOCKET_WANT_ACCEPT 0x0040 /**< non blocking server socket is waiting for accept */
|
||||
#define COAP_SOCKET_WANT_CONNECT 0x0080 /**< non blocking client socket is waiting for connect */
|
||||
#define COAP_SOCKET_CAN_READ 0x0100 /**< non blocking socket can now read without blocking */
|
||||
#define COAP_SOCKET_CAN_WRITE 0x0200 /**< non blocking socket can now write without blocking */
|
||||
#define COAP_SOCKET_CAN_ACCEPT 0x0400 /**< non blocking server socket can now accept without blocking */
|
||||
#define COAP_SOCKET_CAN_CONNECT 0x0800 /**< non blocking client socket can now connect without blocking */
|
||||
#define COAP_SOCKET_MULTICAST 0x1000 /**< socket is used for multicast communication */
|
||||
|
||||
coap_endpoint_t *coap_malloc_endpoint( void );
|
||||
void coap_mfree_endpoint( coap_endpoint_t *ep );
|
||||
|
||||
const char *coap_socket_format_errno(int error);
|
||||
|
||||
int
|
||||
coap_socket_connect_udp(coap_socket_t *sock,
|
||||
const coap_address_t *local_if,
|
||||
const coap_address_t *server,
|
||||
int default_port,
|
||||
coap_address_t *local_addr,
|
||||
coap_address_t *remote_addr);
|
||||
|
||||
int
|
||||
coap_socket_bind_udp(coap_socket_t *sock,
|
||||
const coap_address_t *listen_addr,
|
||||
coap_address_t *bound_addr );
|
||||
|
||||
void coap_socket_close(coap_socket_t *sock);
|
||||
|
||||
ssize_t
|
||||
coap_socket_send( coap_socket_t *sock, coap_session_t *session,
|
||||
const uint8_t *data, size_t data_len );
|
||||
|
||||
ssize_t
|
||||
coap_socket_write(coap_socket_t *sock, const uint8_t *data, size_t data_len);
|
||||
|
||||
ssize_t
|
||||
coap_socket_read(coap_socket_t *sock, uint8_t *data, size_t data_len);
|
||||
|
||||
void
|
||||
coap_epoll_ctl_mod(coap_socket_t *sock, uint32_t events, const char *func);
|
||||
|
||||
#ifdef WITH_LWIP
|
||||
ssize_t
|
||||
coap_socket_send_pdu( coap_socket_t *sock, coap_session_t *session,
|
||||
coap_pdu_t *pdu );
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Function interface for data transmission. This function returns the number of
|
||||
* bytes that have been transmitted, or a value less than zero on error.
|
||||
*
|
||||
* @param sock Socket to send data with
|
||||
* @param session Addressing information for unconnected sockets, or NULL
|
||||
* @param data The data to send.
|
||||
* @param datalen The actual length of @p data.
|
||||
*
|
||||
* @return The number of bytes written on success, or a value
|
||||
* less than zero on error.
|
||||
*/
|
||||
ssize_t coap_network_send( coap_socket_t *sock, const coap_session_t *session, const uint8_t *data, size_t datalen );
|
||||
|
||||
/**
|
||||
* Function interface for reading data. This function returns the number of
|
||||
* bytes that have been read, or a value less than zero on error. In case of an
|
||||
* error, @p *packet is set to NULL.
|
||||
*
|
||||
* @param sock Socket to read data from
|
||||
* @param packet Received packet metadata and payload. src and dst should be preset.
|
||||
*
|
||||
* @return The number of bytes received on success, or a value less than
|
||||
* zero on error.
|
||||
*/
|
||||
ssize_t coap_network_read( coap_socket_t *sock, coap_packet_t *packet );
|
||||
|
||||
#ifndef coap_mcast_interface
|
||||
# define coap_mcast_interface(Local) 0
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Given a packet, set msg and msg_len to an address and length of the packet's
|
||||
* data in memory.
|
||||
* */
|
||||
void coap_packet_get_memmapped(coap_packet_t *packet,
|
||||
unsigned char **address,
|
||||
size_t *length);
|
||||
|
||||
#ifdef WITH_LWIP
|
||||
/**
|
||||
* Get the pbuf of a packet. The caller takes over responsibility for freeing
|
||||
* the pbuf.
|
||||
*/
|
||||
struct pbuf *coap_packet_extract_pbuf(coap_packet_t *packet);
|
||||
#endif
|
||||
|
||||
#if defined(WITH_LWIP)
|
||||
/*
|
||||
* This is only included in coap_io.h instead of .c in order to be available for
|
||||
* sizeof in lwippools.h.
|
||||
* Simple carry-over of the incoming pbuf that is later turned into a node.
|
||||
*
|
||||
* Source address data is currently side-banded via ip_current_dest_addr & co
|
||||
* as the packets have limited lifetime anyway.
|
||||
*/
|
||||
struct coap_packet_t {
|
||||
struct pbuf *pbuf;
|
||||
const coap_endpoint_t *local_interface;
|
||||
coap_addr_tuple_t addr_info; /**< local and remote addresses */
|
||||
int ifindex; /**< the interface index */
|
||||
// uint16_t srcport;
|
||||
};
|
||||
#else
|
||||
struct coap_packet_t {
|
||||
coap_addr_tuple_t addr_info; /**< local and remote addresses */
|
||||
int ifindex; /**< the interface index */
|
||||
size_t length; /**< length of payload */
|
||||
unsigned char payload[COAP_RXBUFFER_SIZE]; /**< payload */
|
||||
};
|
||||
#endif
|
||||
|
||||
#endif /* COAP_IO_INTERNAL_H_ */
|
@ -0,0 +1,59 @@
|
||||
/*
|
||||
* coap_mutex.h -- mutex utilities
|
||||
*
|
||||
* Copyright (C) 2019 Jon Shallow <supjps-libcoap@jpshallow.com>
|
||||
* 2019 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file coap_mutex.h
|
||||
* @brief COAP mutex mechanism wrapper
|
||||
*/
|
||||
|
||||
#ifndef COAP_MUTEX_H_
|
||||
#define COAP_MUTEX_H_
|
||||
|
||||
/*
|
||||
* Mutexes are currently only used if there is a constrained stack,
|
||||
* and large static variables (instead of the large variable being on
|
||||
* the stack) need to be protected.
|
||||
*/
|
||||
#if COAP_CONSTRAINED_STACK
|
||||
|
||||
#if defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD_MUTEX_LOCK)
|
||||
#include <pthread.h>
|
||||
|
||||
typedef pthread_mutex_t coap_mutex_t;
|
||||
#define COAP_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
|
||||
#define coap_mutex_lock(a) pthread_mutex_lock(a)
|
||||
#define coap_mutex_trylock(a) pthread_mutex_trylock(a)
|
||||
#define coap_mutex_unlock(a) pthread_mutex_unlock(a)
|
||||
|
||||
#elif defined(RIOT_VERSION)
|
||||
/* use RIOT's mutex API */
|
||||
#include <mutex.h>
|
||||
|
||||
typedef mutex_t coap_mutex_t;
|
||||
#define COAP_MUTEX_INITIALIZER MUTEX_INIT
|
||||
#define coap_mutex_lock(a) mutex_lock(a)
|
||||
#define coap_mutex_trylock(a) mutex_trylock(a)
|
||||
#define coap_mutex_unlock(a) mutex_unlock(a)
|
||||
|
||||
#else
|
||||
/* define stub mutex functions */
|
||||
typedef int coap_mutex_t;
|
||||
#define COAP_MUTEX_INITIALIZER 0
|
||||
#define coap_mutex_lock(a) *(a) = 1
|
||||
#define coap_mutex_trylock(a) *(a) = 1
|
||||
#define coap_mutex_unlock(a) *(a) = 0
|
||||
|
||||
#endif /* !RIOT_VERSION && !HAVE_PTHREAD_H && !HAVE_PTHREAD_MUTEX_LOCK */
|
||||
|
||||
#endif /* COAP_CONSTRAINED_STACK */
|
||||
|
||||
#endif /* COAP_MUTEX_H_ */
|
@ -0,0 +1,366 @@
|
||||
/*
|
||||
* coap_context_internal.h -- Structures, Enums & Functions that are not
|
||||
* exposed to application programming
|
||||
*
|
||||
* Copyright (C) 2010-2021 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file coap_net_internal.h
|
||||
* @brief COAP net internal information
|
||||
*/
|
||||
|
||||
#ifndef COAP_NET_INTERNAL_H_
|
||||
#define COAP_NET_INTERNAL_H_
|
||||
|
||||
/**
|
||||
* @defgroup context_internal Context Handling (Internal)
|
||||
* CoAP Context Structures, Enums and Functions that are not exposed to
|
||||
* applications
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Queue entry
|
||||
*/
|
||||
struct coap_queue_t {
|
||||
struct coap_queue_t *next;
|
||||
coap_tick_t t; /**< when to send PDU for the next time */
|
||||
unsigned char retransmit_cnt; /**< retransmission counter, will be removed
|
||||
* when zero */
|
||||
unsigned int timeout; /**< the randomized timeout value */
|
||||
coap_session_t *session; /**< the CoAP session */
|
||||
coap_mid_t id; /**< CoAP message id */
|
||||
coap_pdu_t *pdu; /**< the CoAP PDU to send */
|
||||
};
|
||||
|
||||
/**
|
||||
* The CoAP stack's global state is stored in a coap_context_t object.
|
||||
*/
|
||||
struct coap_context_t {
|
||||
coap_opt_filter_t known_options;
|
||||
coap_resource_t *resources; /**< hash table or list of known
|
||||
resources */
|
||||
coap_resource_t *unknown_resource; /**< can be used for handling
|
||||
unknown resources */
|
||||
coap_resource_t *proxy_uri_resource; /**< can be used for handling
|
||||
proxy URI resources */
|
||||
coap_resource_release_userdata_handler_t release_userdata;
|
||||
/**< function to release user_data
|
||||
when resource is deleted */
|
||||
|
||||
#ifndef WITHOUT_ASYNC
|
||||
/**
|
||||
* list of asynchronous message ids */
|
||||
coap_async_t *async_state;
|
||||
#endif /* WITHOUT_ASYNC */
|
||||
|
||||
/**
|
||||
* The time stamp in the first element of the sendqeue is relative
|
||||
* to sendqueue_basetime. */
|
||||
coap_tick_t sendqueue_basetime;
|
||||
coap_queue_t *sendqueue;
|
||||
coap_endpoint_t *endpoint; /**< the endpoints used for listening */
|
||||
coap_session_t *sessions; /**< client sessions */
|
||||
|
||||
#ifdef WITH_CONTIKI
|
||||
struct uip_udp_conn *conn; /**< uIP connection object */
|
||||
struct etimer retransmit_timer; /**< fires when the next packet must be
|
||||
sent */
|
||||
struct etimer notify_timer; /**< used to check resources periodically */
|
||||
#endif /* WITH_CONTIKI */
|
||||
|
||||
#ifdef WITH_LWIP
|
||||
uint8_t timer_configured; /**< Set to 1 when a retransmission is
|
||||
* scheduled using lwIP timers for this
|
||||
* context, otherwise 0. */
|
||||
#endif /* WITH_LWIP */
|
||||
|
||||
coap_response_handler_t response_handler;
|
||||
coap_nack_handler_t nack_handler;
|
||||
coap_ping_handler_t ping_handler;
|
||||
coap_pong_handler_t pong_handler;
|
||||
|
||||
/**
|
||||
* Callback function that is used to signal events to the
|
||||
* application. This field is set by coap_set_event_handler().
|
||||
*/
|
||||
coap_event_handler_t handle_event;
|
||||
|
||||
ssize_t (*network_send)(coap_socket_t *sock, const coap_session_t *session,
|
||||
const uint8_t *data, size_t datalen);
|
||||
|
||||
ssize_t (*network_read)(coap_socket_t *sock, coap_packet_t *packet);
|
||||
|
||||
size_t(*get_client_psk)(const coap_session_t *session, const uint8_t *hint,
|
||||
size_t hint_len, uint8_t *identity,
|
||||
size_t *identity_len, size_t max_identity_len,
|
||||
uint8_t *psk, size_t max_psk_len);
|
||||
size_t(*get_server_psk)(const coap_session_t *session,
|
||||
const uint8_t *identity, size_t identity_len,
|
||||
uint8_t *psk, size_t max_psk_len);
|
||||
size_t(*get_server_hint)(const coap_session_t *session, uint8_t *hint,
|
||||
size_t max_hint_len);
|
||||
|
||||
void *dtls_context;
|
||||
|
||||
coap_dtls_spsk_t spsk_setup_data; /**< Contains the initial PSK server setup
|
||||
data */
|
||||
|
||||
unsigned int session_timeout; /**< Number of seconds of inactivity after
|
||||
which an unused session will be closed.
|
||||
0 means use default. */
|
||||
unsigned int max_idle_sessions; /**< Maximum number of simultaneous unused
|
||||
sessions per endpoint. 0 means no
|
||||
maximum. */
|
||||
unsigned int max_handshake_sessions; /**< Maximum number of simultaneous
|
||||
negotating sessions per endpoint. 0
|
||||
means use default. */
|
||||
unsigned int ping_timeout; /**< Minimum inactivity time before
|
||||
sending a ping message. 0 means
|
||||
disabled. */
|
||||
unsigned int csm_timeout; /**< Timeout for waiting for a CSM from
|
||||
the remote side. 0 means disabled. */
|
||||
uint8_t observe_pending; /**< Observe response pending */
|
||||
uint8_t block_mode; /**< Zero or more COAP_BLOCK_ or'd options */
|
||||
uint64_t etag; /**< Next ETag to use */
|
||||
|
||||
coap_cache_entry_t *cache; /**< CoAP cache-entry cache */
|
||||
uint16_t *cache_ignore_options; /**< CoAP options to ignore when creating a
|
||||
cache-key */
|
||||
size_t cache_ignore_count; /**< The number of CoAP options to ignore
|
||||
when creating a cache-key */
|
||||
void *app; /**< application-specific data */
|
||||
#ifdef COAP_EPOLL_SUPPORT
|
||||
int epfd; /**< External FD for epoll */
|
||||
int eptimerfd; /**< Internal FD for timeout */
|
||||
coap_tick_t next_timeout; /**< When the next timeout is to occur */
|
||||
#endif /* COAP_EPOLL_SUPPORT */
|
||||
};
|
||||
|
||||
/**
|
||||
* Adds @p node to given @p queue, ordered by variable t in @p node.
|
||||
*
|
||||
* @param queue Queue to add to.
|
||||
* @param node Node entry to add to Queue.
|
||||
*
|
||||
* @return @c 1 added to queue, @c 0 failure.
|
||||
*/
|
||||
int coap_insert_node(coap_queue_t **queue, coap_queue_t *node);
|
||||
|
||||
/**
|
||||
* Destroys specified @p node.
|
||||
*
|
||||
* @param node Node entry to remove.
|
||||
*
|
||||
* @return @c 1 node deleted from queue, @c 0 failure.
|
||||
*/
|
||||
int coap_delete_node(coap_queue_t *node);
|
||||
|
||||
/**
|
||||
* Removes all items from given @p queue and frees the allocated storage.
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @param queue The queue to delete.
|
||||
*/
|
||||
void coap_delete_all(coap_queue_t *queue);
|
||||
|
||||
/**
|
||||
* Creates a new node suitable for adding to the CoAP sendqueue.
|
||||
*
|
||||
* @return New node entry, or @c NULL if failure.
|
||||
*/
|
||||
coap_queue_t *coap_new_node(void);
|
||||
|
||||
/**
|
||||
* Set sendqueue_basetime in the given context object @p ctx to @p now. This
|
||||
* function returns the number of elements in the queue head that have timed
|
||||
* out.
|
||||
*/
|
||||
unsigned int coap_adjust_basetime(coap_context_t *ctx, coap_tick_t now);
|
||||
|
||||
/**
|
||||
* Returns the next pdu to send without removing from sendqeue.
|
||||
*/
|
||||
coap_queue_t *coap_peek_next( coap_context_t *context );
|
||||
|
||||
/**
|
||||
* Returns the next pdu to send and removes it from the sendqeue.
|
||||
*/
|
||||
coap_queue_t *coap_pop_next( coap_context_t *context );
|
||||
|
||||
/**
|
||||
* Handles retransmissions of confirmable messages
|
||||
*
|
||||
* @param context The CoAP context.
|
||||
* @param node The node to retransmit.
|
||||
*
|
||||
* @return The message id of the sent message or @c
|
||||
* COAP_INVALID_MID on error.
|
||||
*/
|
||||
coap_mid_t coap_retransmit(coap_context_t *context, coap_queue_t *node);
|
||||
|
||||
/**
|
||||
* Parses and interprets a CoAP datagram with context @p ctx. This function
|
||||
* returns @c 0 if the datagram was handled, or a value less than zero on
|
||||
* error.
|
||||
*
|
||||
* @param ctx The current CoAP context.
|
||||
* @param session The current CoAP session.
|
||||
* @param data The received packet'd data.
|
||||
* @param data_len The received packet'd data length.
|
||||
*
|
||||
* @return @c 0 if message was handled successfully, or less than zero on
|
||||
* error.
|
||||
*/
|
||||
int coap_handle_dgram(coap_context_t *ctx, coap_session_t *session, uint8_t *data, size_t data_len);
|
||||
|
||||
/**
|
||||
* This function removes the element with given @p id from the list given list.
|
||||
* If @p id was found, @p node is updated to point to the removed element. Note
|
||||
* that the storage allocated by @p node is @b not released. The caller must do
|
||||
* this manually using coap_delete_node(). This function returns @c 1 if the
|
||||
* element with id @p id was found, @c 0 otherwise. For a return value of @c 0,
|
||||
* the contents of @p node is undefined.
|
||||
*
|
||||
* @param queue The queue to search for @p id.
|
||||
* @param session The session to look for.
|
||||
* @param id The message id to look for.
|
||||
* @param node If found, @p node is updated to point to the removed node. You
|
||||
* must release the storage pointed to by @p node manually.
|
||||
*
|
||||
* @return @c 1 if @p id was found, @c 0 otherwise.
|
||||
*/
|
||||
int coap_remove_from_queue(coap_queue_t **queue,
|
||||
coap_session_t *session,
|
||||
coap_mid_t id,
|
||||
coap_queue_t **node);
|
||||
|
||||
coap_mid_t
|
||||
coap_wait_ack( coap_context_t *context, coap_session_t *session,
|
||||
coap_queue_t *node);
|
||||
|
||||
/**
|
||||
* Cancels all outstanding messages for session @p session that have the specified
|
||||
* token.
|
||||
*
|
||||
* @param context The context in use.
|
||||
* @param session Session of the messages to remove.
|
||||
* @param token Message token.
|
||||
* @param token_length Actual length of @p token.
|
||||
*/
|
||||
void coap_cancel_all_messages(coap_context_t *context,
|
||||
coap_session_t *session,
|
||||
const uint8_t *token,
|
||||
size_t token_length);
|
||||
|
||||
/**
|
||||
* Cancels all outstanding messages for session @p session.
|
||||
*
|
||||
* @param context The context in use.
|
||||
* @param session Session of the messages to remove.
|
||||
* @param reason The reasion for the session cancellation
|
||||
*/
|
||||
void
|
||||
coap_cancel_session_messages(coap_context_t *context,
|
||||
coap_session_t *session,
|
||||
coap_nack_reason_t reason);
|
||||
|
||||
/**
|
||||
* Dispatches the PDUs from the receive queue in given context.
|
||||
*/
|
||||
void coap_dispatch(coap_context_t *context, coap_session_t *session,
|
||||
coap_pdu_t *pdu);
|
||||
|
||||
/**
|
||||
* Verifies that @p pdu contains no unknown critical options. Options must be
|
||||
* registered at @p ctx, using the function coap_register_option(). A basic set
|
||||
* of options is registered automatically by coap_new_context(). This function
|
||||
* returns @c 1 if @p pdu is ok, @c 0 otherwise. The given filter object @p
|
||||
* unknown will be updated with the unknown options. As only @c COAP_MAX_OPT
|
||||
* options can be signalled this way, remaining options must be examined
|
||||
* manually.
|
||||
*
|
||||
* @code
|
||||
coap_opt_filter_t f = COAP_OPT_NONE;
|
||||
coap_opt_iterator_t opt_iter;
|
||||
|
||||
if (coap_option_check_critical(ctx, pdu, f) == 0) {
|
||||
coap_option_iterator_init(pdu, &opt_iter, f);
|
||||
|
||||
while (coap_option_next(&opt_iter)) {
|
||||
if (opt_iter.type & 0x01) {
|
||||
... handle unknown critical option in opt_iter ...
|
||||
}
|
||||
}
|
||||
}
|
||||
@endcode
|
||||
*
|
||||
* @param ctx The context where all known options are registered.
|
||||
* @param pdu The PDU to check.
|
||||
* @param unknown The output filter that will be updated to indicate the
|
||||
* unknown critical options found in @p pdu.
|
||||
*
|
||||
* @return @c 1 if everything was ok, @c 0 otherwise.
|
||||
*/
|
||||
int coap_option_check_critical(coap_context_t *ctx,
|
||||
coap_pdu_t *pdu,
|
||||
coap_opt_filter_t *unknown);
|
||||
|
||||
/**
|
||||
* Creates a new response for given @p request with the contents of @c
|
||||
* .well-known/core. The result is NULL on error or a newly allocated PDU that
|
||||
* must be either sent with coap_sent() or released by coap_delete_pdu().
|
||||
*
|
||||
* @param context The current coap context to use.
|
||||
* @param session The CoAP session.
|
||||
* @param request The request for @c .well-known/core .
|
||||
*
|
||||
* @return A new 2.05 response for @c .well-known/core or NULL on error.
|
||||
*/
|
||||
coap_pdu_t *coap_wellknown_response(coap_context_t *context,
|
||||
coap_session_t *session,
|
||||
coap_pdu_t *request);
|
||||
|
||||
/**
|
||||
* Calculates the initial timeout based on the session CoAP transmission
|
||||
* parameters 'ack_timeout', 'ack_random_factor', and COAP_TICKS_PER_SECOND.
|
||||
* The calculation requires 'ack_timeout' and 'ack_random_factor' to be in
|
||||
* Qx.FRAC_BITS fixed point notation, whereas the passed parameter @p r
|
||||
* is interpreted as the fractional part of a Q0.MAX_BITS random value.
|
||||
*
|
||||
* @param session session timeout is associated with
|
||||
* @param r random value as fractional part of a Q0.MAX_BITS fixed point
|
||||
* value
|
||||
* @return COAP_TICKS_PER_SECOND * 'ack_timeout' *
|
||||
* (1 + ('ack_random_factor' - 1) * r)
|
||||
*/
|
||||
unsigned int coap_calc_timeout(coap_session_t *session, unsigned char r);
|
||||
|
||||
/**
|
||||
* Sends a CoAP message to given peer. The memory that is
|
||||
* allocated for the pdu will be released by coap_send_internal().
|
||||
* The caller must not use the pdu after calling coap_send_internal().
|
||||
*
|
||||
* If the response body is split into multiple payloads using blocks, libcoap
|
||||
* will handle asking for the subsequent blocks and any necessary recovery
|
||||
* needed.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
* @param pdu The CoAP PDU to send.
|
||||
*
|
||||
* @return The message id of the sent message or @c
|
||||
* COAP_INVALID_MID on error.
|
||||
*/
|
||||
coap_mid_t coap_send_internal(coap_session_t *session, coap_pdu_t *pdu);
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* COAP_NET_INTERNAL_H_ */
|
||||
|
@ -0,0 +1,300 @@
|
||||
/*
|
||||
* coap_pdu_internal.h -- CoAP PDU structure
|
||||
*
|
||||
* Copyright (C) 2010-2021 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file coap_pdu_internal.h
|
||||
* @brief CoAP PDU internal information
|
||||
*/
|
||||
|
||||
#ifndef COAP_COAP_PDU_INTERNAL_H_
|
||||
#define COAP_COAP_PDU_INTERNAL_H_
|
||||
|
||||
#ifdef WITH_LWIP
|
||||
#include <lwip/pbuf.h>
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* @defgroup pdu_internal PDU (Internal)
|
||||
* CoAP PDU Structures, Enums and Functions that are not exposed to
|
||||
* applications
|
||||
* @{
|
||||
*/
|
||||
|
||||
#define COAP_DEFAULT_VERSION 1 /* version of CoAP supported */
|
||||
|
||||
/* TCP Message format constants, do not modify */
|
||||
#define COAP_MESSAGE_SIZE_OFFSET_TCP8 13
|
||||
#define COAP_MESSAGE_SIZE_OFFSET_TCP16 269 /* 13 + 256 */
|
||||
#define COAP_MESSAGE_SIZE_OFFSET_TCP32 65805 /* 269 + 65536 */
|
||||
|
||||
/* Derived message size limits */
|
||||
#define COAP_MAX_MESSAGE_SIZE_TCP0 (COAP_MESSAGE_SIZE_OFFSET_TCP8-1) /* 12 */
|
||||
#define COAP_MAX_MESSAGE_SIZE_TCP8 (COAP_MESSAGE_SIZE_OFFSET_TCP16-1) /* 268 */
|
||||
#define COAP_MAX_MESSAGE_SIZE_TCP16 (COAP_MESSAGE_SIZE_OFFSET_TCP32-1) /* 65804 */
|
||||
#define COAP_MAX_MESSAGE_SIZE_TCP32 (COAP_MESSAGE_SIZE_OFFSET_TCP32+0xFFFFFFFF)
|
||||
|
||||
#ifndef COAP_DEBUG_BUF_SIZE
|
||||
#if defined(WITH_CONTIKI) || defined(WITH_LWIP)
|
||||
#define COAP_DEBUG_BUF_SIZE 128
|
||||
#else /* defined(WITH_CONTIKI) || defined(WITH_LWIP) */
|
||||
/* 1024 derived from RFC7252 4.6. Message Size max payload */
|
||||
#define COAP_DEBUG_BUF_SIZE (8 + 1024 * 2)
|
||||
#endif /* defined(WITH_CONTIKI) || defined(WITH_LWIP) */
|
||||
#endif /* COAP_DEBUG_BUF_SIZE */
|
||||
|
||||
#ifndef COAP_DEFAULT_MAX_PDU_RX_SIZE
|
||||
#if defined(WITH_CONTIKI) || defined(WITH_LWIP)
|
||||
#define COAP_DEFAULT_MAX_PDU_RX_SIZE (COAP_MAX_MESSAGE_SIZE_TCP16+4UL)
|
||||
#else
|
||||
/* 8 MiB max-message-size plus some space for options */
|
||||
#define COAP_DEFAULT_MAX_PDU_RX_SIZE (8UL*1024*1024+256)
|
||||
#endif
|
||||
#endif /* COAP_DEFAULT_MAX_PDU_RX_SIZE */
|
||||
|
||||
/**
|
||||
* Indicates that a response is suppressed. This will occur for error
|
||||
* responses if the request was received via IP multicast.
|
||||
*/
|
||||
#define COAP_DROPPED_RESPONSE -2
|
||||
|
||||
#define COAP_PDU_DELAYED -3
|
||||
|
||||
#define COAP_PAYLOAD_START 0xFF /* payload marker */
|
||||
|
||||
#define COAP_PDU_IS_EMPTY(pdu) ((pdu)->code == 0)
|
||||
#define COAP_PDU_IS_REQUEST(pdu) (!COAP_PDU_IS_EMPTY(pdu) && (pdu)->code < 32)
|
||||
#define COAP_PDU_IS_RESPONSE(pdu) ((pdu)->code >= 64 && (pdu)->code < 224)
|
||||
#define COAP_PDU_IS_SIGNALING(pdu) ((pdu)->code >= 224)
|
||||
|
||||
#define COAP_PDU_MAX_UDP_HEADER_SIZE 4
|
||||
#define COAP_PDU_MAX_TCP_HEADER_SIZE 6
|
||||
|
||||
/**
|
||||
* structure for CoAP PDUs
|
||||
* token, if any, follows the fixed size header, then options until
|
||||
* payload marker (0xff), then the payload if stored inline.
|
||||
* Memory layout is:
|
||||
* <---header--->|<---token---><---options--->0xff<---payload--->
|
||||
* header is addressed with a negative offset to token, its maximum size is
|
||||
* max_hdr_size.
|
||||
* options starts at token + token_length
|
||||
* payload starts at data, its length is used_size - (data - token)
|
||||
*/
|
||||
|
||||
struct coap_pdu_t {
|
||||
coap_pdu_type_t type; /**< message type */
|
||||
coap_pdu_code_t code; /**< request method (value 1--31) or response code
|
||||
(value 64-255) */
|
||||
coap_mid_t mid; /**< message id, if any, in regular host byte
|
||||
order */
|
||||
uint8_t max_hdr_size; /**< space reserved for protocol-specific header */
|
||||
uint8_t hdr_size; /**< actual size used for protocol-specific
|
||||
header */
|
||||
uint8_t token_length; /**< length of Token */
|
||||
uint16_t max_opt; /**< highest option number in PDU */
|
||||
size_t alloc_size; /**< allocated storage for token, options and
|
||||
payload */
|
||||
size_t used_size; /**< used bytes of storage for token, options and
|
||||
payload */
|
||||
size_t max_size; /**< maximum size for token, options and payload,
|
||||
or zero for variable size pdu */
|
||||
uint8_t *token; /**< first byte of token, if any, or options */
|
||||
uint8_t *data; /**< first byte of payload, if any */
|
||||
#ifdef WITH_LWIP
|
||||
struct pbuf *pbuf; /**< lwIP PBUF. The package data will always reside
|
||||
* inside the pbuf's payload, but this pointer
|
||||
* has to be kept because no exact offset can be
|
||||
* given. This field must not be accessed from
|
||||
* outside, because the pbuf's reference count
|
||||
* is checked to be 1 when the pbuf is assigned
|
||||
* to the pdu, and the pbuf stays exclusive to
|
||||
* this pdu. */
|
||||
#endif
|
||||
const uint8_t *body_data; /**< Holds ptr to re-assembled data or NULL */
|
||||
size_t body_length; /**< Holds body data length */
|
||||
size_t body_offset; /**< Holds body data offset */
|
||||
size_t body_total; /**< Holds body data total size */
|
||||
coap_lg_xmit_t *lg_xmit; /**< Holds ptr to lg_xmit if sending a set of
|
||||
blocks */
|
||||
};
|
||||
|
||||
/**
|
||||
* Dynamically grows the size of @p pdu to @p new_size. The new size
|
||||
* must not exceed the PDU's configure maximum size. On success, this
|
||||
* function returns 1, otherwise 0.
|
||||
*
|
||||
* @param pdu The PDU to resize.
|
||||
* @param new_size The new size in bytes.
|
||||
* @return 1 if the operation succeeded, 0 otherwise.
|
||||
*/
|
||||
int coap_pdu_resize(coap_pdu_t *pdu, size_t new_size);
|
||||
|
||||
/**
|
||||
* Dynamically grows the size of @p pdu to @p new_size if needed. The new size
|
||||
* must not exceed the PDU's configured maximum size. On success, this
|
||||
* function returns 1, otherwise 0.
|
||||
*
|
||||
* @param pdu The PDU to resize.
|
||||
* @param new_size The new size in bytes.
|
||||
* @return 1 if the operation succeeded, 0 otherwise.
|
||||
*/
|
||||
int coap_pdu_check_resize(coap_pdu_t *pdu, size_t new_size);
|
||||
|
||||
/**
|
||||
* Interprets @p data to determine the number of bytes in the header.
|
||||
* This function returns @c 0 on error or a number greater than zero on success.
|
||||
*
|
||||
* @param proto Session's protocol
|
||||
* @param data The first byte of raw data to parse as CoAP PDU.
|
||||
*
|
||||
* @return A value greater than zero on success or @c 0 on error.
|
||||
*/
|
||||
size_t coap_pdu_parse_header_size(coap_proto_t proto,
|
||||
const uint8_t *data);
|
||||
|
||||
/**
|
||||
* Parses @p data to extract the message size.
|
||||
* @p length must be at least coap_pdu_parse_header_size(proto, data).
|
||||
* This function returns @c 0 on error or a number greater than zero on success.
|
||||
*
|
||||
* @param proto Session's protocol
|
||||
* @param data The raw data to parse as CoAP PDU.
|
||||
* @param length The actual size of @p data.
|
||||
*
|
||||
* @return A value greater than zero on success or @c 0 on error.
|
||||
*/
|
||||
size_t coap_pdu_parse_size(coap_proto_t proto,
|
||||
const uint8_t *data,
|
||||
size_t length);
|
||||
|
||||
/**
|
||||
* Decode the protocol specific header for the specified PDU.
|
||||
* @param pdu A newly received PDU.
|
||||
* @param proto The target wire protocol.
|
||||
* @return 1 for success or 0 on error.
|
||||
*/
|
||||
|
||||
int coap_pdu_parse_header(coap_pdu_t *pdu, coap_proto_t proto);
|
||||
|
||||
/**
|
||||
* Verify consistency in the given CoAP PDU structure and locate the data.
|
||||
* This function returns @c 0 on error or a number greater than zero on
|
||||
* success.
|
||||
* This function only parses the token and options, up to the payload start
|
||||
* marker.
|
||||
*
|
||||
* @param pdu The PDU structure to check.
|
||||
*
|
||||
* @return 1 on success or @c 0 on error.
|
||||
*/
|
||||
int coap_pdu_parse_opt(coap_pdu_t *pdu);
|
||||
|
||||
/**
|
||||
* Parses @p data into the CoAP PDU structure given in @p result.
|
||||
* The target pdu must be large enough to
|
||||
* This function returns @c 0 on error or a number greater than zero on success.
|
||||
*
|
||||
* @param proto Session's protocol
|
||||
* @param data The raw data to parse as CoAP PDU.
|
||||
* @param length The actual size of @p data.
|
||||
* @param pdu The PDU structure to fill. Note that the structure must
|
||||
* provide space to hold at least the token and options
|
||||
* part of the message.
|
||||
*
|
||||
* @return 1 on success or @c 0 on error.
|
||||
*/
|
||||
int coap_pdu_parse(coap_proto_t proto,
|
||||
const uint8_t *data,
|
||||
size_t length,
|
||||
coap_pdu_t *pdu);
|
||||
|
||||
/**
|
||||
* Clears any contents from @p pdu and resets @c used_size,
|
||||
* and @c data pointers. @c max_size is set to @p size, any
|
||||
* other field is set to @c 0. Note that @p pdu must be a valid
|
||||
* pointer to a coap_pdu_t object created e.g. by coap_pdu_init().
|
||||
*
|
||||
* @param pdu The PDU to clear.
|
||||
* @param size The maximum size of the PDU.
|
||||
*/
|
||||
void coap_pdu_clear(coap_pdu_t *pdu, size_t size);
|
||||
|
||||
/**
|
||||
* Removes (first) option of given number from the @p pdu.
|
||||
*
|
||||
* @param pdu The PDU to remove the option from.
|
||||
* @param number The number of the CoAP option to remove (first only removed).
|
||||
*
|
||||
* @return @c 1 if success else @c 0 if error.
|
||||
*/
|
||||
int coap_remove_option(coap_pdu_t *pdu, coap_option_num_t number);
|
||||
|
||||
/**
|
||||
* Inserts option of given number in the @p pdu with the appropriate data.
|
||||
* The option will be inserted in the appropriate place in the options in
|
||||
* the pdu.
|
||||
*
|
||||
* @param pdu The PDU where the option is to be inserted.
|
||||
* @param number The number of the new option.
|
||||
* @param len The length of the new option.
|
||||
* @param data The data of the new option.
|
||||
*
|
||||
* @return The overall length of the option or @c 0 on failure.
|
||||
*/
|
||||
size_t coap_insert_option(coap_pdu_t *pdu, coap_option_num_t number,
|
||||
size_t len, const uint8_t *data);
|
||||
|
||||
/**
|
||||
* Updates existing first option of given number in the @p pdu with the new
|
||||
* data.
|
||||
*
|
||||
* @param pdu The PDU where the option is to be updated.
|
||||
* @param number The number of the option to update (first only updated).
|
||||
* @param len The length of the updated option.
|
||||
* @param data The data of the updated option.
|
||||
*
|
||||
* @return The overall length of the updated option or @c 0 on failure.
|
||||
*/
|
||||
size_t coap_update_option(coap_pdu_t *pdu,
|
||||
coap_option_num_t number,
|
||||
size_t len,
|
||||
const uint8_t *data);
|
||||
|
||||
/**
|
||||
* Compose the protocol specific header for the specified PDU.
|
||||
*
|
||||
* @param pdu A newly composed PDU.
|
||||
* @param proto The target wire protocol.
|
||||
*
|
||||
* @return Number of header bytes prepended before pdu->token or 0 on error.
|
||||
*/
|
||||
|
||||
size_t coap_pdu_encode_header(coap_pdu_t *pdu, coap_proto_t proto);
|
||||
|
||||
/**
|
||||
* Updates token in @p pdu with length @p len and @p data.
|
||||
* This function returns @c 0 on error or a value greater than zero on success.
|
||||
*
|
||||
* @param pdu The PDU where the token is to be updated.
|
||||
* @param len The length of the new token.
|
||||
* @param data The token to add.
|
||||
*
|
||||
* @return A value greater than zero on success, or @c 0 on error.
|
||||
*/
|
||||
int coap_update_token(coap_pdu_t *pdu,
|
||||
size_t len,
|
||||
const uint8_t *data);
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* COAP_COAP_PDU_INTERNAL_H_ */
|
113
tools/sdk/esp32/include/coap/libcoap/include/coap3/coap_prng.h
Normal file
113
tools/sdk/esp32/include/coap/libcoap/include/coap3/coap_prng.h
Normal file
@ -0,0 +1,113 @@
|
||||
/*
|
||||
* coap_prng.h -- Pseudo Random Numbers
|
||||
*
|
||||
* Copyright (C) 2010-2020 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file coap_prng.h
|
||||
* @brief Pseudo Random Numbers
|
||||
*/
|
||||
|
||||
#ifndef COAP_PRNG_H_
|
||||
#define COAP_PRNG_H_
|
||||
|
||||
/**
|
||||
* @defgroup coap_prng Pseudo Random Numbers
|
||||
* API functions for gerating pseudo random numbers
|
||||
* @{
|
||||
*/
|
||||
|
||||
#if defined(WITH_CONTIKI)
|
||||
#include <string.h>
|
||||
|
||||
/**
|
||||
* Fills \p buf with \p len random bytes. This is the default implementation for
|
||||
* coap_prng(). You might want to change contiki_prng_impl() to use a better
|
||||
* PRNG on your specific platform.
|
||||
*/
|
||||
COAP_STATIC_INLINE int
|
||||
contiki_prng_impl(unsigned char *buf, size_t len) {
|
||||
uint16_t v = random_rand();
|
||||
while (len > sizeof(v)) {
|
||||
memcpy(buf, &v, sizeof(v));
|
||||
len -= sizeof(v);
|
||||
buf += sizeof(v);
|
||||
v = random_rand();
|
||||
}
|
||||
|
||||
memcpy(buf, &v, len);
|
||||
return 1;
|
||||
}
|
||||
|
||||
#define coap_prng(Buf,Length) contiki_prng_impl((Buf), (Length))
|
||||
#define coap_prng_init(Value) random_init((uint16_t)(Value))
|
||||
|
||||
#elif defined(WITH_LWIP) && defined(LWIP_RAND)
|
||||
|
||||
COAP_STATIC_INLINE int
|
||||
lwip_prng_impl(unsigned char *buf, size_t len) {
|
||||
u32_t v = LWIP_RAND();
|
||||
while (len > sizeof(v)) {
|
||||
memcpy(buf, &v, sizeof(v));
|
||||
len -= sizeof(v);
|
||||
buf += sizeof(v);
|
||||
v = LWIP_RAND();
|
||||
}
|
||||
|
||||
memcpy(buf, &v, len);
|
||||
return 1;
|
||||
}
|
||||
|
||||
#define coap_prng(Buf,Length) lwip_prng_impl((Buf), (Length))
|
||||
#define coap_prng_init(Value) (void)Value
|
||||
|
||||
#else
|
||||
|
||||
/**
|
||||
* Data type for random number generator function. The function must
|
||||
* fill @p len bytes of random data into the buffer starting at @p
|
||||
* out. On success, the function should return 1, zero otherwise.
|
||||
*/
|
||||
typedef int (*coap_rand_func_t)(void *out, size_t len);
|
||||
|
||||
/**
|
||||
* Replaces the current random number generation function with the
|
||||
* default function @p rng.
|
||||
*
|
||||
* @param rng The random number generation function to use.
|
||||
*/
|
||||
void coap_set_prng(coap_rand_func_t rng);
|
||||
|
||||
/**
|
||||
* Seeds the default random number generation function with the given
|
||||
* @p seed. The default random number generation function will use
|
||||
* getrandom() if available, ignoring the seed.
|
||||
*
|
||||
* @param seed The seed for the pseudo random number generator.
|
||||
*/
|
||||
void coap_prng_init(unsigned int seed);
|
||||
|
||||
/**
|
||||
* Fills @p buf with @p len random bytes using the default pseudo
|
||||
* random number generator. The default PRNG can be changed with
|
||||
* coap_set_prng(). This function returns 1 when @p len random bytes
|
||||
* have been written to @p buf, zero otherwise.
|
||||
*
|
||||
* @param buf The buffer to fill with random bytes.
|
||||
* @param len The number of random bytes to write into @p buf.
|
||||
*
|
||||
* @return 1 on success, 0 otherwise.
|
||||
*/
|
||||
int coap_prng(void *buf, size_t len);
|
||||
|
||||
#endif /* POSIX */
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* COAP_PRNG_H_ */
|
@ -0,0 +1,141 @@
|
||||
/*
|
||||
* coap_resource_internal.h -- generic resource handling
|
||||
*
|
||||
* Copyright (C) 2010,2011,2014-2021 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file coap_resource_internal.h
|
||||
* @brief Generic resource internal handling
|
||||
*/
|
||||
|
||||
#ifndef COAP_RESOURCE_INTERNAL_H_
|
||||
#define COAP_RESOURCE_INTERNAL_H_
|
||||
|
||||
#include "uthash.h"
|
||||
|
||||
/**
|
||||
* @defgroup coap_resource_internal Resources (Internal)
|
||||
* Structures, Enums and Functions that are not exposed to applications
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Abstraction of attribute associated with a resource.
|
||||
*/
|
||||
struct coap_attr_t {
|
||||
struct coap_attr_t *next; /**< Pointer to next in chain or NULL */
|
||||
coap_str_const_t *name; /**< Name of the attribute */
|
||||
coap_str_const_t *value; /**< Value of the attribute (can be NULL) */
|
||||
int flags;
|
||||
};
|
||||
|
||||
/**
|
||||
* Abstraction of resource that can be attached to coap_context_t.
|
||||
* The key is uri_path.
|
||||
*/
|
||||
struct coap_resource_t {
|
||||
unsigned int dirty:1; /**< set to 1 if resource has changed */
|
||||
unsigned int partiallydirty:1; /**< set to 1 if some subscribers have not yet
|
||||
* been notified of the last change */
|
||||
unsigned int observable:1; /**< can be observed */
|
||||
unsigned int cacheable:1; /**< can be cached */
|
||||
unsigned int is_unknown:1; /**< resource created for unknown handler */
|
||||
unsigned int is_proxy_uri:1; /**< resource created for proxy URI handler */
|
||||
|
||||
/**
|
||||
* Used to store handlers for the seven coap methods @c GET, @c POST, @c PUT,
|
||||
* @c DELETE, @c FETCH, @c PATCH and @c IPATCH.
|
||||
* coap_dispatch() will pass incoming requests to handle_request() and then
|
||||
* to the handler that corresponds to its request method or generate a 4.05
|
||||
* response if no handler is available.
|
||||
*/
|
||||
coap_method_handler_t handler[7];
|
||||
|
||||
UT_hash_handle hh;
|
||||
|
||||
coap_attr_t *link_attr; /**< attributes to be included with the link format */
|
||||
coap_subscription_t *subscribers; /**< list of observers for this resource */
|
||||
|
||||
/**
|
||||
* Request URI Path for this resource. This field will point into static
|
||||
* or allocated memory which must remain there for the duration of the
|
||||
* resource.
|
||||
*/
|
||||
coap_str_const_t *uri_path; /**< the key used for hash lookup for this
|
||||
resource */
|
||||
int flags; /**< zero or more COAP_RESOURCE_FLAGS_* or'd together */
|
||||
|
||||
/**
|
||||
* The next value for the Observe option. This field must be increased each
|
||||
* time the resource changes. Only the lower 24 bits are sent.
|
||||
*/
|
||||
unsigned int observe;
|
||||
|
||||
/**
|
||||
* Pointer back to the context that 'owns' this resource.
|
||||
*/
|
||||
coap_context_t *context;
|
||||
|
||||
/**
|
||||
* Count of valid names this host is known by (proxy support)
|
||||
*/
|
||||
size_t proxy_name_count;
|
||||
|
||||
/**
|
||||
* Array valid names this host is known by (proxy support)
|
||||
*/
|
||||
coap_str_const_t ** proxy_name_list;
|
||||
|
||||
/**
|
||||
* This pointer is under user control. It can be used to store context for
|
||||
* the coap handler.
|
||||
*/
|
||||
void *user_data;
|
||||
|
||||
};
|
||||
|
||||
/**
|
||||
* Deletes all resources from given @p context and frees their storage.
|
||||
*
|
||||
* @param context The CoAP context with the resources to be deleted.
|
||||
*/
|
||||
void coap_delete_all_resources(coap_context_t *context);
|
||||
|
||||
#define RESOURCES_ADD(r, obj) \
|
||||
HASH_ADD(hh, (r), uri_path->s[0], (obj)->uri_path->length, (obj))
|
||||
|
||||
#define RESOURCES_DELETE(r, obj) \
|
||||
HASH_DELETE(hh, (r), (obj))
|
||||
|
||||
#define RESOURCES_ITER(r,tmp) \
|
||||
coap_resource_t *tmp, *rtmp; \
|
||||
HASH_ITER(hh, (r), tmp, rtmp)
|
||||
|
||||
#define RESOURCES_FIND(r, k, res) { \
|
||||
HASH_FIND(hh, (r), (k)->s, (k)->length, (res)); \
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes an attribute.
|
||||
* Note: This is for internal use only, as it is not deleted from its chain.
|
||||
*
|
||||
* @param attr Pointer to a previously created attribute.
|
||||
*
|
||||
*/
|
||||
void coap_delete_attr(coap_attr_t *attr);
|
||||
|
||||
coap_print_status_t coap_print_wellknown(coap_context_t *,
|
||||
unsigned char *,
|
||||
size_t *, size_t,
|
||||
coap_opt_t *);
|
||||
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* COAP_RESOURCE_INTERNAL_H_ */
|
@ -0,0 +1,34 @@
|
||||
/* coap_riot.h -- RIOT-specific definitions for libcoap
|
||||
*
|
||||
* Copyright (C) 2019 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see
|
||||
* README for terms of use.
|
||||
*/
|
||||
|
||||
#ifndef COAP_RIOT_H_
|
||||
#define COAP_RIOT_H_
|
||||
|
||||
#ifndef LIBCOAP_MSG_QUEUE_SIZE
|
||||
/**
|
||||
* Size of the queue for passing messages between the network
|
||||
* interface and the coap stack. */
|
||||
#define LIBCOAP_MSG_QUEUE_SIZE (32U)
|
||||
#endif /* LIBCOAP_MSG_QUEUE_SIZE */
|
||||
|
||||
#ifndef LIBCOAP_MAX_SOCKETS
|
||||
/**
|
||||
* Maximum number of sockets that are simultaneously considered for
|
||||
* reading or writing. */
|
||||
#define LIBCOAP_MAX_SOCKETS (16U)
|
||||
#endif /* LIBCOAP_MAX_SOCKETS */
|
||||
|
||||
/**
|
||||
* This function must be called in the RIOT CoAP thread for
|
||||
* RIOT-specific initialization.
|
||||
*/
|
||||
void coap_riot_startup(void);
|
||||
|
||||
#endif /* COAP_RIOT_H_ */
|
@ -0,0 +1,591 @@
|
||||
/* coap_session.h -- Session management for libcoap
|
||||
*
|
||||
* Copyright (C) 2017 Jean-Claue Michelou <jcm@spinetix.com>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see
|
||||
* README for terms of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file coap_session.h
|
||||
* @brief Defines the application visible session information
|
||||
*/
|
||||
|
||||
#ifndef COAP_SESSION_H_
|
||||
#define COAP_SESSION_H_
|
||||
|
||||
/**
|
||||
* @defgroup session Sessions
|
||||
* API functions for CoAP Sessions
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Abstraction of a fixed point number that can be used where necessary instead
|
||||
* of a float. 1,000 fractional bits equals one integer
|
||||
*/
|
||||
typedef struct coap_fixed_point_t {
|
||||
uint16_t integer_part; /**< Integer part of fixed point variable */
|
||||
uint16_t fractional_part; /**< Fractional part of fixed point variable
|
||||
1/1000 (3 points) precision */
|
||||
} coap_fixed_point_t;
|
||||
|
||||
#define COAP_PROTO_NOT_RELIABLE(p) ((p)==COAP_PROTO_UDP || (p)==COAP_PROTO_DTLS)
|
||||
#define COAP_PROTO_RELIABLE(p) ((p)==COAP_PROTO_TCP || (p)==COAP_PROTO_TLS)
|
||||
|
||||
/**
|
||||
* coap_session_type_t values
|
||||
*/
|
||||
typedef enum coap_session_type_t {
|
||||
COAP_SESSION_TYPE_NONE = 0, /**< Not defined */
|
||||
COAP_SESSION_TYPE_CLIENT, /**< client-side */
|
||||
COAP_SESSION_TYPE_SERVER, /**< server-side */
|
||||
COAP_SESSION_TYPE_HELLO, /**< server-side ephemeral session for
|
||||
responding to a client hello */
|
||||
} coap_session_type_t;
|
||||
|
||||
/**
|
||||
* coap_session_state_t values
|
||||
*/
|
||||
typedef enum coap_session_state_t {
|
||||
COAP_SESSION_STATE_NONE = 0,
|
||||
COAP_SESSION_STATE_CONNECTING,
|
||||
COAP_SESSION_STATE_HANDSHAKE,
|
||||
COAP_SESSION_STATE_CSM,
|
||||
COAP_SESSION_STATE_ESTABLISHED,
|
||||
} coap_session_state_t;
|
||||
|
||||
/**
|
||||
* Increment reference counter on a session.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
* @return same as session
|
||||
*/
|
||||
coap_session_t *coap_session_reference(coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Decrement reference counter on a session.
|
||||
* Note that the session may be deleted as a result and should not be used
|
||||
* after this call.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
*/
|
||||
void coap_session_release(coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Notify session that it has failed. This cleans up any outstanding / queued
|
||||
* transmissions, observations etc..
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
* @param reason The reason why the session was disconnected.
|
||||
*/
|
||||
void coap_session_disconnected(coap_session_t *session,
|
||||
coap_nack_reason_t reason);
|
||||
|
||||
/**
|
||||
* Stores @p data with the given session. This function overwrites any value
|
||||
* that has previously been stored with @p session.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
* @param data The pointer to the data to store.
|
||||
*/
|
||||
void coap_session_set_app_data(coap_session_t *session, void *data);
|
||||
|
||||
/**
|
||||
* Returns any application-specific data that has been stored with @p
|
||||
* session using the function coap_session_set_app_data(). This function will
|
||||
* return @c NULL if no data has been stored.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
*
|
||||
* @return Pointer to the stored data or @c NULL.
|
||||
*/
|
||||
void *coap_session_get_app_data(const coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Get the remote IP address from the session.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
*
|
||||
* @return The session's remote address or @c NULL on failure.
|
||||
*/
|
||||
const coap_address_t *coap_session_get_addr_remote(
|
||||
const coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Get the local IP address from the session.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
*
|
||||
* @return The session's local address or @c NULL on failure.
|
||||
*/
|
||||
const coap_address_t *coap_session_get_addr_local(
|
||||
const coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Get the session protocol type
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
*
|
||||
* @return The session's protocol type
|
||||
*/
|
||||
coap_proto_t coap_session_get_proto(const coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Get the session type
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
*
|
||||
* @return The session's type
|
||||
*/
|
||||
coap_session_type_t coap_session_get_type(const coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Get the session state
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
*
|
||||
* @return The session's state
|
||||
*/
|
||||
coap_session_state_t coap_session_get_state(const coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Get the session if index
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
*
|
||||
* @return The session's if index, or @c -1 on error.
|
||||
*/
|
||||
int coap_session_get_ifindex(const coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Get the session TLS security ptr (TLS type dependent)
|
||||
*
|
||||
* OpenSSL: SSL*
|
||||
* GnuTLS: gnutls_session_t (implicit *)
|
||||
* Mbed TLS: mbedtls_ssl_context*
|
||||
* TinyDTLS: struct dtls_context*
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
* @param tls_lib Updated with the library type.
|
||||
*
|
||||
* @return The session TLS ptr or @c NULL if not set up
|
||||
*/
|
||||
void *coap_session_get_tls(const coap_session_t *session,
|
||||
coap_tls_library_t *tls_lib);
|
||||
|
||||
/**
|
||||
* Get the session context
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
*
|
||||
* @return The session's context
|
||||
*/
|
||||
coap_context_t *coap_session_get_context(const coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Set the session type to client. Typically used in a call-home server.
|
||||
* The session needs to be of type COAP_SESSION_TYPE_SERVER.
|
||||
* Note: If this function is successful, the session reference count is
|
||||
* incremented and a subsequent coap_session_release() taking the
|
||||
* reference count to 0 will cause the session to be freed off.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
*
|
||||
* @return @c 1 if updated, @c 0 on failure.
|
||||
*/
|
||||
int coap_session_set_type_client(coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Set the session MTU. This is the maximum message size that can be sent,
|
||||
* excluding IP and UDP overhead.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
* @param mtu maximum message size
|
||||
*/
|
||||
void coap_session_set_mtu(coap_session_t *session, unsigned mtu);
|
||||
|
||||
/**
|
||||
* Get maximum acceptable PDU size
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
* @return maximum PDU size, not including header (but including token).
|
||||
*/
|
||||
size_t coap_session_max_pdu_size(const coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Creates a new client session to the designated server.
|
||||
* @param ctx The CoAP context.
|
||||
* @param local_if Address of local interface. It is recommended to use NULL to let the operating system choose a suitable local interface. If an address is specified, the port number should be zero, which means that a free port is automatically selected.
|
||||
* @param server The server's address. If the port number is zero, the default port for the protocol will be used.
|
||||
* @param proto Protocol.
|
||||
*
|
||||
* @return A new CoAP session or NULL if failed. Call coap_session_release to free.
|
||||
*/
|
||||
coap_session_t *coap_new_client_session(
|
||||
coap_context_t *ctx,
|
||||
const coap_address_t *local_if,
|
||||
const coap_address_t *server,
|
||||
coap_proto_t proto
|
||||
);
|
||||
|
||||
/**
|
||||
* Creates a new client session to the designated server with PSK credentials
|
||||
* @param ctx The CoAP context.
|
||||
* @param local_if Address of local interface. It is recommended to use NULL to let the operating system choose a suitable local interface. If an address is specified, the port number should be zero, which means that a free port is automatically selected.
|
||||
* @param server The server's address. If the port number is zero, the default port for the protocol will be used.
|
||||
* @param proto Protocol.
|
||||
* @param identity PSK client identity
|
||||
* @param key PSK shared key
|
||||
* @param key_len PSK shared key length
|
||||
*
|
||||
* @return A new CoAP session or NULL if failed. Call coap_session_release to free.
|
||||
*/
|
||||
coap_session_t *coap_new_client_session_psk(
|
||||
coap_context_t *ctx,
|
||||
const coap_address_t *local_if,
|
||||
const coap_address_t *server,
|
||||
coap_proto_t proto,
|
||||
const char *identity,
|
||||
const uint8_t *key,
|
||||
unsigned key_len
|
||||
);
|
||||
|
||||
/**
|
||||
* Creates a new client session to the designated server with PSK credentials
|
||||
* @param ctx The CoAP context.
|
||||
* @param local_if Address of local interface. It is recommended to use NULL to
|
||||
* let the operating system choose a suitable local interface.
|
||||
* If an address is specified, the port number should be zero,
|
||||
* which means that a free port is automatically selected.
|
||||
* @param server The server's address. If the port number is zero, the default
|
||||
* port for the protocol will be used.
|
||||
* @param proto CoAP Protocol.
|
||||
* @param setup_data PSK parameters.
|
||||
*
|
||||
* @return A new CoAP session or NULL if failed. Call coap_session_release()
|
||||
* to free.
|
||||
*/
|
||||
coap_session_t *coap_new_client_session_psk2(
|
||||
coap_context_t *ctx,
|
||||
const coap_address_t *local_if,
|
||||
const coap_address_t *server,
|
||||
coap_proto_t proto,
|
||||
coap_dtls_cpsk_t *setup_data
|
||||
);
|
||||
|
||||
/**
|
||||
* Get the server session's current Identity Hint (PSK).
|
||||
*
|
||||
* @param session The current coap_session_t object.
|
||||
*
|
||||
* @return @c hint if successful, else @c NULL.
|
||||
*/
|
||||
const coap_bin_const_t * coap_session_get_psk_hint(
|
||||
const coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Get the session's current pre-shared key (PSK).
|
||||
*
|
||||
* @param session The current coap_session_t object.
|
||||
*
|
||||
* @return @c psk_key if successful, else @c NULL.
|
||||
*/
|
||||
const coap_bin_const_t * coap_session_get_psk_key(
|
||||
const coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Creates a new client session to the designated server with PKI credentials
|
||||
* @param ctx The CoAP context.
|
||||
* @param local_if Address of local interface. It is recommended to use NULL to
|
||||
* let the operating system choose a suitable local interface.
|
||||
* If an address is specified, the port number should be zero,
|
||||
* which means that a free port is automatically selected.
|
||||
* @param server The server's address. If the port number is zero, the default
|
||||
* port for the protocol will be used.
|
||||
* @param proto CoAP Protocol.
|
||||
* @param setup_data PKI parameters.
|
||||
*
|
||||
* @return A new CoAP session or NULL if failed. Call coap_session_release()
|
||||
* to free.
|
||||
*/
|
||||
coap_session_t *coap_new_client_session_pki(
|
||||
coap_context_t *ctx,
|
||||
const coap_address_t *local_if,
|
||||
const coap_address_t *server,
|
||||
coap_proto_t proto,
|
||||
coap_dtls_pki_t *setup_data
|
||||
);
|
||||
|
||||
/**
|
||||
* Initializes the token value to use as a starting point.
|
||||
*
|
||||
* @param session The current coap_session_t object.
|
||||
* @param length The length of the token (0 - 8 bytes).
|
||||
* @param token The token data.
|
||||
*
|
||||
*/
|
||||
void coap_session_init_token(coap_session_t *session, size_t length,
|
||||
const uint8_t *token);
|
||||
|
||||
/**
|
||||
* Creates a new token for use.
|
||||
*
|
||||
* @param session The current coap_session_t object.
|
||||
* @param length Updated with the length of the new token.
|
||||
* @param token Updated with the new token data (must be 8 bytes long).
|
||||
*
|
||||
*/
|
||||
void coap_session_new_token(coap_session_t *session, size_t *length,
|
||||
uint8_t *token);
|
||||
|
||||
/**
|
||||
* @ingroup logging
|
||||
* Get session description.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
* @return description string.
|
||||
*/
|
||||
const char *coap_session_str(const coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Create a new endpoint for communicating with peers.
|
||||
*
|
||||
* @param context The coap context that will own the new endpoint
|
||||
* @param listen_addr Address the endpoint will listen for incoming requests on or originate outgoing requests from. Use NULL to specify that no incoming request will be accepted and use a random endpoint.
|
||||
* @param proto Protocol used on this endpoint
|
||||
*/
|
||||
|
||||
coap_endpoint_t *coap_new_endpoint(coap_context_t *context, const coap_address_t *listen_addr, coap_proto_t proto);
|
||||
|
||||
/**
|
||||
* Set the endpoint's default MTU. This is the maximum message size that can be
|
||||
* sent, excluding IP and UDP overhead.
|
||||
*
|
||||
* @param endpoint The CoAP endpoint.
|
||||
* @param mtu maximum message size
|
||||
*/
|
||||
void coap_endpoint_set_default_mtu(coap_endpoint_t *endpoint, unsigned mtu);
|
||||
|
||||
void coap_free_endpoint(coap_endpoint_t *ep);
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @ingroup logging
|
||||
* Get endpoint description.
|
||||
*
|
||||
* @param endpoint The CoAP endpoint.
|
||||
* @return description string.
|
||||
*/
|
||||
const char *coap_endpoint_str(const coap_endpoint_t *endpoint);
|
||||
|
||||
coap_session_t *coap_session_get_by_peer(const coap_context_t *ctx,
|
||||
const coap_address_t *remote_addr, int ifindex);
|
||||
|
||||
/**
|
||||
* @defgroup cc Rate Control
|
||||
* The transmission parameters for CoAP rate control ("Congestion
|
||||
* Control" in stream-oriented protocols) are defined in
|
||||
* https://tools.ietf.org/html/rfc7252#section-4.8
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Number of seconds when to expect an ACK or a response to an
|
||||
* outstanding CON message.
|
||||
* RFC 7252, Section 4.8 Default value of ACK_TIMEOUT is 2
|
||||
*
|
||||
* Configurable using coap_session_set_ack_timeout()
|
||||
*/
|
||||
#define COAP_DEFAULT_ACK_TIMEOUT ((coap_fixed_point_t){2,0})
|
||||
|
||||
/**
|
||||
* A factor that is used to randomize the wait time before a message
|
||||
* is retransmitted to prevent synchronization effects.
|
||||
* RFC 7252, Section 4.8 Default value of ACK_RANDOM_FACTOR is 1.5
|
||||
*
|
||||
* Configurable using coap_session_set_ack_random_factor()
|
||||
*/
|
||||
#define COAP_DEFAULT_ACK_RANDOM_FACTOR ((coap_fixed_point_t){1,500})
|
||||
|
||||
/**
|
||||
* Number of message retransmissions before message sending is stopped
|
||||
* RFC 7252, Section 4.8 Default value of MAX_RETRANSMIT is 4
|
||||
*
|
||||
* Configurable using coap_session_set_max_retransmit()
|
||||
*/
|
||||
#define COAP_DEFAULT_MAX_RETRANSMIT 4
|
||||
|
||||
/**
|
||||
* The number of simultaneous outstanding interactions that a client
|
||||
* maintains to a given server.
|
||||
* RFC 7252, Section 4.8 Default value of NSTART is 1
|
||||
*/
|
||||
#define COAP_DEFAULT_NSTART 1
|
||||
|
||||
/**
|
||||
* The maximum number of seconds before sending back a response to a
|
||||
* multicast request.
|
||||
* RFC 7252, Section 4.8 DEFAULT_LEISURE is 5.
|
||||
*/
|
||||
#ifndef COAP_DEFAULT_LEISURE
|
||||
#define COAP_DEFAULT_LEISURE (5U)
|
||||
#endif /* COAP_DEFAULT_LEISURE */
|
||||
|
||||
/**
|
||||
* The MAX_TRANSMIT_SPAN definition for the session (s).
|
||||
*
|
||||
* RFC 7252, Section 4.8.2 Calculation of MAX_TRAMSMIT_SPAN
|
||||
* ACK_TIMEOUT * ((2 ** (MAX_RETRANSMIT)) - 1) * ACK_RANDOM_FACTOR
|
||||
*/
|
||||
#define COAP_MAX_TRANSMIT_SPAN(s) \
|
||||
((s->ack_timeout.integer_part * 1000 + s->ack_timeout.fractional_part) * \
|
||||
((1 << (s->max_retransmit)) -1) * \
|
||||
(s->ack_random_factor.integer_part * 1000 + \
|
||||
s->ack_random_factor.fractional_part) \
|
||||
/ 1000000)
|
||||
|
||||
/**
|
||||
* The MAX_TRANSMIT_WAIT definition for the session (s).
|
||||
*
|
||||
* RFC 7252, Section 4.8.2 Calculation of MAX_TRAMSMIT_WAIT
|
||||
* ACK_TIMEOUT * ((2 ** (MAX_RETRANSMIT + 1)) - 1) * ACK_RANDOM_FACTOR
|
||||
*/
|
||||
#define COAP_MAX_TRANSMIT_WAIT(s) \
|
||||
((s->ack_timeout.integer_part * 1000 + s->ack_timeout.fractional_part) * \
|
||||
((1 << (s->max_retransmit + 1)) -1) * \
|
||||
(s->ack_random_factor.integer_part * 1000 + \
|
||||
s->ack_random_factor.fractional_part) \
|
||||
/ 1000000)
|
||||
|
||||
/**
|
||||
* The MAX_LATENCY definition.
|
||||
* RFC 7252, Section 4.8.2 MAX_LATENCY is 100.
|
||||
*/
|
||||
#define COAP_MAX_LATENCY 100
|
||||
|
||||
/**
|
||||
* The PROCESSING_DELAY definition for the session (s).
|
||||
*
|
||||
* RFC 7252, Section 4.8.2 Calculation of PROCESSING_DELAY
|
||||
* PROCESSING_DELAY set to ACK_TIMEOUT
|
||||
*/
|
||||
#define COAP_PROCESSING_DELAY(s) \
|
||||
((s->ack_timeout.integer_part * 1000 + s->ack_timeout.fractional_part + 500) \
|
||||
/ 1000)
|
||||
|
||||
/**
|
||||
* The MAX_RTT definition for the session (s).
|
||||
*
|
||||
* RFC 7252, Section 4.8.2 Calculation of MAX_RTT
|
||||
* (2 * MAX_LATENCY) + PROCESSING_DELAY
|
||||
*/
|
||||
#define COAP_MAX_RTT(s) \
|
||||
((2 * COAP_MAX_LATENCY) + COAP_PROCESSING_DELAY(s))
|
||||
|
||||
/**
|
||||
* The EXCHANGE_LIFETIME definition for the session (s).
|
||||
*
|
||||
* RFC 7252, Section 4.8.2 Calculation of EXCHANGE_LIFETIME
|
||||
* MAX_TRANSMIT_SPAN + (2 * MAX_LATENCY) + PROCESSING_DELAY
|
||||
*/
|
||||
#define COAP_EXCHANGE_LIFETIME(s) \
|
||||
(COAP_MAX_TRANSMIT_SPAN(s) + (2 * COAP_MAX_LATENCY) + COAP_PROCESSING_DELAY(s))
|
||||
|
||||
/**
|
||||
* The NON_LIFETIME definition for the session (s).
|
||||
*
|
||||
* RFC 7252, Section 4.8.2 Calculation of NON_LIFETIME
|
||||
* MAX_TRANSMIT_SPAN + MAX_LATENCY
|
||||
*/
|
||||
#define COAP_NON_LIFETIME(s) \
|
||||
(COAP_MAX_TRANSMIT_SPAN(s) + COAP_MAX_LATENCY)
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* Set the CoAP maximum retransmit count before failure
|
||||
*
|
||||
* Number of message retransmissions before message sending is stopped
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
* @param value The value to set to. The default is 4 and should not normally
|
||||
* get changed.
|
||||
*/
|
||||
void coap_session_set_max_retransmit(coap_session_t *session,
|
||||
unsigned int value);
|
||||
|
||||
/**
|
||||
* Set the CoAP initial ack response timeout before the next re-transmit
|
||||
*
|
||||
* Number of seconds when to expect an ACK or a response to an
|
||||
* outstanding CON message.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
* @param value The value to set to. The default is 2 and should not normally
|
||||
* get changed.
|
||||
*/
|
||||
void coap_session_set_ack_timeout(coap_session_t *session,
|
||||
coap_fixed_point_t value);
|
||||
|
||||
/**
|
||||
* Set the CoAP ack randomize factor
|
||||
*
|
||||
* A factor that is used to randomize the wait time before a message
|
||||
* is retransmitted to prevent synchronization effects.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
* @param value The value to set to. The default is 1.5 and should not normally
|
||||
* get changed.
|
||||
*/
|
||||
void coap_session_set_ack_random_factor(coap_session_t *session,
|
||||
coap_fixed_point_t value);
|
||||
|
||||
/**
|
||||
* Get the CoAP maximum retransmit before failure
|
||||
*
|
||||
* Number of message retransmissions before message sending is stopped
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
*
|
||||
* @return Current maximum retransmit value
|
||||
*/
|
||||
unsigned int coap_session_get_max_retransmit(const coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Get the CoAP initial ack response timeout before the next re-transmit
|
||||
*
|
||||
* Number of seconds when to expect an ACK or a response to an
|
||||
* outstanding CON message.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
*
|
||||
* @return Current ack response timeout value
|
||||
*/
|
||||
coap_fixed_point_t coap_session_get_ack_timeout(const coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Get the CoAP ack randomize factor
|
||||
*
|
||||
* A factor that is used to randomize the wait time before a message
|
||||
* is retransmitted to prevent synchronization effects.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
*
|
||||
* @return Current ack randomize value
|
||||
*/
|
||||
coap_fixed_point_t coap_session_get_ack_random_factor(
|
||||
const coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Send a ping message for the session.
|
||||
* @param session The CoAP session.
|
||||
*
|
||||
* @return COAP_INVALID_MID if there is an error
|
||||
*/
|
||||
coap_mid_t coap_session_send_ping(coap_session_t *session);
|
||||
|
||||
#endif /* COAP_SESSION_H */
|
@ -0,0 +1,295 @@
|
||||
/*
|
||||
* coap_session_internal.h -- Structures, Enums & Functions that are not
|
||||
* exposed to application programming
|
||||
*
|
||||
* Copyright (C) 2010-2019 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file coap_session_internal.h
|
||||
* @brief COAP session internal information
|
||||
*/
|
||||
|
||||
#ifndef COAP_SESSION_INTERNAL_H_
|
||||
#define COAP_SESSION_INTERNAL_H_
|
||||
|
||||
#include "coap_io_internal.h"
|
||||
|
||||
#define COAP_DEFAULT_SESSION_TIMEOUT 300
|
||||
#define COAP_PARTIAL_SESSION_TIMEOUT_TICKS (30 * COAP_TICKS_PER_SECOND)
|
||||
#define COAP_DEFAULT_MAX_HANDSHAKE_SESSIONS 100
|
||||
|
||||
/**
|
||||
* @defgroup session_internal Sessions (Internal)
|
||||
* CoAP Session Structures, Enums and Functions that are not exposed to
|
||||
* applications
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Only used for servers for hashing incoming packets. Cannot have local IP
|
||||
* address as this may be an initial multicast and subsequent unicast address
|
||||
*/
|
||||
struct coap_addr_hash_t {
|
||||
coap_address_t remote; /**< remote address and port */
|
||||
uint16_t lport; /**< local port */
|
||||
coap_proto_t proto; /**< CoAP protocol */
|
||||
};
|
||||
|
||||
/**
|
||||
* Abstraction of virtual session that can be attached to coap_context_t
|
||||
* (client) or coap_endpoint_t (server).
|
||||
*/
|
||||
struct coap_session_t {
|
||||
coap_proto_t proto; /**< protocol used */
|
||||
coap_session_type_t type; /**< client or server side socket */
|
||||
coap_session_state_t state; /**< current state of relationaship with
|
||||
peer */
|
||||
unsigned ref; /**< reference count from queues */
|
||||
size_t tls_overhead; /**< overhead of TLS layer */
|
||||
size_t mtu; /**< path or CSM mtu */
|
||||
coap_addr_hash_t addr_hash; /**< Address hash for server incoming packets */
|
||||
UT_hash_handle hh;
|
||||
coap_addr_tuple_t addr_info; /**< key: remote/local address info */
|
||||
int ifindex; /**< interface index */
|
||||
coap_socket_t sock; /**< socket object for the session, if
|
||||
any */
|
||||
coap_endpoint_t *endpoint; /**< session's endpoint */
|
||||
coap_context_t *context; /**< session's context */
|
||||
void *tls; /**< security parameters */
|
||||
uint16_t tx_mid; /**< the last message id that was used in
|
||||
this session */
|
||||
uint8_t con_active; /**< Active CON request sent */
|
||||
uint8_t csm_block_supported; /**< CSM TCP blocks supported */
|
||||
coap_mid_t last_ping_mid; /**< the last keepalive message id that was
|
||||
used in this session */
|
||||
coap_queue_t *delayqueue; /**< list of delayed messages waiting to
|
||||
be sent */
|
||||
coap_lg_xmit_t *lg_xmit; /**< list of large transmissions */
|
||||
coap_lg_crcv_t *lg_crcv; /**< Client list of expected large receives */
|
||||
coap_lg_srcv_t *lg_srcv; /**< Server list of expected large receives */
|
||||
size_t partial_write; /**< if > 0 indicates number of bytes
|
||||
already written from the pdu at the
|
||||
head of sendqueue */
|
||||
uint8_t read_header[8]; /**< storage space for header of incoming
|
||||
message header */
|
||||
size_t partial_read; /**< if > 0 indicates number of bytes
|
||||
already read for an incoming message */
|
||||
coap_pdu_t *partial_pdu; /**< incomplete incoming pdu */
|
||||
coap_tick_t last_rx_tx;
|
||||
coap_tick_t last_tx_rst;
|
||||
coap_tick_t last_ping;
|
||||
coap_tick_t last_pong;
|
||||
coap_tick_t csm_tx;
|
||||
coap_dtls_cpsk_t cpsk_setup_data; /**< client provided PSK initial setup
|
||||
data */
|
||||
coap_bin_const_t *psk_identity; /**< If client, this field contains the
|
||||
current identity for server; When this
|
||||
field is NULL, the current identity is
|
||||
contained in cpsk_setup_data
|
||||
|
||||
If server, this field contains the client
|
||||
provided identity.
|
||||
|
||||
Value maintained internally */
|
||||
coap_bin_const_t *psk_key; /**< If client, this field contains the
|
||||
current pre-shared key for server;
|
||||
When this field is NULL, the current
|
||||
key is contained in cpsk_setup_data
|
||||
|
||||
If server, this field contains the
|
||||
client's current key.
|
||||
|
||||
Value maintained internally */
|
||||
coap_bin_const_t *psk_hint; /**< If client, this field contains the
|
||||
server provided identity hint.
|
||||
|
||||
If server, this field contains the
|
||||
current hint for the client; When this
|
||||
field is NULL, the current hint is
|
||||
contained in context->spsk_setup_data
|
||||
|
||||
Value maintained internally */
|
||||
void *app; /**< application-specific data */
|
||||
unsigned int max_retransmit; /**< maximum re-transmit count (default
|
||||
4) */
|
||||
coap_fixed_point_t ack_timeout; /**< timeout waiting for ack (default 2
|
||||
secs) */
|
||||
coap_fixed_point_t ack_random_factor; /**< ack random factor backoff (default
|
||||
1.5) */
|
||||
unsigned int dtls_timeout_count; /**< dtls setup retry counter */
|
||||
int dtls_event; /**< Tracking any (D)TLS events on this
|
||||
sesison */
|
||||
uint8_t block_mode; /**< Zero or more COAP_BLOCK_ or'd options */
|
||||
uint64_t tx_token; /**< Next token number to use */
|
||||
};
|
||||
|
||||
/**
|
||||
* Abstraction of virtual endpoint that can be attached to coap_context_t. The
|
||||
* keys (port, bind_addr) must uniquely identify this endpoint.
|
||||
*/
|
||||
struct coap_endpoint_t {
|
||||
struct coap_endpoint_t *next;
|
||||
coap_context_t *context; /**< endpoint's context */
|
||||
coap_proto_t proto; /**< protocol used on this interface */
|
||||
uint16_t default_mtu; /**< default mtu for this interface */
|
||||
coap_socket_t sock; /**< socket object for the interface, if
|
||||
any */
|
||||
coap_address_t bind_addr; /**< local interface address */
|
||||
coap_session_t *sessions; /**< hash table or list of active sessions */
|
||||
};
|
||||
|
||||
/**
|
||||
* Notify session transport has just connected and CSM exchange can now start.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
*/
|
||||
void coap_session_send_csm(coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Notify session that it has just connected or reconnected.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
*/
|
||||
void coap_session_connected(coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Refresh the session's current Identity Hint (PSK).
|
||||
* Note: A copy of @p psk_hint is maintained in the session by libcoap.
|
||||
*
|
||||
* @param session The current coap_session_t object.
|
||||
* @param psk_hint If NULL, the Identity Hint will revert to the
|
||||
* initial Identity Hint used at session setup.
|
||||
*
|
||||
* @return @c 1 if successful, else @c 0.
|
||||
*/
|
||||
int coap_session_refresh_psk_hint(coap_session_t *session,
|
||||
const coap_bin_const_t *psk_hint);
|
||||
|
||||
/**
|
||||
* Refresh the session's current pre-shared key (PSK).
|
||||
* Note: A copy of @p psk_key is maintained in the session by libcoap.
|
||||
*
|
||||
* @param session The current coap_session_t object.
|
||||
* @param psk_key If NULL, the pre-shared key will revert to the
|
||||
* initial pre-shared key used as session setup.
|
||||
*
|
||||
* @return @c 1 if successful, else @c 0.
|
||||
*/
|
||||
int coap_session_refresh_psk_key(coap_session_t *session,
|
||||
const coap_bin_const_t *psk_key);
|
||||
|
||||
/**
|
||||
* Creates a new server session for the specified endpoint.
|
||||
* @param ctx The CoAP context.
|
||||
* @param ep An endpoint where an incoming connection request is pending.
|
||||
*
|
||||
* @return A new CoAP session or NULL if failed. Call coap_session_release to
|
||||
* add to unused queue.
|
||||
*/
|
||||
coap_session_t *coap_new_server_session(
|
||||
coap_context_t *ctx,
|
||||
coap_endpoint_t *ep
|
||||
);
|
||||
|
||||
/**
|
||||
* Function interface for datagram data transmission. This function returns
|
||||
* the number of bytes that have been transmitted, or a value less than zero
|
||||
* on error.
|
||||
*
|
||||
* @param session Session to send data on.
|
||||
* @param data The data to send.
|
||||
* @param datalen The actual length of @p data.
|
||||
*
|
||||
* @return The number of bytes written on success, or a value
|
||||
* less than zero on error.
|
||||
*/
|
||||
ssize_t coap_session_send(coap_session_t *session,
|
||||
const uint8_t *data, size_t datalen);
|
||||
|
||||
/**
|
||||
* Function interface for stream data transmission. This function returns
|
||||
* the number of bytes that have been transmitted, or a value less than zero
|
||||
* on error. The number of bytes written may be less than datalen because of
|
||||
* congestion control.
|
||||
*
|
||||
* @param session Session to send data on.
|
||||
* @param data The data to send.
|
||||
* @param datalen The actual length of @p data.
|
||||
*
|
||||
* @return The number of bytes written on success, or a value
|
||||
* less than zero on error.
|
||||
*/
|
||||
ssize_t coap_session_write(coap_session_t *session,
|
||||
const uint8_t *data, size_t datalen);
|
||||
|
||||
/**
|
||||
* Send a pdu according to the session's protocol. This function returns
|
||||
* the number of bytes that have been transmitted, or a value less than zero
|
||||
* on error.
|
||||
*
|
||||
* @param session Session to send pdu on.
|
||||
* @param pdu The pdu to send.
|
||||
*
|
||||
* @return The number of bytes written on success, or a value
|
||||
* less than zero on error.
|
||||
*/
|
||||
ssize_t coap_session_send_pdu(coap_session_t *session, coap_pdu_t *pdu);
|
||||
|
||||
ssize_t
|
||||
coap_session_delay_pdu(coap_session_t *session, coap_pdu_t *pdu,
|
||||
coap_queue_t *node);
|
||||
|
||||
/**
|
||||
* Lookup the server session for the packet received on an endpoint, or create
|
||||
* a new one.
|
||||
*
|
||||
* @param endpoint Active endpoint the packet was received on.
|
||||
* @param packet Received packet.
|
||||
* @param now The current time in ticks.
|
||||
* @return The CoAP session or @c NULL if error.
|
||||
*/
|
||||
coap_session_t *coap_endpoint_get_session(coap_endpoint_t *endpoint,
|
||||
const coap_packet_t *packet, coap_tick_t now);
|
||||
|
||||
/**
|
||||
* Create a new DTLS session for the @p session.
|
||||
* Note: the @p session is released if no DTLS server session can be created.
|
||||
*
|
||||
* @ingroup dtls_internal
|
||||
*
|
||||
* @param session Session to add DTLS session to
|
||||
* @param now The current time in ticks.
|
||||
*
|
||||
* @return CoAP session or @c NULL if error.
|
||||
*/
|
||||
coap_session_t *coap_session_new_dtls_session(coap_session_t *session,
|
||||
coap_tick_t now);
|
||||
|
||||
void coap_session_free(coap_session_t *session);
|
||||
void coap_session_mfree(coap_session_t *session);
|
||||
|
||||
/** @} */
|
||||
|
||||
#define SESSIONS_ADD(e, obj) \
|
||||
HASH_ADD(hh, (e), addr_hash, sizeof((obj)->addr_hash), (obj))
|
||||
|
||||
#define SESSIONS_DELETE(e, obj) \
|
||||
HASH_DELETE(hh, (e), (obj))
|
||||
|
||||
#define SESSIONS_ITER(e, el, rtmp) \
|
||||
HASH_ITER(hh, (e), el, rtmp)
|
||||
|
||||
#define SESSIONS_ITER_SAFE(e, el, rtmp) \
|
||||
for ((el) = (e); (el) && ((rtmp) = (el)->hh.next, 1); (el) = (rtmp))
|
||||
|
||||
#define SESSIONS_FIND(e, k, res) { \
|
||||
HASH_FIND(hh, (e), &(k), sizeof(k), (res)); \
|
||||
}
|
||||
|
||||
#endif /* COAP_SESSION_INTERNAL_H_ */
|
@ -0,0 +1,151 @@
|
||||
/*
|
||||
* coap_subscribe_internal.h -- Structures, Enums & Functions that are not
|
||||
* exposed to application programming
|
||||
*
|
||||
* Copyright (C) 2010-2021 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file coap_subscribe_internal.h
|
||||
* @brief COAP subscribe internal information
|
||||
*/
|
||||
|
||||
#ifndef COAP_SUBSCRIBE_INTERNAL_H_
|
||||
#define COAP_SUBSCRIBE_INTERNAL_H_
|
||||
|
||||
/**
|
||||
* @defgroup subscribe_internal Observe Subscription (Internal)
|
||||
* CoAP Observe Subscription Structures, Enums and Functions that are not
|
||||
* exposed to applications
|
||||
* @{
|
||||
*/
|
||||
|
||||
#ifndef COAP_OBS_MAX_NON
|
||||
/**
|
||||
* Number of notifications that may be sent non-confirmable before a confirmable
|
||||
* message is sent to detect if observers are alive. The maximum allowed value
|
||||
* here is @c 15.
|
||||
*/
|
||||
#define COAP_OBS_MAX_NON 5
|
||||
#endif /* COAP_OBS_MAX_NON */
|
||||
|
||||
#ifndef COAP_OBS_MAX_FAIL
|
||||
/**
|
||||
* Number of confirmable notifications that may fail (i.e. time out without
|
||||
* being ACKed) before an observer is removed. The maximum value for
|
||||
* COAP_OBS_MAX_FAIL is @c 3.
|
||||
*/
|
||||
#define COAP_OBS_MAX_FAIL 3
|
||||
#endif /* COAP_OBS_MAX_FAIL */
|
||||
|
||||
/** Subscriber information */
|
||||
struct coap_subscription_t {
|
||||
struct coap_subscription_t *next; /**< next element in linked list */
|
||||
struct coap_session_t *session; /**< subscriber session */
|
||||
|
||||
unsigned int non_cnt:4; /**< up to 15 non-confirmable notifies allowed */
|
||||
unsigned int fail_cnt:2; /**< up to 3 confirmable notifies can fail */
|
||||
unsigned int dirty:1; /**< set if the notification temporarily could not be
|
||||
* sent (in that case, the resource's partially
|
||||
* dirty flag is set too) */
|
||||
coap_cache_key_t *cache_key; /** cache_key to identify requester */
|
||||
coap_pdu_t *pdu; /**< PDU to use for additional requests */
|
||||
};
|
||||
|
||||
void coap_subscription_init(coap_subscription_t *);
|
||||
|
||||
/**
|
||||
* Handles a failed observe notify.
|
||||
*
|
||||
* @param context The context holding the resource.
|
||||
* @param session The session that the observe notify failed on.
|
||||
* @param token The token used when the observe notify failed.
|
||||
*/
|
||||
void
|
||||
coap_handle_failed_notify(coap_context_t *context,
|
||||
coap_session_t *session,
|
||||
const coap_binary_t *token);
|
||||
|
||||
/**
|
||||
* Checks all known resources to see if they are dirty and then notifies
|
||||
* subscribed observers.
|
||||
*
|
||||
* @param context The context to check for dirty resources.
|
||||
*/
|
||||
void coap_check_notify(coap_context_t *context);
|
||||
|
||||
/**
|
||||
* Adds the specified peer as observer for @p resource. The subscription is
|
||||
* identified by the given @p token. This function returns the registered
|
||||
* subscription information if the @p observer has been added, or @c NULL on
|
||||
* error.
|
||||
*
|
||||
* @param resource The observed resource.
|
||||
* @param session The observer's session
|
||||
* @param token The token that identifies this subscription.
|
||||
* @param pdu The requesting pdu.
|
||||
*
|
||||
* @return A pointer to the added/updated subscription
|
||||
* information or @c NULL on error.
|
||||
*/
|
||||
coap_subscription_t *coap_add_observer(coap_resource_t *resource,
|
||||
coap_session_t *session,
|
||||
const coap_binary_t *token,
|
||||
const coap_pdu_t *pdu);
|
||||
|
||||
/**
|
||||
* Returns a subscription object for given @p peer.
|
||||
*
|
||||
* @param resource The observed resource.
|
||||
* @param session The observer's session
|
||||
* @param token The token that identifies this subscription or @c NULL for
|
||||
* any token.
|
||||
* @return A valid subscription if exists or @c NULL otherwise.
|
||||
*/
|
||||
coap_subscription_t *coap_find_observer(coap_resource_t *resource,
|
||||
coap_session_t *session,
|
||||
const coap_binary_t *token);
|
||||
|
||||
/**
|
||||
* Flags that data is ready to be sent to observers.
|
||||
*
|
||||
* @param context The CoAP context to use.
|
||||
* @param session The observer's session
|
||||
* @param token The corresponding token that has been used for the
|
||||
* subscription.
|
||||
*/
|
||||
void coap_touch_observer(coap_context_t *context,
|
||||
coap_session_t *session,
|
||||
const coap_binary_t *token);
|
||||
|
||||
/**
|
||||
* Removes any subscription for @p observer from @p resource and releases the
|
||||
* allocated storage. The result is @c 1 if an observation relationship with @p
|
||||
* observer and @p token existed, @c 0 otherwise.
|
||||
*
|
||||
* @param resource The observed resource.
|
||||
* @param session The observer's session.
|
||||
* @param token The token that identifies this subscription or @c NULL for
|
||||
* any token.
|
||||
* @return @c 1 if the observer has been deleted, @c 0 otherwise.
|
||||
*/
|
||||
int coap_delete_observer(coap_resource_t *resource,
|
||||
coap_session_t *session,
|
||||
const coap_binary_t *token);
|
||||
|
||||
/**
|
||||
* Removes any subscription for @p session and releases the allocated storage.
|
||||
*
|
||||
* @param context The CoAP context to use.
|
||||
* @param session The observer's session.
|
||||
*/
|
||||
void coap_delete_observers(coap_context_t *context, coap_session_t *session);
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* COAP_SUBSCRIBE_INTERNAL_H_ */
|
@ -0,0 +1,111 @@
|
||||
/*
|
||||
* coap_tcp_internal.h -- TCP functions for libcoap
|
||||
*
|
||||
* Copyright (C) 2019--2020 Olaf Bergmann <bergmann@tzi.org> and others
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file coap_tcp_internal.h
|
||||
* @brief COAP tcp internal information
|
||||
*/
|
||||
|
||||
#ifndef COAP_TCP_INTERNAL_H_
|
||||
#define COAP_TCP_INTERNAL_H_
|
||||
|
||||
#include "coap_io.h"
|
||||
|
||||
/**
|
||||
* @defgroup tcp TCP Support (Internal)
|
||||
* CoAP TCP Structures, Enums and Functions that are not exposed to
|
||||
* applications
|
||||
* @{
|
||||
*/
|
||||
|
||||
#if !COAP_DISABLE_TCP
|
||||
|
||||
/**
|
||||
* Create a new TCP socket and initiate the connection
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @param sock Where socket information is to be filled in
|
||||
* @param local_if The local address to use or NULL
|
||||
* @param server The address to connect to
|
||||
* @param default_port The port to use if not set in @p server
|
||||
* @param local_addr Filled in after connection initiation with
|
||||
* the local address
|
||||
* @param remote_addr Filled in after connection initiation with
|
||||
* the remote address
|
||||
*
|
||||
* @return @c 1 if succesful, @c 0 if failure of some sort
|
||||
*/
|
||||
int
|
||||
coap_socket_connect_tcp1(coap_socket_t *sock,
|
||||
const coap_address_t *local_if,
|
||||
const coap_address_t *server,
|
||||
int default_port,
|
||||
coap_address_t *local_addr,
|
||||
coap_address_t *remote_addr);
|
||||
|
||||
/**
|
||||
* Complete the TCP Connection
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @param sock The socket information to use
|
||||
* @param local_addr Filled in with the final local address
|
||||
* @param remote_addr Filled in with the final remote address
|
||||
*
|
||||
* @return @c 1 if succesful, @c 0 if failure of some sort
|
||||
*/
|
||||
int
|
||||
coap_socket_connect_tcp2(coap_socket_t *sock,
|
||||
coap_address_t *local_addr,
|
||||
coap_address_t *remote_addr);
|
||||
|
||||
/**
|
||||
* Create a new TCP socket and then listen for new incoming TCP sessions
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @param sock Where socket information is to be filled in
|
||||
* @param listen_addr The address to be listening for new incoming sessions
|
||||
* @param bound_addr Filled in with the address that the TCP layer
|
||||
* is listening on for new incoming TCP sessions
|
||||
*
|
||||
* @return @c 1 if succesful, @c 0 if failure of some sort
|
||||
*/
|
||||
int
|
||||
coap_socket_bind_tcp(coap_socket_t *sock,
|
||||
const coap_address_t *listen_addr,
|
||||
coap_address_t *bound_addr);
|
||||
|
||||
/**
|
||||
* Accept a new incoming TCP session
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @param server The socket information to use to accept the TCP connection
|
||||
* @param new_client Filled in socket information with the new incoming
|
||||
* session information
|
||||
* @param local_addr Filled in with the local address
|
||||
* @param remote_addr Filled in with the remote address
|
||||
*
|
||||
* @return @c 1 if succesful, @c 0 if failure of some sort
|
||||
*/
|
||||
int
|
||||
coap_socket_accept_tcp(coap_socket_t *server,
|
||||
coap_socket_t *new_client,
|
||||
coap_address_t *local_addr,
|
||||
coap_address_t *remote_addr);
|
||||
|
||||
#endif /* !COAP_DISABLE_TCP */
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* COAP_TCP_INTERNAL_H_ */
|
203
tools/sdk/esp32/include/coap/libcoap/include/coap3/coap_time.h
Normal file
203
tools/sdk/esp32/include/coap/libcoap/include/coap3/coap_time.h
Normal file
@ -0,0 +1,203 @@
|
||||
/*
|
||||
* coap_time.h -- Clock Handling
|
||||
*
|
||||
* Copyright (C) 2010-2019 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file coap_time.h
|
||||
* @brief Clock Handling
|
||||
*/
|
||||
|
||||
#ifndef COAP_TIME_H_
|
||||
#define COAP_TIME_H_
|
||||
|
||||
/**
|
||||
* @defgroup clock Clock Handling
|
||||
* Default implementation of internal clock.
|
||||
* @{
|
||||
*/
|
||||
|
||||
#if defined(WITH_LWIP)
|
||||
|
||||
#include <stdint.h>
|
||||
#include <lwip/sys.h>
|
||||
|
||||
/* lwIP provides ms in sys_now */
|
||||
#define COAP_TICKS_PER_SECOND 1000
|
||||
|
||||
typedef uint32_t coap_tick_t;
|
||||
typedef uint32_t coap_time_t;
|
||||
typedef int32_t coap_tick_diff_t;
|
||||
|
||||
COAP_STATIC_INLINE void coap_ticks_impl(coap_tick_t *t) {
|
||||
*t = sys_now();
|
||||
}
|
||||
|
||||
COAP_STATIC_INLINE void coap_clock_init_impl(void) {
|
||||
}
|
||||
|
||||
#define coap_clock_init coap_clock_init_impl
|
||||
#define coap_ticks coap_ticks_impl
|
||||
|
||||
COAP_STATIC_INLINE coap_time_t coap_ticks_to_rt(coap_tick_t t) {
|
||||
return t / COAP_TICKS_PER_SECOND;
|
||||
}
|
||||
|
||||
COAP_STATIC_INLINE uint64_t coap_ticks_to_rt_us(coap_tick_t t) {
|
||||
return (uint64_t)t * 1000000 / COAP_TICKS_PER_SECOND;
|
||||
}
|
||||
|
||||
#elif defined(WITH_CONTIKI)
|
||||
|
||||
#include "clock.h"
|
||||
|
||||
typedef clock_time_t coap_tick_t;
|
||||
typedef clock_time_t coap_time_t;
|
||||
|
||||
/**
|
||||
* This data type is used to represent the difference between two clock_tick_t
|
||||
* values. This data type must have the same size in memory as coap_tick_t to
|
||||
* allow wrapping.
|
||||
*/
|
||||
typedef int coap_tick_diff_t;
|
||||
|
||||
#define COAP_TICKS_PER_SECOND CLOCK_SECOND
|
||||
|
||||
COAP_STATIC_INLINE void coap_clock_init(void) {
|
||||
clock_init();
|
||||
}
|
||||
|
||||
COAP_STATIC_INLINE void coap_ticks(coap_tick_t *t) {
|
||||
*t = clock_time();
|
||||
}
|
||||
|
||||
COAP_STATIC_INLINE coap_time_t coap_ticks_to_rt(coap_tick_t t) {
|
||||
return t / COAP_TICKS_PER_SECOND;
|
||||
}
|
||||
|
||||
COAP_STATIC_INLINE uint64_t coap_ticks_to_rt_us(coap_tick_t t) {
|
||||
return (uint64_t)t * 1000000 / COAP_TICKS_PER_SECOND;
|
||||
}
|
||||
|
||||
#elif defined(RIOT_VERSION)
|
||||
#include <xtimer.h>
|
||||
|
||||
#ifdef XTIMER_HZ
|
||||
#define COAP_TICKS_PER_SECOND (XTIMER_HZ)
|
||||
#else /* XTIMER_HZ */
|
||||
#define COAP_TICKS_PER_SECOND (XTIMER_HZ_BASE)
|
||||
#endif /* XTIMER_HZ */
|
||||
|
||||
typedef uint64_t coap_tick_t;
|
||||
typedef int64_t coap_tick_diff_t;
|
||||
typedef uint32_t coap_time_t;
|
||||
|
||||
static inline void coap_clock_init(void) {}
|
||||
|
||||
static inline void coap_ticks(coap_tick_t *t) {
|
||||
*t = xtimer_now_usec64();
|
||||
}
|
||||
|
||||
static inline coap_time_t coap_ticks_to_rt(coap_tick_t t) {
|
||||
return t / 1000000UL;
|
||||
}
|
||||
|
||||
static inline uint64_t coap_ticks_to_rt_us(coap_tick_t t) {
|
||||
return t;
|
||||
}
|
||||
|
||||
static inline coap_tick_t coap_ticks_from_rt_us(uint64_t t) {
|
||||
return t / 1000000UL;
|
||||
}
|
||||
#else /* !WITH_LWIP && !WITH_CONTIKI && !RIOT_VERSION */
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* This data type represents internal timer ticks with COAP_TICKS_PER_SECOND
|
||||
* resolution.
|
||||
*/
|
||||
typedef uint64_t coap_tick_t;
|
||||
|
||||
/**
|
||||
* CoAP time in seconds since epoch.
|
||||
*/
|
||||
typedef time_t coap_time_t;
|
||||
|
||||
/**
|
||||
* This data type is used to represent the difference between two clock_tick_t
|
||||
* values. This data type must have the same size in memory as coap_tick_t to
|
||||
* allow wrapping.
|
||||
*/
|
||||
typedef int64_t coap_tick_diff_t;
|
||||
|
||||
/** Use ms resolution on POSIX systems */
|
||||
#define COAP_TICKS_PER_SECOND ((coap_tick_t)(1000U))
|
||||
|
||||
/**
|
||||
* Initializes the internal clock.
|
||||
*/
|
||||
void coap_clock_init(void);
|
||||
|
||||
/**
|
||||
* Sets @p t to the internal time with COAP_TICKS_PER_SECOND resolution.
|
||||
*/
|
||||
void coap_ticks(coap_tick_t *t);
|
||||
|
||||
/**
|
||||
* Helper function that converts coap ticks to wallclock time. On POSIX, this
|
||||
* function returns the number of seconds since the epoch. On other systems, it
|
||||
* may be the calculated number of seconds since last reboot or so.
|
||||
*
|
||||
* @param t Internal system ticks.
|
||||
*
|
||||
* @return The number of seconds that has passed since a specific reference
|
||||
* point (seconds since epoch on POSIX).
|
||||
*/
|
||||
coap_time_t coap_ticks_to_rt(coap_tick_t t);
|
||||
|
||||
/**
|
||||
* Helper function that converts coap ticks to POSIX wallclock time in us.
|
||||
*
|
||||
* @param t Internal system ticks.
|
||||
*
|
||||
* @return The number of seconds that has passed since a specific reference
|
||||
* point (seconds since epoch on POSIX).
|
||||
*/
|
||||
uint64_t coap_ticks_to_rt_us(coap_tick_t t);
|
||||
|
||||
/**
|
||||
* Helper function that converts POSIX wallclock time in us to coap ticks.
|
||||
*
|
||||
* @param t POSIX time is us
|
||||
*
|
||||
* @return coap ticks
|
||||
*/
|
||||
coap_tick_t coap_ticks_from_rt_us(uint64_t t);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Returns @c 1 if and only if @p a is less than @p b where less is defined on a
|
||||
* signed data type.
|
||||
*/
|
||||
COAP_STATIC_INLINE int coap_time_lt(coap_tick_t a, coap_tick_t b) {
|
||||
return ((coap_tick_diff_t)(a - b)) < 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns @c 1 if and only if @p a is less than or equal @p b where less is
|
||||
* defined on a signed data type.
|
||||
*/
|
||||
COAP_STATIC_INLINE int coap_time_le(coap_tick_t a, coap_tick_t b) {
|
||||
return a == b || coap_time_lt(a,b);
|
||||
}
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* COAP_TIME_H_ */
|
120
tools/sdk/esp32/include/coap/libcoap/include/coap3/encode.h
Normal file
120
tools/sdk/esp32/include/coap/libcoap/include/coap3/encode.h
Normal file
@ -0,0 +1,120 @@
|
||||
/*
|
||||
* encode.h -- encoding and decoding of CoAP data types
|
||||
*
|
||||
* Copyright (C) 2010-2012 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
#ifndef COAP_ENCODE_H_
|
||||
#define COAP_ENCODE_H_
|
||||
|
||||
#if (BSD >= 199103) || defined(WITH_CONTIKI) || defined(_WIN32)
|
||||
# include <string.h>
|
||||
#else
|
||||
# include <strings.h>
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#ifndef HAVE_FLS
|
||||
/* include this only if fls() is not available */
|
||||
extern int coap_fls(unsigned int i);
|
||||
#else
|
||||
#define coap_fls(i) fls(i)
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_FLSLL
|
||||
/* include this only if flsll() is not available */
|
||||
extern int coap_flsll(long long i);
|
||||
#else
|
||||
#define coap_flsll(i) flsll(i)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* @defgroup encode Encode / Decode API
|
||||
* API functions for endoding/decoding CoAP options.
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Decodes multiple-length byte sequences. @p buf points to an input byte
|
||||
* sequence of length @p length. Returns the up to 4 byte decoded value.
|
||||
*
|
||||
* @param buf The input byte sequence to decode from
|
||||
* @param length The length of the input byte sequence
|
||||
*
|
||||
* @return The decoded value
|
||||
*/
|
||||
unsigned int coap_decode_var_bytes(const uint8_t *buf, size_t length);
|
||||
|
||||
/**
|
||||
* Decodes multiple-length byte sequences. @p buf points to an input byte
|
||||
* sequence of length @p length. Returns the up to 8 byte decoded value.
|
||||
*
|
||||
* @param buf The input byte sequence to decode from
|
||||
* @param length The length of the input byte sequence
|
||||
*
|
||||
* @return The decoded value
|
||||
*/
|
||||
uint64_t coap_decode_var_bytes8(const uint8_t *buf, size_t length);
|
||||
|
||||
/**
|
||||
* Encodes multiple-length byte sequences. @p buf points to an output buffer of
|
||||
* sufficient length to store the encoded bytes. @p value is the 4 byte value
|
||||
* to encode.
|
||||
* Returns the number of bytes used to encode @p value or 0 on error.
|
||||
*
|
||||
* @param buf The output buffer to encode into
|
||||
* @param length The output buffer size to encode into (must be sufficient)
|
||||
* @param value The value to encode into the buffer
|
||||
*
|
||||
* @return The number of bytes used to encode @p value or @c 0 on error.
|
||||
*/
|
||||
unsigned int coap_encode_var_safe(uint8_t *buf,
|
||||
size_t length,
|
||||
unsigned int value);
|
||||
|
||||
/**
|
||||
* Encodes multiple-length byte sequences. @p buf points to an output buffer of
|
||||
* sufficient length to store the encoded bytes. @p value is the 8 byte value
|
||||
* to encode.
|
||||
* Returns the number of bytes used to encode @p value or 0 on error.
|
||||
*
|
||||
* @param buf The output buffer to encode into
|
||||
* @param length The output buffer size to encode into (must be sufficient)
|
||||
* @param value The value to encode into the buffer
|
||||
*
|
||||
* @return The number of bytes used to encode @p value or @c 0 on error.
|
||||
*/
|
||||
unsigned int coap_encode_var_safe8(uint8_t *buf,
|
||||
size_t length,
|
||||
uint64_t value);
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* @deprecated Use coap_encode_var_safe() instead.
|
||||
* Provided for backward compatibility. As @p value has a
|
||||
* maximum value of 0xffffffff, and buf is usually defined as an array, it
|
||||
* is unsafe to continue to use this variant if buf[] is less than buf[4].
|
||||
*
|
||||
* For example
|
||||
* char buf[1],oops;
|
||||
* ..
|
||||
* coap_encode_var_bytes(buf, 0xfff);
|
||||
* would cause oops to get overwritten. This error can only be found by code
|
||||
* inspection.
|
||||
* coap_encode_var_safe(buf, sizeof(buf), 0xfff);
|
||||
* would catch this error at run-time and should be used instead.
|
||||
*/
|
||||
COAP_STATIC_INLINE COAP_DEPRECATED int
|
||||
coap_encode_var_bytes(uint8_t *buf, unsigned int value
|
||||
) {
|
||||
return (int)coap_encode_var_safe(buf, sizeof(value), value);
|
||||
}
|
||||
|
||||
#endif /* COAP_ENCODE_H_ */
|
63
tools/sdk/esp32/include/coap/libcoap/include/coap3/libcoap.h
Normal file
63
tools/sdk/esp32/include/coap/libcoap/include/coap3/libcoap.h
Normal file
@ -0,0 +1,63 @@
|
||||
/*
|
||||
* libcoap.h -- platform specific header file for CoAP stack
|
||||
*
|
||||
* Copyright (C) 2015 Carsten Schoenert <c.schoenert@t-online.de>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
#ifndef COAP_LIBCOAP_H_
|
||||
#define COAP_LIBCOAP_H_
|
||||
|
||||
/* The non posix embedded platforms like Contiki, TinyOS, RIOT, ... doesn't have
|
||||
* a POSIX compatible header structure so we have to slightly do some platform
|
||||
* related things. Currently there is only Contiki available so we check for a
|
||||
* CONTIKI environment and do *not* include the POSIX related network stuff. If
|
||||
* there are other platforms in future there need to be analogous environments.
|
||||
*
|
||||
* The CONTIKI variable is within the Contiki build environment! */
|
||||
|
||||
#if defined(_WIN32)
|
||||
#pragma comment(lib,"Ws2_32.lib")
|
||||
#include <ws2tcpip.h>
|
||||
typedef SSIZE_T ssize_t;
|
||||
typedef USHORT in_port_t;
|
||||
#elif !defined (CONTIKI)
|
||||
#include <netinet/in.h>
|
||||
#include <sys/socket.h>
|
||||
#endif /* CONTIKI */
|
||||
|
||||
#ifndef COAP_STATIC_INLINE
|
||||
# if defined(__cplusplus)
|
||||
# define COAP_STATIC_INLINE inline
|
||||
# else
|
||||
# if defined(_MSC_VER)
|
||||
# define COAP_STATIC_INLINE static __inline
|
||||
# else
|
||||
# define COAP_STATIC_INLINE static inline
|
||||
# endif
|
||||
# endif
|
||||
#endif
|
||||
#ifndef COAP_DEPRECATED
|
||||
# if defined(_MSC_VER)
|
||||
# define COAP_DEPRECATED __declspec(deprecated)
|
||||
# else
|
||||
# define COAP_DEPRECATED __attribute__ ((deprecated))
|
||||
# endif
|
||||
#endif
|
||||
#ifndef COAP_UNUSED
|
||||
# ifdef __GNUC__
|
||||
# define COAP_UNUSED __attribute__((unused))
|
||||
# else /* __GNUC__ */
|
||||
# define COAP_UNUSED
|
||||
# endif /* __GNUC__ */
|
||||
#endif /* COAP_UNUSED */
|
||||
|
||||
void coap_startup(void);
|
||||
|
||||
void coap_cleanup(void);
|
||||
|
||||
#endif /* COAP_LIBCOAP_H_ */
|
117
tools/sdk/esp32/include/coap/libcoap/include/coap3/lwippools.h
Normal file
117
tools/sdk/esp32/include/coap/libcoap/include/coap3/lwippools.h
Normal file
@ -0,0 +1,117 @@
|
||||
/*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/* Memory pool definitions for the libcoap when used with lwIP (which has its
|
||||
* own mechanism for quickly allocating chunks of data with known sizes). Has
|
||||
* to be findable by lwIP (ie. an #include <lwippools.h> must either directly
|
||||
* include this or include something more generic which includes this), and
|
||||
* MEMP_USE_CUSTOM_POOLS has to be set in lwipopts.h. */
|
||||
|
||||
#include "coap_internal.h"
|
||||
#include "net.h"
|
||||
#include "resource.h"
|
||||
#include "subscribe.h"
|
||||
|
||||
#ifndef MEMP_NUM_COAPCONTEXT
|
||||
#define MEMP_NUM_COAPCONTEXT 1
|
||||
#endif
|
||||
|
||||
#ifndef MEMP_NUM_COAPENDPOINT
|
||||
#define MEMP_NUM_COAPENDPOINT 1
|
||||
#endif
|
||||
|
||||
/* 1 is sufficient as this is very short-lived */
|
||||
#ifndef MEMP_NUM_COAPPACKET
|
||||
#define MEMP_NUM_COAPPACKET 1
|
||||
#endif
|
||||
|
||||
#ifndef MEMP_NUM_COAPNODE
|
||||
#define MEMP_NUM_COAPNODE 4
|
||||
#endif
|
||||
|
||||
#ifndef MEMP_NUM_COAPPDU
|
||||
#define MEMP_NUM_COAPPDU MEMP_NUM_COAPNODE
|
||||
#endif
|
||||
|
||||
#ifndef MEMP_NUM_COAPSESSION
|
||||
#define MEMP_NUM_COAPSESSION 2
|
||||
#endif
|
||||
|
||||
#ifndef MEMP_NUM_COAP_SUBSCRIPTION
|
||||
#define MEMP_NUM_COAP_SUBSCRIPTION 4
|
||||
#endif
|
||||
|
||||
#ifndef MEMP_NUM_COAPRESOURCE
|
||||
#define MEMP_NUM_COAPRESOURCE 10
|
||||
#endif
|
||||
|
||||
#ifndef MEMP_NUM_COAPRESOURCEATTR
|
||||
#define MEMP_NUM_COAPRESOURCEATTR 20
|
||||
#endif
|
||||
|
||||
#ifndef MEMP_NUM_COAPOPTLIST
|
||||
#define MEMP_NUM_COAPOPTLIST 1
|
||||
#endif
|
||||
|
||||
#ifndef MEMP_LEN_COAPOPTLIST
|
||||
#define MEMP_LEN_COAPOPTLIST 12
|
||||
#endif
|
||||
|
||||
#ifndef MEMP_NUM_COAPSTRING
|
||||
#define MEMP_NUM_COAPSTRING 10
|
||||
#endif
|
||||
|
||||
#ifndef MEMP_LEN_COAPSTRING
|
||||
#define MEMP_LEN_COAPSTRING 32
|
||||
#endif
|
||||
|
||||
#ifndef MEMP_NUM_COAPCACHE_KEYS
|
||||
#define MEMP_NUM_COAPCACHE_KEYS (2U)
|
||||
#endif /* MEMP_NUM_COAPCACHE_KEYS */
|
||||
|
||||
#ifndef MEMP_NUM_COAPCACHE_ENTRIES
|
||||
#define MEMP_NUM_COAPCACHE_ENTRIES (2U)
|
||||
#endif /* MEMP_NUM_COAPCACHE_ENTRIES */
|
||||
|
||||
#ifndef MEMP_NUM_COAPPDUBUF
|
||||
#define MEMP_NUM_COAPPDUBUF 2
|
||||
#endif
|
||||
|
||||
#ifndef MEMP_LEN_COAPPDUBUF
|
||||
#define MEMP_LEN_COAPPDUBUF 32
|
||||
#endif
|
||||
|
||||
#ifndef MEMP_NUM_COAPLGXMIT
|
||||
#define MEMP_NUM_COAPLGXMIT 2
|
||||
#endif
|
||||
|
||||
#ifndef MEMP_NUM_COAPLGCRCV
|
||||
#define MEMP_NUM_COAPLGCRCV 2
|
||||
#endif
|
||||
|
||||
#ifndef MEMP_NUM_COAPLGSRCV
|
||||
#define MEMP_NUM_COAPLGSRCV 2
|
||||
#endif
|
||||
|
||||
LWIP_MEMPOOL(COAP_CONTEXT, MEMP_NUM_COAPCONTEXT, sizeof(coap_context_t), "COAP_CONTEXT")
|
||||
LWIP_MEMPOOL(COAP_ENDPOINT, MEMP_NUM_COAPENDPOINT, sizeof(coap_endpoint_t), "COAP_ENDPOINT")
|
||||
LWIP_MEMPOOL(COAP_PACKET, MEMP_NUM_COAPPACKET, sizeof(coap_packet_t), "COAP_PACKET")
|
||||
LWIP_MEMPOOL(COAP_NODE, MEMP_NUM_COAPNODE, sizeof(coap_queue_t), "COAP_NODE")
|
||||
LWIP_MEMPOOL(COAP_PDU, MEMP_NUM_COAPPDU, sizeof(coap_pdu_t), "COAP_PDU")
|
||||
LWIP_MEMPOOL(COAP_SESSION, MEMP_NUM_COAPSESSION, sizeof(coap_session_t), "COAP_SESSION")
|
||||
LWIP_MEMPOOL(COAP_subscription, MEMP_NUM_COAP_SUBSCRIPTION, sizeof(coap_subscription_t), "COAP_subscription")
|
||||
LWIP_MEMPOOL(COAP_RESOURCE, MEMP_NUM_COAPRESOURCE, sizeof(coap_resource_t), "COAP_RESOURCE")
|
||||
LWIP_MEMPOOL(COAP_RESOURCEATTR, MEMP_NUM_COAPRESOURCEATTR, sizeof(coap_attr_t), "COAP_RESOURCEATTR")
|
||||
LWIP_MEMPOOL(COAP_OPTLIST, MEMP_NUM_COAPOPTLIST, sizeof(coap_optlist_t)+MEMP_LEN_COAPOPTLIST, "COAP_OPTLIST")
|
||||
LWIP_MEMPOOL(COAP_STRING, MEMP_NUM_COAPSTRING, sizeof(coap_string_t)+MEMP_LEN_COAPSTRING, "COAP_STRING")
|
||||
LWIP_MEMPOOL(COAP_CACHE_KEY, MEMP_NUM_COAPCACHE_KEYS, sizeof(coap_cache_key_t), "COAP_CACHE_KEY")
|
||||
LWIP_MEMPOOL(COAP_CACHE_ENTRY, MEMP_NUM_COAPCACHE_ENTRIES, sizeof(coap_cache_entry_t), "COAP_CACHE_ENTRY")
|
||||
LWIP_MEMPOOL(COAP_PDU_BUF, MEMP_NUM_COAPPDUBUF, MEMP_LEN_COAPPDUBUF, "COAP_PDU_BUF")
|
||||
LWIP_MEMPOOL(COAP_LG_XMIT, MEMP_NUM_COAPLGXMIT, sizeof(coap_lg_xmit_t), "COAP_LG_XMIT")
|
||||
LWIP_MEMPOOL(COAP_LG_CRCV, MEMP_NUM_COAPLGCRCV, sizeof(coap_lg_crcv_t), "COAP_LG_CRCV")
|
||||
LWIP_MEMPOOL(COAP_LG_SRCV, MEMP_NUM_COAPLGSRCV, sizeof(coap_lg_srcv_t), "COAP_LG_SRCV")
|
||||
|
139
tools/sdk/esp32/include/coap/libcoap/include/coap3/mem.h
Normal file
139
tools/sdk/esp32/include/coap/libcoap/include/coap3/mem.h
Normal file
@ -0,0 +1,139 @@
|
||||
/*
|
||||
* mem.h -- CoAP memory handling
|
||||
*
|
||||
* Copyright (C) 2010-2011,2014-2015 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
#ifndef COAP_MEM_H_
|
||||
#define COAP_MEM_H_
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifndef WITH_LWIP
|
||||
/**
|
||||
* Initializes libcoap's memory management.
|
||||
* This function must be called once before coap_malloc() can be used on
|
||||
* constrained devices.
|
||||
*/
|
||||
void coap_memory_init(void);
|
||||
#endif /* WITH_LWIP */
|
||||
|
||||
/**
|
||||
* Type specifiers for coap_malloc_type(). Memory objects can be typed to
|
||||
* facilitate arrays of type objects to be used instead of dynamic memory
|
||||
* management on constrained devices.
|
||||
*/
|
||||
typedef enum {
|
||||
COAP_STRING,
|
||||
COAP_ATTRIBUTE_NAME,
|
||||
COAP_ATTRIBUTE_VALUE,
|
||||
COAP_PACKET,
|
||||
COAP_NODE,
|
||||
COAP_CONTEXT,
|
||||
COAP_ENDPOINT,
|
||||
COAP_PDU,
|
||||
COAP_PDU_BUF,
|
||||
COAP_RESOURCE,
|
||||
COAP_RESOURCEATTR,
|
||||
#ifdef HAVE_LIBTINYDTLS
|
||||
COAP_DTLS_SESSION,
|
||||
#endif
|
||||
COAP_SESSION,
|
||||
COAP_OPTLIST,
|
||||
COAP_CACHE_KEY,
|
||||
COAP_CACHE_ENTRY,
|
||||
COAP_LG_XMIT,
|
||||
COAP_LG_CRCV,
|
||||
COAP_LG_SRCV,
|
||||
} coap_memory_tag_t;
|
||||
|
||||
#ifndef WITH_LWIP
|
||||
|
||||
/**
|
||||
* Allocates a chunk of @p size bytes and returns a pointer to the newly
|
||||
* allocated memory. The @p type is used to select the appropriate storage
|
||||
* container on constrained devices. The storage allocated by coap_malloc_type()
|
||||
* must be released with coap_free_type().
|
||||
*
|
||||
* @param type The type of object to be stored.
|
||||
* @param size The number of bytes requested.
|
||||
* @return A pointer to the allocated storage or @c NULL on error.
|
||||
*/
|
||||
void *coap_malloc_type(coap_memory_tag_t type, size_t size);
|
||||
|
||||
/**
|
||||
* Reallocates a chunk @p p of bytes created by coap_malloc_type() or
|
||||
* coap_realloc_type() and returns a pointer to the newly allocated memory of
|
||||
* @p size.
|
||||
* Only COAP_STRING type is supported.
|
||||
*
|
||||
* Note: If there is an error, @p p will separately need to be released by
|
||||
* coap_free_type().
|
||||
*
|
||||
* @param type The type of object to be stored.
|
||||
* @param p A pointer to memory that was allocated by coap_malloc_type().
|
||||
* @param size The number of bytes requested.
|
||||
* @return A pointer to the allocated storage or @c NULL on error.
|
||||
*/
|
||||
void *coap_realloc_type(coap_memory_tag_t type, void *p, size_t size);
|
||||
|
||||
/**
|
||||
* Releases the memory that was allocated by coap_malloc_type(). The type tag @p
|
||||
* type must be the same that was used for allocating the object pointed to by
|
||||
* @p .
|
||||
*
|
||||
* @param type The type of the object to release.
|
||||
* @param p A pointer to memory that was allocated by coap_malloc_type().
|
||||
*/
|
||||
void coap_free_type(coap_memory_tag_t type, void *p);
|
||||
|
||||
/**
|
||||
* Wrapper function to coap_malloc_type() for backwards compatibility.
|
||||
*/
|
||||
COAP_STATIC_INLINE void *coap_malloc(size_t size) {
|
||||
return coap_malloc_type(COAP_STRING, size);
|
||||
}
|
||||
|
||||
/**
|
||||
* Wrapper function to coap_free_type() for backwards compatibility.
|
||||
*/
|
||||
COAP_STATIC_INLINE void coap_free(void *object) {
|
||||
coap_free_type(COAP_STRING, object);
|
||||
}
|
||||
|
||||
#endif /* not WITH_LWIP */
|
||||
|
||||
#ifdef WITH_LWIP
|
||||
|
||||
#include <lwip/memp.h>
|
||||
|
||||
/* no initialization needed with lwip (or, more precisely: lwip must be
|
||||
* completely initialized anyway by the time coap gets active) */
|
||||
COAP_STATIC_INLINE void coap_memory_init(void) {}
|
||||
|
||||
/* It would be nice to check that size equals the size given at the memp
|
||||
* declaration, but i currently don't see a standard way to check that without
|
||||
* sourcing the custom memp pools and becoming dependent of its syntax
|
||||
*/
|
||||
#define coap_malloc_type(type, size) memp_malloc(MEMP_ ## type)
|
||||
#define coap_free_type(type, p) memp_free(MEMP_ ## type, p)
|
||||
|
||||
/* Those are just here to make uri.c happy where string allocation has not been
|
||||
* made conditional.
|
||||
*/
|
||||
COAP_STATIC_INLINE void *coap_malloc(size_t size) {
|
||||
LWIP_ASSERT("coap_malloc must not be used in lwIP", 0);
|
||||
}
|
||||
|
||||
COAP_STATIC_INLINE void coap_free(void *pointer) {
|
||||
LWIP_ASSERT("coap_free must not be used in lwIP", 0);
|
||||
}
|
||||
|
||||
#endif /* WITH_LWIP */
|
||||
|
||||
#endif /* COAP_MEM_H_ */
|
780
tools/sdk/esp32/include/coap/libcoap/include/coap3/net.h
Normal file
780
tools/sdk/esp32/include/coap/libcoap/include/coap3/net.h
Normal file
@ -0,0 +1,780 @@
|
||||
/*
|
||||
* net.h -- CoAP network interface
|
||||
*
|
||||
* Copyright (C) 2010-2021 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
#ifndef COAP_NET_H_
|
||||
#define COAP_NET_H_
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#ifndef _WIN32
|
||||
#include <sys/select.h>
|
||||
#include <sys/time.h>
|
||||
#endif
|
||||
#include <time.h>
|
||||
|
||||
#ifdef WITH_LWIP
|
||||
#include <lwip/ip_addr.h>
|
||||
#endif
|
||||
|
||||
#include "coap_io.h"
|
||||
#include "coap_dtls.h"
|
||||
#include "coap_event.h"
|
||||
#include "pdu.h"
|
||||
#include "coap_session.h"
|
||||
|
||||
/**
|
||||
* @defgroup context Context Handling
|
||||
* API functions for handling PDUs using CoAP Contexts
|
||||
* @{
|
||||
*/
|
||||
|
||||
typedef enum coap_response_t {
|
||||
COAP_RESPONSE_FAIL, /**< Response not liked - send CoAP RST packet */
|
||||
COAP_RESPONSE_OK /**< Response is fine */
|
||||
} coap_response_t;
|
||||
|
||||
/**
|
||||
* Response handler that is used as callback in coap_context_t.
|
||||
*
|
||||
* @param session CoAP session.
|
||||
* @param sent The PDU that was transmitted.
|
||||
* @param received The PDU that was received.
|
||||
* @param mid CoAP transaction ID.
|
||||
|
||||
* @return @c COAP_RESPONSE_OK if successful, else @c COAP_RESPONSE_FAIL which
|
||||
* triggers sending a RST packet.
|
||||
*/
|
||||
typedef coap_response_t (*coap_response_handler_t)(coap_session_t *session,
|
||||
const coap_pdu_t *sent,
|
||||
const coap_pdu_t *received,
|
||||
const coap_mid_t mid);
|
||||
|
||||
/**
|
||||
* Negative Acknowedge handler that is used as callback in coap_context_t.
|
||||
*
|
||||
* @param session CoAP session.
|
||||
* @param sent The PDU that was transmitted.
|
||||
* @param reason The reason for the NACK.
|
||||
* @param mid CoAP message ID.
|
||||
*/
|
||||
typedef void (*coap_nack_handler_t)(coap_session_t *session,
|
||||
const coap_pdu_t *sent,
|
||||
const coap_nack_reason_t reason,
|
||||
const coap_mid_t mid);
|
||||
|
||||
/**
|
||||
* Received Ping handler that is used as callback in coap_context_t.
|
||||
*
|
||||
* @param session CoAP session.
|
||||
* @param received The PDU that was received.
|
||||
* @param mid CoAP message ID.
|
||||
*/
|
||||
typedef void (*coap_ping_handler_t)(coap_session_t *session,
|
||||
const coap_pdu_t *received,
|
||||
const coap_mid_t mid);
|
||||
|
||||
/**
|
||||
* Received Pong handler that is used as callback in coap_context_t.
|
||||
*
|
||||
* @param session CoAP session.
|
||||
* @param received The PDU that was received.
|
||||
* @param mid CoAP message ID.
|
||||
*/
|
||||
typedef void (*coap_pong_handler_t)(coap_session_t *session,
|
||||
const coap_pdu_t *received,
|
||||
const coap_mid_t mid);
|
||||
|
||||
/**
|
||||
* Registers a new message handler that is called whenever a response is
|
||||
* received.
|
||||
*
|
||||
* @param context The context to register the handler for.
|
||||
* @param handler The response handler to register.
|
||||
*/
|
||||
void
|
||||
coap_register_response_handler(coap_context_t *context,
|
||||
coap_response_handler_t handler);
|
||||
|
||||
/**
|
||||
* Registers a new message handler that is called whenever a confirmable
|
||||
* message (request or response) is dropped after all retries have been
|
||||
* exhausted, or a rst message was received, or a network or TLS level
|
||||
* event was received that indicates delivering the message is not possible.
|
||||
*
|
||||
* @param context The context to register the handler for.
|
||||
* @param handler The nack handler to register.
|
||||
*/
|
||||
void
|
||||
coap_register_nack_handler(coap_context_t *context,
|
||||
coap_nack_handler_t handler);
|
||||
|
||||
/**
|
||||
* Registers a new message handler that is called whenever a CoAP Ping
|
||||
* message is received.
|
||||
*
|
||||
* @param context The context to register the handler for.
|
||||
* @param handler The ping handler to register.
|
||||
*/
|
||||
void
|
||||
coap_register_ping_handler(coap_context_t *context,
|
||||
coap_ping_handler_t handler);
|
||||
|
||||
/**
|
||||
* Registers a new message handler that is called whenever a CoAP Pong
|
||||
* message is received.
|
||||
*
|
||||
* @param context The context to register the handler for.
|
||||
* @param handler The pong handler to register.
|
||||
*/
|
||||
void
|
||||
coap_register_pong_handler(coap_context_t *context,
|
||||
coap_pong_handler_t handler);
|
||||
|
||||
/**
|
||||
* Registers the option type @p type with the given context object @p ctx.
|
||||
*
|
||||
* @param ctx The context to use.
|
||||
* @param type The option type to register.
|
||||
*/
|
||||
void
|
||||
coap_register_option(coap_context_t *ctx, uint16_t type);
|
||||
|
||||
/**
|
||||
* Creates a new coap_context_t object that will hold the CoAP stack status.
|
||||
*/
|
||||
coap_context_t *coap_new_context(const coap_address_t *listen_addr);
|
||||
|
||||
/**
|
||||
* Set the context's default PSK hint and/or key for a server.
|
||||
*
|
||||
* @param context The current coap_context_t object.
|
||||
* @param hint The default PSK server hint sent to a client. If NULL, PSK
|
||||
* authentication is disabled. Empty string is a valid hint.
|
||||
* @param key The default PSK key. If NULL, PSK authentication will fail.
|
||||
* @param key_len The default PSK key's length. If @p 0, PSK authentication will
|
||||
* fail.
|
||||
*
|
||||
* @return @c 1 if successful, else @c 0.
|
||||
*/
|
||||
int coap_context_set_psk( coap_context_t *context, const char *hint,
|
||||
const uint8_t *key, size_t key_len );
|
||||
|
||||
/**
|
||||
* Set the context's default PSK hint and/or key for a server.
|
||||
*
|
||||
* @param context The current coap_context_t object.
|
||||
* @param setup_data If NULL, PSK authentication will fail. PSK
|
||||
* information required.
|
||||
*
|
||||
* @return @c 1 if successful, else @c 0.
|
||||
*/
|
||||
int coap_context_set_psk2(coap_context_t *context,
|
||||
coap_dtls_spsk_t *setup_data);
|
||||
|
||||
/**
|
||||
* Set the context's default PKI information for a server.
|
||||
*
|
||||
* @param context The current coap_context_t object.
|
||||
* @param setup_data If NULL, PKI authentication will fail. Certificate
|
||||
* information required.
|
||||
*
|
||||
* @return @c 1 if successful, else @c 0.
|
||||
*/
|
||||
int
|
||||
coap_context_set_pki(coap_context_t *context,
|
||||
const coap_dtls_pki_t *setup_data);
|
||||
|
||||
/**
|
||||
* Set the context's default Root CA information for a client or server.
|
||||
*
|
||||
* @param context The current coap_context_t object.
|
||||
* @param ca_file If not NULL, is the full path name of a PEM encoded
|
||||
* file containing all the Root CAs to be used.
|
||||
* @param ca_dir If not NULL, points to a directory containing PEM
|
||||
* encoded files containing all the Root CAs to be used.
|
||||
*
|
||||
* @return @c 1 if successful, else @c 0.
|
||||
*/
|
||||
int
|
||||
coap_context_set_pki_root_cas(coap_context_t *context,
|
||||
const char *ca_file,
|
||||
const char *ca_dir);
|
||||
|
||||
/**
|
||||
* Set the context keepalive timer for sessions.
|
||||
* A keepalive message will be sent after if a session has been inactive,
|
||||
* i.e. no packet sent or received, for the given number of seconds.
|
||||
* For unreliable protocols, a CoAP Empty message will be sent. If a
|
||||
* CoAP RST is not received, the CoAP Empty messages will get resent based
|
||||
* on the Confirmable retry parameters until there is a failure timeout,
|
||||
* at which point the session will be considered as disconnected.
|
||||
* For reliable protocols, a CoAP PING message will be sent. If a CoAP PONG
|
||||
* has not been received before the next PING is due to be sent, the session
|
||||
* will be considered as disconnected.
|
||||
*
|
||||
* @param context The coap_context_t object.
|
||||
* @param seconds Number of seconds for the inactivity timer, or zero
|
||||
* to disable CoAP-level keepalive messages.
|
||||
*/
|
||||
void coap_context_set_keepalive(coap_context_t *context, unsigned int seconds);
|
||||
|
||||
/**
|
||||
* Get the libcoap internal file descriptor for using in an application's
|
||||
* select() or returned as an event in an application's epoll_wait() call.
|
||||
*
|
||||
* @param context The coap_context_t object.
|
||||
*
|
||||
* @return The libcoap file descriptor or @c -1 if epoll is not available.
|
||||
*/
|
||||
int coap_context_get_coap_fd(const coap_context_t *context);
|
||||
|
||||
/**
|
||||
* Set the maximum idle sessions count. The number of server sessions that
|
||||
* are currently not in use. If this number is exceeded, the least recently
|
||||
* used server session is completely removed.
|
||||
* 0 (the default) means that the number is not monitored.
|
||||
*
|
||||
* @param context The coap_context_t object.
|
||||
* @param max_idle_sessions The maximum idle session count.
|
||||
*/
|
||||
void
|
||||
coap_context_set_max_idle_sessions(coap_context_t *context,
|
||||
unsigned int max_idle_sessions);
|
||||
|
||||
/**
|
||||
* Get the maximum idle sessions count.
|
||||
*
|
||||
* @param context The coap_context_t object.
|
||||
*
|
||||
* @return The count of max idle sessions.
|
||||
*/
|
||||
unsigned int
|
||||
coap_context_get_max_idle_sessions(const coap_context_t *context);
|
||||
|
||||
/**
|
||||
* Set the session timeout value. The number of seconds of inactivity after
|
||||
* which an unused server session will be closed.
|
||||
* 0 means use default (300 secs).
|
||||
*
|
||||
* @param context The coap_context_t object.
|
||||
* @param session_timeout The session timeout value.
|
||||
*/
|
||||
void
|
||||
coap_context_set_session_timeout(coap_context_t *context,
|
||||
unsigned int session_timeout);
|
||||
|
||||
/**
|
||||
* Get the session timeout value
|
||||
*
|
||||
* @param context The coap_context_t object.
|
||||
*
|
||||
* @return The session timeout value.
|
||||
*/
|
||||
unsigned int
|
||||
coap_context_get_session_timeout(const coap_context_t *context);
|
||||
|
||||
/**
|
||||
* Set the CSM timeout value. The number of seconds to wait for a (TCP) CSM
|
||||
* negotiation response from the peer.
|
||||
* 0 (the default) means use wait forever.
|
||||
*
|
||||
* @param context The coap_context_t object.
|
||||
* @param csm_tmeout The CSM timeout value.
|
||||
*/
|
||||
void
|
||||
coap_context_set_csm_timeout(coap_context_t *context,
|
||||
unsigned int csm_tmeout);
|
||||
|
||||
/**
|
||||
* Get the CSM timeout value
|
||||
*
|
||||
* @param context The coap_context_t object.
|
||||
*
|
||||
* @return The CSM timeout value.
|
||||
*/
|
||||
unsigned int
|
||||
coap_context_get_csm_timeout(const coap_context_t *context);
|
||||
|
||||
/**
|
||||
* Set the maximum number of sessions in (D)TLS handshake value. If this number
|
||||
* is exceeded, the least recently used server session in handshake is
|
||||
* completely removed.
|
||||
* 0 (the default) means that the number is not monitored.
|
||||
*
|
||||
* @param context The coap_context_t object.
|
||||
* @param max_handshake_sessions The maximum number of sessions in handshake.
|
||||
*/
|
||||
void
|
||||
coap_context_set_max_handshake_sessions(coap_context_t *context,
|
||||
unsigned int max_handshake_sessions);
|
||||
|
||||
/**
|
||||
* Get the session timeout value
|
||||
*
|
||||
* @param context The coap_context_t object.
|
||||
*
|
||||
* @return The maximim number of sessions in (D)TLS handshake value.
|
||||
*/
|
||||
unsigned int
|
||||
coap_context_get_max_handshake_sessions(const coap_context_t *context);
|
||||
|
||||
/**
|
||||
* Returns a new message id and updates @p session->tx_mid accordingly. The
|
||||
* message id is returned in network byte order to make it easier to read in
|
||||
* tracing tools.
|
||||
*
|
||||
* @param session The current coap_session_t object.
|
||||
*
|
||||
* @return Incremented message id in network byte order.
|
||||
*/
|
||||
uint16_t coap_new_message_id(coap_session_t *session);
|
||||
|
||||
/**
|
||||
* CoAP stack context must be released with coap_free_context(). This function
|
||||
* clears all entries from the receive queue and send queue and deletes the
|
||||
* resources that have been registered with @p context, and frees the attached
|
||||
* endpoints.
|
||||
*
|
||||
* @param context The current coap_context_t object to free off.
|
||||
*/
|
||||
void coap_free_context(coap_context_t *context);
|
||||
|
||||
/**
|
||||
* Stores @p data with the given CoAP context. This function
|
||||
* overwrites any value that has previously been stored with @p
|
||||
* context.
|
||||
*
|
||||
* @param context The CoAP context.
|
||||
* @param data The data to store with wih the context. Note that this data
|
||||
* must be valid during the lifetime of @p context.
|
||||
*/
|
||||
void coap_set_app_data(coap_context_t *context, void *data);
|
||||
|
||||
/**
|
||||
* Returns any application-specific data that has been stored with @p
|
||||
* context using the function coap_set_app_data(). This function will
|
||||
* return @c NULL if no data has been stored.
|
||||
*
|
||||
* @param context The CoAP context.
|
||||
*
|
||||
* @return The data previously stored or @c NULL if not data stored.
|
||||
*/
|
||||
void *coap_get_app_data(const coap_context_t *context);
|
||||
|
||||
/**
|
||||
* Creates a new ACK PDU with specified error @p code. The options specified by
|
||||
* the filter expression @p opts will be copied from the original request
|
||||
* contained in @p request. Unless @c SHORT_ERROR_RESPONSE was defined at build
|
||||
* time, the textual reason phrase for @p code will be added as payload, with
|
||||
* Content-Type @c 0.
|
||||
* This function returns a pointer to the new response message, or @c NULL on
|
||||
* error. The storage allocated for the new message must be released with
|
||||
* coap_free().
|
||||
*
|
||||
* @param request Specification of the received (confirmable) request.
|
||||
* @param code The error code to set.
|
||||
* @param opts An option filter that specifies which options to copy from
|
||||
* the original request in @p node.
|
||||
*
|
||||
* @return A pointer to the new message or @c NULL on error.
|
||||
*/
|
||||
coap_pdu_t *coap_new_error_response(const coap_pdu_t *request,
|
||||
coap_pdu_code_t code,
|
||||
coap_opt_filter_t *opts);
|
||||
|
||||
/**
|
||||
* Sends an error response with code @p code for request @p request to @p dst.
|
||||
* @p opts will be passed to coap_new_error_response() to copy marked options
|
||||
* from the request. This function returns the message id if the message was
|
||||
* sent, or @c COAP_INVALID_MID otherwise.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
* @param request The original request to respond to.
|
||||
* @param code The response code.
|
||||
* @param opts A filter that specifies the options to copy from the
|
||||
* @p request.
|
||||
*
|
||||
* @return The message id if the message was sent, or @c
|
||||
* COAP_INVALID_MID otherwise.
|
||||
*/
|
||||
coap_mid_t coap_send_error(coap_session_t *session,
|
||||
const coap_pdu_t *request,
|
||||
coap_pdu_code_t code,
|
||||
coap_opt_filter_t *opts);
|
||||
|
||||
/**
|
||||
* Helper function to create and send a message with @p type (usually ACK or
|
||||
* RST). This function returns @c COAP_INVALID_MID when the message was not
|
||||
* sent, a valid transaction id otherwise.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
* @param request The request that should be responded to.
|
||||
* @param type Which type to set.
|
||||
* @return message id on success or @c COAP_INVALID_MID
|
||||
* otherwise.
|
||||
*/
|
||||
coap_mid_t
|
||||
coap_send_message_type(coap_session_t *session, const coap_pdu_t *request,
|
||||
coap_pdu_type_t type);
|
||||
|
||||
/**
|
||||
* Sends an ACK message with code @c 0 for the specified @p request to @p dst.
|
||||
* This function returns the corresponding message id if the message was
|
||||
* sent or @c COAP_INVALID_MID on error.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
* @param request The request to be acknowledged.
|
||||
*
|
||||
* @return The message id if ACK was sent or @c
|
||||
* COAP_INVALID_MID on error.
|
||||
*/
|
||||
coap_mid_t coap_send_ack(coap_session_t *session, const coap_pdu_t *request);
|
||||
|
||||
/**
|
||||
* Sends an RST message with code @c 0 for the specified @p request to @p dst.
|
||||
* This function returns the corresponding message id if the message was
|
||||
* sent or @c COAP_INVALID_MID on error.
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
* @param request The request to be reset.
|
||||
*
|
||||
* @return The message id if RST was sent or @c
|
||||
* COAP_INVALID_MID on error.
|
||||
*/
|
||||
COAP_STATIC_INLINE coap_mid_t
|
||||
coap_send_rst(coap_session_t *session, const coap_pdu_t *request) {
|
||||
return coap_send_message_type(session, request, COAP_MESSAGE_RST);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sends a CoAP message to given peer. The memory that is
|
||||
* allocated for the pdu will be released by coap_send().
|
||||
* The caller must not use the pdu after calling coap_send().
|
||||
*
|
||||
* @param session The CoAP session.
|
||||
* @param pdu The CoAP PDU to send.
|
||||
*
|
||||
* @return The message id of the sent message or @c
|
||||
* COAP_INVALID_MID on error.
|
||||
*/
|
||||
coap_mid_t coap_send( coap_session_t *session, coap_pdu_t *pdu );
|
||||
|
||||
#define coap_send_large(session, pdu) coap_send(session, pdu)
|
||||
|
||||
/**
|
||||
* Invokes the event handler of @p context for the given @p event and
|
||||
* @p data.
|
||||
*
|
||||
* @param context The CoAP context whose event handler is to be called.
|
||||
* @param event The event to deliver.
|
||||
* @param session The session related to @p event.
|
||||
* @return The result from the associated event handler or 0 if none was
|
||||
* registered.
|
||||
*/
|
||||
int coap_handle_event(coap_context_t *context,
|
||||
coap_event_t event,
|
||||
coap_session_t *session);
|
||||
/**
|
||||
* Returns 1 if there are no messages to send or to dispatch in the context's
|
||||
* queues. */
|
||||
int coap_can_exit(coap_context_t *context);
|
||||
|
||||
/**
|
||||
* Returns the current value of an internal tick counter. The counter counts \c
|
||||
* COAP_TICKS_PER_SECOND ticks every second.
|
||||
*/
|
||||
void coap_ticks(coap_tick_t *);
|
||||
|
||||
/**
|
||||
* Function interface for joining a multicast group for listening for the
|
||||
* currently defined endpoints that are UDP.
|
||||
*
|
||||
* @param ctx The current context.
|
||||
* @param groupname The name of the group that is to be joined for listening.
|
||||
* @param ifname Network interface to join the group on, or NULL if first
|
||||
* appropriate interface is to be chosen by the O/S.
|
||||
*
|
||||
* @return 0 on success, -1 on error
|
||||
*/
|
||||
int
|
||||
coap_join_mcast_group_intf(coap_context_t *ctx, const char *groupname,
|
||||
const char *ifname);
|
||||
|
||||
#define coap_join_mcast_group(ctx, groupname) \
|
||||
(coap_join_mcast_group_intf(ctx, groupname, NULL))
|
||||
|
||||
/**
|
||||
* Function interface for defining the hop count (ttl) for sending
|
||||
* multicast traffic
|
||||
*
|
||||
* @param session The current contexsion.
|
||||
* @param hops The number of hops (ttl) to use before the multicast
|
||||
* packet expires.
|
||||
*
|
||||
* @return 1 on success, 0 on error
|
||||
*/
|
||||
int
|
||||
coap_mcast_set_hops(coap_session_t *session, size_t hops);
|
||||
|
||||
/**@}*/
|
||||
|
||||
/**
|
||||
* @defgroup app_io Application I/O Handling
|
||||
* API functions for Application Input / Output
|
||||
* @{
|
||||
*/
|
||||
|
||||
#define COAP_IO_WAIT 0
|
||||
#define COAP_IO_NO_WAIT ((uint32_t)-1)
|
||||
|
||||
/**
|
||||
* The main I/O processing function. All pending network I/O is completed,
|
||||
* and then optionally waits for the next input packet.
|
||||
*
|
||||
* This internally calls coap_io_prepare_io(), then select() for the appropriate
|
||||
* sockets, updates COAP_SOCKET_CAN_xxx where appropriate and then calls
|
||||
* coap_io_do_io() before returning with the time spent in the function.
|
||||
*
|
||||
* Alternatively, if libcoap is compiled with epoll support, this internally
|
||||
* calls coap_io_prepare_epoll(), then epoll_wait() for waiting for any file
|
||||
* descriptors that have (internally) been set up with epoll_ctl() and
|
||||
* finally coap_io_do_epoll() before returning with the time spent in the
|
||||
* function.
|
||||
*
|
||||
* @param ctx The CoAP context
|
||||
* @param timeout_ms Minimum number of milliseconds to wait for new packets
|
||||
* before returning after doing any processing.
|
||||
* If COAP_IO_WAIT, the call will block until the next
|
||||
* internal action (e.g. packet retransmit) if any, or block
|
||||
* until the next packet is received whichever is the sooner
|
||||
* and do the necessary processing.
|
||||
* If COAP_IO_NO_WAIT, the function will return immediately
|
||||
* after processing without waiting for any new input
|
||||
* packets to arrive.
|
||||
*
|
||||
* @return Number of milliseconds spent in function or @c -1 if there was
|
||||
* an error
|
||||
*/
|
||||
int coap_io_process(coap_context_t *ctx, uint32_t timeout_ms);
|
||||
|
||||
#ifndef RIOT_VERSION
|
||||
/**
|
||||
* The main message processing loop with additional fds for internal select.
|
||||
*
|
||||
* @param ctx The CoAP context
|
||||
* @param timeout_ms Minimum number of milliseconds to wait for new packets
|
||||
* before returning after doing any processing.
|
||||
* If COAP_IO_WAIT, the call will block until the next
|
||||
* internal action (e.g. packet retransmit) if any, or block
|
||||
* until the next packet is received whichever is the sooner
|
||||
* and do the necessary processing.
|
||||
* If COAP_IO_NO_WAIT, the function will return immediately
|
||||
* after processing without waiting for any new input
|
||||
* packets to arrive.
|
||||
* @param nfds The maximum FD set in readfds, writefds or exceptfds
|
||||
* plus one,
|
||||
* @param readfds Read FDs to additionally check for in internal select()
|
||||
* or NULL if not required.
|
||||
* @param writefds Write FDs to additionally check for in internal select()
|
||||
* or NULL if not required.
|
||||
* @param exceptfds Except FDs to additionally check for in internal select()
|
||||
* or NULL if not required.
|
||||
*
|
||||
*
|
||||
* @return Number of milliseconds spent in coap_io_process_with_fds, or @c -1
|
||||
* if there was an error. If defined, readfds, writefds, exceptfds
|
||||
* are updated as returned by the internal select() call.
|
||||
*/
|
||||
int coap_io_process_with_fds(coap_context_t *ctx, uint32_t timeout_ms,
|
||||
int nfds, fd_set *readfds, fd_set *writefds,
|
||||
fd_set *exceptfds);
|
||||
#endif /* !RIOT_VERSION */
|
||||
|
||||
/**@}*/
|
||||
|
||||
/**
|
||||
* @defgroup app_io_internal Application I/O Handling (Internal)
|
||||
* Internal API functions for Application Input / Output
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Iterates through all the coap_socket_t structures embedded in endpoints or
|
||||
* sessions associated with the @p ctx to determine which are wanting any
|
||||
* read, write, accept or connect I/O (COAP_SOCKET_WANT_xxx is set). If set,
|
||||
* the coap_socket_t is added to the @p sockets.
|
||||
*
|
||||
* Any now timed out delayed packet is transmitted, along with any packets
|
||||
* associated with requested observable response.
|
||||
*
|
||||
* In addition, it returns when the next expected I/O is expected to take place
|
||||
* (e.g. a packet retransmit).
|
||||
*
|
||||
* Prior to calling coap_io_do_io(), the @p sockets must be tested to see
|
||||
* if any of the COAP_SOCKET_WANT_xxx have the appropriate information and if
|
||||
* so, COAP_SOCKET_CAN_xxx is set. This typically will be done after using a
|
||||
* select() call.
|
||||
*
|
||||
* Note: If epoll support is compiled into libcoap, coap_io_prepare_epoll() must
|
||||
* be used instead of coap_io_prepare_io().
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @param ctx The CoAP context
|
||||
* @param sockets Array of socket descriptors, filled on output
|
||||
* @param max_sockets Size of socket array.
|
||||
* @param num_sockets Pointer to the number of valid entries in the socket
|
||||
* arrays on output.
|
||||
* @param now Current time.
|
||||
*
|
||||
* @return timeout Maxmimum number of milliseconds that can be used by a
|
||||
* select() to wait for network events or 0 if wait should be
|
||||
* forever.
|
||||
*/
|
||||
unsigned int
|
||||
coap_io_prepare_io(coap_context_t *ctx,
|
||||
coap_socket_t *sockets[],
|
||||
unsigned int max_sockets,
|
||||
unsigned int *num_sockets,
|
||||
coap_tick_t now
|
||||
);
|
||||
|
||||
/**
|
||||
* Processes any outstanding read, write, accept or connect I/O as indicated
|
||||
* in the coap_socket_t structures (COAP_SOCKET_CAN_xxx set) embedded in
|
||||
* endpoints or sessions associated with @p ctx.
|
||||
*
|
||||
* Note: If epoll support is compiled into libcoap, coap_io_do_epoll() must
|
||||
* be used instead of coap_io_do_io().
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @param ctx The CoAP context
|
||||
* @param now Current time
|
||||
*/
|
||||
void coap_io_do_io(coap_context_t *ctx, coap_tick_t now);
|
||||
|
||||
/**
|
||||
* Any now timed out delayed packet is transmitted, along with any packets
|
||||
* associated with requested observable response.
|
||||
*
|
||||
* In addition, it returns when the next expected I/O is expected to take place
|
||||
* (e.g. a packet retransmit).
|
||||
*
|
||||
* Note: If epoll support is compiled into libcoap, coap_io_prepare_epoll() must
|
||||
* be used instead of coap_io_prepare_io().
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @param ctx The CoAP context
|
||||
* @param now Current time.
|
||||
*
|
||||
* @return timeout Maxmimum number of milliseconds that can be used by a
|
||||
* epoll_wait() to wait for network events or 0 if wait should be
|
||||
* forever.
|
||||
*/
|
||||
unsigned int
|
||||
coap_io_prepare_epoll(coap_context_t *ctx, coap_tick_t now);
|
||||
|
||||
struct epoll_event;
|
||||
|
||||
/**
|
||||
* Process all the epoll events
|
||||
*
|
||||
* Note: If epoll support is compiled into libcoap, coap_io_do_epoll() must
|
||||
* be used instead of coap_io_do_io().
|
||||
*
|
||||
* Internal function
|
||||
*
|
||||
* @param ctx The current CoAP context.
|
||||
* @param events The list of events returned from an epoll_wait() call.
|
||||
* @param nevents The number of events.
|
||||
*
|
||||
*/
|
||||
void coap_io_do_epoll(coap_context_t *ctx, struct epoll_event* events,
|
||||
size_t nevents);
|
||||
|
||||
/**@}*/
|
||||
|
||||
/**
|
||||
* @deprecated Use coap_io_process() instead.
|
||||
*
|
||||
* This function just calls coap_io_process().
|
||||
*
|
||||
* @param ctx The CoAP context
|
||||
* @param timeout_ms Minimum number of milliseconds to wait for new packets
|
||||
* before returning after doing any processing.
|
||||
* If COAP_IO_WAIT, the call will block until the next
|
||||
* internal action (e.g. packet retransmit) if any, or block
|
||||
* until the next packet is received whichever is the sooner
|
||||
* and do the necessary processing.
|
||||
* If COAP_IO_NO_WAIT, the function will return immediately
|
||||
* after processing without waiting for any new input
|
||||
* packets to arrive.
|
||||
*
|
||||
* @return Number of milliseconds spent in function or @c -1 if there was
|
||||
* an error
|
||||
*/
|
||||
COAP_STATIC_INLINE COAP_DEPRECATED int
|
||||
coap_run_once(coap_context_t *ctx, uint32_t timeout_ms)
|
||||
{
|
||||
return coap_io_process(ctx, timeout_ms);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use coap_io_prepare_io() instead.
|
||||
*
|
||||
* This function just calls coap_io_prepare_io().
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @param ctx The CoAP context
|
||||
* @param sockets Array of socket descriptors, filled on output
|
||||
* @param max_sockets Size of socket array.
|
||||
* @param num_sockets Pointer to the number of valid entries in the socket
|
||||
* arrays on output.
|
||||
* @param now Current time.
|
||||
*
|
||||
* @return timeout Maxmimum number of milliseconds that can be used by a
|
||||
* select() to wait for network events or 0 if wait should be
|
||||
* forever.
|
||||
*/
|
||||
COAP_STATIC_INLINE COAP_DEPRECATED unsigned int
|
||||
coap_write(coap_context_t *ctx,
|
||||
coap_socket_t *sockets[],
|
||||
unsigned int max_sockets,
|
||||
unsigned int *num_sockets,
|
||||
coap_tick_t now
|
||||
) {
|
||||
return coap_io_prepare_io(ctx, sockets, max_sockets, num_sockets, now);
|
||||
}
|
||||
|
||||
/**
|
||||
* @deprecated Use coap_io_do_io() instead.
|
||||
*
|
||||
* This function just calls coap_io_do_io().
|
||||
*
|
||||
* Internal function.
|
||||
*
|
||||
* @param ctx The CoAP context
|
||||
* @param now Current time
|
||||
*/
|
||||
COAP_STATIC_INLINE COAP_DEPRECATED void
|
||||
coap_read(coap_context_t *ctx, coap_tick_t now
|
||||
) {
|
||||
coap_io_do_io(ctx, now);
|
||||
}
|
||||
|
||||
/* Old definitions which may be hanging around in old code - be helpful! */
|
||||
#define COAP_RUN_NONBLOCK COAP_RUN_NONBLOCK_deprecated_use_COAP_IO_NO_WAIT
|
||||
#define COAP_RUN_BLOCK COAP_RUN_BLOCK_deprecated_use_COAP_IO_WAIT
|
||||
|
||||
#endif /* COAP_NET_H_ */
|
439
tools/sdk/esp32/include/coap/libcoap/include/coap3/option.h
Normal file
439
tools/sdk/esp32/include/coap/libcoap/include/coap3/option.h
Normal file
@ -0,0 +1,439 @@
|
||||
/*
|
||||
* option.h -- helpers for handling options in CoAP PDUs
|
||||
*
|
||||
* Copyright (C) 2010-2013 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file option.h
|
||||
* @brief Helpers for handling options in CoAP PDUs
|
||||
*/
|
||||
|
||||
#ifndef COAP_OPTION_H_
|
||||
#define COAP_OPTION_H_
|
||||
|
||||
typedef uint16_t coap_option_num_t;
|
||||
|
||||
/**
|
||||
* Use byte-oriented access methods here because sliding a complex struct
|
||||
* coap_opt_t over the data buffer may cause bus error on certain platforms.
|
||||
*/
|
||||
typedef uint8_t coap_opt_t;
|
||||
#define PCHAR(p) ((coap_opt_t *)(p))
|
||||
|
||||
/**
|
||||
* Representation of CoAP options.
|
||||
*/
|
||||
typedef struct {
|
||||
uint16_t delta;
|
||||
size_t length;
|
||||
const uint8_t *value;
|
||||
} coap_option_t;
|
||||
|
||||
/**
|
||||
* Parses the option pointed to by @p opt into @p result. This function returns
|
||||
* the number of bytes that have been parsed, or @c 0 on error. An error is
|
||||
* signaled when illegal delta or length values are encountered or when option
|
||||
* parsing would result in reading past the option (i.e. beyond opt + length).
|
||||
*
|
||||
* @param opt The beginning of the option to parse.
|
||||
* @param length The maximum length of @p opt.
|
||||
* @param result A pointer to the coap_option_t structure that is filled with
|
||||
* actual values iff coap_opt_parse() > 0.
|
||||
* @return The number of bytes parsed or @c 0 on error.
|
||||
*/
|
||||
size_t coap_opt_parse(const coap_opt_t *opt,
|
||||
size_t length,
|
||||
coap_option_t *result);
|
||||
|
||||
/**
|
||||
* Returns the size of the given option, taking into account a possible option
|
||||
* jump.
|
||||
*
|
||||
* @param opt An option jump or the beginning of the option.
|
||||
* @return The number of bytes between @p opt and the end of the option
|
||||
* starting at @p opt. In case of an error, this function returns
|
||||
* @c 0 as options need at least one byte storage space.
|
||||
*/
|
||||
size_t coap_opt_size(const coap_opt_t *opt);
|
||||
|
||||
/**
|
||||
* @defgroup opt_filter Option Filters
|
||||
* API functions for access option filters
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* The number of option types below 256 that can be stored in an
|
||||
* option filter. COAP_OPT_FILTER_SHORT + COAP_OPT_FILTER_LONG must be
|
||||
* at most 16. Each coap_option_filter_t object reserves
|
||||
* ((COAP_OPT_FILTER_SHORT + 1) / 2) * 2 bytes for short options.
|
||||
*/
|
||||
#define COAP_OPT_FILTER_SHORT 6
|
||||
|
||||
/**
|
||||
* The number of option types above 255 that can be stored in an
|
||||
* option filter. COAP_OPT_FILTER_SHORT + COAP_OPT_FILTER_LONG must be
|
||||
* at most 16. Each coap_option_filter_t object reserves
|
||||
* COAP_OPT_FILTER_LONG * 2 bytes for short options.
|
||||
*/
|
||||
#define COAP_OPT_FILTER_LONG 2
|
||||
|
||||
/* Ensure that COAP_OPT_FILTER_SHORT and COAP_OPT_FILTER_LONG are set
|
||||
* correctly. */
|
||||
#if (COAP_OPT_FILTER_SHORT + COAP_OPT_FILTER_LONG > 16)
|
||||
#error COAP_OPT_FILTER_SHORT + COAP_OPT_FILTER_LONG must be less or equal 16
|
||||
#endif /* (COAP_OPT_FILTER_SHORT + COAP_OPT_FILTER_LONG > 16) */
|
||||
|
||||
/*
|
||||
* mask contains a bit vector that indicates which fields in the long_opts[]
|
||||
* and subsequent short_opts[] are used. The first COAP_OPT_FILTER_LONG bits
|
||||
* correspond to the long option types that are stored in long_opts[]
|
||||
* elements. The next COAP_OPT_FILTER_SHORT bits correspond to the short
|
||||
* option types that are stored in short_opts[].
|
||||
*/
|
||||
typedef struct coap_opt_filter_t {
|
||||
uint16_t mask;
|
||||
uint16_t long_opts[COAP_OPT_FILTER_LONG];
|
||||
uint8_t short_opts[COAP_OPT_FILTER_SHORT];
|
||||
} coap_opt_filter_t;
|
||||
|
||||
/** Pre-defined filter that includes all options. */
|
||||
#define COAP_OPT_ALL NULL
|
||||
|
||||
/**
|
||||
* Clears filter @p filter.
|
||||
*
|
||||
* @param filter The filter to clear.
|
||||
*/
|
||||
void
|
||||
coap_option_filter_clear(coap_opt_filter_t *filter);
|
||||
|
||||
/**
|
||||
* Sets the corresponding entry for @p number in @p filter. This
|
||||
* function returns @c 1 if bit was set or @c 0 on error (i.e. when
|
||||
* the given number does not fit in the filter).
|
||||
*
|
||||
* @param filter The filter object to change.
|
||||
* @param number The option number for which the bit should be set.
|
||||
*
|
||||
* @return @c 1 if bit was set, @c 0 otherwise.
|
||||
*/
|
||||
int coap_option_filter_set(coap_opt_filter_t *filter, coap_option_num_t number);
|
||||
|
||||
/**
|
||||
* Clears the corresponding entry for @p number in @p filter. This
|
||||
* function returns @c 1 if bit was set or @c 0 on error (i.e. when
|
||||
* the given number does not fit in the filter).
|
||||
*
|
||||
* @param filter The filter object to change.
|
||||
* @param number The option number that should be cleared from the filter.
|
||||
*
|
||||
* @return @c 1 if bit was set, @c 0 otherwise.
|
||||
*/
|
||||
int coap_option_filter_unset(coap_opt_filter_t *filter,
|
||||
coap_option_num_t number);
|
||||
|
||||
/**
|
||||
* Checks if @p number is contained in @p filter. This function returns
|
||||
* @c 1 if found, @c 0 if not, or @c -1 on error (i.e. when the given
|
||||
* number does not fit in the filter).
|
||||
*
|
||||
* @param filter The filter object to search.
|
||||
* @param number The option number to search for.
|
||||
*
|
||||
* @return @c 1 if @p number was found, @c 0 otherwise, or @c -1 on error.
|
||||
*/
|
||||
int coap_option_filter_get(coap_opt_filter_t *filter, coap_option_num_t number);
|
||||
|
||||
/**
|
||||
* Iterator to run through PDU options. This object must be
|
||||
* initialized with coap_option_iterator_init(). Call
|
||||
* coap_option_next() to walk through the list of options until
|
||||
* coap_option_next() returns @c NULL.
|
||||
*
|
||||
* @code
|
||||
* coap_opt_t *option;
|
||||
* coap_opt_iterator_t opt_iter;
|
||||
* coap_option_iterator_init(pdu, &opt_iter, COAP_OPT_ALL);
|
||||
*
|
||||
* while ((option = coap_option_next(&opt_iter))) {
|
||||
* ... do something with option ...
|
||||
* }
|
||||
* @endcode
|
||||
*/
|
||||
typedef struct {
|
||||
size_t length; /**< remaining length of PDU */
|
||||
coap_option_num_t number; /**< decoded option number */
|
||||
unsigned int bad:1; /**< iterator object is ok if not set */
|
||||
unsigned int filtered:1; /**< denotes whether or not filter is used */
|
||||
coap_opt_t *next_option; /**< pointer to the unparsed next option */
|
||||
coap_opt_filter_t filter; /**< option filter */
|
||||
} coap_opt_iterator_t;
|
||||
|
||||
/**
|
||||
* Initializes the given option iterator @p oi to point to the beginning of the
|
||||
* @p pdu's option list. This function returns @p oi on success, @c NULL
|
||||
* otherwise (i.e. when no options exist). Note that a length check on the
|
||||
* option list must be performed before coap_option_iterator_init() is called.
|
||||
*
|
||||
* @param pdu The PDU the options of which should be walked through.
|
||||
* @param oi An iterator object that will be initilized.
|
||||
* @param filter An optional option number filter.
|
||||
* With @p number != @c COAP_OPT_ALL, coap_option_next()
|
||||
* will return only options matching this bitmask.
|
||||
* Fence-post options @c 14, @c 28, @c 42, ... are always
|
||||
* skipped.
|
||||
*
|
||||
* @return The iterator object @p oi on success, @c NULL otherwise.
|
||||
*/
|
||||
coap_opt_iterator_t *coap_option_iterator_init(const coap_pdu_t *pdu,
|
||||
coap_opt_iterator_t *oi,
|
||||
const coap_opt_filter_t *filter);
|
||||
|
||||
/**
|
||||
* Updates the iterator @p oi to point to the next option. This function returns
|
||||
* a pointer to that option or @c NULL if no more options exist. The contents of
|
||||
* @p oi will be updated. In particular, @c oi->n specifies the current option's
|
||||
* ordinal number (counted from @c 1), @c oi->number is the option's number
|
||||
* value, and @c oi->option points to the beginning of the current option
|
||||
* itself. When * advanced past the last option, @c oi->option will be @c NULL.
|
||||
*
|
||||
* Note that options are skipped whose corresponding bits in the filter
|
||||
* specified with coap_option_iterator_init() are @c 0. Options with numbers
|
||||
* that do not fit in this filter hence will always be returned.
|
||||
*
|
||||
* @param oi The option iterator to update.
|
||||
*
|
||||
* @return The next option or @c NULL if no more options exist.
|
||||
*/
|
||||
coap_opt_t *coap_option_next(coap_opt_iterator_t *oi);
|
||||
|
||||
/**
|
||||
* Retrieves the first option of number @p number from @p pdu. @p oi must
|
||||
* point to a coap_opt_iterator_t object that will be initialized by this
|
||||
* function to filter only options with number @p number. This function returns
|
||||
* the first option with this number, or @c NULL if not found.
|
||||
*
|
||||
* @param pdu The PDU to parse for options.
|
||||
* @param number The option number to search for.
|
||||
* @param oi An iterator object to use.
|
||||
*
|
||||
* @return A pointer to the first option of number @p number, or @c NULL if
|
||||
* not found.
|
||||
*/
|
||||
coap_opt_t *coap_check_option(const coap_pdu_t *pdu,
|
||||
coap_option_num_t number,
|
||||
coap_opt_iterator_t *oi);
|
||||
|
||||
/**
|
||||
* Encodes the given delta and length values into @p opt. This function returns
|
||||
* the number of bytes that were required to encode @p delta and @p length or @c
|
||||
* 0 on error. Note that the result indicates by how many bytes @p opt must be
|
||||
* advanced to encode the option value.
|
||||
*
|
||||
* @param opt The option buffer space where @p delta and @p length are
|
||||
* written.
|
||||
* @param maxlen The maximum length of @p opt.
|
||||
* @param delta The actual delta value to encode.
|
||||
* @param length The actual length value to encode.
|
||||
*
|
||||
* @return The number of bytes used or @c 0 on error.
|
||||
*/
|
||||
size_t coap_opt_setheader(coap_opt_t *opt,
|
||||
size_t maxlen,
|
||||
uint16_t delta,
|
||||
size_t length);
|
||||
|
||||
/**
|
||||
* Compute storage bytes needed for an option with given @p delta and
|
||||
* @p length
|
||||
*
|
||||
* @param delta The option delta.
|
||||
* @param length The option length.
|
||||
*
|
||||
* @return The number of bytes required to encode this option.
|
||||
*/
|
||||
size_t coap_opt_encode_size(uint16_t delta, size_t length);
|
||||
|
||||
/**
|
||||
* Encodes option with given @p delta into @p opt. This function returns the
|
||||
* number of bytes written to @p opt or @c 0 on error. This happens especially
|
||||
* when @p opt does not provide sufficient space to store the option value,
|
||||
* delta, and option jumps when required.
|
||||
*
|
||||
* @param opt The option buffer space where @p val is written.
|
||||
* @param n Maximum length of @p opt.
|
||||
* @param delta The option delta.
|
||||
* @param val The option value to copy into @p opt.
|
||||
* @param length The actual length of @p val.
|
||||
*
|
||||
* @return The number of bytes that have been written to @p opt or @c 0 on
|
||||
* error. The return value will always be less than @p n.
|
||||
*/
|
||||
size_t coap_opt_encode(coap_opt_t *opt,
|
||||
size_t n,
|
||||
uint16_t delta,
|
||||
const uint8_t *val,
|
||||
size_t length);
|
||||
|
||||
/**
|
||||
* Returns the length of the given option. @p opt must point to an option jump
|
||||
* or the beginning of the option. This function returns @c 0 when @p opt is not
|
||||
* an option or the actual length of @p opt (which can be @c 0 as well).
|
||||
*
|
||||
* @note {The rationale for using @c 0 in case of an error is that in most
|
||||
* contexts, the result of this function is used to skip the next
|
||||
* coap_opt_length() bytes.}
|
||||
*
|
||||
* @param opt The option whose length should be returned.
|
||||
*
|
||||
* @return The option's length or @c 0 when undefined.
|
||||
*/
|
||||
uint32_t coap_opt_length(const coap_opt_t *opt);
|
||||
|
||||
/**
|
||||
* Returns a pointer to the value of the given option. @p opt must point to an
|
||||
* option jump or the beginning of the option. This function returns @c NULL if
|
||||
* @p opt is not a valid option.
|
||||
*
|
||||
* @param opt The option whose value should be returned.
|
||||
*
|
||||
* @return A pointer to the option value or @c NULL on error.
|
||||
*/
|
||||
const uint8_t *coap_opt_value(const coap_opt_t *opt);
|
||||
|
||||
/**
|
||||
* Representation of chained list of CoAP options to install.
|
||||
*
|
||||
* @code
|
||||
* coap_optlist_t *optlist_chain = NULL;
|
||||
* coap_pdu_t *pdu = coap_new_pdu(session);
|
||||
*
|
||||
* ... other set up code ...
|
||||
* coap_insert_optlist(&optlist_chain, coap_new_optlist(COAP_OPTION_OBSERVE,
|
||||
* COAP_OBSERVE_ESTABLISH, NULL));
|
||||
*
|
||||
* coap_add_optlist_pdu(pdu, &optlist_chain);
|
||||
* ... other code ...
|
||||
* coap_delete_optlist(optlist_chain);
|
||||
* @endcode
|
||||
*/
|
||||
typedef struct coap_optlist_t {
|
||||
struct coap_optlist_t *next; /**< next entry in the optlist chain */
|
||||
uint16_t number; /**< the option number (no delta coding) */
|
||||
size_t length; /**< the option value length */
|
||||
uint8_t *data; /**< the option data */
|
||||
} coap_optlist_t;
|
||||
|
||||
/**
|
||||
* Create a new optlist entry.
|
||||
*
|
||||
* Note: Where possible, the option data needs to be stripped of leading zeros
|
||||
* (big endian) to reduce the amount of data needed in the PDU, as well as in
|
||||
* some cases the maximum data size of an opton can be exceeded if not stripped
|
||||
* and hence be illegal. This is done by using coap_encode_var_safe() or
|
||||
* coap_encode_var_safe8().
|
||||
*
|
||||
* @param number The option number (COAP_OPTION_*)
|
||||
* @param length The option length
|
||||
* @param data The option value data
|
||||
*
|
||||
* @return A pointer to the new optlist entry, or @c NULL if error
|
||||
*/
|
||||
coap_optlist_t *coap_new_optlist(uint16_t number,
|
||||
size_t length,
|
||||
const uint8_t *data);
|
||||
|
||||
/**
|
||||
* The current optlist of @p optlist_chain is first sorted (as per RFC7272
|
||||
* ordering requirements) and then added to the @p pdu.
|
||||
*
|
||||
* @param pdu The pdu to add the options to from the chain list
|
||||
* @param optlist_chain The chained list of optlist to add to the pdu
|
||||
*
|
||||
* @return @c 1 if succesful or @c 0 if failure;
|
||||
*/
|
||||
int coap_add_optlist_pdu(coap_pdu_t *pdu, coap_optlist_t** optlist_chain);
|
||||
|
||||
/**
|
||||
* Adds @p optlist to the given @p optlist_chain. The optlist_chain variable
|
||||
* be set to NULL before the initial call to coap_insert_optlist().
|
||||
* The optlist_chain will need to be deleted using coap_delete_optlist()
|
||||
* when no longer required.
|
||||
*
|
||||
* @param optlist_chain The chain to add optlist to
|
||||
* @param optlist The optlist to add to the queue
|
||||
*
|
||||
* @return @c 1 if successful, @c 0 otherwise.
|
||||
*/
|
||||
int coap_insert_optlist(coap_optlist_t **optlist_chain,
|
||||
coap_optlist_t *optlist);
|
||||
|
||||
/**
|
||||
* Removes all entries from the @p optlist_chain, freeing off their
|
||||
* memory usage.
|
||||
*
|
||||
* @param optlist_chain The optlist chain to remove all the entries from
|
||||
*/
|
||||
void coap_delete_optlist(coap_optlist_t *optlist_chain);
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* Sets the corresponding bit for @p type in @p filter. This function returns @c
|
||||
* 1 if bit was set or @c -1 on error (i.e. when the given type does not fit in
|
||||
* the filter).
|
||||
*
|
||||
* @deprecated Use coap_option_filter_set() instead.
|
||||
*
|
||||
* @param filter The filter object to change.
|
||||
* @param type The type for which the bit should be set.
|
||||
*
|
||||
* @return @c 1 if bit was set, @c -1 otherwise.
|
||||
*/
|
||||
COAP_STATIC_INLINE COAP_DEPRECATED int
|
||||
coap_option_setb(coap_opt_filter_t *filter, uint16_t type) {
|
||||
return coap_option_filter_set(filter, type) ? 1 : -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Clears the corresponding bit for @p type in @p filter. This function returns
|
||||
* @c 1 if bit was cleared or @c -1 on error (i.e. when the given type does not
|
||||
* fit in the filter).
|
||||
*
|
||||
* @deprecated Use coap_option_filter_unset() instead.
|
||||
*
|
||||
* @param filter The filter object to change.
|
||||
* @param type The type for which the bit should be cleared.
|
||||
*
|
||||
* @return @c 1 if bit was set, @c -1 otherwise.
|
||||
*/
|
||||
COAP_STATIC_INLINE COAP_DEPRECATED int
|
||||
coap_option_clrb(coap_opt_filter_t *filter, uint16_t type) {
|
||||
return coap_option_filter_unset(filter, type) ? 1 : -1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the corresponding bit for @p type in @p filter. This function returns @c
|
||||
* 1 if the bit is set @c 0 if not, or @c -1 on error (i.e. when the given type
|
||||
* does not fit in the filter).
|
||||
*
|
||||
* @deprecated Use coap_option_filter_get() instead.
|
||||
*
|
||||
* @param filter The filter object to read bit from.
|
||||
* @param type The type for which the bit should be read.
|
||||
*
|
||||
* @return @c 1 if bit was set, @c 0 if not, @c -1 on error.
|
||||
*/
|
||||
COAP_STATIC_INLINE COAP_DEPRECATED int
|
||||
coap_option_getb(coap_opt_filter_t *filter, uint16_t type) {
|
||||
return coap_option_filter_get(filter, type);
|
||||
}
|
||||
|
||||
#endif /* COAP_OPTION_H_ */
|
571
tools/sdk/esp32/include/coap/libcoap/include/coap3/pdu.h
Normal file
571
tools/sdk/esp32/include/coap/libcoap/include/coap3/pdu.h
Normal file
@ -0,0 +1,571 @@
|
||||
/*
|
||||
* pdu.h -- CoAP message structure
|
||||
*
|
||||
* Copyright (C) 2010-2014 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file pdu.h
|
||||
* @brief Pre-defined constants that reflect defaults for CoAP
|
||||
*/
|
||||
|
||||
#ifndef COAP_PDU_H_
|
||||
#define COAP_PDU_H_
|
||||
|
||||
#include "uri.h"
|
||||
#include "option.h"
|
||||
|
||||
#ifdef WITH_LWIP
|
||||
#include <lwip/pbuf.h>
|
||||
#endif
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
/**
|
||||
* @defgroup pdu PDU
|
||||
* API functions for PDUs
|
||||
* @{
|
||||
*/
|
||||
|
||||
#define COAP_DEFAULT_PORT 5683 /* CoAP default UDP/TCP port */
|
||||
#define COAPS_DEFAULT_PORT 5684 /* CoAP default UDP/TCP port for secure transmission */
|
||||
#define COAP_DEFAULT_MAX_AGE 60 /* default maximum object lifetime in seconds */
|
||||
#ifndef COAP_DEFAULT_MTU
|
||||
#define COAP_DEFAULT_MTU 1152
|
||||
#endif /* COAP_DEFAULT_MTU */
|
||||
|
||||
#ifndef COAP_DEFAULT_HOP_LIMIT
|
||||
#define COAP_DEFAULT_HOP_LIMIT 16
|
||||
#endif /* COAP_DEFAULT_HOP_LIMIT */
|
||||
|
||||
#define COAP_DEFAULT_SCHEME "coap" /* the default scheme for CoAP URIs */
|
||||
|
||||
/** well-known resources URI */
|
||||
#define COAP_DEFAULT_URI_WELLKNOWN ".well-known/core"
|
||||
|
||||
/* CoAP message types */
|
||||
|
||||
/**
|
||||
* CoAP PDU message type definitions
|
||||
*/
|
||||
typedef enum coap_pdu_type_t {
|
||||
COAP_MESSAGE_CON, /* 0 confirmable message (requires ACK/RST) */
|
||||
COAP_MESSAGE_NON, /* 1 non-confirmable message (one-shot message) */
|
||||
COAP_MESSAGE_ACK, /* 2 used to acknowledge confirmable messages */
|
||||
COAP_MESSAGE_RST /* 3 indicates error in received messages */
|
||||
} coap_pdu_type_t;
|
||||
|
||||
/**
|
||||
* CoAP PDU Request methods
|
||||
*/
|
||||
typedef enum coap_request_t {
|
||||
COAP_REQUEST_GET = 1,
|
||||
COAP_REQUEST_POST, /* 2 */
|
||||
COAP_REQUEST_PUT, /* 3 */
|
||||
COAP_REQUEST_DELETE, /* 4 */
|
||||
COAP_REQUEST_FETCH, /* 5 RFC 8132 */
|
||||
COAP_REQUEST_PATCH, /* 6 RFC 8132 */
|
||||
COAP_REQUEST_IPATCH, /* 7 RFC 8132 */
|
||||
} coap_request_t;
|
||||
|
||||
/*
|
||||
* CoAP option numbers (be sure to update coap_option_check_critical() and
|
||||
* coap_add_option() when adding options
|
||||
*/
|
||||
|
||||
/*
|
||||
* The C, U, and N flags indicate the properties
|
||||
* Critical, Unsafe, and NoCacheKey, respectively.
|
||||
* If U is set, then N has no meaning as per
|
||||
* https://tools.ietf.org/html/rfc7252#section-5.10
|
||||
* and is set to a -.
|
||||
*
|
||||
* Separately, R is for the options that can be repeated
|
||||
*
|
||||
* The least significant byte of the option is set as followed
|
||||
* as per https://tools.ietf.org/html/rfc7252#section-5.4.6
|
||||
*
|
||||
* 0 1 2 3 4 5 6 7
|
||||
* --+---+---+---+---+---+---+---+
|
||||
* | NoCacheKey| U | C |
|
||||
* --+---+---+---+---+---+---+---+
|
||||
*
|
||||
* https://tools.ietf.org/html/rfc8613#section-4 goes on to define E, I and U
|
||||
* properties Encrypted and Integrity Protected, Integrity Protected Only, and
|
||||
* Unprotected respectively. Integrity Protected Only is not currently used.
|
||||
*
|
||||
* An Option is tagged with CUNREIU with any of the letters replaced with _ if
|
||||
* not set, or - for N if U is set (see above) for aiding understanding of the
|
||||
* Option.
|
||||
*/
|
||||
|
||||
#define COAP_OPTION_IF_MATCH 1 /* C__RE__, opaque, 0-8 B, RFC7252 */
|
||||
#define COAP_OPTION_URI_HOST 3 /* CU-___U, String, 1-255 B, RFC7252 */
|
||||
#define COAP_OPTION_ETAG 4 /* ___RE__, opaque, 1-8 B, RFC7252 */
|
||||
#define COAP_OPTION_IF_NONE_MATCH 5 /* C___E__, empty, 0 B, RFC7252 */
|
||||
#define COAP_OPTION_OBSERVE 6 /* _U-_E_U, empty/uint,0/0-3 B, RFC7641 */
|
||||
#define COAP_OPTION_URI_PORT 7 /* CU-___U, uint, 0-2 B, RFC7252 */
|
||||
#define COAP_OPTION_LOCATION_PATH 8 /* ___RE__, String, 0-255 B, RFC7252 */
|
||||
#define COAP_OPTION_OSCORE 9 /* C_____U, *, 0-255 B, RFC8613 */
|
||||
#define COAP_OPTION_URI_PATH 11 /* CU-RE__, String, 0-255 B, RFC7252 */
|
||||
#define COAP_OPTION_CONTENT_FORMAT 12 /* ____E__, uint, 0-2 B, RFC7252 */
|
||||
#define COAP_OPTION_CONTENT_TYPE COAP_OPTION_CONTENT_FORMAT
|
||||
/* COAP_OPTION_MAXAGE default 60 seconds if not set */
|
||||
#define COAP_OPTION_MAXAGE 14 /* _U-_E_U, uint, 0-4 B, RFC7252 */
|
||||
#define COAP_OPTION_URI_QUERY 15 /* CU-RE__, String, 1-255 B, RFC7252 */
|
||||
#define COAP_OPTION_HOP_LIMIT 16 /* ______U, uint, 1 B, RFC8768 */
|
||||
#define COAP_OPTION_ACCEPT 17 /* C___E__, uint, 0-2 B, RFC7252 */
|
||||
#define COAP_OPTION_LOCATION_QUERY 20 /* ___RE__, String, 0-255 B, RFC7252 */
|
||||
#define COAP_OPTION_BLOCK2 23 /* CU-_E_U, uint, 0-3 B, RFC7959 */
|
||||
#define COAP_OPTION_BLOCK1 27 /* CU-_E_U, uint, 0-3 B, RFC7959 */
|
||||
#define COAP_OPTION_SIZE2 28 /* __N_E_U, uint, 0-4 B, RFC7959 */
|
||||
#define COAP_OPTION_PROXY_URI 35 /* CU-___U, String, 1-1034 B, RFC7252 */
|
||||
#define COAP_OPTION_PROXY_SCHEME 39 /* CU-___U, String, 1-255 B, RFC7252 */
|
||||
#define COAP_OPTION_SIZE1 60 /* __N_E_U, uint, 0-4 B, RFC7252 */
|
||||
#define COAP_OPTION_NORESPONSE 258 /* _U-_E_U, uint, 0-1 B, RFC7967 */
|
||||
|
||||
#define COAP_MAX_OPT 65535 /**< the highest option number we know */
|
||||
|
||||
/* CoAP result codes (HTTP-Code / 100 * 40 + HTTP-Code % 100) */
|
||||
|
||||
/* As of draft-ietf-core-coap-04, response codes are encoded to base
|
||||
* 32, i.e. the three upper bits determine the response class while
|
||||
* the remaining five fine-grained information specific to that class.
|
||||
*/
|
||||
#define COAP_RESPONSE_CODE(N) (((N)/100 << 5) | (N)%100)
|
||||
|
||||
/* Determines the class of response code C */
|
||||
#define COAP_RESPONSE_CLASS(C) (((C) >> 5) & 0xFF)
|
||||
|
||||
#ifndef SHORT_ERROR_RESPONSE
|
||||
/**
|
||||
* Returns a human-readable response phrase for the specified CoAP response @p
|
||||
* code. This function returns @c NULL if not found.
|
||||
*
|
||||
* @param code The response code for which the literal phrase should be
|
||||
* retrieved.
|
||||
*
|
||||
* @return A zero-terminated string describing the error, or @c NULL if not
|
||||
* found.
|
||||
*/
|
||||
const char *coap_response_phrase(unsigned char code);
|
||||
|
||||
#define COAP_ERROR_PHRASE_LENGTH 32 /**< maximum length of error phrase */
|
||||
|
||||
#else
|
||||
#define coap_response_phrase(x) ((char *)NULL)
|
||||
|
||||
#define COAP_ERROR_PHRASE_LENGTH 0 /**< maximum length of error phrase */
|
||||
#endif /* SHORT_ERROR_RESPONSE */
|
||||
|
||||
#define COAP_SIGNALING_CODE(N) (((N)/100 << 5) | (N)%100)
|
||||
|
||||
typedef enum coap_pdu_signaling_proto_t {
|
||||
COAP_SIGNALING_CSM = COAP_SIGNALING_CODE(701),
|
||||
COAP_SIGNALING_PING = COAP_SIGNALING_CODE(702),
|
||||
COAP_SIGNALING_PONG = COAP_SIGNALING_CODE(703),
|
||||
COAP_SIGNALING_RELEASE = COAP_SIGNALING_CODE(704),
|
||||
COAP_SIGNALING_ABORT = COAP_SIGNALING_CODE(705),
|
||||
} coap_pdu_signaling_proto_t;
|
||||
|
||||
/* Applies to COAP_SIGNALING_CSM */
|
||||
#define COAP_SIGNALING_OPTION_MAX_MESSAGE_SIZE 2
|
||||
#define COAP_SIGNALING_OPTION_BLOCK_WISE_TRANSFER 4
|
||||
/* Applies to COAP_SIGNALING_PING / COAP_SIGNALING_PONG */
|
||||
#define COAP_SIGNALING_OPTION_CUSTODY 2
|
||||
/* Applies to COAP_SIGNALING_RELEASE */
|
||||
#define COAP_SIGNALING_OPTION_ALTERNATIVE_ADDRESS 2
|
||||
#define COAP_SIGNALING_OPTION_HOLD_OFF 4
|
||||
/* Applies to COAP_SIGNALING_ABORT */
|
||||
#define COAP_SIGNALING_OPTION_BAD_CSM_OPTION 2
|
||||
|
||||
/* CoAP media type encoding */
|
||||
|
||||
#define COAP_MEDIATYPE_TEXT_PLAIN 0 /* text/plain (UTF-8) */
|
||||
#define COAP_MEDIATYPE_APPLICATION_LINK_FORMAT 40 /* application/link-format */
|
||||
#define COAP_MEDIATYPE_APPLICATION_XML 41 /* application/xml */
|
||||
#define COAP_MEDIATYPE_APPLICATION_OCTET_STREAM 42 /* application/octet-stream */
|
||||
#define COAP_MEDIATYPE_APPLICATION_RDF_XML 43 /* application/rdf+xml */
|
||||
#define COAP_MEDIATYPE_APPLICATION_EXI 47 /* application/exi */
|
||||
#define COAP_MEDIATYPE_APPLICATION_JSON 50 /* application/json */
|
||||
#define COAP_MEDIATYPE_APPLICATION_CBOR 60 /* application/cbor */
|
||||
#define COAP_MEDIATYPE_APPLICATION_CWT 61 /* application/cwt, RFC 8392 */
|
||||
|
||||
/* Content formats from RFC 8152 */
|
||||
#define COAP_MEDIATYPE_APPLICATION_COSE_SIGN 98 /* application/cose; cose-type="cose-sign" */
|
||||
#define COAP_MEDIATYPE_APPLICATION_COSE_SIGN1 18 /* application/cose; cose-type="cose-sign1" */
|
||||
#define COAP_MEDIATYPE_APPLICATION_COSE_ENCRYPT 96 /* application/cose; cose-type="cose-encrypt" */
|
||||
#define COAP_MEDIATYPE_APPLICATION_COSE_ENCRYPT0 16 /* application/cose; cose-type="cose-encrypt0" */
|
||||
#define COAP_MEDIATYPE_APPLICATION_COSE_MAC 97 /* application/cose; cose-type="cose-mac" */
|
||||
#define COAP_MEDIATYPE_APPLICATION_COSE_MAC0 17 /* application/cose; cose-type="cose-mac0" */
|
||||
|
||||
#define COAP_MEDIATYPE_APPLICATION_COSE_KEY 101 /* application/cose-key */
|
||||
#define COAP_MEDIATYPE_APPLICATION_COSE_KEY_SET 102 /* application/cose-key-set */
|
||||
|
||||
/* Content formats from RFC 8428 */
|
||||
#define COAP_MEDIATYPE_APPLICATION_SENML_JSON 110 /* application/senml+json */
|
||||
#define COAP_MEDIATYPE_APPLICATION_SENSML_JSON 111 /* application/sensml+json */
|
||||
#define COAP_MEDIATYPE_APPLICATION_SENML_CBOR 112 /* application/senml+cbor */
|
||||
#define COAP_MEDIATYPE_APPLICATION_SENSML_CBOR 113 /* application/sensml+cbor */
|
||||
#define COAP_MEDIATYPE_APPLICATION_SENML_EXI 114 /* application/senml-exi */
|
||||
#define COAP_MEDIATYPE_APPLICATION_SENSML_EXI 115 /* application/sensml-exi */
|
||||
#define COAP_MEDIATYPE_APPLICATION_SENML_XML 310 /* application/senml+xml */
|
||||
#define COAP_MEDIATYPE_APPLICATION_SENSML_XML 311 /* application/sensml+xml */
|
||||
|
||||
/* Content formats from RFC 8782 */
|
||||
#define COAP_MEDIATYPE_APPLICATION_DOTS_CBOR 271 /* application/dots+cbor */
|
||||
|
||||
/* Note that identifiers for registered media types are in the range 0-65535. We
|
||||
* use an unallocated type here and hope for the best. */
|
||||
#define COAP_MEDIATYPE_ANY 0xff /* any media type */
|
||||
|
||||
/**
|
||||
* coap_mid_t is used to store the CoAP Message ID of a CoAP PDU.
|
||||
* Valid message ids are 0 to 2^16. Negative values are error codes.
|
||||
*/
|
||||
typedef int coap_mid_t;
|
||||
|
||||
/** Indicates an invalid message id. */
|
||||
#define COAP_INVALID_MID -1
|
||||
|
||||
/**
|
||||
* Indicates an invalid message id.
|
||||
* @deprecated Use COAP_INVALID_MID instead.
|
||||
*/
|
||||
#define COAP_INVALID_TID COAP_INVALID_MID
|
||||
|
||||
/**
|
||||
* @deprecated Use coap_optlist_t instead.
|
||||
*
|
||||
* Structures for more convenient handling of options. (To be used with ordered
|
||||
* coap_list_t.) The option's data will be added to the end of the coap_option
|
||||
* structure (see macro COAP_OPTION_DATA).
|
||||
*/
|
||||
COAP_DEPRECATED typedef struct {
|
||||
uint16_t key; /* the option key (no delta coding) */
|
||||
unsigned int length;
|
||||
} coap_option;
|
||||
|
||||
#define COAP_OPTION_KEY(option) (option).key
|
||||
#define COAP_OPTION_LENGTH(option) (option).length
|
||||
#define COAP_OPTION_DATA(option) ((unsigned char *)&(option) + sizeof(coap_option))
|
||||
|
||||
#ifdef WITH_LWIP
|
||||
/**
|
||||
* Creates a CoAP PDU from an lwIP @p pbuf, whose reference is passed on to this
|
||||
* function.
|
||||
*
|
||||
* The pbuf is checked for being contiguous, and for having only one reference.
|
||||
* The reference is stored in the PDU and will be freed when the PDU is freed.
|
||||
*
|
||||
* (For now, these are fatal errors; in future, a new pbuf might be allocated,
|
||||
* the data copied and the passed pbuf freed).
|
||||
*
|
||||
* This behaves like coap_pdu_init(0, 0, 0, pbuf->tot_len), and afterwards
|
||||
* copying the contents of the pbuf to the pdu.
|
||||
*
|
||||
* @return A pointer to the new PDU object or @c NULL on error.
|
||||
*/
|
||||
coap_pdu_t * coap_pdu_from_pbuf(struct pbuf *pbuf);
|
||||
#endif
|
||||
|
||||
/**
|
||||
* CoAP protocol types
|
||||
*/
|
||||
typedef enum coap_proto_t {
|
||||
COAP_PROTO_NONE = 0,
|
||||
COAP_PROTO_UDP,
|
||||
COAP_PROTO_DTLS,
|
||||
COAP_PROTO_TCP,
|
||||
COAP_PROTO_TLS,
|
||||
} coap_proto_t;
|
||||
|
||||
/**
|
||||
* Set of codes available for a PDU.
|
||||
*/
|
||||
typedef enum coap_pdu_code_t {
|
||||
COAP_EMPTY_CODE = 0,
|
||||
|
||||
COAP_REQUEST_CODE_GET = COAP_REQUEST_GET,
|
||||
COAP_REQUEST_CODE_POST = COAP_REQUEST_POST,
|
||||
COAP_REQUEST_CODE_PUT = COAP_REQUEST_PUT,
|
||||
COAP_REQUEST_CODE_DELETE = COAP_REQUEST_DELETE,
|
||||
COAP_REQUEST_CODE_FETCH = COAP_REQUEST_FETCH,
|
||||
COAP_REQUEST_CODE_PATCH = COAP_REQUEST_PATCH,
|
||||
COAP_REQUEST_CODE_IPATCH = COAP_REQUEST_IPATCH,
|
||||
|
||||
COAP_RESPONSE_CODE_CREATED = COAP_RESPONSE_CODE(201),
|
||||
COAP_RESPONSE_CODE_DELETED = COAP_RESPONSE_CODE(202),
|
||||
COAP_RESPONSE_CODE_VALID = COAP_RESPONSE_CODE(203),
|
||||
COAP_RESPONSE_CODE_CHANGED = COAP_RESPONSE_CODE(204),
|
||||
COAP_RESPONSE_CODE_CONTENT = COAP_RESPONSE_CODE(205),
|
||||
COAP_RESPONSE_CODE_CONTINUE = COAP_RESPONSE_CODE(231),
|
||||
COAP_RESPONSE_CODE_BAD_REQUEST = COAP_RESPONSE_CODE(400),
|
||||
COAP_RESPONSE_CODE_UNAUTHORIZED = COAP_RESPONSE_CODE(401),
|
||||
COAP_RESPONSE_CODE_BAD_OPTION = COAP_RESPONSE_CODE(402),
|
||||
COAP_RESPONSE_CODE_FORBIDDEN = COAP_RESPONSE_CODE(403),
|
||||
COAP_RESPONSE_CODE_NOT_FOUND = COAP_RESPONSE_CODE(404),
|
||||
COAP_RESPONSE_CODE_NOT_ALLOWED = COAP_RESPONSE_CODE(405),
|
||||
COAP_RESPONSE_CODE_NOT_ACCEPTABLE = COAP_RESPONSE_CODE(406),
|
||||
COAP_RESPONSE_CODE_INCOMPLETE = COAP_RESPONSE_CODE(408),
|
||||
COAP_RESPONSE_CODE_CONFLICT = COAP_RESPONSE_CODE(409),
|
||||
COAP_RESPONSE_CODE_PRECONDITION_FAILED = COAP_RESPONSE_CODE(412),
|
||||
COAP_RESPONSE_CODE_REQUEST_TOO_LARGE = COAP_RESPONSE_CODE(413),
|
||||
COAP_RESPONSE_CODE_UNSUPPORTED_CONTENT_FORMAT = COAP_RESPONSE_CODE(415),
|
||||
COAP_RESPONSE_CODE_UNPROCESSABLE = COAP_RESPONSE_CODE(422),
|
||||
COAP_RESPONSE_CODE_TOO_MANY_REQUESTS = COAP_RESPONSE_CODE(429),
|
||||
COAP_RESPONSE_CODE_INTERNAL_ERROR = COAP_RESPONSE_CODE(500),
|
||||
COAP_RESPONSE_CODE_NOT_IMPLEMENTED = COAP_RESPONSE_CODE(501),
|
||||
COAP_RESPONSE_CODE_BAD_GATEWAY = COAP_RESPONSE_CODE(502),
|
||||
COAP_RESPONSE_CODE_SERVICE_UNAVAILABLE = COAP_RESPONSE_CODE(503),
|
||||
COAP_RESPONSE_CODE_GATEWAY_TIMEOUT = COAP_RESPONSE_CODE(504),
|
||||
COAP_RESPONSE_CODE_PROXYING_NOT_SUPPORTED = COAP_RESPONSE_CODE(505),
|
||||
COAP_RESPONSE_CODE_HOP_LIMIT_REACHED = COAP_RESPONSE_CODE(508),
|
||||
|
||||
COAP_SIGNALING_CODE_CSM = COAP_SIGNALING_CSM,
|
||||
COAP_SIGNALING_CODE_PING = COAP_SIGNALING_PING,
|
||||
COAP_SIGNALING_CODE_PONG = COAP_SIGNALING_PONG,
|
||||
COAP_SIGNALING_CODE_RELEASE = COAP_SIGNALING_RELEASE,
|
||||
COAP_SIGNALING_CODE_ABORT = COAP_SIGNALING_ABORT
|
||||
} coap_pdu_code_t;
|
||||
|
||||
/**
|
||||
* Creates a new CoAP PDU with at least enough storage space for the given
|
||||
* @p size maximum message size. The function returns a pointer to the
|
||||
* node coap_pdu_t object on success, or @c NULL on error. The storage allocated
|
||||
* for the result must be released with coap_delete_pdu() if coap_send()
|
||||
* is not called.
|
||||
*
|
||||
* @param type The type of the PDU (one of COAP_MESSAGE_CON, COAP_MESSAGE_NON,
|
||||
* COAP_MESSAGE_ACK, COAP_MESSAGE_RST).
|
||||
* @param code The message code of the PDU.
|
||||
* @param mid The message id to set or 0 if unknown / not applicable.
|
||||
* @param size The maximum allowed number of byte for the message.
|
||||
* @return A pointer to the new PDU object or @c NULL on error.
|
||||
*/
|
||||
coap_pdu_t *coap_pdu_init(coap_pdu_type_t type, coap_pdu_code_t code,
|
||||
coap_mid_t mid, size_t size);
|
||||
|
||||
/**
|
||||
* Creates a new CoAP PDU.
|
||||
*
|
||||
* @param type The type of the PDU (one of COAP_MESSAGE_CON, COAP_MESSAGE_NON,
|
||||
* COAP_MESSAGE_ACK, COAP_MESSAGE_RST).
|
||||
* @param code The message code of the PDU.
|
||||
* @param session The session that will be using this PDU
|
||||
*
|
||||
* @return The skeletal PDU or @c NULL if failure.
|
||||
*/
|
||||
coap_pdu_t *coap_new_pdu(coap_pdu_type_t type, coap_pdu_code_t code,
|
||||
coap_session_t *session);
|
||||
|
||||
/**
|
||||
* Dispose of an CoAP PDU and frees associated storage.
|
||||
* Not that in general you should not call this function directly.
|
||||
* When a PDU is sent with coap_send(), coap_delete_pdu() will be called
|
||||
* automatically for you.
|
||||
*
|
||||
* @param pdu The PDU for free off.
|
||||
*/
|
||||
void coap_delete_pdu(coap_pdu_t *pdu);
|
||||
|
||||
/**
|
||||
* Duplicate an existing PDU. Specific options can be ignored and not copied
|
||||
* across. The PDU data payload is not copied across.
|
||||
*
|
||||
* @param old_pdu The PDU to duplicate
|
||||
* @param session The session that will be using this PDU.
|
||||
* @param token_length The length of the token to use in this duplicated PDU.
|
||||
* @param token The token to use in this duplicated PDU.
|
||||
* @param drop_options A list of options not to copy into the duplicated PDU.
|
||||
* If @c NULL, then all options are copied across.
|
||||
*
|
||||
* @return The duplicated PDU or @c NULL if failure.
|
||||
*/
|
||||
coap_pdu_t *
|
||||
coap_pdu_duplicate(const coap_pdu_t *old_pdu,
|
||||
coap_session_t *session,
|
||||
size_t token_length,
|
||||
const uint8_t *token,
|
||||
coap_opt_filter_t *drop_options);
|
||||
|
||||
/**
|
||||
* Adds token of length @p len to @p pdu.
|
||||
* Adding the token destroys any following contents of the pdu. Hence options
|
||||
* and data must be added after coap_add_token() has been called. In @p pdu,
|
||||
* length is set to @p len + @c 4, and max_delta is set to @c 0. This function
|
||||
* returns @c 0 on error or a value greater than zero on success.
|
||||
*
|
||||
* @param pdu The PDU where the token is to be added.
|
||||
* @param len The length of the new token.
|
||||
* @param data The token to add.
|
||||
*
|
||||
* @return A value greater than zero on success, or @c 0 on error.
|
||||
*/
|
||||
int coap_add_token(coap_pdu_t *pdu,
|
||||
size_t len,
|
||||
const uint8_t *data);
|
||||
|
||||
/**
|
||||
* Adds option of given number to pdu that is passed as first
|
||||
* parameter.
|
||||
* coap_add_option() destroys the PDU's data, so coap_add_data() must be called
|
||||
* after all options have been added. As coap_add_token() destroys the options
|
||||
* following the token, the token must be added before coap_add_option() is
|
||||
* called. This function returns the number of bytes written or @c 0 on error.
|
||||
*
|
||||
* Note: Where possible, the option data needs to be stripped of leading zeros
|
||||
* (big endian) to reduce the amount of data needed in the PDU, as well as in
|
||||
* some cases the maximum data size of an opton can be exceeded if not stripped
|
||||
* and hence be illegal. This is done by using coap_encode_var_safe() or
|
||||
* coap_encode_var_safe8().
|
||||
*
|
||||
* @param pdu The PDU where the option is to be added.
|
||||
* @param number The number of the new option.
|
||||
* @param len The length of the new option.
|
||||
* @param data The data of the new option.
|
||||
*
|
||||
* @return The overall length of the option or @c 0 on failure.
|
||||
*/
|
||||
size_t coap_add_option(coap_pdu_t *pdu,
|
||||
coap_option_num_t number,
|
||||
size_t len,
|
||||
const uint8_t *data);
|
||||
|
||||
/**
|
||||
* Adds given data to the pdu that is passed as first parameter. Note that the
|
||||
* PDU's data is destroyed by coap_add_option(). coap_add_data() must be called
|
||||
* only once per PDU, otherwise the result is undefined.
|
||||
*
|
||||
* @param pdu The PDU where the data is to be added.
|
||||
* @param len The length of the data.
|
||||
* @param data The data to add.
|
||||
*
|
||||
* @return @c 1 if success, else @c 0 if failure.
|
||||
*/
|
||||
int coap_add_data(coap_pdu_t *pdu,
|
||||
size_t len,
|
||||
const uint8_t *data);
|
||||
|
||||
/**
|
||||
* Adds given data to the pdu that is passed as first parameter but does not
|
||||
* copy it. Note that the PDU's data is destroyed by coap_add_option().
|
||||
* coap_add_data() must be have been called once for this PDU, otherwise the
|
||||
* result is undefined.
|
||||
* The actual data must be copied at the returned location.
|
||||
*
|
||||
* @param pdu The PDU where the data is to be added.
|
||||
* @param len The length of the data.
|
||||
*
|
||||
* @return Where to copy the data of len to, or @c NULL is error.
|
||||
*/
|
||||
uint8_t *coap_add_data_after(coap_pdu_t *pdu, size_t len);
|
||||
|
||||
/**
|
||||
* Retrieves the length and data pointer of specified PDU. Returns 0 on error or
|
||||
* 1 if *len and *data have correct values. Note that these values are destroyed
|
||||
* with the pdu.
|
||||
*
|
||||
* @param pdu The specified PDU.
|
||||
* @param len Returns the length of the current data
|
||||
* @param data Returns the ptr to the current data
|
||||
*
|
||||
* @return @c 1 if len and data are correctly filled in, else
|
||||
* @c 0 if there is no data.
|
||||
*/
|
||||
int coap_get_data(const coap_pdu_t *pdu,
|
||||
size_t *len,
|
||||
const uint8_t **data);
|
||||
|
||||
/**
|
||||
* Retrieves the data from a PDU, with support for large bodies of data that
|
||||
* spans multiple PDUs.
|
||||
*
|
||||
* Note: The data pointed to on return is destroyed when the PDU is destroyed.
|
||||
*
|
||||
* @param pdu The specified PDU.
|
||||
* @param len Returns the length of the current data
|
||||
* @param data Returns the ptr to the current data
|
||||
* @param offset Returns the offset of the current data from the start of the
|
||||
* body comprising of many blocks (RFC7959)
|
||||
* @param total Returns the total size of the body.
|
||||
* If offset + length < total, then there is more data to follow.
|
||||
*
|
||||
* @return @c 1 if len, data, offset and total are correctly filled in, else
|
||||
* @c 0 if there is no data.
|
||||
*/
|
||||
int coap_get_data_large(const coap_pdu_t *pdu,
|
||||
size_t *len,
|
||||
const uint8_t **data,
|
||||
size_t *offset,
|
||||
size_t *total);
|
||||
|
||||
/**
|
||||
* Gets the PDU code associated with @p pdu.
|
||||
*
|
||||
* @param pdu The PDU object.
|
||||
*
|
||||
* @return The PDU code.
|
||||
*/
|
||||
coap_pdu_code_t coap_pdu_get_code(const coap_pdu_t *pdu);
|
||||
|
||||
/**
|
||||
* Sets the PDU code in the @p pdu.
|
||||
*
|
||||
* @param pdu The PDU object.
|
||||
* @param code The code to set in the PDU.
|
||||
*/
|
||||
void coap_pdu_set_code(coap_pdu_t *pdu, coap_pdu_code_t code);
|
||||
|
||||
/**
|
||||
* Gets the PDU type associated with @p pdu.
|
||||
*
|
||||
* @param pdu The PDU object.
|
||||
*
|
||||
* @return The PDU type.
|
||||
*/
|
||||
coap_pdu_type_t coap_pdu_get_type(const coap_pdu_t *pdu);
|
||||
|
||||
/**
|
||||
* Sets the PDU type in the @p pdu.
|
||||
*
|
||||
* @param pdu The PDU object.
|
||||
* @param type The type to set for the PDU.
|
||||
*/
|
||||
void coap_pdu_set_type(coap_pdu_t *pdu, coap_pdu_type_t type);
|
||||
|
||||
/**
|
||||
* Gets the token associated with @p pdu.
|
||||
*
|
||||
* @param pdu The PDU object.
|
||||
*
|
||||
* @return The token information.
|
||||
*/
|
||||
coap_bin_const_t coap_pdu_get_token(const coap_pdu_t *pdu);
|
||||
|
||||
/**
|
||||
* Gets the message id associated with @p pdu.
|
||||
*
|
||||
* @param pdu The PDU object.
|
||||
*
|
||||
* @return The message id.
|
||||
*/
|
||||
coap_mid_t coap_pdu_get_mid(const coap_pdu_t *pdu);
|
||||
|
||||
/**
|
||||
* Sets the message id in the @p pdu.
|
||||
*
|
||||
* @param pdu The PDU object.
|
||||
* @param mid The message id value to set in the PDU.
|
||||
*
|
||||
*/
|
||||
void coap_pdu_set_mid(coap_pdu_t *pdu, coap_mid_t mid);
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* COAP_PDU_H_ */
|
379
tools/sdk/esp32/include/coap/libcoap/include/coap3/resource.h
Normal file
379
tools/sdk/esp32/include/coap/libcoap/include/coap3/resource.h
Normal file
@ -0,0 +1,379 @@
|
||||
/*
|
||||
* resource.h -- generic resource handling
|
||||
*
|
||||
* Copyright (C) 2010,2011,2014-2021 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file resource.h
|
||||
* @brief Generic resource handling
|
||||
*/
|
||||
|
||||
#ifndef COAP_RESOURCE_H_
|
||||
#define COAP_RESOURCE_H_
|
||||
|
||||
#ifndef COAP_RESOURCE_CHECK_TIME
|
||||
/** The interval in seconds to check if resources have changed. */
|
||||
#define COAP_RESOURCE_CHECK_TIME 2
|
||||
#endif /* COAP_RESOURCE_CHECK_TIME */
|
||||
|
||||
#include "async.h"
|
||||
#include "block.h"
|
||||
#include "str.h"
|
||||
#include "pdu.h"
|
||||
#include "net.h"
|
||||
#include "subscribe.h"
|
||||
|
||||
/**
|
||||
* @defgroup coap_resource Resource Configuraton
|
||||
* API functions for setting up resources
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Definition of message handler function
|
||||
*/
|
||||
typedef void (*coap_method_handler_t)
|
||||
(coap_resource_t *,
|
||||
coap_session_t *,
|
||||
const coap_pdu_t * /* request */,
|
||||
const coap_string_t * /* query string */,
|
||||
coap_pdu_t * /* response */);
|
||||
|
||||
#define COAP_ATTR_FLAGS_RELEASE_NAME 0x1
|
||||
#define COAP_ATTR_FLAGS_RELEASE_VALUE 0x2
|
||||
|
||||
/** The URI passed to coap_resource_init() is free'd by coap_delete_resource(). */
|
||||
#define COAP_RESOURCE_FLAGS_RELEASE_URI 0x1
|
||||
|
||||
/**
|
||||
* Notifications will be sent non-confirmable by default. RFC 7641 Section 4.5
|
||||
* https://tools.ietf.org/html/rfc7641#section-4.5
|
||||
* Libcoap will always send every fifth packet as confirmable.
|
||||
*/
|
||||
#define COAP_RESOURCE_FLAGS_NOTIFY_NON 0x0
|
||||
|
||||
/**
|
||||
* Notifications will be sent confirmable. RFC 7641 Section 4.5
|
||||
* https://tools.ietf.org/html/rfc7641#section-4.5
|
||||
*/
|
||||
#define COAP_RESOURCE_FLAGS_NOTIFY_CON 0x2
|
||||
|
||||
/**
|
||||
* Notifications will always be sent non-confirmable. This is in
|
||||
* violation of RFC 7641 Section 4.5
|
||||
* https://tools.ietf.org/html/rfc7641#section-4.5
|
||||
* but required by the DOTS signal channel protocol which needs to operate in
|
||||
* lossy DDoS attack environments.
|
||||
* https://tools.ietf.org/html/rfc8782#section-4.4.2.1
|
||||
*/
|
||||
#define COAP_RESOURCE_FLAGS_NOTIFY_NON_ALWAYS 0x4
|
||||
|
||||
/**
|
||||
* Creates a new resource object and initializes the link field to the string
|
||||
* @p uri_path. This function returns the new coap_resource_t object.
|
||||
*
|
||||
* If the string is going to be freed off by coap_delete_resource() when
|
||||
* COAP_RESOURCE_FLAGS_RELEASE_URI is set in @p flags, then either the 's'
|
||||
* variable of coap_str_const_t has to point to constant text, or point to data
|
||||
* within the allocated coap_str_const_t parameter.
|
||||
*
|
||||
* @param uri_path The string URI path of the new resource. The leading '/' is
|
||||
* not normally required - e.g. just "full/path/for/resource".
|
||||
* @param flags Flags for memory management (in particular release of
|
||||
* memory). Possible values:@n
|
||||
*
|
||||
* COAP_RESOURCE_FLAGS_RELEASE_URI
|
||||
* If this flag is set, the URI passed to
|
||||
* coap_resource_init() is free'd by
|
||||
* coap_delete_resource()@n
|
||||
*
|
||||
* COAP_RESOURCE_FLAGS_NOTIFY_CON
|
||||
* If this flag is set, coap-observe notifications
|
||||
* will be sent confirmable by default.@n
|
||||
*
|
||||
* COAP_RESOURCE_FLAGS_NOTIFY_NON (default)
|
||||
* If this flag is set, coap-observe notifications
|
||||
* will be sent non-confirmable by default.@n
|
||||
*
|
||||
* If flags is set to 0 then the
|
||||
* COAP_RESOURCE_FLAGS_NOTIFY_NON is considered.
|
||||
*
|
||||
* @return A pointer to the new object or @c NULL on error.
|
||||
*/
|
||||
coap_resource_t *coap_resource_init(coap_str_const_t *uri_path,
|
||||
int flags);
|
||||
|
||||
|
||||
/**
|
||||
* Creates a new resource object for the unknown resource handler with support
|
||||
* for PUT.
|
||||
*
|
||||
* In the same way that additional handlers can be added to the resource
|
||||
* created by coap_resource_init() by using coap_register_handler(), POST,
|
||||
* GET, DELETE etc. handlers can be added to this resource. It is the
|
||||
* responsibility of the application to manage the unknown resources by either
|
||||
* creating new resources with coap_resource_init() (which should have a
|
||||
* DELETE handler specified for the resource removal) or by maintaining an
|
||||
* active resource list.
|
||||
*
|
||||
* Note: There can only be one unknown resource handler per context - attaching
|
||||
* a new one overrides the previous definition.
|
||||
*
|
||||
* Note: It is not possible to observe the unknown resource with a GET request
|
||||
* - a separate resource needs to be reated by the PUT (or POST) handler,
|
||||
* and make that resource observable.
|
||||
*
|
||||
* This function returns the new coap_resource_t object.
|
||||
*
|
||||
* @param put_handler The PUT handler to register with @p resource for
|
||||
* unknown Uri-Path.
|
||||
*
|
||||
* @return A pointer to the new object or @c NULL on error.
|
||||
*/
|
||||
coap_resource_t *coap_resource_unknown_init(coap_method_handler_t put_handler);
|
||||
|
||||
/**
|
||||
* Creates a new resource object for handling proxy URIs.
|
||||
* This function returns the new coap_resource_t object.
|
||||
*
|
||||
* Note: There can only be one proxy resource handler per context - attaching
|
||||
* a new one overrides the previous definition.
|
||||
*
|
||||
* @param handler The PUT/POST/GET etc. handler that handles all request types.
|
||||
* @param host_name_count The number of provided host_name_list entries. A
|
||||
* minimum of 1 must be provided.
|
||||
* @param host_name_list Array of depth host_name_count names that this proxy
|
||||
* is known by.
|
||||
*
|
||||
* @return A pointer to the new object or @c NULL on error.
|
||||
*/
|
||||
coap_resource_t *coap_resource_proxy_uri_init(coap_method_handler_t handler,
|
||||
size_t host_name_count, const char *host_name_list[]);
|
||||
|
||||
/**
|
||||
* Returns the resource identified by the unique string @p uri_path. If no
|
||||
* resource was found, this function returns @c NULL.
|
||||
*
|
||||
* @param context The context to look for this resource.
|
||||
* @param uri_path The unique string uri of the resource.
|
||||
*
|
||||
* @return A pointer to the resource or @c NULL if not found.
|
||||
*/
|
||||
coap_resource_t *coap_get_resource_from_uri_path(coap_context_t *context,
|
||||
coap_str_const_t *uri_path);
|
||||
|
||||
/**
|
||||
* Get the uri_path from a @p resource.
|
||||
*
|
||||
* @param resource The CoAP resource to check.
|
||||
*
|
||||
* @return The uri_path if it exists or @c NULL otherwise.
|
||||
*/
|
||||
coap_str_const_t* coap_resource_get_uri_path(coap_resource_t *resource);
|
||||
|
||||
/**
|
||||
* Sets the notification message type of resource @p resource to given
|
||||
* @p mode
|
||||
|
||||
* @param resource The resource to update.
|
||||
* @param mode Must be one of @c COAP_RESOURCE_FLAGS_NOTIFY_NON
|
||||
* or @c COAP_RESOURCE_FLAGS_NOTIFY_CON.
|
||||
*/
|
||||
void coap_resource_set_mode(coap_resource_t *resource, int mode);
|
||||
|
||||
/**
|
||||
* Sets the user_data. The user_data is exclusively used by the library-user
|
||||
* and can be used as user defined context in the handler functions.
|
||||
*
|
||||
* @param resource Resource to attach the data to
|
||||
* @param data Data to attach to the user_data field. This pointer is
|
||||
* only used for storage, the data remains under user control
|
||||
*/
|
||||
void coap_resource_set_userdata(coap_resource_t *resource, void *data);
|
||||
|
||||
/**
|
||||
* Gets the user_data. The user_data is exclusively used by the library-user
|
||||
* and can be used as context in the handler functions.
|
||||
*
|
||||
* @param resource Resource to retrieve the user_data from
|
||||
*
|
||||
* @return The user_data pointer
|
||||
*/
|
||||
void *coap_resource_get_userdata(coap_resource_t *resource);
|
||||
|
||||
/**
|
||||
* Definition of release resource user_data callback function
|
||||
*/
|
||||
typedef void (*coap_resource_release_userdata_handler_t)(void *user_data);
|
||||
|
||||
/**
|
||||
* Defines the context wide callback to use to when the resource is deleted
|
||||
* to release the data held in the resource's user_data.
|
||||
*
|
||||
* @param context The context to associate the release callback with
|
||||
* @param callback The callback to invoke when the resource is deleted or NULL
|
||||
*
|
||||
*/
|
||||
void coap_resource_release_userdata_handler(coap_context_t *context,
|
||||
coap_resource_release_userdata_handler_t callback);
|
||||
|
||||
/**
|
||||
* Registers the given @p resource for @p context. The resource must have been
|
||||
* created by coap_resource_init() or coap_resource_unknown_init(), the
|
||||
* storage allocated for the resource will be released by coap_delete_resource().
|
||||
*
|
||||
* @param context The context to use.
|
||||
* @param resource The resource to store.
|
||||
*/
|
||||
void coap_add_resource(coap_context_t *context, coap_resource_t *resource);
|
||||
|
||||
/**
|
||||
* Deletes a resource identified by @p resource. The storage allocated for that
|
||||
* resource is freed, and removed from the context.
|
||||
*
|
||||
* @param context The context where the resources are stored.
|
||||
* @param resource The resource to delete.
|
||||
*
|
||||
* @return @c 1 if the resource was found (and destroyed),
|
||||
* @c 0 otherwise.
|
||||
*/
|
||||
int coap_delete_resource(coap_context_t *context, coap_resource_t *resource);
|
||||
|
||||
/**
|
||||
* Registers the specified @p handler as message handler for the request type @p
|
||||
* method
|
||||
*
|
||||
* @param resource The resource for which the handler shall be registered.
|
||||
* @param method The CoAP request method to handle.
|
||||
* @param handler The handler to register with @p resource.
|
||||
*/
|
||||
void coap_register_handler(coap_resource_t *resource,
|
||||
coap_request_t method,
|
||||
coap_method_handler_t handler);
|
||||
|
||||
/**
|
||||
* Registers a new attribute with the given @p resource. As the
|
||||
* attribute's coap_str_const_ fields will point to @p name and @p value the
|
||||
* caller must ensure that these pointers are valid during the
|
||||
* attribute's lifetime.
|
||||
|
||||
* If the @p name and/or @p value string is going to be freed off at attribute
|
||||
* removal time by the setting of COAP_ATTR_FLAGS_RELEASE_NAME or
|
||||
* COAP_ATTR_FLAGS_RELEASE_VALUE in @p flags, then either the 's'
|
||||
* variable of coap_str_const_t has to point to constant text, or point to data
|
||||
* within the allocated coap_str_const_t parameter.
|
||||
*
|
||||
* @param resource The resource to register the attribute with.
|
||||
* @param name The attribute's name as a string.
|
||||
* @param value The attribute's value as a string or @c NULL if none.
|
||||
* @param flags Flags for memory management (in particular release of
|
||||
* memory). Possible values:@n
|
||||
*
|
||||
* COAP_ATTR_FLAGS_RELEASE_NAME
|
||||
* If this flag is set, the name passed to
|
||||
* coap_add_attr_release() is free'd
|
||||
* when the attribute is deleted@n
|
||||
*
|
||||
* COAP_ATTR_FLAGS_RELEASE_VALUE
|
||||
* If this flag is set, the value passed to
|
||||
* coap_add_attr_release() is free'd
|
||||
* when the attribute is deleted@n
|
||||
*
|
||||
* @return A pointer to the new attribute or @c NULL on error.
|
||||
*/
|
||||
coap_attr_t *coap_add_attr(coap_resource_t *resource,
|
||||
coap_str_const_t *name,
|
||||
coap_str_const_t *value,
|
||||
int flags);
|
||||
|
||||
/**
|
||||
* Returns @p resource's coap_attr_t object with given @p name if found, @c NULL
|
||||
* otherwise.
|
||||
*
|
||||
* @param resource The resource to search for attribute @p name.
|
||||
* @param name Name of the requested attribute as a string.
|
||||
* @return The first attribute with specified @p name or @c NULL if none
|
||||
* was found.
|
||||
*/
|
||||
coap_attr_t *coap_find_attr(coap_resource_t *resource,
|
||||
coap_str_const_t *name);
|
||||
|
||||
/**
|
||||
* Returns @p attribute's value.
|
||||
*
|
||||
* @param attribute Pointer to attribute.
|
||||
*
|
||||
* @return Attribute's value or @c NULL.
|
||||
*/
|
||||
coap_str_const_t *coap_attr_get_value(coap_attr_t *attribute);
|
||||
|
||||
/**
|
||||
* Status word to encode the result of conditional print or copy operations such
|
||||
* as coap_print_link(). The lower 28 bits of coap_print_status_t are used to
|
||||
* encode the number of characters that has actually been printed, bits 28 to 31
|
||||
* encode the status. When COAP_PRINT_STATUS_ERROR is set, an error occurred
|
||||
* during output. In this case, the other bits are undefined.
|
||||
* COAP_PRINT_STATUS_TRUNC indicates that the output is truncated, i.e. the
|
||||
* printing would have exceeded the current buffer.
|
||||
*/
|
||||
typedef unsigned int coap_print_status_t;
|
||||
|
||||
#define COAP_PRINT_STATUS_MASK 0xF0000000u
|
||||
#define COAP_PRINT_OUTPUT_LENGTH(v) ((v) & ~COAP_PRINT_STATUS_MASK)
|
||||
#define COAP_PRINT_STATUS_ERROR 0x80000000u
|
||||
#define COAP_PRINT_STATUS_TRUNC 0x40000000u
|
||||
|
||||
/**
|
||||
* Writes a description of this resource in link-format to given text buffer. @p
|
||||
* len must be initialized to the maximum length of @p buf and will be set to
|
||||
* the number of characters actually written if successful. This function
|
||||
* returns @c 1 on success or @c 0 on error.
|
||||
*
|
||||
* @param resource The resource to describe.
|
||||
* @param buf The output buffer to write the description to.
|
||||
* @param len Must be initialized to the length of @p buf and
|
||||
* will be set to the length of the printed link description.
|
||||
* @param offset The offset within the resource description where to
|
||||
* start writing into @p buf. This is useful for dealing
|
||||
* with the Block2 option. @p offset is updated during
|
||||
* output as it is consumed.
|
||||
*
|
||||
* @return If COAP_PRINT_STATUS_ERROR is set, an error occured. Otherwise,
|
||||
* the lower 28 bits will indicate the number of characters that
|
||||
* have actually been output into @p buffer. The flag
|
||||
* COAP_PRINT_STATUS_TRUNC indicates that the output has been
|
||||
* truncated.
|
||||
*/
|
||||
coap_print_status_t coap_print_link(const coap_resource_t *resource,
|
||||
unsigned char *buf,
|
||||
size_t *len,
|
||||
size_t *offset);
|
||||
|
||||
/** @} */
|
||||
|
||||
/**
|
||||
* Returns the resource identified by the unique string @p uri_path. If no
|
||||
* resource was found, this function returns @c NULL.
|
||||
*
|
||||
* @param context The context to look for this resource.
|
||||
* @param uri_path The unique string uri of the resource.
|
||||
*
|
||||
* @return A pointer to the resource or @c NULL if not found.
|
||||
*/
|
||||
coap_resource_t *coap_get_resource_from_uri_path(coap_context_t *context,
|
||||
coap_str_const_t *uri_path);
|
||||
|
||||
/**
|
||||
* @deprecated use coap_resource_notify_observers() instead.
|
||||
*/
|
||||
COAP_DEPRECATED int
|
||||
coap_resource_set_dirty(coap_resource_t *r,
|
||||
const coap_string_t *query);
|
||||
|
||||
#endif /* COAP_RESOURCE_H_ */
|
204
tools/sdk/esp32/include/coap/libcoap/include/coap3/str.h
Normal file
204
tools/sdk/esp32/include/coap/libcoap/include/coap3/str.h
Normal file
@ -0,0 +1,204 @@
|
||||
/*
|
||||
* str.h -- strings to be used in the CoAP library
|
||||
*
|
||||
* Copyright (C) 2010-2011 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
#ifndef COAP_STR_H_
|
||||
#define COAP_STR_H_
|
||||
|
||||
#include <string.h>
|
||||
|
||||
|
||||
/**
|
||||
* @defgroup string String handling support
|
||||
* API functions for handling strings and binary data
|
||||
* @{
|
||||
*/
|
||||
|
||||
/*
|
||||
* Note: string and binary use equivalent objects.
|
||||
* string is likely to contain readable textual information, binary will not.
|
||||
*/
|
||||
|
||||
/**
|
||||
* CoAP string data definition
|
||||
*/
|
||||
typedef struct coap_string_t {
|
||||
size_t length; /**< length of string */
|
||||
uint8_t *s; /**< string data */
|
||||
} coap_string_t;
|
||||
|
||||
/**
|
||||
* CoAP string data definition with const data
|
||||
*/
|
||||
typedef struct coap_str_const_t {
|
||||
size_t length; /**< length of string */
|
||||
const uint8_t *s; /**< read-only string data */
|
||||
} coap_str_const_t;
|
||||
|
||||
#define COAP_SET_STR(st,l,v) { (st)->length = (l), (st)->s = (v); }
|
||||
|
||||
/**
|
||||
* CoAP binary data definition
|
||||
*/
|
||||
typedef struct coap_binary_t {
|
||||
size_t length; /**< length of binary data */
|
||||
uint8_t *s; /**< binary data */
|
||||
} coap_binary_t;
|
||||
|
||||
/**
|
||||
* CoAP binary data definition with const data
|
||||
*/
|
||||
typedef struct coap_bin_const_t {
|
||||
size_t length; /**< length of binary data */
|
||||
const uint8_t *s; /**< read-only binary data */
|
||||
} coap_bin_const_t;
|
||||
|
||||
/**
|
||||
* Returns a new string object with at least size+1 bytes storage allocated.
|
||||
* It is the responsibility of the caller to fill in all the appropriate
|
||||
* information.
|
||||
* The string must be released using coap_delete_string().
|
||||
*
|
||||
* @param size The size to allocate for the string data.
|
||||
*
|
||||
* @return A pointer to the new object or @c NULL on error.
|
||||
*/
|
||||
coap_string_t *coap_new_string(size_t size);
|
||||
|
||||
/**
|
||||
* Deletes the given string and releases any memory allocated.
|
||||
*
|
||||
* @param string The string to free off.
|
||||
*/
|
||||
void coap_delete_string(coap_string_t *string);
|
||||
|
||||
/**
|
||||
* Returns a new const string object with at least size+1 bytes storage
|
||||
* allocated, and the provided data copied into the string object.
|
||||
* The string must be released using coap_delete_str_const().
|
||||
*
|
||||
* @param data The data to put in the new string object.
|
||||
* @param size The size to allocate for the binary string data.
|
||||
*
|
||||
* @return A pointer to the new object or @c NULL on error.
|
||||
*/
|
||||
coap_str_const_t *coap_new_str_const(const uint8_t *data, size_t size);
|
||||
|
||||
/**
|
||||
* Deletes the given const string and releases any memory allocated.
|
||||
*
|
||||
* @param string The string to free off.
|
||||
*/
|
||||
void coap_delete_str_const(coap_str_const_t *string);
|
||||
|
||||
/**
|
||||
* Returns a new binary object with at least size bytes storage allocated.
|
||||
* It is the responsibility of the caller to fill in all the appropriate
|
||||
* information.
|
||||
* The coap_binary_t object must be released using coap_delete_binary().
|
||||
*
|
||||
* @param size The size to allocate for the binary data.
|
||||
*
|
||||
* @return A pointer to the new object or @c NULL on error.
|
||||
*/
|
||||
coap_binary_t *coap_new_binary(size_t size);
|
||||
|
||||
/**
|
||||
* Deletes the given coap_binary_t object and releases any memory allocated.
|
||||
*
|
||||
* @param binary The coap_binary_t object to free off.
|
||||
*/
|
||||
void coap_delete_binary(coap_binary_t *binary);
|
||||
|
||||
/**
|
||||
* Resizes the given coap_binary_t object.
|
||||
* It is the responsibility of the caller to fill in all the appropriate
|
||||
* additional information.
|
||||
*
|
||||
* Note: If there is an error, @p binary will separately need to be released by
|
||||
* coap_delete_binary().
|
||||
*
|
||||
* @param binary The coap_binary_t object to resize.
|
||||
* @param new_size The new size to allocate for the binary data.
|
||||
*
|
||||
* @return A pointer to the new object or @c NULL on error.
|
||||
*/
|
||||
coap_binary_t *coap_resize_binary(coap_binary_t *binary, size_t new_size);
|
||||
|
||||
/**
|
||||
* Take the specified byte array (text) and create a coap_bin_const_t *
|
||||
* Returns a new const binary object with at least size bytes storage
|
||||
* allocated, and the provided data copied into the binary object.
|
||||
* The binary data must be released using coap_delete_bin_const().
|
||||
*
|
||||
* @param data The data to put in the new string object.
|
||||
* @param size The size to allocate for the binary data.
|
||||
*
|
||||
* @return A pointer to the new object or @c NULL on error.
|
||||
*/
|
||||
coap_bin_const_t *coap_new_bin_const(const uint8_t *data, size_t size);
|
||||
|
||||
/**
|
||||
* Deletes the given const binary data and releases any memory allocated.
|
||||
*
|
||||
* @param binary The binary data to free off.
|
||||
*/
|
||||
void coap_delete_bin_const(coap_bin_const_t *binary);
|
||||
|
||||
#ifndef COAP_MAX_STR_CONST_FUNC
|
||||
#define COAP_MAX_STR_CONST_FUNC 2
|
||||
#endif /* COAP_MAX_STR_CONST_FUNC */
|
||||
|
||||
/**
|
||||
* Take the specified byte array (text) and create a coap_str_const_t *
|
||||
*
|
||||
* Note: the array is 2 deep as there are up to two callings of
|
||||
* coap_make_str_const in a function call. e.g. coap_add_attr().
|
||||
* Caution: If there are local variable assignments, these will cycle around
|
||||
* the var[COAP_MAX_STR_CONST_FUNC] set. No current examples do this.
|
||||
*
|
||||
* @param string The const string to convert to a coap_str_const_t *
|
||||
*
|
||||
* @return A pointer to one of two static variables containing the
|
||||
* coap_str_const_t * result
|
||||
*/
|
||||
coap_str_const_t *coap_make_str_const(const char *string);
|
||||
|
||||
/**
|
||||
* Compares the two strings for equality
|
||||
*
|
||||
* @param string1 The first string.
|
||||
* @param string2 The second string.
|
||||
*
|
||||
* @return @c 1 if the strings are equal
|
||||
* @c 0 otherwise.
|
||||
*/
|
||||
#define coap_string_equal(string1,string2) \
|
||||
((string1)->length == (string2)->length && ((string1)->length == 0 || \
|
||||
((string1)->s && (string2)->s && \
|
||||
memcmp((string1)->s, (string2)->s, (string1)->length) == 0)))
|
||||
|
||||
/**
|
||||
* Compares the two binary data for equality
|
||||
*
|
||||
* @param binary1 The first binary data.
|
||||
* @param binary2 The second binary data.
|
||||
*
|
||||
* @return @c 1 if the binary data is equal
|
||||
* @c 0 otherwise.
|
||||
*/
|
||||
#define coap_binary_equal(binary1,binary2) \
|
||||
((binary1)->length == (binary2)->length && ((binary1)->length == 0 || \
|
||||
((binary1)->s && (binary2)->s && \
|
||||
memcmp((binary1)->s, (binary2)->s, (binary1)->length) == 0)))
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* COAP_STR_H_ */
|
@ -0,0 +1,68 @@
|
||||
/*
|
||||
* subscribe.h -- subscription handling for CoAP
|
||||
* see RFC7641
|
||||
*
|
||||
* Copyright (C) 2010-2012,2014-2021 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file subscribe.h
|
||||
* @brief Defines the application visible subscribe information
|
||||
*/
|
||||
|
||||
#ifndef COAP_SUBSCRIBE_H_
|
||||
#define COAP_SUBSCRIBE_H_
|
||||
|
||||
/**
|
||||
* @defgroup observe Resource Observation
|
||||
* API functions for interfacing with the observe handling (RFC7641)
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* The value COAP_OBSERVE_ESTABLISH in a GET/FETCH request option
|
||||
* COAP_OPTION_OBSERVE indicates a new observe relationship for (sender
|
||||
* address, token) is requested.
|
||||
*/
|
||||
#define COAP_OBSERVE_ESTABLISH 0
|
||||
|
||||
/**
|
||||
* The value COAP_OBSERVE_CANCEL in a GET/FETCH request option
|
||||
* COAP_OPTION_OBSERVE indicates that the observe relationship for (sender
|
||||
* address, token) must be cancelled.
|
||||
*/
|
||||
#define COAP_OBSERVE_CANCEL 1
|
||||
|
||||
/**
|
||||
* Set whether a @p resource is observable. If the resource is observable
|
||||
* and the client has set the COAP_OPTION_OBSERVE in a request packet, then
|
||||
* whenever the state of the resource changes (a call to
|
||||
* coap_resource_trigger_observe()), an Observer response will get sent.
|
||||
*
|
||||
* @param resource The CoAP resource to use.
|
||||
* @param mode @c 1 if Observable is to be set, @c 0 otherwise.
|
||||
*
|
||||
*/
|
||||
void coap_resource_set_get_observable(coap_resource_t *resource, int mode);
|
||||
|
||||
/**
|
||||
* Initiate the sending of an Observe packet for all observers of @p resource,
|
||||
* optionally matching @p query if not NULL
|
||||
*
|
||||
* @param resource The CoAP resource to use.
|
||||
* @param query The Query to match against or NULL
|
||||
*
|
||||
* @return @c 1 if the Observe has been triggered, @c 0 otherwise.
|
||||
*/
|
||||
int
|
||||
coap_resource_notify_observers(coap_resource_t *resource,
|
||||
const coap_string_t *query);
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* COAP_SUBSCRIBE_H_ */
|
176
tools/sdk/esp32/include/coap/libcoap/include/coap3/uri.h
Normal file
176
tools/sdk/esp32/include/coap/libcoap/include/coap3/uri.h
Normal file
@ -0,0 +1,176 @@
|
||||
/*
|
||||
* uri.h -- helper functions for URI treatment
|
||||
*
|
||||
* Copyright (C) 2010-2020 Olaf Bergmann <bergmann@tzi.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*
|
||||
* This file is part of the CoAP library libcoap. Please see README for terms
|
||||
* of use.
|
||||
*/
|
||||
|
||||
#ifndef COAP_URI_H_
|
||||
#define COAP_URI_H_
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include "str.h"
|
||||
|
||||
/**
|
||||
* The scheme specifiers. Secure schemes have an odd numeric value,
|
||||
* others are even.
|
||||
*/
|
||||
typedef enum coap_uri_scheme_t {
|
||||
COAP_URI_SCHEME_COAP = 0,
|
||||
COAP_URI_SCHEME_COAPS, /* 1 */
|
||||
COAP_URI_SCHEME_COAP_TCP, /* 2 */
|
||||
COAP_URI_SCHEME_COAPS_TCP, /* 3 */
|
||||
COAP_URI_SCHEME_HTTP, /* 4 Proxy-Uri only */
|
||||
COAP_URI_SCHEME_HTTPS /* 5 Proxy-Uri only */
|
||||
} coap_uri_scheme_t;
|
||||
|
||||
/** This mask can be used to check if a parsed URI scheme is secure. */
|
||||
#define COAP_URI_SCHEME_SECURE_MASK 0x01
|
||||
|
||||
/**
|
||||
* Representation of parsed URI. Components may be filled from a string with
|
||||
* coap_split_uri() or coap_split_proxy_uri() and can be used as input for
|
||||
* option-creation functions.
|
||||
*/
|
||||
typedef struct {
|
||||
coap_str_const_t host; /**< host part of the URI */
|
||||
uint16_t port; /**< The port in host byte order */
|
||||
coap_str_const_t path; /**< Beginning of the first path segment.
|
||||
Use coap_split_path() to create Uri-Path options */
|
||||
coap_str_const_t query; /**< The query part if present */
|
||||
|
||||
/** The parsed scheme specifier. */
|
||||
enum coap_uri_scheme_t scheme;
|
||||
} coap_uri_t;
|
||||
|
||||
static inline int
|
||||
coap_uri_scheme_is_secure(const coap_uri_t *uri) {
|
||||
return uri && ((uri->scheme & COAP_URI_SCHEME_SECURE_MASK) != 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new coap_uri_t object from the specified URI. Returns the new
|
||||
* object or NULL on error. The memory allocated by the new coap_uri_t
|
||||
* must be released using coap_free().
|
||||
*
|
||||
* @param uri The URI path to copy.
|
||||
* @param length The length of uri.
|
||||
*
|
||||
* @return New URI object or NULL on error.
|
||||
*/
|
||||
coap_uri_t *coap_new_uri(const uint8_t *uri, unsigned int length);
|
||||
|
||||
/**
|
||||
* Clones the specified coap_uri_t object. Thie function allocates sufficient
|
||||
* memory to hold the coap_uri_t structure and its contents. The object must
|
||||
* be released with coap_free(). */
|
||||
coap_uri_t *coap_clone_uri(const coap_uri_t *uri);
|
||||
|
||||
/**
|
||||
* @defgroup uri_parse URI Parsing Functions
|
||||
*
|
||||
* CoAP PDUs contain normalized URIs with their path and query split into
|
||||
* multiple segments. The functions in this module help splitting strings.
|
||||
* @{
|
||||
*/
|
||||
|
||||
/**
|
||||
* Parses a given string into URI components. The identified syntactic
|
||||
* components are stored in the result parameter @p uri. Optional URI
|
||||
* components that are not specified will be set to { 0, 0 }, except for the
|
||||
* port which is set to the default port for the protocol. This function
|
||||
* returns @p 0 if parsing succeeded, a value less than zero otherwise.
|
||||
*
|
||||
* @param str_var The string to split up.
|
||||
* @param len The actual length of @p str_var
|
||||
* @param uri The coap_uri_t object to store the result.
|
||||
*
|
||||
* @return @c 0 on success, or < 0 on error.
|
||||
*
|
||||
*/
|
||||
int coap_split_uri(const uint8_t *str_var, size_t len, coap_uri_t *uri);
|
||||
|
||||
/**
|
||||
* Parses a given string into URI components. The identified syntactic
|
||||
* components are stored in the result parameter @p uri. Optional URI
|
||||
* components that are not specified will be set to { 0, 0 }, except for the
|
||||
* port which is set to default port for the protocol. This function returns
|
||||
* @p 0 if parsing succeeded, a value less than zero otherwise.
|
||||
* Note: This function enforces that the given string is in Proxy-Uri format
|
||||
* as well as supports different schema such as http.
|
||||
*
|
||||
* @param str_var The string to split up.
|
||||
* @param len The actual length of @p str_var
|
||||
* @param uri The coap_uri_t object to store the result.
|
||||
*
|
||||
* @return @c 0 on success, or < 0 on error.
|
||||
*
|
||||
*/
|
||||
int coap_split_proxy_uri(const uint8_t *str_var, size_t len, coap_uri_t *uri);
|
||||
|
||||
/**
|
||||
* Splits the given URI path into segments. Each segment is preceded
|
||||
* by an option pseudo-header with delta-value 0 and the actual length
|
||||
* of the respective segment after percent-decoding.
|
||||
*
|
||||
* @param s The path string to split.
|
||||
* @param length The actual length of @p s.
|
||||
* @param buf Result buffer for parsed segments.
|
||||
* @param buflen Maximum length of @p buf. Will be set to the actual number
|
||||
* of bytes written into buf on success.
|
||||
*
|
||||
* @return The number of segments created or @c -1 on error.
|
||||
*/
|
||||
int coap_split_path(const uint8_t *s,
|
||||
size_t length,
|
||||
unsigned char *buf,
|
||||
size_t *buflen);
|
||||
|
||||
/**
|
||||
* Splits the given URI query into segments. Each segment is preceded
|
||||
* by an option pseudo-header with delta-value 0 and the actual length
|
||||
* of the respective query term.
|
||||
*
|
||||
* @param s The query string to split.
|
||||
* @param length The actual length of @p s.
|
||||
* @param buf Result buffer for parsed segments.
|
||||
* @param buflen Maximum length of @p buf. Will be set to the actual number
|
||||
* of bytes written into buf on success.
|
||||
*
|
||||
* @return The number of segments created or @c -1 on error.
|
||||
*
|
||||
* @bug This function does not reserve additional space for delta > 12.
|
||||
*/
|
||||
int coap_split_query(const uint8_t *s,
|
||||
size_t length,
|
||||
unsigned char *buf,
|
||||
size_t *buflen);
|
||||
|
||||
/**
|
||||
* Extract query string from request PDU according to escape rules in 6.5.8.
|
||||
* @param request Request PDU.
|
||||
* @return Reconstructed and escaped query string part or @c NULL if
|
||||
* no query was contained in @p request. The coap_string_t
|
||||
* object returned by this function must be released with
|
||||
* coap_delete_string.
|
||||
*/
|
||||
coap_string_t *coap_get_query(const coap_pdu_t *request);
|
||||
|
||||
/**
|
||||
* Extract uri_path string from request PDU
|
||||
* @param request Request PDU.
|
||||
* @return Reconstructed and escaped uri path string part or @c NULL
|
||||
* if no URI-Path was contained in @p request. The
|
||||
* coap_string_t object returned by this function must be
|
||||
* released with coap_delete_string.
|
||||
*/
|
||||
coap_string_t *coap_get_uri_path(const coap_pdu_t *request);
|
||||
|
||||
/** @} */
|
||||
|
||||
#endif /* COAP_URI_H_ */
|
1136
tools/sdk/esp32/include/coap/libcoap/include/coap3/uthash.h
Normal file
1136
tools/sdk/esp32/include/coap/libcoap/include/coap3/uthash.h
Normal file
File diff suppressed because it is too large
Load Diff
1073
tools/sdk/esp32/include/coap/libcoap/include/coap3/utlist.h
Normal file
1073
tools/sdk/esp32/include/coap/libcoap/include/coap3/utlist.h
Normal file
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user