mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-11-03 23:51:39 +01:00 
			
		
		
		
	IDF master 3e370c4296
* Fix build compilation due to changes in the HW_TIMER's structs * Fix compilation warnings and errors with USB * Update USBCDC.cpp * Update CMakeLists.txt * Update HWCDC.cpp
This commit is contained in:
		@@ -1,148 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * async.h -- state management for asynchronous messages
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2010-2011 Olaf Bergmann <bergmann@tzi.org>
 | 
			
		||||
 *
 | 
			
		||||
 * 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"
 | 
			
		||||
 | 
			
		||||
#ifndef WITHOUT_ASYNC
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @defgroup coap_async Asynchronous Messaging
 | 
			
		||||
 * @{
 | 
			
		||||
 * Structure for managing asynchronous state of CoAP resources. A
 | 
			
		||||
 * coap_resource_t object holds a list of coap_async_state_t objects that can be
 | 
			
		||||
 * used to generate a separate response in case a result of an operation cannot
 | 
			
		||||
 * be delivered in time, or the resource has been explicitly subscribed to with
 | 
			
		||||
 * the option @c observe.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct coap_async_state_t {
 | 
			
		||||
  unsigned char flags;  /**< holds the flags to control behaviour */
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * Holds the internal time when the object was registered with a
 | 
			
		||||
   * resource. This field will be updated whenever
 | 
			
		||||
   * coap_register_async() is called for a specific resource.
 | 
			
		||||
   */
 | 
			
		||||
  coap_tick_t created;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * This field can be used to register opaque application data with the
 | 
			
		||||
   * asynchronous state object.
 | 
			
		||||
   */
 | 
			
		||||
  void *appdata;
 | 
			
		||||
  coap_session_t *session;         /**< transaction session */
 | 
			
		||||
  coap_tid_t id;                   /**< transaction id */
 | 
			
		||||
  struct coap_async_state_t *next; /**< internally used for linking */
 | 
			
		||||
  size_t tokenlen;                 /**< length of the token */
 | 
			
		||||
  uint8_t token[8];                /**< the token to use in a response */
 | 
			
		||||
} coap_async_state_t;
 | 
			
		||||
 | 
			
		||||
/* Definitions for Async Status Flags These flags can be used to control the
 | 
			
		||||
 * behaviour of asynchronous response generation.
 | 
			
		||||
 */
 | 
			
		||||
#define COAP_ASYNC_CONFIRM   0x01  /**< send confirmable response */
 | 
			
		||||
#define COAP_ASYNC_SEPARATE  0x02  /**< send separate response */
 | 
			
		||||
#define COAP_ASYNC_OBSERVED  0x04  /**< the resource is being observed */
 | 
			
		||||
 | 
			
		||||
/** release application data on destruction */
 | 
			
		||||
#define COAP_ASYNC_RELEASE_DATA  0x08
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Allocates a new coap_async_state_t object and fills its fields according to
 | 
			
		||||
 * the given @p request. The @p flags are used to control generation of empty
 | 
			
		||||
 * ACK responses to stop retransmissions and to release registered @p data when
 | 
			
		||||
 * the resource is deleted by coap_free_async(). 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.
 | 
			
		||||
 *
 | 
			
		||||
 * @param context  The context to use.
 | 
			
		||||
 * @param session  The session that is used for asynchronous transmissions.
 | 
			
		||||
 * @param request  The request that is handled asynchronously.
 | 
			
		||||
 * @param flags    Flags to control state management.
 | 
			
		||||
 * @param data     Opaque application data to register. Note that the
 | 
			
		||||
 *                 storage occupied by @p data is released on destruction
 | 
			
		||||
 *                 only if flag COAP_ASYNC_RELEASE_DATA is set.
 | 
			
		||||
 *
 | 
			
		||||
 * @return         A pointer to the registered coap_async_state_t object or @c
 | 
			
		||||
 *                 NULL in case of an error.
 | 
			
		||||
 */
 | 
			
		||||
coap_async_state_t *
 | 
			
		||||
coap_register_async(coap_context_t *context,
 | 
			
		||||
                    coap_session_t *session,
 | 
			
		||||
                    coap_pdu_t *request,
 | 
			
		||||
                    unsigned char flags,
 | 
			
		||||
                    void *data);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Removes the state object identified by @p id from @p context. The removed
 | 
			
		||||
 * object is returned in @p s, if found. Otherwise, @p s is undefined. This
 | 
			
		||||
 * function returns @c 1 if the object was removed, @c 0 otherwise. Note that
 | 
			
		||||
 * the storage allocated for the stored object is not released by this
 | 
			
		||||
 * functions. You will have to call coap_free_async() to do so.
 | 
			
		||||
 *
 | 
			
		||||
 * @param context The context where the async object is registered.
 | 
			
		||||
 * @param session  The session that is used for asynchronous transmissions.
 | 
			
		||||
 * @param id      The identifier of the asynchronous transaction.
 | 
			
		||||
 * @param s       Will be set to the object identified by @p id after removal.
 | 
			
		||||
 *
 | 
			
		||||
 * @return        @c 1 if object was removed and @p s updated, or @c 0 if no
 | 
			
		||||
 *                object was found with the given id. @p s is valid only if the
 | 
			
		||||
 *                return value is @c 1.
 | 
			
		||||
 */
 | 
			
		||||
int coap_remove_async(coap_context_t *context,
 | 
			
		||||
                      coap_session_t *session,
 | 
			
		||||
                      coap_tid_t id,
 | 
			
		||||
                      coap_async_state_t **s);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Releases the memory that was allocated by coap_async_state_init() for the
 | 
			
		||||
 * object @p s. The registered application data will be released automatically
 | 
			
		||||
 * if COAP_ASYNC_RELEASE_DATA is set.
 | 
			
		||||
 *
 | 
			
		||||
 * @param state The object to delete.
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
coap_free_async(coap_async_state_t *state);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Retrieves the object identified by @p id 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 context The context where the asynchronous objects are registered
 | 
			
		||||
 *                with.
 | 
			
		||||
 * @param session  The session that is used for asynchronous transmissions.
 | 
			
		||||
 * @param id      The id of the object to retrieve.
 | 
			
		||||
 *
 | 
			
		||||
 * @return        A pointer to the object identified by @p id or @c NULL if
 | 
			
		||||
 *                not found.
 | 
			
		||||
 */
 | 
			
		||||
coap_async_state_t *coap_find_async(coap_context_t *context, coap_session_t *session, coap_tid_t id);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Updates the time stamp of @p s.
 | 
			
		||||
 *
 | 
			
		||||
 * @param s The state object to update.
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE void
 | 
			
		||||
coap_touch_async(coap_async_state_t *s) { coap_ticks(&s->created); }
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
#endif /*  WITHOUT_ASYNC */
 | 
			
		||||
 | 
			
		||||
#endif /* COAP_ASYNC_H_ */
 | 
			
		||||
@@ -1,78 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * bits.h -- bit vector manipulation
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2010-2011 Olaf Bergmann <bergmann@tzi.org>
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of the CoAP library libcoap. Please see README for terms
 | 
			
		||||
 * of use.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file bits.h
 | 
			
		||||
 * @brief Bit vector manipulation
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef COAP_BITS_H_
 | 
			
		||||
#define COAP_BITS_H_
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Sets the bit @p bit in bit-vector @p vec. This function returns @c 1 if bit
 | 
			
		||||
 * was set or @c -1 on error (i.e. when the given bit does not fit in the
 | 
			
		||||
 * vector).
 | 
			
		||||
 *
 | 
			
		||||
 * @param vec  The bit-vector to change.
 | 
			
		||||
 * @param size The size of @p vec in bytes.
 | 
			
		||||
 * @param bit  The bit to set in @p vec.
 | 
			
		||||
 *
 | 
			
		||||
 * @return     @c -1 if @p bit does not fit into @p vec, @c 1 otherwise.
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE int
 | 
			
		||||
bits_setb(uint8_t *vec, size_t size, uint8_t bit) {
 | 
			
		||||
  if (size <= ((size_t)bit >> 3))
 | 
			
		||||
    return -1;
 | 
			
		||||
 | 
			
		||||
  *(vec + (bit >> 3)) |= (uint8_t)(1 << (bit & 0x07));
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Clears the bit @p bit from bit-vector @p vec. This function returns @c 1 if
 | 
			
		||||
 * bit was cleared or @c -1 on error (i.e. when the given bit does not fit in
 | 
			
		||||
 * the vector).
 | 
			
		||||
 *
 | 
			
		||||
 * @param vec  The bit-vector to change.
 | 
			
		||||
 * @param size The size of @p vec in bytes.
 | 
			
		||||
 * @param bit  The bit to clear from @p vec.
 | 
			
		||||
 *
 | 
			
		||||
 * @return     @c -1 if @p bit does not fit into @p vec, @c 1 otherwise.
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE int
 | 
			
		||||
bits_clrb(uint8_t *vec, size_t size, uint8_t bit) {
 | 
			
		||||
  if (size <= ((size_t)bit >> 3))
 | 
			
		||||
    return -1;
 | 
			
		||||
 | 
			
		||||
  *(vec + (bit >> 3)) &= (uint8_t)(~(1 << (bit & 0x07)));
 | 
			
		||||
  return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Gets the status of bit @p bit from bit-vector @p vec. This function returns
 | 
			
		||||
 * @c 1 if the bit is set, @c 0 otherwise (even in case of an error).
 | 
			
		||||
 *
 | 
			
		||||
 * @param vec  The bit-vector to read from.
 | 
			
		||||
 * @param size The size of @p vec in bytes.
 | 
			
		||||
 * @param bit  The bit to get from @p vec.
 | 
			
		||||
 *
 | 
			
		||||
 * @return     @c 1 if the bit is set, @c 0 otherwise.
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE int
 | 
			
		||||
bits_getb(const uint8_t *vec, size_t size, uint8_t bit) {
 | 
			
		||||
  if (size <= ((size_t)bit >> 3))
 | 
			
		||||
    return -1;
 | 
			
		||||
 | 
			
		||||
  return (*(vec + (bit >> 3)) & (1 << (bit & 0x07))) != 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#endif /* COAP_BITS_H_ */
 | 
			
		||||
@@ -1,173 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * block.h -- block transfer
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2010-2012,2014-2015 Olaf Bergmann <bergmann@tzi.org>
 | 
			
		||||
 *
 | 
			
		||||
 * 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"
 | 
			
		||||
 | 
			
		||||
struct coap_resource_t;
 | 
			
		||||
struct coap_session_t;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @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;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 type must be either COAP_OPTION_BLOCK1
 | 
			
		||||
 * or COAP_OPTION_BLOCK2. When option @p type 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 type.
 | 
			
		||||
 * @param type  The option 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(coap_pdu_t *pdu, uint16_t type, coap_block_t *block);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Writes a block option of type @p type 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 type        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,
 | 
			
		||||
                         uint16_t type,
 | 
			
		||||
                         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,
 | 
			
		||||
                   unsigned int len,
 | 
			
		||||
                   const uint8_t *data,
 | 
			
		||||
                   unsigned int block_num,
 | 
			
		||||
                   unsigned char block_szx);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 GET request handler.
 | 
			
		||||
 *
 | 
			
		||||
 * @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 token      The token 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 length     The total length of the data.
 | 
			
		||||
 * @param data       The entire data block to transmit.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void
 | 
			
		||||
coap_add_data_blocked_response(struct coap_resource_t *resource,
 | 
			
		||||
                               struct coap_session_t *session,
 | 
			
		||||
                               coap_pdu_t *request,
 | 
			
		||||
                               coap_pdu_t *response,
 | 
			
		||||
                               const coap_binary_t *token,
 | 
			
		||||
                               uint16_t media_type,
 | 
			
		||||
                               int maxage,
 | 
			
		||||
                               size_t length,
 | 
			
		||||
                               const uint8_t* data);
 | 
			
		||||
 | 
			
		||||
/**@}*/
 | 
			
		||||
 | 
			
		||||
#endif /* COAP_BLOCK_H_ */
 | 
			
		||||
@@ -1,611 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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>
 | 
			
		||||
 *
 | 
			
		||||
 * 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"
 | 
			
		||||
 | 
			
		||||
struct coap_context_t;
 | 
			
		||||
struct coap_session_t;
 | 
			
		||||
struct coap_dtls_pki_t;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @defgroup dtls DTLS Support
 | 
			
		||||
 * API functions for interfacing with DTLS libraries.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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);
 | 
			
		||||
 | 
			
		||||
#define COAP_TLS_LIBRARY_NOTLS 0 /**< No DTLS library */
 | 
			
		||||
#define COAP_TLS_LIBRARY_TINYDTLS 1 /**< Using TinyDTLS library */
 | 
			
		||||
#define COAP_TLS_LIBRARY_OPENSSL 2 /**< Using OpenSSL library */
 | 
			
		||||
#define COAP_TLS_LIBRARY_GNUTLS 3 /**< Using GnuTLS library */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 */
 | 
			
		||||
  int 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 call-back.
 | 
			
		||||
 *                    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,
 | 
			
		||||
                                        struct coap_dtls_pki_t *setup_data);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * CN Validation call-back 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.
 | 
			
		||||
 *
 | 
			
		||||
 * @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,
 | 
			
		||||
             struct coap_session_t *coap_session,
 | 
			
		||||
             unsigned 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 */
 | 
			
		||||
  COAP_PKI_KEY_ASN1,      /**< The PKI key type is ASN.1 (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 in PEM format */
 | 
			
		||||
  const char *private_key;   /**< File location of Private Key in PEM format */
 | 
			
		||||
} coap_pki_key_pem_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 */
 | 
			
		||||
  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 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 keys */
 | 
			
		||||
    coap_pki_key_asn1_t asn1;       /**< for ASN.1 (DER) keys */
 | 
			
		||||
  } key;
 | 
			
		||||
} coap_dtls_key_t;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Server Name Indication (SNI) Validation call-back 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_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.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct coap_dtls_pki_t {
 | 
			
		||||
  uint8_t version; /** Set to 1 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 require_peer_cert;       /**< 1 if peer cert is required */
 | 
			
		||||
  uint8_t allow_self_signed;       /**< 1 if self signed certs are allowed */
 | 
			
		||||
  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 reserved[6];             /**< Reserved - must be set to 0 for
 | 
			
		||||
                                        future compatibility */
 | 
			
		||||
                                   /* Size of 6 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 call-back 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 call-back function */
 | 
			
		||||
 | 
			
		||||
  /** SNI check call-back 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_sni_callback_t validate_sni_call_back;
 | 
			
		||||
  void *sni_call_back_arg;  /**< Passed in to the sni call-back function */
 | 
			
		||||
 | 
			
		||||
  /** Additional Security call-back handler that is invoked when libcoap has
 | 
			
		||||
   * done the standerd, 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 */
 | 
			
		||||
} coap_dtls_pki_t;
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @defgroup dtls_internal DTLS Support (Internal)
 | 
			
		||||
 * Internal API functions for interfacing with DTLS libraries.
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @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(struct coap_context_t *coap_context);
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Set the DTLS context's default PSK information.
 | 
			
		||||
 * This does the PSK specifics following coap_dtls_new_context().
 | 
			
		||||
 * If @p COAP_DTLS_ROLE_SERVER, then identity hint will also get set.
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @param coap_context The CoAP context.
 | 
			
		||||
 * @param identity_hint The default PSK server identity hint sent to a client.
 | 
			
		||||
 *                      Required parameter.  If @p NULL, will be set to "".
 | 
			
		||||
 *                      Empty string is a valid hint.
 | 
			
		||||
 *                      This parameter is ignored if COAP_DTLS_ROLE_CLIENT
 | 
			
		||||
 * @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_psk(struct coap_context_t *coap_context,
 | 
			
		||||
                          const char *identity_hint,
 | 
			
		||||
                          coap_dtls_role_t role);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @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(struct coap_context_t *coap_context,
 | 
			
		||||
                          coap_dtls_pki_t *setup_data,
 | 
			
		||||
                          coap_dtls_role_t role);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Set the dtls context's default Root CA information for a client or server.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @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(struct 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.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @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(struct coap_context_t *coap_context);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Releases the storage allocated for @p dtls_context.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @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.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @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(struct 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.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @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(struct 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.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @param coap_session   The CoAP session.
 | 
			
		||||
 */
 | 
			
		||||
void coap_dtls_free_session(struct coap_session_t *coap_session);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Notify of a change in the CoAP session's MTU, for example after
 | 
			
		||||
 * a PMTU update.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @param coap_session   The CoAP session.
 | 
			
		||||
 */
 | 
			
		||||
void coap_dtls_session_update_mtu(struct coap_session_t *coap_session);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Send data to a DTLS peer.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @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(struct 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.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @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
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @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.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @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(struct coap_session_t *coap_session,
 | 
			
		||||
                                  coap_tick_t now);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Handle a DTLS timeout expiration.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @param coap_session The CoAP session.
 | 
			
		||||
 */
 | 
			
		||||
void coap_dtls_handle_timeout(struct coap_session_t *coap_session);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Handling incoming data from a DTLS peer.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @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(struct 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.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @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(struct coap_session_t *coap_session,
 | 
			
		||||
                    const uint8_t *data,
 | 
			
		||||
                    size_t data_len);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get DTLS overhead over cleartext PDUs.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @param coap_session The CoAP session.
 | 
			
		||||
 *
 | 
			
		||||
 * @return Maximum number of bytes added by DTLS layer.
 | 
			
		||||
 */
 | 
			
		||||
unsigned int coap_dtls_get_overhead(struct coap_session_t *coap_session);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Create a new TLS client-side session.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @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(struct coap_session_t *coap_session, int *connected);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Create a TLS new server-side session.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @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(struct 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.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @param coap_session The CoAP session.
 | 
			
		||||
 */
 | 
			
		||||
void coap_tls_free_session( struct coap_session_t *coap_session );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Send data to a TLS peer, with implicit flush.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @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(struct coap_session_t *coap_session,
 | 
			
		||||
                       const uint8_t *data,
 | 
			
		||||
                       size_t data_len
 | 
			
		||||
                       );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Read some data from a TLS peer.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 * @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(struct coap_session_t *coap_session,
 | 
			
		||||
                      uint8_t *data,
 | 
			
		||||
                      size_t data_len
 | 
			
		||||
                      );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Initialize the underlying (D)TLS Library layer.
 | 
			
		||||
 *
 | 
			
		||||
 * Internal function.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
void coap_dtls_startup(void);
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @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 */
 | 
			
		||||
@@ -1,492 +0,0 @@
 | 
			
		||||
/* coap_session.h -- Session management for libcoap
 | 
			
		||||
*
 | 
			
		||||
* Copyright (C) 2017 Jean-Claue Michelou <jcm@spinetix.com>
 | 
			
		||||
*
 | 
			
		||||
* This file is part of the CoAP library libcoap. Please see
 | 
			
		||||
* README for terms of use.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
#ifndef COAP_SESSION_H_
 | 
			
		||||
#define COAP_SESSION_H_
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#include "coap_io.h"
 | 
			
		||||
#include "coap_time.h"
 | 
			
		||||
#include "pdu.h"
 | 
			
		||||
 | 
			
		||||
struct coap_endpoint_t;
 | 
			
		||||
struct coap_context_t;
 | 
			
		||||
struct coap_queue_t;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* 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_DEFAULT_SESSION_TIMEOUT 300
 | 
			
		||||
#define COAP_PARTIAL_SESSION_TIMEOUT_TICKS (30 * COAP_TICKS_PER_SECOND)
 | 
			
		||||
#define COAP_DEFAULT_MAX_HANDSHAKE_SESSIONS 100
 | 
			
		||||
 | 
			
		||||
#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)
 | 
			
		||||
 | 
			
		||||
typedef uint8_t coap_session_type_t;
 | 
			
		||||
/**
 | 
			
		||||
 * coap_session_type_t values
 | 
			
		||||
 */
 | 
			
		||||
#define COAP_SESSION_TYPE_CLIENT 1  /**< client-side */
 | 
			
		||||
#define COAP_SESSION_TYPE_SERVER 2  /**< server-side */
 | 
			
		||||
#define COAP_SESSION_TYPE_HELLO  3  /**< server-side ephemeral session for responding to a client hello */
 | 
			
		||||
 | 
			
		||||
typedef uint8_t coap_session_state_t;
 | 
			
		||||
/**
 | 
			
		||||
 * coap_session_state_t values
 | 
			
		||||
 */
 | 
			
		||||
#define COAP_SESSION_STATE_NONE                0
 | 
			
		||||
#define COAP_SESSION_STATE_CONNECTING        1
 | 
			
		||||
#define COAP_SESSION_STATE_HANDSHAKE        2
 | 
			
		||||
#define COAP_SESSION_STATE_CSM                3
 | 
			
		||||
#define COAP_SESSION_STATE_ESTABLISHED        4
 | 
			
		||||
 | 
			
		||||
typedef struct coap_session_t {
 | 
			
		||||
  struct coap_session_t *next;
 | 
			
		||||
  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 */
 | 
			
		||||
  unsigned tls_overhead;            /**< overhead of TLS layer */
 | 
			
		||||
  unsigned mtu;                     /**< path or CSM mtu */
 | 
			
		||||
  coap_address_t local_if;          /**< optional local interface address */
 | 
			
		||||
  coap_address_t remote_addr;       /**< remote address and port */
 | 
			
		||||
  coap_address_t local_addr;        /**< local address and port */
 | 
			
		||||
  int ifindex;                      /**< interface index */
 | 
			
		||||
  coap_socket_t sock;               /**< socket object for the session, if any */
 | 
			
		||||
  struct coap_endpoint_t *endpoint; /**< session's endpoint */
 | 
			
		||||
  struct 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 */
 | 
			
		||||
  struct coap_queue_t *delayqueue;  /**< list of delayed messages waiting to be sent */
 | 
			
		||||
  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;
 | 
			
		||||
  uint8_t *psk_identity;
 | 
			
		||||
  size_t psk_identity_len;
 | 
			
		||||
  uint8_t *psk_key;
 | 
			
		||||
  size_t psk_key_len;
 | 
			
		||||
  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 */
 | 
			
		||||
} coap_session_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);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* Stores @p data with the given session. This function overwrites any value
 | 
			
		||||
* that has previously been stored with @p session.
 | 
			
		||||
*/
 | 
			
		||||
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.
 | 
			
		||||
*/
 | 
			
		||||
void *coap_session_get_app_data(const coap_session_t *session);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* Notify session that it has failed.
 | 
			
		||||
*
 | 
			
		||||
* @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);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* 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);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* 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(
 | 
			
		||||
  struct 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(
 | 
			
		||||
  struct 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
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
struct coap_dtls_pki_t;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* 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(
 | 
			
		||||
  struct coap_context_t *ctx,
 | 
			
		||||
  const coap_address_t *local_if,
 | 
			
		||||
  const coap_address_t *server,
 | 
			
		||||
  coap_proto_t proto,
 | 
			
		||||
  struct coap_dtls_pki_t *setup_data
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* 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 free.
 | 
			
		||||
*/
 | 
			
		||||
coap_session_t *coap_new_server_session(
 | 
			
		||||
  struct coap_context_t *ctx,
 | 
			
		||||
  struct 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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @ingroup logging
 | 
			
		||||
 * Get session description.
 | 
			
		||||
 *
 | 
			
		||||
 * @param session  The CoAP session.
 | 
			
		||||
 * @return description string.
 | 
			
		||||
 */
 | 
			
		||||
const char *coap_session_str(const coap_session_t *session);
 | 
			
		||||
 | 
			
		||||
ssize_t
 | 
			
		||||
coap_session_delay_pdu(coap_session_t *session, coap_pdu_t *pdu,
 | 
			
		||||
                       struct coap_queue_t *node);
 | 
			
		||||
/**
 | 
			
		||||
* Abstraction of virtual endpoint that can be attached to coap_context_t. The
 | 
			
		||||
* tuple (handle, addr) must uniquely identify this endpoint.
 | 
			
		||||
*/
 | 
			
		||||
typedef struct coap_endpoint_t {
 | 
			
		||||
  struct coap_endpoint_t *next;
 | 
			
		||||
  struct 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;       /**< list of active sessions */
 | 
			
		||||
} coap_endpoint_t;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* 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(struct 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);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* 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 struct 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);
 | 
			
		||||
 | 
			
		||||
coap_session_t *coap_session_get_by_peer(struct coap_context_t *ctx,
 | 
			
		||||
  const struct coap_address_t *remote_addr, int ifindex);
 | 
			
		||||
 | 
			
		||||
void coap_session_free(coap_session_t *session);
 | 
			
		||||
void coap_session_mfree(coap_session_t *session);
 | 
			
		||||
 | 
			
		||||
 /**
 | 
			
		||||
  * @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
 | 
			
		||||
   */
 | 
			
		||||
#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
 | 
			
		||||
    */
 | 
			
		||||
#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
 | 
			
		||||
     */
 | 
			
		||||
#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
 | 
			
		||||
 | 
			
		||||
      /** @} */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* 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_transmit(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(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(coap_session_t *session);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Send a ping message for the session.
 | 
			
		||||
 * @param session The CoAP session.
 | 
			
		||||
 *
 | 
			
		||||
 * @return COAP_INVALID_TID if there is an error
 | 
			
		||||
 */
 | 
			
		||||
coap_tid_t coap_session_send_ping(coap_session_t *session);
 | 
			
		||||
 | 
			
		||||
#endif  /* COAP_SESSION_H */
 | 
			
		||||
@@ -1,746 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * net.h -- CoAP network interface
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2010-2015 Olaf Bergmann <bergmann@tzi.org>
 | 
			
		||||
 *
 | 
			
		||||
 * 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 <assert.h>
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
#include <string.h>
 | 
			
		||||
#ifndef _WIN32
 | 
			
		||||
#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 "coap_time.h"
 | 
			
		||||
#include "option.h"
 | 
			
		||||
#include "pdu.h"
 | 
			
		||||
#include "prng.h"
 | 
			
		||||
#include "coap_session.h"
 | 
			
		||||
 | 
			
		||||
struct coap_queue_t;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Queue entry
 | 
			
		||||
 */
 | 
			
		||||
typedef 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_tid_t id;                /**< CoAP transaction id */
 | 
			
		||||
  coap_pdu_t *pdu;              /**< the CoAP PDU to send */
 | 
			
		||||
} coap_queue_t;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 * @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);
 | 
			
		||||
 | 
			
		||||
struct coap_resource_t;
 | 
			
		||||
struct coap_context_t;
 | 
			
		||||
#ifndef WITHOUT_ASYNC
 | 
			
		||||
struct coap_async_state_t;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Response handler that is used as call-back in coap_context_t.
 | 
			
		||||
 *
 | 
			
		||||
 * @param context CoAP session.
 | 
			
		||||
 * @param session CoAP session.
 | 
			
		||||
 * @param sent The PDU that was transmitted.
 | 
			
		||||
 * @param received The PDU that was received.
 | 
			
		||||
 * @param id CoAP transaction ID.
 | 
			
		||||
 */
 | 
			
		||||
typedef void (*coap_response_handler_t)(struct coap_context_t *context,
 | 
			
		||||
                                        coap_session_t *session,
 | 
			
		||||
                                        coap_pdu_t *sent,
 | 
			
		||||
                                        coap_pdu_t *received,
 | 
			
		||||
                                        const coap_tid_t id);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Negative Acknowedge handler that is used as call-back in coap_context_t.
 | 
			
		||||
 *
 | 
			
		||||
 * @param context CoAP session.
 | 
			
		||||
 * @param session CoAP session.
 | 
			
		||||
 * @param sent The PDU that was transmitted.
 | 
			
		||||
 * @param reason The reason for the NACK.
 | 
			
		||||
 * @param id CoAP transaction ID.
 | 
			
		||||
 */
 | 
			
		||||
typedef void (*coap_nack_handler_t)(struct coap_context_t *context,
 | 
			
		||||
                                    coap_session_t *session,
 | 
			
		||||
                                    coap_pdu_t *sent,
 | 
			
		||||
                                    coap_nack_reason_t reason,
 | 
			
		||||
                                    const coap_tid_t id);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Recieved Ping handler that is used as call-back in coap_context_t.
 | 
			
		||||
 *
 | 
			
		||||
 * @param context CoAP session.
 | 
			
		||||
 * @param session CoAP session.
 | 
			
		||||
 * @param received The PDU that was received.
 | 
			
		||||
 * @param id CoAP transaction ID.
 | 
			
		||||
 */
 | 
			
		||||
typedef void (*coap_ping_handler_t)(struct coap_context_t *context,
 | 
			
		||||
                                    coap_session_t *session,
 | 
			
		||||
                                    coap_pdu_t *received,
 | 
			
		||||
                                    const coap_tid_t id);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Recieved Pong handler that is used as call-back in coap_context_t.
 | 
			
		||||
 *
 | 
			
		||||
 * @param context CoAP session.
 | 
			
		||||
 * @param session CoAP session.
 | 
			
		||||
 * @param received The PDU that was received.
 | 
			
		||||
 * @param id CoAP transaction ID.
 | 
			
		||||
 */
 | 
			
		||||
typedef void (*coap_pong_handler_t)(struct coap_context_t *context,
 | 
			
		||||
                                    coap_session_t *session,
 | 
			
		||||
                                    coap_pdu_t *received,
 | 
			
		||||
                                    const coap_tid_t id);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The CoAP stack's global state is stored in a coap_context_t object.
 | 
			
		||||
 */
 | 
			
		||||
typedef struct coap_context_t {
 | 
			
		||||
  coap_opt_filter_t known_options;
 | 
			
		||||
  struct coap_resource_t *resources; /**< hash table or list of known
 | 
			
		||||
                                          resources */
 | 
			
		||||
  struct coap_resource_t *unknown_resource; /**< can be used for handling
 | 
			
		||||
                                                 unknown resources */
 | 
			
		||||
 | 
			
		||||
#ifndef WITHOUT_ASYNC
 | 
			
		||||
  /**
 | 
			
		||||
   * list of asynchronous transactions */
 | 
			
		||||
  struct coap_async_state_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, struct 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;
 | 
			
		||||
  uint8_t *psk_hint;
 | 
			
		||||
  size_t psk_hint_len;
 | 
			
		||||
  uint8_t *psk_key;
 | 
			
		||||
  size_t psk_key_len;
 | 
			
		||||
 | 
			
		||||
  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. */
 | 
			
		||||
 | 
			
		||||
  void *app;                       /**< application-specific data */
 | 
			
		||||
} coap_context_t;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Registers a new message handler that is called whenever a response was
 | 
			
		||||
 * received that matches an ongoing transaction.
 | 
			
		||||
 *
 | 
			
		||||
 * @param context The context to register the handler for.
 | 
			
		||||
 * @param handler The response handler to register.
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE void
 | 
			
		||||
coap_register_response_handler(coap_context_t *context,
 | 
			
		||||
                               coap_response_handler_t handler) {
 | 
			
		||||
  context->response_handler = 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.
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE void
 | 
			
		||||
coap_register_nack_handler(coap_context_t *context,
 | 
			
		||||
                           coap_nack_handler_t handler) {
 | 
			
		||||
  context->nack_handler = 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.
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE void
 | 
			
		||||
coap_register_ping_handler(coap_context_t *context,
 | 
			
		||||
                           coap_ping_handler_t handler) {
 | 
			
		||||
  context->ping_handler = 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.
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE void
 | 
			
		||||
coap_register_pong_handler(coap_context_t *context,
 | 
			
		||||
                           coap_pong_handler_t handler) {
 | 
			
		||||
  context->pong_handler = 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.
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE void
 | 
			
		||||
coap_register_option(coap_context_t *ctx, uint16_t type) {
 | 
			
		||||
  coap_option_setb(ctx->known_options, type);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 @p NULL, PSK
 | 
			
		||||
 *                authentication is disabled. Empty string is a valid hint.
 | 
			
		||||
 * @param key     The default PSK key. If @p 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 PKI information for a server.
 | 
			
		||||
 *
 | 
			
		||||
 * @param context        The current coap_context_t object.
 | 
			
		||||
 * @param setup_data     If @p 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,
 | 
			
		||||
                     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 @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_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 reliable protocols, a PING message will be sent. If a PONG has not
 | 
			
		||||
 * been received before the next PING is due to be sent, the session will
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 * @return 1 if successful, else 0
 | 
			
		||||
 */
 | 
			
		||||
void coap_context_set_keepalive(coap_context_t *context, unsigned int seconds);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE uint16_t
 | 
			
		||||
coap_new_message_id(coap_session_t *session) {
 | 
			
		||||
  return ++session->tx_mid;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 relased 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(coap_pdu_t *request,
 | 
			
		||||
                                    unsigned char 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 transaction id if the message was
 | 
			
		||||
 * sent, or @c COAP_INVALID_TID 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 transaction id if the message was sent, or @c
 | 
			
		||||
 *                        COAP_INVALID_TID otherwise.
 | 
			
		||||
 */
 | 
			
		||||
coap_tid_t coap_send_error(coap_session_t *session,
 | 
			
		||||
                           coap_pdu_t *request,
 | 
			
		||||
                           unsigned char code,
 | 
			
		||||
                           coap_opt_filter_t opts);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Helper funktion to create and send a message with @p type (usually ACK or
 | 
			
		||||
 * RST). This function returns @c COAP_INVALID_TID 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                transaction id on success or @c COAP_INVALID_TID
 | 
			
		||||
 *                        otherwise.
 | 
			
		||||
 */
 | 
			
		||||
coap_tid_t
 | 
			
		||||
coap_send_message_type(coap_session_t *session, coap_pdu_t *request, unsigned char type);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Sends an ACK message with code @c 0 for the specified @p request to @p dst.
 | 
			
		||||
 * This function returns the corresponding transaction id if the message was
 | 
			
		||||
 * sent or @c COAP_INVALID_TID on error.
 | 
			
		||||
 *
 | 
			
		||||
 * @param session         The CoAP session.
 | 
			
		||||
 * @param request         The request to be acknowledged.
 | 
			
		||||
 *
 | 
			
		||||
 * @return                The transaction id if ACK was sent or @c
 | 
			
		||||
 *                        COAP_INVALID_TID on error.
 | 
			
		||||
 */
 | 
			
		||||
coap_tid_t coap_send_ack(coap_session_t *session, 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 transaction id if the message was
 | 
			
		||||
 * sent or @c COAP_INVALID_TID on error.
 | 
			
		||||
 *
 | 
			
		||||
 * @param session         The CoAP session.
 | 
			
		||||
 * @param request         The request to be reset.
 | 
			
		||||
 *
 | 
			
		||||
 * @return                The transaction id if RST was sent or @c
 | 
			
		||||
 *                        COAP_INVALID_TID on error.
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE coap_tid_t
 | 
			
		||||
coap_send_rst(coap_session_t *session, 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 by 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_TID on error.
 | 
			
		||||
*/
 | 
			
		||||
coap_tid_t coap_send( coap_session_t *session, coap_pdu_t *pdu );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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_TID on error.
 | 
			
		||||
 */
 | 
			
		||||
coap_tid_t coap_retransmit(coap_context_t *context, coap_queue_t *node);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* For applications with their own message loop, send all pending retransmits and
 | 
			
		||||
* return the list of sockets with events to wait for and the next timeout
 | 
			
		||||
* The application should call coap_read, then coap_write again when any condition below is true:
 | 
			
		||||
* - data is available on any of the sockets with the COAP_SOCKET_WANT_READ
 | 
			
		||||
* - an incoming connection is pending in the listen queue and the COAP_SOCKET_WANT_ACCEPT flag is set
 | 
			
		||||
* - at least some data can be written without blocking on any of the sockets with the COAP_SOCKET_WANT_WRITE flag set
 | 
			
		||||
* - a connection event occured (success or failure) and the COAP_SOCKET_WANT_CONNECT flag is set
 | 
			
		||||
* - the timeout has expired
 | 
			
		||||
* Before calling coap_read or coap_write again, the application should position COAP_SOCKET_CAN_READ and COAP_SOCKET_CAN_WRITE flags as applicable.
 | 
			
		||||
*
 | 
			
		||||
* @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 as maxmimum number of milliseconds that the application should wait for network events or 0 if the application should wait forever.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
unsigned int
 | 
			
		||||
coap_write(coap_context_t *ctx,
 | 
			
		||||
  coap_socket_t *sockets[],
 | 
			
		||||
  unsigned int max_sockets,
 | 
			
		||||
  unsigned int *num_sockets,
 | 
			
		||||
  coap_tick_t now
 | 
			
		||||
);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * For applications with their own message loop, reads all data from the network.
 | 
			
		||||
 *
 | 
			
		||||
 * @param ctx The CoAP context
 | 
			
		||||
 * @param now Current time
 | 
			
		||||
 */
 | 
			
		||||
void coap_read(coap_context_t *ctx, coap_tick_t now);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The main message processing loop.
 | 
			
		||||
 *
 | 
			
		||||
 * @param ctx The CoAP context
 | 
			
		||||
 * @param timeout_ms Minimum number of milliseconds to wait for new messages before returning. If zero the call will block until at least one packet is sent or received.
 | 
			
		||||
 *
 | 
			
		||||
 * @return number of milliseconds spent or @c -1 if there was an error
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
int coap_run_once( coap_context_t *ctx, unsigned int timeout_ms );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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);
 | 
			
		||||
/**
 | 
			
		||||
 * 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 transaction 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_tid_t id,
 | 
			
		||||
                           coap_queue_t **node);
 | 
			
		||||
 | 
			
		||||
coap_tid_t
 | 
			
		||||
coap_wait_ack( coap_context_t *context, coap_session_t *session,
 | 
			
		||||
               coap_queue_t *node);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Retrieves transaction from the queue.
 | 
			
		||||
 *
 | 
			
		||||
 * @param queue The transaction queue to be searched.
 | 
			
		||||
 * @param session The session to find.
 | 
			
		||||
 * @param id    The transaction id to find.
 | 
			
		||||
 *
 | 
			
		||||
 * @return      A pointer to the transaction object or @c NULL if not found.
 | 
			
		||||
 */
 | 
			
		||||
coap_queue_t *coap_find_transaction(coap_queue_t *queue, coap_session_t *session, coap_tid_t id);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 *);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Function interface for joining a multicast group for listening
 | 
			
		||||
 *
 | 
			
		||||
 * @param ctx   The current context
 | 
			
		||||
 * @param groupname The name of the group that is to be joined for listening
 | 
			
		||||
 *
 | 
			
		||||
 * @return       0 on success, -1 on error
 | 
			
		||||
 */
 | 
			
		||||
int
 | 
			
		||||
coap_join_mcast_group(coap_context_t *ctx, const char *groupname);
 | 
			
		||||
 | 
			
		||||
#endif /* COAP_NET_H_ */
 | 
			
		||||
@@ -1,543 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * pdu.h -- CoAP message structure
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2010-2014 Olaf Bergmann <bergmann@tzi.org>
 | 
			
		||||
 *
 | 
			
		||||
 * 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"
 | 
			
		||||
 | 
			
		||||
struct coap_session_t;
 | 
			
		||||
 | 
			
		||||
#ifdef WITH_LWIP
 | 
			
		||||
#include <lwip/pbuf.h>
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#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 */
 | 
			
		||||
 | 
			
		||||
/* 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_DEFAULT_MAX_PDU_RX_SIZE
 | 
			
		||||
#if defined(WITH_CONTIKI) || defined(WITH_LWIP)
 | 
			
		||||
#define COAP_DEFAULT_MAX_PDU_RX_SIZE (COAP_MAX_MESSAGE_SIZE_TCP16+4)
 | 
			
		||||
#else
 | 
			
		||||
/* 8 MiB max-message-size plus some space for options */
 | 
			
		||||
#define COAP_DEFAULT_MAX_PDU_RX_SIZE (8*1024*1024+256)
 | 
			
		||||
#endif
 | 
			
		||||
#endif /* COAP_DEFAULT_MAX_PDU_RX_SIZE */
 | 
			
		||||
 | 
			
		||||
#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 */
 | 
			
		||||
 | 
			
		||||
#define COAP_DEFAULT_VERSION      1 /* version of CoAP supported */
 | 
			
		||||
#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 */
 | 
			
		||||
 | 
			
		||||
#define COAP_MESSAGE_CON       0 /* confirmable message (requires ACK/RST) */
 | 
			
		||||
#define COAP_MESSAGE_NON       1 /* non-confirmable message (one-shot message) */
 | 
			
		||||
#define COAP_MESSAGE_ACK       2 /* used to acknowledge confirmable messages */
 | 
			
		||||
#define COAP_MESSAGE_RST       3 /* indicates error in received messages */
 | 
			
		||||
 | 
			
		||||
/* CoAP request methods */
 | 
			
		||||
 | 
			
		||||
#define COAP_REQUEST_GET       1
 | 
			
		||||
#define COAP_REQUEST_POST      2
 | 
			
		||||
#define COAP_REQUEST_PUT       3
 | 
			
		||||
#define COAP_REQUEST_DELETE    4
 | 
			
		||||
#define COAP_REQUEST_FETCH     5 /* RFC 8132 */
 | 
			
		||||
#define COAP_REQUEST_PATCH     6 /* RFC 8132 */
 | 
			
		||||
#define COAP_REQUEST_IPATCH    7 /* RFC 8132 */
 | 
			
		||||
 | 
			
		||||
/*
 | 
			
		||||
 * CoAP option types (be sure to update coap_option_check_critical() when
 | 
			
		||||
 * adding options
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#define COAP_OPTION_IF_MATCH        1 /* C, opaque, 0-8 B, (none) */
 | 
			
		||||
#define COAP_OPTION_URI_HOST        3 /* C, String, 1-255 B, destination address */
 | 
			
		||||
#define COAP_OPTION_ETAG            4 /* E, opaque, 1-8 B, (none) */
 | 
			
		||||
#define COAP_OPTION_IF_NONE_MATCH   5 /* empty, 0 B, (none) */
 | 
			
		||||
#define COAP_OPTION_URI_PORT        7 /* C, uint, 0-2 B, destination port */
 | 
			
		||||
#define COAP_OPTION_LOCATION_PATH   8 /* E, String, 0-255 B, - */
 | 
			
		||||
#define COAP_OPTION_URI_PATH       11 /* C, String, 0-255 B, (none) */
 | 
			
		||||
#define COAP_OPTION_CONTENT_FORMAT 12 /* E, uint, 0-2 B, (none) */
 | 
			
		||||
#define COAP_OPTION_CONTENT_TYPE COAP_OPTION_CONTENT_FORMAT
 | 
			
		||||
#define COAP_OPTION_MAXAGE         14 /* E, uint, 0--4 B, 60 Seconds */
 | 
			
		||||
#define COAP_OPTION_URI_QUERY      15 /* C, String, 1-255 B, (none) */
 | 
			
		||||
#define COAP_OPTION_ACCEPT         17 /* C, uint,   0-2 B, (none) */
 | 
			
		||||
#define COAP_OPTION_LOCATION_QUERY 20 /* E, String,   0-255 B, (none) */
 | 
			
		||||
#define COAP_OPTION_SIZE2          28 /* E, uint, 0-4 B, (none) */
 | 
			
		||||
#define COAP_OPTION_PROXY_URI      35 /* C, String, 1-1034 B, (none) */
 | 
			
		||||
#define COAP_OPTION_PROXY_SCHEME   39 /* C, String, 1-255 B, (none) */
 | 
			
		||||
#define COAP_OPTION_SIZE1          60 /* E, uint, 0-4 B, (none) */
 | 
			
		||||
 | 
			
		||||
/* option types from RFC 7641 */
 | 
			
		||||
 | 
			
		||||
#define COAP_OPTION_OBSERVE         6 /* E, empty/uint, 0 B/0-3 B, (none) */
 | 
			
		||||
#define COAP_OPTION_SUBSCRIPTION  COAP_OPTION_OBSERVE
 | 
			
		||||
 | 
			
		||||
/* selected option types from RFC 7959 */
 | 
			
		||||
 | 
			
		||||
#define COAP_OPTION_BLOCK2         23 /* C, uint, 0--3 B, (none) */
 | 
			
		||||
#define COAP_OPTION_BLOCK1         27 /* C, uint, 0--3 B, (none) */
 | 
			
		||||
 | 
			
		||||
/* selected option types from RFC 7967 */
 | 
			
		||||
 | 
			
		||||
#define COAP_OPTION_NORESPONSE    258 /* N, uint, 0--1 B, 0 */
 | 
			
		||||
 | 
			
		||||
#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 */
 | 
			
		||||
 | 
			
		||||
/* The following definitions exist for backwards compatibility */
 | 
			
		||||
#if 0 /* this does not exist any more */
 | 
			
		||||
#define COAP_RESPONSE_100      40 /* 100 Continue */
 | 
			
		||||
#endif
 | 
			
		||||
#define COAP_RESPONSE_200      COAP_RESPONSE_CODE(200)  /* 2.00 OK */
 | 
			
		||||
#define COAP_RESPONSE_201      COAP_RESPONSE_CODE(201)  /* 2.01 Created */
 | 
			
		||||
#define COAP_RESPONSE_304      COAP_RESPONSE_CODE(203)  /* 2.03 Valid */
 | 
			
		||||
#define COAP_RESPONSE_400      COAP_RESPONSE_CODE(400)  /* 4.00 Bad Request */
 | 
			
		||||
#define COAP_RESPONSE_404      COAP_RESPONSE_CODE(404)  /* 4.04 Not Found */
 | 
			
		||||
#define COAP_RESPONSE_405      COAP_RESPONSE_CODE(405)  /* 4.05 Method Not Allowed */
 | 
			
		||||
#define COAP_RESPONSE_415      COAP_RESPONSE_CODE(415)  /* 4.15 Unsupported Media Type */
 | 
			
		||||
#define COAP_RESPONSE_500      COAP_RESPONSE_CODE(500)  /* 5.00 Internal Server Error */
 | 
			
		||||
#define COAP_RESPONSE_501      COAP_RESPONSE_CODE(501)  /* 5.01 Not Implemented */
 | 
			
		||||
#define COAP_RESPONSE_503      COAP_RESPONSE_CODE(503)  /* 5.03 Service Unavailable */
 | 
			
		||||
#define COAP_RESPONSE_504      COAP_RESPONSE_CODE(504)  /* 5.04 Gateway Timeout */
 | 
			
		||||
#if 0  /* these response codes do not have a valid code any more */
 | 
			
		||||
#  define COAP_RESPONSE_X_240    240   /* Token Option required by server */
 | 
			
		||||
#  define COAP_RESPONSE_X_241    241   /* Uri-Authority Option required by server */
 | 
			
		||||
#endif
 | 
			
		||||
#define COAP_RESPONSE_X_242    COAP_RESPONSE_CODE(402)  /* Critical Option not supported */
 | 
			
		||||
 | 
			
		||||
#define COAP_SIGNALING_CODE(N) (((N)/100 << 5) | (N)%100)
 | 
			
		||||
#define COAP_SIGNALING_CSM     COAP_SIGNALING_CODE(701)
 | 
			
		||||
#define COAP_SIGNALING_PING    COAP_SIGNALING_CODE(702)
 | 
			
		||||
#define COAP_SIGNALING_PONG    COAP_SIGNALING_CODE(703)
 | 
			
		||||
#define COAP_SIGNALING_RELEASE COAP_SIGNALING_CODE(704)
 | 
			
		||||
#define COAP_SIGNALING_ABORT   COAP_SIGNALING_CODE(705)
 | 
			
		||||
 | 
			
		||||
/* 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  */
 | 
			
		||||
 | 
			
		||||
/* 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  */
 | 
			
		||||
 | 
			
		||||
/* 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_tid_t is used to store CoAP transaction id, i.e. a hash value
 | 
			
		||||
 * built from the remote transport address and the message id of a
 | 
			
		||||
 * CoAP PDU.  Valid transaction ids are greater or equal zero.
 | 
			
		||||
 */
 | 
			
		||||
typedef int coap_tid_t;
 | 
			
		||||
 | 
			
		||||
/** Indicates an invalid transaction id. */
 | 
			
		||||
#define COAP_INVALID_TID -1
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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_OPT_LONG 0x0F      /* OC == 0b1111 indicates that the option list
 | 
			
		||||
                                 * in a CoAP message is limited by 0b11110000
 | 
			
		||||
                                 * marker */
 | 
			
		||||
 | 
			
		||||
#define COAP_OPT_END 0xF0       /* end marker */
 | 
			
		||||
 | 
			
		||||
#define COAP_PAYLOAD_START 0xFF /* payload marker */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @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))
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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)
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
typedef struct coap_pdu_t {
 | 
			
		||||
  uint8_t type;             /**< message type */
 | 
			
		||||
  uint8_t code;             /**< request method (value 1--10) or response code (value 40-255) */
 | 
			
		||||
  uint8_t max_hdr_size;     /**< space reserved for protocol-specific header */
 | 
			
		||||
  uint8_t hdr_size;         /**< actaul size used for protocol-specific header */
 | 
			
		||||
  uint8_t token_length;     /**< length of Token */
 | 
			
		||||
  uint16_t tid;             /**< transaction id, if any, in regular host byte order */
 | 
			
		||||
  uint16_t max_delta;       /**< highest option number */
 | 
			
		||||
  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
 | 
			
		||||
} coap_pdu_t;
 | 
			
		||||
 | 
			
		||||
#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
 | 
			
		||||
 | 
			
		||||
#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
 | 
			
		||||
 | 
			
		||||
typedef uint8_t coap_proto_t;
 | 
			
		||||
/**
 | 
			
		||||
* coap_proto_t values
 | 
			
		||||
*/
 | 
			
		||||
#define COAP_PROTO_NONE         0
 | 
			
		||||
#define COAP_PROTO_UDP          1
 | 
			
		||||
#define COAP_PROTO_DTLS         2
 | 
			
		||||
#define COAP_PROTO_TCP          3
 | 
			
		||||
#define COAP_PROTO_TLS          4
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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.
 | 
			
		||||
 * @param tid  The transcation 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(uint8_t type, uint8_t code, uint16_t tid, size_t size);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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().
 | 
			
		||||
 */
 | 
			
		||||
void coap_pdu_clear(coap_pdu_t *pdu, size_t size);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Creates a new CoAP PDU.
 | 
			
		||||
 */
 | 
			
		||||
coap_pdu_t *coap_new_pdu(const struct 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.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
void coap_delete_pdu(coap_pdu_t *);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
* 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.
 | 
			
		||||
 *
 | 
			
		||||
 * @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);
 | 
			
		||||
/**
 | 
			
		||||
 * 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 type 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.
 | 
			
		||||
 */
 | 
			
		||||
size_t coap_add_option(coap_pdu_t *pdu,
 | 
			
		||||
                       uint16_t type,
 | 
			
		||||
                       size_t len,
 | 
			
		||||
                       const uint8_t *data);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Adds option of given type to pdu that is passed as first parameter, but does
 | 
			
		||||
 * not write a value. It works like coap_add_option with respect to calling
 | 
			
		||||
 * sequence (i.e. after token and before data). This function returns a memory
 | 
			
		||||
 * address to which the option data has to be written before the PDU can be
 | 
			
		||||
 * sent, or @c NULL on error.
 | 
			
		||||
 */
 | 
			
		||||
uint8_t *coap_add_option_later(coap_pdu_t *pdu,
 | 
			
		||||
                               uint16_t type,
 | 
			
		||||
                               size_t len);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
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
 | 
			
		||||
 * copyt 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.
 | 
			
		||||
 */
 | 
			
		||||
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.
 | 
			
		||||
 */
 | 
			
		||||
int coap_get_data(const coap_pdu_t *pdu,
 | 
			
		||||
                  size_t *len,
 | 
			
		||||
                  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);
 | 
			
		||||
 | 
			
		||||
#endif /* COAP_PDU_H_ */
 | 
			
		||||
@@ -1,127 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * prng.h -- Pseudo Random Numbers
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2010-2011 Olaf Bergmann <bergmann@tzi.org>
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of the CoAP library libcoap. Please see README for terms
 | 
			
		||||
 * of use.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @file prng.h
 | 
			
		||||
 * @brief Pseudo Random Numbers
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef COAP_PRNG_H_
 | 
			
		||||
#define COAP_PRNG_H_
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @defgroup 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
 | 
			
		||||
 * prng(). You might want to change prng() 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 prng(Buf,Length) contiki_prng_impl((Buf), (Length))
 | 
			
		||||
#define 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 prng(Buf,Length) lwip_prng_impl((Buf), (Length))
 | 
			
		||||
#define prng_init(Value)
 | 
			
		||||
#elif defined(_WIN32)
 | 
			
		||||
#define prng_init(Value)
 | 
			
		||||
errno_t __cdecl rand_s( _Out_ unsigned int* _RandomValue );
 | 
			
		||||
 /**
 | 
			
		||||
 * Fills \p buf with \p len random bytes. This is the default implementation for
 | 
			
		||||
 * prng(). You might want to change prng() to use a better PRNG on your specific
 | 
			
		||||
 * platform.
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE int
 | 
			
		||||
coap_prng_impl( unsigned char *buf, size_t len ) {
 | 
			
		||||
        while ( len != 0 ) {
 | 
			
		||||
                uint32_t r = 0;
 | 
			
		||||
                size_t i;
 | 
			
		||||
                if ( rand_s( &r ) != 0 )
 | 
			
		||||
                        return 0;
 | 
			
		||||
                for ( i = 0; i < len && i < 4; i++ ) {
 | 
			
		||||
                        *buf++ = (uint8_t)r;
 | 
			
		||||
                        r >>= 8;
 | 
			
		||||
                }
 | 
			
		||||
                len -= i;
 | 
			
		||||
        }
 | 
			
		||||
        return 1;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
#include <stdlib.h>
 | 
			
		||||
 | 
			
		||||
 /**
 | 
			
		||||
 * Fills \p buf with \p len random bytes. This is the default implementation for
 | 
			
		||||
 * prng(). You might want to change prng() to use a better PRNG on your specific
 | 
			
		||||
 * platform.
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE int
 | 
			
		||||
coap_prng_impl( unsigned char *buf, size_t len ) {
 | 
			
		||||
        while ( len-- )
 | 
			
		||||
                *buf++ = rand() & 0xFF;
 | 
			
		||||
        return 1;
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef prng
 | 
			
		||||
/**
 | 
			
		||||
 * Fills \p Buf with \p Length bytes of random data.
 | 
			
		||||
 *
 | 
			
		||||
 * @hideinitializer
 | 
			
		||||
 */
 | 
			
		||||
#define prng(Buf,Length) coap_prng_impl((Buf), (Length))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef prng_init
 | 
			
		||||
/**
 | 
			
		||||
 * Called to set the PRNG seed. You may want to re-define this to allow for a
 | 
			
		||||
 * better PRNG.
 | 
			
		||||
 *
 | 
			
		||||
 * @hideinitializer
 | 
			
		||||
 */
 | 
			
		||||
#define prng_init(Value) srand((unsigned long)(Value))
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
#endif /* COAP_PRNG_H_ */
 | 
			
		||||
@@ -1,121 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * str.h -- strings to be used in the CoAP library
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2010-2011 Olaf Bergmann <bergmann@tzi.org>
 | 
			
		||||
 *
 | 
			
		||||
 * 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
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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; /**< 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;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Returns a new string object with at least size+1 bytes storage allocated.
 | 
			
		||||
 * The string must be released using coap_delete_string().
 | 
			
		||||
 *
 | 
			
		||||
 * @param size The size to allocate for the binary 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);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Take the specified byte array (text) and create a coap_str_const_t *
 | 
			
		||||
 *
 | 
			
		||||
 * WARNING: The byte array must be in the local scope and not a
 | 
			
		||||
 * parameter in the function call as sizeof() will return the size of the
 | 
			
		||||
 * pointer, not the size of the byte array, leading to unxepected results.
 | 
			
		||||
 *
 | 
			
		||||
 * @param string The const byte array to convert to a coap_str_const_t *
 | 
			
		||||
 */
 | 
			
		||||
#ifdef __cplusplus
 | 
			
		||||
namespace libcoap {
 | 
			
		||||
  struct CoAPStrConst : coap_str_const_t {
 | 
			
		||||
    operator coap_str_const_t *() { return this; }
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
#define coap_make_str_const(CStr)                                       \
 | 
			
		||||
  libcoap::CoAPStrConst{sizeof(CStr)-1, reinterpret_cast<const uint8_t *>(CStr)}
 | 
			
		||||
#else /* __cplusplus */
 | 
			
		||||
#define coap_make_str_const(string)                                     \
 | 
			
		||||
  (&(coap_str_const_t){sizeof(string)-1,(const uint8_t *)(string)})
 | 
			
		||||
#endif  /* __cplusplus */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 || \
 | 
			
		||||
         memcmp((string1)->s, (string2)->s, (string1)->length) == 0))
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
#endif /* COAP_STR_H_ */
 | 
			
		||||
@@ -1,77 +0,0 @@
 | 
			
		||||
/*
 | 
			
		||||
 * subscribe.h -- subscription handling for CoAP
 | 
			
		||||
 *                see RFC7641
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2010-2012,2014-2015 Olaf Bergmann <bergmann@tzi.org>
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of the CoAP library libcoap. Please see README for terms
 | 
			
		||||
 * of use.
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#ifndef COAP_SUBSCRIBE_H_
 | 
			
		||||
#define COAP_SUBSCRIBE_H_
 | 
			
		||||
 | 
			
		||||
#include "address.h"
 | 
			
		||||
#include "coap_io.h"
 | 
			
		||||
#include "block.h"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @defgroup observe Resource observation
 | 
			
		||||
 * API functions for interfacing with the observe handling (RFC7641)
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The value COAP_OBSERVE_ESTABLISH in a GET request indicates a new observe
 | 
			
		||||
 * relationship for (sender address, token) is requested.
 | 
			
		||||
 */
 | 
			
		||||
#define COAP_OBSERVE_ESTABLISH 0
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The value COAP_OBSERVE_CANCEL in a GET request indicates that the observe
 | 
			
		||||
 * relationship for (sender address, token) must be cancelled.
 | 
			
		||||
 */
 | 
			
		||||
#define COAP_OBSERVE_CANCEL 1
 | 
			
		||||
 | 
			
		||||
#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 */
 | 
			
		||||
typedef struct coap_subscription_t {
 | 
			
		||||
  struct coap_subscription_t *next; /**< next element in linked list */
 | 
			
		||||
  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) */
 | 
			
		||||
  unsigned int has_block2:1; /**< GET request had Block2 definition */
 | 
			
		||||
  uint16_t tid;             /**< transaction id, if any, in regular host byte order */
 | 
			
		||||
  coap_block_t block2;     /**< GET request Block2 definition */
 | 
			
		||||
  size_t token_length;     /**< actual length of token */
 | 
			
		||||
  unsigned char token[8];  /**< token used for subscription */
 | 
			
		||||
  coap_string_t *query;    /**< query string used for subscription, if any */
 | 
			
		||||
} coap_subscription_t;
 | 
			
		||||
 | 
			
		||||
void coap_subscription_init(coap_subscription_t *);
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
#endif /* COAP_SUBSCRIBE_H_ */
 | 
			
		||||
@@ -3,6 +3,8 @@
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
@@ -30,6 +32,22 @@ typedef struct coap_address_t {
 | 
			
		||||
  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)))
 | 
			
		||||
@@ -47,6 +65,22 @@ typedef struct coap_address_t {
 | 
			
		||||
  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)))
 | 
			
		||||
@@ -68,6 +102,16 @@ typedef struct coap_address_t {
 | 
			
		||||
  } 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
 | 
			
		||||
@@ -100,15 +144,7 @@ _coap_address_isany_impl(const coap_address_t *a) {
 | 
			
		||||
 *
 | 
			
		||||
 * @param addr The coap_address_t object to initialize.
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE void
 | 
			
		||||
coap_address_init(coap_address_t *addr) {
 | 
			
		||||
  assert(addr);
 | 
			
		||||
  memset(addr, 0, sizeof(coap_address_t));
 | 
			
		||||
#if !defined(WITH_LWIP) && !defined(WITH_CONTIKI)
 | 
			
		||||
  /* lwip and Contiki have constant address sizes and doesn't need the .size part */
 | 
			
		||||
  addr->size = sizeof(addr->addr);
 | 
			
		||||
#endif
 | 
			
		||||
}
 | 
			
		||||
void coap_address_init(coap_address_t *addr);
 | 
			
		||||
 | 
			
		||||
/* Convenience function to copy IPv6 addresses without garbage. */
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										116
									
								
								tools/sdk/esp32s2/include/coap/libcoap/include/coap3/async.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										116
									
								
								tools/sdk/esp32s2/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/esp32s2/include/coap/libcoap/include/coap3/block.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										348
									
								
								tools/sdk/esp32s2/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,239 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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_ */
 | 
			
		||||
@@ -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_ */
 | 
			
		||||
@@ -3,6 +3,8 @@
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
@@ -36,8 +38,16 @@
 | 
			
		||||
 * Logging type.  One of LOG_* from @b syslog.
 | 
			
		||||
 */
 | 
			
		||||
typedef short coap_log_t;
 | 
			
		||||
#else
 | 
			
		||||
/** Pre-defined log levels akin to what is used in \b syslog. */
 | 
			
		||||
/*
 | 
			
		||||
   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 */
 | 
			
		||||
@@ -46,9 +56,29 @@ typedef enum {
 | 
			
		||||
  LOG_WARNING, /**< Warning */
 | 
			
		||||
  LOG_NOTICE,  /**< Notice */
 | 
			
		||||
  LOG_INFO,    /**< Information */
 | 
			
		||||
  LOG_DEBUG    /**< Debug */
 | 
			
		||||
  LOG_DEBUG,   /**< Debug */
 | 
			
		||||
  COAP_LOG_CIPHERS=LOG_DEBUG+2 /**< CipherInfo */
 | 
			
		||||
} coap_log_t;
 | 
			
		||||
#endif
 | 
			
		||||
#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.
 | 
			
		||||
@@ -65,7 +95,7 @@ coap_log_t coap_get_log_level(void);
 | 
			
		||||
void coap_set_log_level(coap_log_t level);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Logging call-back handler definition.
 | 
			
		||||
 * Logging callback handler definition.
 | 
			
		||||
 *
 | 
			
		||||
 * @param level One of the LOG_* values.
 | 
			
		||||
 * @param message Zero-terminated string message to log.
 | 
			
		||||
@@ -163,7 +193,15 @@ void coap_show_tls_version(coap_log_t level);
 | 
			
		||||
 */
 | 
			
		||||
char *coap_string_tls_version(char *buffer, size_t bufsize);
 | 
			
		||||
 | 
			
		||||
struct coap_address_t;
 | 
			
		||||
/**
 | 
			
		||||
 * 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.
 | 
			
		||||
@@ -176,7 +214,7 @@ struct coap_address_t;
 | 
			
		||||
 *
 | 
			
		||||
 * @return The amount written into the buffer.
 | 
			
		||||
 */
 | 
			
		||||
size_t coap_print_addr(const struct coap_address_t *address,
 | 
			
		||||
size_t coap_print_addr(const coap_address_t *address,
 | 
			
		||||
                       unsigned char *buffer, size_t size);
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
							
								
								
									
										479
									
								
								tools/sdk/esp32s2/include/coap/libcoap/include/coap3/coap_dtls.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										479
									
								
								tools/sdk/esp32s2/include/coap/libcoap/include/coap3/coap_dtls.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,479 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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
 | 
			
		||||
 | 
			
		||||
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 */
 | 
			
		||||
@@ -3,6 +3,8 @@
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
@@ -12,9 +14,6 @@
 | 
			
		||||
 | 
			
		||||
#include "libcoap.h"
 | 
			
		||||
 | 
			
		||||
struct coap_context_t;
 | 
			
		||||
struct coap_session_t;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @defgroup events Event API
 | 
			
		||||
 * API functions for event delivery from lower-layer library functions.
 | 
			
		||||
@@ -49,17 +48,20 @@ struct coap_session_t;
 | 
			
		||||
#define COAP_EVENT_SESSION_CLOSED     0x2002
 | 
			
		||||
#define COAP_EVENT_SESSION_FAILED     0x2003
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * BLOCK2 receive errors
 | 
			
		||||
 */
 | 
			
		||||
#define COAP_EVENT_PARTIAL_BLOCK      0x3001
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 coap_context_t object
 | 
			
		||||
 * where the handler function has been registered. The second argument
 | 
			
		||||
 * is the event type that may be complemented by event-specific data
 | 
			
		||||
 * passed as the third argument.
 | 
			
		||||
 * 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)(struct coap_context_t *,
 | 
			
		||||
                                    coap_event_t event,
 | 
			
		||||
                                    struct coap_session_t *session);
 | 
			
		||||
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
 | 
			
		||||
@@ -70,9 +72,11 @@ typedef int (*coap_event_handler_t)(struct coap_context_t *,
 | 
			
		||||
 * @param hnd     The event handler to be registered.  @c NULL if to be
 | 
			
		||||
 *                de-registered.
 | 
			
		||||
 */
 | 
			
		||||
void coap_register_event_handler(struct coap_context_t *context,
 | 
			
		||||
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
 | 
			
		||||
@@ -84,7 +88,7 @@ void coap_register_event_handler(struct coap_context_t *context,
 | 
			
		||||
 * @param hnd     The event handler to be registered.
 | 
			
		||||
 */
 | 
			
		||||
COAP_DEPRECATED
 | 
			
		||||
void coap_set_event_handler(struct coap_context_t *context,
 | 
			
		||||
void coap_set_event_handler(coap_context_t *context,
 | 
			
		||||
                            coap_event_handler_t hnd);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -95,8 +99,6 @@ void coap_set_event_handler(struct coap_context_t *context,
 | 
			
		||||
 * @param context The CoAP context whose event handler is to be removed.
 | 
			
		||||
 */
 | 
			
		||||
COAP_DEPRECATED
 | 
			
		||||
void coap_clear_event_handler(struct coap_context_t *context);
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
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_ */
 | 
			
		||||
@@ -3,6 +3,8 @@
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
@@ -31,7 +33,7 @@ typedef unsigned char coap_key_t[4];
 | 
			
		||||
 * @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, unsigned int len, coap_key_t h);
 | 
			
		||||
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))
 | 
			
		||||
@@ -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_ */
 | 
			
		||||
@@ -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_ */
 | 
			
		||||
@@ -3,41 +3,24 @@
 | 
			
		||||
 *
 | 
			
		||||
 * 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_
 | 
			
		||||
#ifndef COAP_IO_INTERNAL_H_
 | 
			
		||||
#define COAP_IO_INTERNAL_H_
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
#include <sys/types.h>
 | 
			
		||||
 | 
			
		||||
#include "address.h"
 | 
			
		||||
 | 
			
		||||
#ifndef COAP_RXBUFFER_SIZE
 | 
			
		||||
#define COAP_RXBUFFER_SIZE 1472
 | 
			
		||||
#endif /* COAP_RXBUFFER_SIZE */
 | 
			
		||||
#ifdef RIOT_VERSION
 | 
			
		||||
#include "net/gnrc.h"
 | 
			
		||||
#endif /* RIOT_VERSION */
 | 
			
		||||
 | 
			
		||||
#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
 | 
			
		||||
 | 
			
		||||
struct coap_packet_t;
 | 
			
		||||
struct coap_session_t;
 | 
			
		||||
struct coap_pdu_t;
 | 
			
		||||
 | 
			
		||||
typedef uint16_t coap_socket_flags_t;
 | 
			
		||||
 | 
			
		||||
typedef struct coap_socket_t {
 | 
			
		||||
struct coap_socket_t {
 | 
			
		||||
#if defined(WITH_LWIP)
 | 
			
		||||
  struct udp_pcb *pcb;
 | 
			
		||||
#elif defined(WITH_CONTIKI)
 | 
			
		||||
@@ -45,8 +28,14 @@ typedef struct coap_socket_t {
 | 
			
		||||
#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_socket_t;
 | 
			
		||||
  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
 | 
			
		||||
@@ -65,8 +54,10 @@ typedef struct coap_socket_t {
 | 
			
		||||
#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 */
 | 
			
		||||
 | 
			
		||||
struct coap_endpoint_t *coap_malloc_endpoint( void );
 | 
			
		||||
void coap_mfree_endpoint( struct coap_endpoint_t *ep );
 | 
			
		||||
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,
 | 
			
		||||
@@ -81,34 +72,10 @@ coap_socket_bind_udp(coap_socket_t *sock,
 | 
			
		||||
                     const coap_address_t *listen_addr,
 | 
			
		||||
                     coap_address_t *bound_addr );
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
coap_socket_connect_tcp2(coap_socket_t *sock,
 | 
			
		||||
                         coap_address_t *local_addr,
 | 
			
		||||
                         coap_address_t *remote_addr);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
coap_socket_bind_tcp(coap_socket_t *sock,
 | 
			
		||||
                     const coap_address_t *listen_addr,
 | 
			
		||||
                     coap_address_t *bound_addr);
 | 
			
		||||
 | 
			
		||||
int
 | 
			
		||||
coap_socket_accept_tcp(coap_socket_t *server,
 | 
			
		||||
                       coap_socket_t *new_client,
 | 
			
		||||
                       coap_address_t *local_addr,
 | 
			
		||||
                       coap_address_t *remote_addr);
 | 
			
		||||
 | 
			
		||||
void coap_socket_close(coap_socket_t *sock);
 | 
			
		||||
 | 
			
		||||
ssize_t
 | 
			
		||||
coap_socket_send( coap_socket_t *sock, struct coap_session_t *session,
 | 
			
		||||
coap_socket_send( coap_socket_t *sock, coap_session_t *session,
 | 
			
		||||
                  const uint8_t *data, size_t data_len );
 | 
			
		||||
 | 
			
		||||
ssize_t
 | 
			
		||||
@@ -117,14 +84,15 @@ 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, struct coap_session_t *session,
 | 
			
		||||
                      struct coap_pdu_t *pdu );
 | 
			
		||||
coap_socket_send_pdu( coap_socket_t *sock, coap_session_t *session,
 | 
			
		||||
                      coap_pdu_t *pdu );
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
const char *coap_socket_strerror( void );
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Function interface for data transmission. This function returns the number of
 | 
			
		||||
 * bytes that have been transmitted, or a value less than zero on error.
 | 
			
		||||
@@ -137,7 +105,7 @@ const char *coap_socket_strerror( void );
 | 
			
		||||
 * @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 struct coap_session_t *session, const uint8_t *data, size_t datalen );
 | 
			
		||||
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
 | 
			
		||||
@@ -150,7 +118,7 @@ ssize_t coap_network_send( coap_socket_t *sock, const struct coap_session_t *ses
 | 
			
		||||
 * @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, struct coap_packet_t *packet );
 | 
			
		||||
ssize_t coap_network_read( coap_socket_t *sock, coap_packet_t *packet );
 | 
			
		||||
 | 
			
		||||
#ifndef coap_mcast_interface
 | 
			
		||||
# define coap_mcast_interface(Local) 0
 | 
			
		||||
@@ -160,7 +128,7 @@ ssize_t coap_network_read( coap_socket_t *sock, struct coap_packet_t *packet );
 | 
			
		||||
 * 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(struct coap_packet_t *packet,
 | 
			
		||||
void coap_packet_get_memmapped(coap_packet_t *packet,
 | 
			
		||||
                               unsigned char **address,
 | 
			
		||||
                               size_t *length);
 | 
			
		||||
 | 
			
		||||
@@ -169,7 +137,7 @@ void coap_packet_get_memmapped(struct coap_packet_t *packet,
 | 
			
		||||
 * Get the pbuf of a packet. The caller takes over responsibility for freeing
 | 
			
		||||
 * the pbuf.
 | 
			
		||||
 */
 | 
			
		||||
struct pbuf *coap_packet_extract_pbuf(struct coap_packet_t *packet);
 | 
			
		||||
struct pbuf *coap_packet_extract_pbuf(coap_packet_t *packet);
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(WITH_LWIP)
 | 
			
		||||
@@ -183,28 +151,18 @@ struct pbuf *coap_packet_extract_pbuf(struct coap_packet_t *packet);
 | 
			
		||||
 */
 | 
			
		||||
struct coap_packet_t {
 | 
			
		||||
  struct pbuf *pbuf;
 | 
			
		||||
  const struct coap_endpoint_t *local_interface;
 | 
			
		||||
  coap_address_t src;              /**< the packet's source address */
 | 
			
		||||
  coap_address_t dst;              /**< the packet's destination address */
 | 
			
		||||
  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_address_t src;              /**< the packet's source address */
 | 
			
		||||
  coap_address_t dst;              /**< the packet's destination address */
 | 
			
		||||
  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
 | 
			
		||||
typedef struct coap_packet_t coap_packet_t;
 | 
			
		||||
 | 
			
		||||
typedef enum {
 | 
			
		||||
  COAP_NACK_TOO_MANY_RETRIES,
 | 
			
		||||
  COAP_NACK_NOT_DELIVERABLE,
 | 
			
		||||
  COAP_NACK_RST,
 | 
			
		||||
  COAP_NACK_TLS_FAILED
 | 
			
		||||
} coap_nack_reason_t;
 | 
			
		||||
 | 
			
		||||
#endif /* COAP_IO_H_ */
 | 
			
		||||
#endif /* COAP_IO_INTERNAL_H_ */
 | 
			
		||||
@@ -2,6 +2,9 @@
 | 
			
		||||
 * 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.
 | 
			
		||||
@@ -15,28 +18,14 @@
 | 
			
		||||
#ifndef COAP_MUTEX_H_
 | 
			
		||||
#define COAP_MUTEX_H_
 | 
			
		||||
 | 
			
		||||
#if defined(RIOT_VERSION)
 | 
			
		||||
 | 
			
		||||
#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)
 | 
			
		||||
 | 
			
		||||
#elif defined(WITH_CONTIKI)
 | 
			
		||||
 | 
			
		||||
/* CONTIKI does not support mutex */
 | 
			
		||||
 | 
			
		||||
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
 | 
			
		||||
 | 
			
		||||
#else /* ! RIOT_VERSION && ! WITH_CONTIKI */
 | 
			
		||||
/*
 | 
			
		||||
 * 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;
 | 
			
		||||
@@ -45,6 +34,26 @@ typedef pthread_mutex_t coap_mutex_t;
 | 
			
		||||
#define coap_mutex_trylock(a) pthread_mutex_trylock(a)
 | 
			
		||||
#define coap_mutex_unlock(a) pthread_mutex_unlock(a)
 | 
			
		||||
 | 
			
		||||
#endif /* ! RIOT_VERSION && ! WITH_CONTIKI */
 | 
			
		||||
#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/esp32s2/include/coap/libcoap/include/coap3/coap_prng.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										113
									
								
								tools/sdk/esp32s2/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_ */
 | 
			
		||||
@@ -3,6 +3,8 @@
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
@@ -47,6 +49,10 @@ 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"
 | 
			
		||||
@@ -75,7 +81,38 @@ COAP_STATIC_INLINE coap_time_t coap_ticks_to_rt(coap_tick_t t) {
 | 
			
		||||
  return t / COAP_TICKS_PER_SECOND;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
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>
 | 
			
		||||
 | 
			
		||||
#define COAP_TICKS_PER_SECOND (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>
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -3,6 +3,8 @@
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
@@ -18,15 +20,6 @@
 | 
			
		||||
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#define Nn 8  /* duplicate definition of N if built on sky motes */
 | 
			
		||||
#define ENCODE_HEADER_SIZE 4
 | 
			
		||||
#define HIBIT (1 << (Nn - 1))
 | 
			
		||||
#define EMASK ((1 << ENCODE_HEADER_SIZE) - 1)
 | 
			
		||||
#define MMASK ((1 << Nn) - 1 - EMASK)
 | 
			
		||||
#define MAX_VALUE ( (1 << Nn) - (1 << ENCODE_HEADER_SIZE) ) * (1 << ((1 << ENCODE_HEADER_SIZE) - 1))
 | 
			
		||||
 | 
			
		||||
#define COAP_PSEUDOFP_DECODE_8_4(r) (r < HIBIT ? r : (r & MMASK) << (r & EMASK))
 | 
			
		||||
 | 
			
		||||
#ifndef HAVE_FLS
 | 
			
		||||
/* include this only if fls() is not available */
 | 
			
		||||
extern int coap_fls(unsigned int i);
 | 
			
		||||
@@ -41,28 +34,41 @@ extern int coap_flsll(long long i);
 | 
			
		||||
#define coap_flsll(i) flsll(i)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* ls and s must be integer variables */
 | 
			
		||||
#define COAP_PSEUDOFP_ENCODE_8_4_DOWN(v,ls) (v < HIBIT ? v : (ls = coap_fls(v) - Nn, (v >> ls) & MMASK) + ls)
 | 
			
		||||
#define COAP_PSEUDOFP_ENCODE_8_4_UP(v,ls,s) (v < HIBIT ? v : (ls = coap_fls(v) - Nn, (s = (((v + ((1<<ENCODE_HEADER_SIZE<<ls)-1)) >> ls) & MMASK)), s == 0 ? HIBIT + ls + 1 : s + ls))
 | 
			
		||||
/**
 | 
			
		||||
 * @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 decoded value.
 | 
			
		||||
 * 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, unsigned int length);
 | 
			
		||||
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 value to
 | 
			
		||||
 * encode.
 | 
			
		||||
 * 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 decode into
 | 
			
		||||
 * @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
 | 
			
		||||
 *
 | 
			
		||||
@@ -72,6 +78,24 @@ 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
 | 
			
		||||
@@ -3,6 +3,8 @@
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
@@ -46,6 +48,13 @@ typedef USHORT in_port_t;
 | 
			
		||||
#    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);
 | 
			
		||||
 | 
			
		||||
@@ -1,4 +1,6 @@
 | 
			
		||||
/*
 | 
			
		||||
 * SPDX-License-Identifier: BSD-2-Clause
 | 
			
		||||
 *
 | 
			
		||||
 * This file is part of the CoAP library libcoap. Please see README for terms
 | 
			
		||||
 * of use.
 | 
			
		||||
 */
 | 
			
		||||
@@ -9,10 +11,10 @@
 | 
			
		||||
 * include this or include something more generic which includes this), and
 | 
			
		||||
 * MEMP_USE_CUSTOM_POOLS has to be set in lwipopts.h. */
 | 
			
		||||
 | 
			
		||||
#include "coap_config.h"
 | 
			
		||||
#include <net.h>
 | 
			
		||||
#include <resource.h>
 | 
			
		||||
#include <subscribe.h>
 | 
			
		||||
#include "coap_internal.h"
 | 
			
		||||
#include "net.h"
 | 
			
		||||
#include "resource.h"
 | 
			
		||||
#include "subscribe.h"
 | 
			
		||||
 | 
			
		||||
#ifndef MEMP_NUM_COAPCONTEXT
 | 
			
		||||
#define MEMP_NUM_COAPCONTEXT 1
 | 
			
		||||
@@ -67,6 +69,34 @@
 | 
			
		||||
#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")
 | 
			
		||||
@@ -78,4 +108,10 @@ LWIP_MEMPOOL(COAP_RESOURCE, MEMP_NUM_COAPRESOURCE, sizeof(coap_resource_t), "COA
 | 
			
		||||
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")
 | 
			
		||||
 | 
			
		||||
@@ -3,6 +3,8 @@
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
@@ -43,6 +45,11 @@ typedef enum {
 | 
			
		||||
#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
 | 
			
		||||
@@ -59,6 +66,22 @@ typedef enum {
 | 
			
		||||
 */
 | 
			
		||||
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
 | 
			
		||||
							
								
								
									
										779
									
								
								tools/sdk/esp32s2/include/coap/libcoap/include/coap3/net.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										779
									
								
								tools/sdk/esp32s2/include/coap/libcoap/include/coap3/net.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,779 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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/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_ */
 | 
			
		||||
@@ -3,6 +3,8 @@
 | 
			
		||||
 *
 | 
			
		||||
 * 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.
 | 
			
		||||
 */
 | 
			
		||||
@@ -15,8 +17,7 @@
 | 
			
		||||
#ifndef COAP_OPTION_H_
 | 
			
		||||
#define COAP_OPTION_H_
 | 
			
		||||
 | 
			
		||||
#include "bits.h"
 | 
			
		||||
#include "pdu.h"
 | 
			
		||||
typedef uint16_t coap_option_num_t;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Use byte-oriented access methods here because sliding a complex struct
 | 
			
		||||
@@ -89,134 +90,66 @@ size_t coap_opt_size(const coap_opt_t *opt);
 | 
			
		||||
#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) */
 | 
			
		||||
 | 
			
		||||
/** The number of elements in coap_opt_filter_t. */
 | 
			
		||||
#define COAP_OPT_FILTER_SIZE                                        \
 | 
			
		||||
  (((COAP_OPT_FILTER_SHORT + 1) >> 1) + COAP_OPT_FILTER_LONG) +1
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Fixed-size vector we use for option filtering. It is large enough
 | 
			
		||||
 * to hold COAP_OPT_FILTER_SHORT entries with an option number between
 | 
			
		||||
 * 0 and 255, and COAP_OPT_FILTER_LONG entries with an option number
 | 
			
		||||
 * between 256 and 65535. Its internal structure is
 | 
			
		||||
 *
 | 
			
		||||
 * @code
 | 
			
		||||
struct {
 | 
			
		||||
/*
 | 
			
		||||
 * 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];
 | 
			
		||||
}
 | 
			
		||||
 * @endcode
 | 
			
		||||
 *
 | 
			
		||||
 * The first element contains a bit vector that indicates which fields
 | 
			
		||||
 * in the remaining array are used. The first COAP_OPT_FILTER_LONG
 | 
			
		||||
 * bits correspond to the long option types that are stored in the
 | 
			
		||||
 * elements from index 1 to COAP_OPT_FILTER_LONG. The next
 | 
			
		||||
 * COAP_OPT_FILTER_SHORT bits correspond to the short option types
 | 
			
		||||
 * that are stored in the elements from index COAP_OPT_FILTER_LONG + 1
 | 
			
		||||
 * to COAP_OPT_FILTER_LONG + COAP_OPT_FILTER_SHORT. The latter
 | 
			
		||||
 * elements are treated as bytes.
 | 
			
		||||
 */
 | 
			
		||||
typedef uint16_t coap_opt_filter_t[COAP_OPT_FILTER_SIZE];
 | 
			
		||||
} coap_opt_filter_t;
 | 
			
		||||
 | 
			
		||||
/** Pre-defined filter that includes all options. */
 | 
			
		||||
#define COAP_OPT_ALL NULL
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Clears filter @p f.
 | 
			
		||||
 * Clears filter @p filter.
 | 
			
		||||
 *
 | 
			
		||||
 * @param f The filter to clear.
 | 
			
		||||
 * @param filter The filter to clear.
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE void
 | 
			
		||||
coap_option_filter_clear(coap_opt_filter_t f) {
 | 
			
		||||
  memset(f, 0, sizeof(coap_opt_filter_t));
 | 
			
		||||
}
 | 
			
		||||
void
 | 
			
		||||
coap_option_filter_clear(coap_opt_filter_t *filter);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Sets the corresponding entry for @p type in @p filter. This
 | 
			
		||||
 * 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 type does not fit in the filter).
 | 
			
		||||
 * the given number does not fit in the filter).
 | 
			
		||||
 *
 | 
			
		||||
 * @param filter The filter object to change.
 | 
			
		||||
 * @param type   The type for which the bit should be set.
 | 
			
		||||
 * @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, uint16_t type);
 | 
			
		||||
int coap_option_filter_set(coap_opt_filter_t *filter, coap_option_num_t number);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Clears the corresponding entry for @p type in @p filter. This
 | 
			
		||||
 * 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 type does not fit in the filter).
 | 
			
		||||
 * the given number does not fit in the filter).
 | 
			
		||||
 *
 | 
			
		||||
 * @param filter The filter object to change.
 | 
			
		||||
 * @param type   The type that should be cleared from the filter.
 | 
			
		||||
 * @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, uint16_t type);
 | 
			
		||||
int coap_option_filter_unset(coap_opt_filter_t *filter,
 | 
			
		||||
                             coap_option_num_t number);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Checks if @p type is contained in @p filter. This function returns
 | 
			
		||||
 * 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
 | 
			
		||||
 * type does not fit in the filter).
 | 
			
		||||
 * number does not fit in the filter).
 | 
			
		||||
 *
 | 
			
		||||
 * @param filter The filter object to search.
 | 
			
		||||
 * @param type   The type to search for.
 | 
			
		||||
 * @param number The option number to search for.
 | 
			
		||||
 *
 | 
			
		||||
 * @return       @c 1 if @p type was found, @c 0 otherwise, or @c -1 on error.
 | 
			
		||||
 * @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, uint16_t type);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 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 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 int
 | 
			
		||||
coap_option_getb(coap_opt_filter_t filter, uint16_t type) {
 | 
			
		||||
  return coap_option_filter_get(filter, type);
 | 
			
		||||
}
 | 
			
		||||
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
 | 
			
		||||
@@ -236,7 +169,7 @@ coap_option_getb(coap_opt_filter_t filter, uint16_t type) {
 | 
			
		||||
 */
 | 
			
		||||
typedef struct {
 | 
			
		||||
  size_t length;                /**< remaining length of PDU */
 | 
			
		||||
  uint16_t type;                /**< decoded option type */
 | 
			
		||||
  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 */
 | 
			
		||||
@@ -251,8 +184,8 @@ typedef struct {
 | 
			
		||||
 *
 | 
			
		||||
 * @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 type filter.
 | 
			
		||||
 *               With @p type != @c COAP_OPT_ALL, coap_option_next()
 | 
			
		||||
 * @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.
 | 
			
		||||
@@ -261,18 +194,18 @@ typedef struct {
 | 
			
		||||
 */
 | 
			
		||||
coap_opt_iterator_t *coap_option_iterator_init(const coap_pdu_t *pdu,
 | 
			
		||||
                                               coap_opt_iterator_t *oi,
 | 
			
		||||
                                               const coap_opt_filter_t filter);
 | 
			
		||||
                                               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->type is the option's type code,
 | 
			
		||||
 * 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.
 | 
			
		||||
 * 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 type codes
 | 
			
		||||
 * 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.
 | 
			
		||||
@@ -282,20 +215,20 @@ coap_opt_iterator_t *coap_option_iterator_init(const coap_pdu_t *pdu,
 | 
			
		||||
coap_opt_t *coap_option_next(coap_opt_iterator_t *oi);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Retrieves the first option of type @p type 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 code @p type. This function returns the first option
 | 
			
		||||
 * with this type, or @c NULL if not found.
 | 
			
		||||
 * 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 type The option type code to search for.
 | 
			
		||||
 * @param number The option number to search for.
 | 
			
		||||
 * @param oi   An iterator object to use.
 | 
			
		||||
 *
 | 
			
		||||
 * @return     A pointer to the first option of type @p type, or @c NULL if
 | 
			
		||||
 * @return     A pointer to the first option of number @p number, or @c NULL if
 | 
			
		||||
 *             not found.
 | 
			
		||||
 */
 | 
			
		||||
coap_opt_t *coap_check_option(coap_pdu_t *pdu,
 | 
			
		||||
                              uint16_t type,
 | 
			
		||||
coap_opt_t *coap_check_option(const coap_pdu_t *pdu,
 | 
			
		||||
                              coap_option_num_t number,
 | 
			
		||||
                              coap_opt_iterator_t *oi);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
@@ -349,18 +282,6 @@ size_t coap_opt_encode(coap_opt_t *opt,
 | 
			
		||||
                       const uint8_t *val,
 | 
			
		||||
                       size_t length);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Decodes the delta value of the next option. This function returns the number
 | 
			
		||||
 * of bytes read or @c 0 on error. The caller of this function must ensure that
 | 
			
		||||
 * it does not read over the boundaries of @p opt (e.g. by calling
 | 
			
		||||
 * coap_opt_check_delta().
 | 
			
		||||
 *
 | 
			
		||||
 * @param opt The option to examine.
 | 
			
		||||
 *
 | 
			
		||||
 * @return    The number of bytes read or @c 0 on error.
 | 
			
		||||
 */
 | 
			
		||||
uint16_t coap_opt_delta(const coap_opt_t *opt);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -374,7 +295,7 @@ uint16_t coap_opt_delta(const coap_opt_t *opt);
 | 
			
		||||
 *
 | 
			
		||||
 * @return     The option's length or @c 0 when undefined.
 | 
			
		||||
 */
 | 
			
		||||
uint16_t coap_opt_length(const coap_opt_t *opt);
 | 
			
		||||
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
 | 
			
		||||
@@ -387,8 +308,6 @@ uint16_t coap_opt_length(const coap_opt_t *opt);
 | 
			
		||||
 */
 | 
			
		||||
const uint8_t *coap_opt_value(const coap_opt_t *opt);
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Representation of chained list of CoAP options to install.
 | 
			
		||||
 *
 | 
			
		||||
@@ -415,6 +334,12 @@ typedef struct 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
 | 
			
		||||
@@ -458,4 +383,57 @@ int coap_insert_optlist(coap_optlist_t **optlist_chain,
 | 
			
		||||
 */
 | 
			
		||||
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_ */
 | 
			
		||||
							
								
								
									
										572
									
								
								tools/sdk/esp32s2/include/coap/libcoap/include/coap3/pdu.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										572
									
								
								tools/sdk/esp32s2/include/coap/libcoap/include/coap3/pdu.h
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,572 @@
 | 
			
		||||
/*
 | 
			
		||||
 * 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_OK                         = COAP_RESPONSE_CODE(200),
 | 
			
		||||
  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_ */
 | 
			
		||||
@@ -1,7 +1,9 @@
 | 
			
		||||
/*
 | 
			
		||||
 * resource.h -- generic resource handling
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2010,2011,2014,2015 Olaf Bergmann <bergmann@tzi.org>
 | 
			
		||||
 * 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.
 | 
			
		||||
@@ -15,100 +17,62 @@
 | 
			
		||||
#ifndef COAP_RESOURCE_H_
 | 
			
		||||
#define COAP_RESOURCE_H_
 | 
			
		||||
 | 
			
		||||
# include <assert.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 "uthash.h"
 | 
			
		||||
#include "async.h"
 | 
			
		||||
#include "block.h"
 | 
			
		||||
#include "str.h"
 | 
			
		||||
#include "pdu.h"
 | 
			
		||||
#include "net.h"
 | 
			
		||||
#include "subscribe.h"
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Definition of message handler function (@sa coap_resource_t).
 | 
			
		||||
 * @defgroup coap_resource Resource Configuraton
 | 
			
		||||
 * API functions for setting up resources
 | 
			
		||||
 * @{
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Definition of message handler function
 | 
			
		||||
 */
 | 
			
		||||
typedef void (*coap_method_handler_t)
 | 
			
		||||
  (coap_context_t  *,
 | 
			
		||||
   struct coap_resource_t *,
 | 
			
		||||
  (coap_resource_t *,
 | 
			
		||||
   coap_session_t *,
 | 
			
		||||
   coap_pdu_t *,
 | 
			
		||||
   coap_binary_t * /* token */,
 | 
			
		||||
   coap_string_t * /* query string */,
 | 
			
		||||
   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
 | 
			
		||||
 | 
			
		||||
typedef struct coap_attr_t {
 | 
			
		||||
  struct coap_attr_t *next;
 | 
			
		||||
  coap_str_const_t *name;
 | 
			
		||||
  coap_str_const_t *value;
 | 
			
		||||
  int flags;
 | 
			
		||||
} coap_attr_t;
 | 
			
		||||
 | 
			
		||||
/** 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 by default. RFC 7641 Section 4.5
 | 
			
		||||
 * 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
 | 
			
		||||
 | 
			
		||||
typedef 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 */
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * 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 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;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
  * 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;
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * This pointer is under user control. It can be used to store context for
 | 
			
		||||
   * the coap handler.
 | 
			
		||||
   */
 | 
			
		||||
  void *user_data;
 | 
			
		||||
 | 
			
		||||
} coap_resource_t;
 | 
			
		||||
/**
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -173,6 +137,45 @@ coap_resource_t *coap_resource_init(coap_str_const_t *uri_path,
 | 
			
		||||
 */
 | 
			
		||||
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
 | 
			
		||||
@@ -181,38 +184,43 @@ coap_resource_t *coap_resource_unknown_init(coap_method_handler_t put_handler);
 | 
			
		||||
 * @param mode     Must be one of @c COAP_RESOURCE_FLAGS_NOTIFY_NON
 | 
			
		||||
 *                 or @c COAP_RESOURCE_FLAGS_NOTIFY_CON.
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE void
 | 
			
		||||
coap_resource_set_mode(coap_resource_t *resource, int mode) {
 | 
			
		||||
  resource->flags = (resource->flags &
 | 
			
		||||
    ~(COAP_RESOURCE_FLAGS_NOTIFY_CON|COAP_RESOURCE_FLAGS_NOTIFY_NON)) |
 | 
			
		||||
    (mode & (COAP_RESOURCE_FLAGS_NOTIFY_CON|COAP_RESOURCE_FLAGS_NOTIFY_NON));
 | 
			
		||||
}
 | 
			
		||||
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 context in the handler functions.
 | 
			
		||||
 * and can be used as user defined context in the handler functions.
 | 
			
		||||
 *
 | 
			
		||||
 * @param r       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
 | 
			
		||||
 * @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
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE void
 | 
			
		||||
coap_resource_set_userdata(coap_resource_t *r, void *data) {
 | 
			
		||||
  r->user_data = data;
 | 
			
		||||
}
 | 
			
		||||
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 r        Resource to retrieve the user_darta from
 | 
			
		||||
 * @param resource Resource to retrieve the user_data from
 | 
			
		||||
 *
 | 
			
		||||
 * @return        The user_data pointer
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE void *
 | 
			
		||||
coap_resource_get_userdata(coap_resource_t *r) {
 | 
			
		||||
  return r->user_data;
 | 
			
		||||
}
 | 
			
		||||
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
 | 
			
		||||
@@ -237,11 +245,16 @@ void coap_add_resource(coap_context_t *context, coap_resource_t *resource);
 | 
			
		||||
int coap_delete_resource(coap_context_t *context, coap_resource_t *resource);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Deletes all resources from given @p context and frees their storage.
 | 
			
		||||
 * Registers the specified @p handler as message handler for the request type @p
 | 
			
		||||
 * method
 | 
			
		||||
 *
 | 
			
		||||
 * @param context The CoAP context with the resources to be deleted.
 | 
			
		||||
 * @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_delete_all_resources(coap_context_t *context);
 | 
			
		||||
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
 | 
			
		||||
@@ -291,13 +304,13 @@ coap_attr_t *coap_find_attr(coap_resource_t *resource,
 | 
			
		||||
                            coap_str_const_t *name);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Deletes an attribute.
 | 
			
		||||
 * Note: This is for internal use only, as it is not deleted from its chain.
 | 
			
		||||
 * Returns @p attribute's value.
 | 
			
		||||
 *
 | 
			
		||||
 * @param attr Pointer to a previously created attribute.
 | 
			
		||||
 * @param attribute Pointer to attribute.
 | 
			
		||||
 *
 | 
			
		||||
 * @return Attribute's value or @c NULL.
 | 
			
		||||
 */
 | 
			
		||||
void coap_delete_attr(coap_attr_t *attr);
 | 
			
		||||
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
 | 
			
		||||
@@ -341,17 +354,7 @@ coap_print_status_t coap_print_link(const coap_resource_t *resource,
 | 
			
		||||
                                    size_t *len,
 | 
			
		||||
                                    size_t *offset);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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,
 | 
			
		||||
                           unsigned char method,
 | 
			
		||||
                           coap_method_handler_t handler);
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Returns the resource identified by the unique string @p uri_path. If no
 | 
			
		||||
@@ -365,155 +368,6 @@ void coap_register_handler(coap_resource_t *resource,
 | 
			
		||||
coap_resource_t *coap_get_resource_from_uri_path(coap_context_t *context,
 | 
			
		||||
                                                coap_str_const_t *uri_path);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @addtogroup observe
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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 query           The query string, if any. subscription will
 | 
			
		||||
                          take ownership of the string.
 | 
			
		||||
 * @param has_block2      If Option Block2 defined.
 | 
			
		||||
 * @param block2          Contents of Block2 if Block 2 defined.
 | 
			
		||||
 * @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,
 | 
			
		||||
                                       coap_string_t *query,
 | 
			
		||||
                                       int has_block2,
 | 
			
		||||
                                       coap_block_t block2);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Marks an observer as alive.
 | 
			
		||||
 *
 | 
			
		||||
 * @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);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Checks for all known resources, if they are dirty and notifies subscribed
 | 
			
		||||
 * observers.
 | 
			
		||||
 */
 | 
			
		||||
void coap_check_notify(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)); \
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
coap_print_status_t coap_print_wellknown(coap_context_t *,
 | 
			
		||||
                                         unsigned char *,
 | 
			
		||||
                                         size_t *, size_t,
 | 
			
		||||
                                         coap_opt_t *);
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
coap_handle_failed_notify(coap_context_t *,
 | 
			
		||||
                          coap_session_t *,
 | 
			
		||||
                          const coap_binary_t *);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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.
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE void
 | 
			
		||||
coap_resource_set_get_observable(coap_resource_t *resource, int mode) {
 | 
			
		||||
  resource->observable = mode ? 1 : 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * 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);
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Get the UriPath from a @p resource.
 | 
			
		||||
 *
 | 
			
		||||
 * @param resource The CoAP resource to check.
 | 
			
		||||
 *
 | 
			
		||||
 * @return         The UriPath if it exists or @c NULL otherwise.
 | 
			
		||||
 */
 | 
			
		||||
COAP_STATIC_INLINE coap_str_const_t*
 | 
			
		||||
coap_resource_get_uri_path(coap_resource_t *resource) {
 | 
			
		||||
  if (resource)
 | 
			
		||||
    return resource->uri_path;
 | 
			
		||||
  return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * @deprecated use coap_resource_notify_observers() instead.
 | 
			
		||||
 */
 | 
			
		||||
							
								
								
									
										204
									
								
								tools/sdk/esp32s2/include/coap/libcoap/include/coap3/str.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										204
									
								
								tools/sdk/esp32s2/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_ */
 | 
			
		||||
@@ -1,7 +1,9 @@
 | 
			
		||||
/*
 | 
			
		||||
 * uri.h -- helper functions for URI treatment
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2010-2011,2016 Olaf Bergmann <bergmann@tzi.org>
 | 
			
		||||
 * 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.
 | 
			
		||||
@@ -13,25 +15,27 @@
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
 | 
			
		||||
#include "str.h"
 | 
			
		||||
struct coap_pdu_t;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * The scheme specifiers. Secure schemes have an odd numeric value,
 | 
			
		||||
 * others are even.
 | 
			
		||||
 */
 | 
			
		||||
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
 | 
			
		||||
};
 | 
			
		||||
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() and can be used as input for option-creation functions.
 | 
			
		||||
 * 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 */
 | 
			
		||||
@@ -79,17 +83,36 @@ coap_uri_t *coap_clone_uri(const 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 @c COAP_DEFAULT_PORT. This function returns @p 0 if
 | 
			
		||||
 * parsing succeeded, a value less than zero otherwise.
 | 
			
		||||
 * 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
 | 
			
		||||
@@ -131,16 +154,22 @@ int coap_split_query(const uint8_t *s,
 | 
			
		||||
/**
 | 
			
		||||
 * 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.
 | 
			
		||||
 * @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 struct coap_pdu_t *request);
 | 
			
		||||
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.
 | 
			
		||||
 * @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 struct coap_pdu_t *request);
 | 
			
		||||
coap_string_t *coap_get_uri_path(const coap_pdu_t *request);
 | 
			
		||||
 | 
			
		||||
/** @} */
 | 
			
		||||
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright (c) 2003-2017, Troy D. Hanson     http://troydhanson.github.com/uthash/
 | 
			
		||||
Copyright (c) 2003-2021, Troy D. Hanson     http://troydhanson.github.io/uthash/
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
Redistribution and use in source and binary forms, with or without
 | 
			
		||||
@@ -24,12 +24,22 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
#ifndef UTHASH_H
 | 
			
		||||
#define UTHASH_H
 | 
			
		||||
 | 
			
		||||
#define UTHASH_VERSION 2.0.2
 | 
			
		||||
#define UTHASH_VERSION 2.3.0
 | 
			
		||||
 | 
			
		||||
#include <string.h>   /* memcmp, memset, strlen */
 | 
			
		||||
#include <stddef.h>   /* ptrdiff_t */
 | 
			
		||||
#include <stdlib.h>   /* exit */
 | 
			
		||||
 | 
			
		||||
#if defined(HASH_DEFINE_OWN_STDINT) && HASH_DEFINE_OWN_STDINT
 | 
			
		||||
/* This codepath is provided for backward compatibility, but I plan to remove it. */
 | 
			
		||||
#warning "HASH_DEFINE_OWN_STDINT is deprecated; please use HASH_NO_STDINT instead"
 | 
			
		||||
typedef unsigned int uint32_t;
 | 
			
		||||
typedef unsigned char uint8_t;
 | 
			
		||||
#elif defined(HASH_NO_STDINT) && HASH_NO_STDINT
 | 
			
		||||
#else
 | 
			
		||||
#include <stdint.h>   /* uint8_t, uint32_t */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* These macros use decltype or the earlier __typeof GNU extension.
 | 
			
		||||
   As decltype is only available in newer compilers (VS2010 or gcc 4.3+
 | 
			
		||||
   when compiling c++ source) this code uses whatever method is needed
 | 
			
		||||
@@ -62,26 +72,6 @@ do {
 | 
			
		||||
} while (0)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* a number of the hash function use uint32_t which isn't defined on Pre VS2010 */
 | 
			
		||||
#if defined(_WIN32)
 | 
			
		||||
#if defined(_MSC_VER) && _MSC_VER >= 1600
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#elif defined(__WATCOMC__) || defined(__MINGW32__) || defined(__CYGWIN__)
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#else
 | 
			
		||||
typedef unsigned int uint32_t;
 | 
			
		||||
typedef unsigned char uint8_t;
 | 
			
		||||
#endif
 | 
			
		||||
#elif defined(__GNUC__) && !defined(__VXWORKS__)
 | 
			
		||||
#include <stdint.h>
 | 
			
		||||
#else
 | 
			
		||||
typedef unsigned int uint32_t;
 | 
			
		||||
typedef unsigned char uint8_t;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef uthash_fatal
 | 
			
		||||
#define uthash_fatal(msg) exit(-1)        /* fatal error (out of memory,etc) */
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef uthash_malloc
 | 
			
		||||
#define uthash_malloc(sz) malloc(sz)      /* malloc fcn                      */
 | 
			
		||||
#endif
 | 
			
		||||
@@ -91,13 +81,18 @@ typedef unsigned char uint8_t;
 | 
			
		||||
#ifndef uthash_bzero
 | 
			
		||||
#define uthash_bzero(a,n) memset(a,'\0',n)
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef uthash_memcmp
 | 
			
		||||
#define uthash_memcmp(a,b,n) memcmp(a,b,n)
 | 
			
		||||
#endif
 | 
			
		||||
#ifndef uthash_strlen
 | 
			
		||||
#define uthash_strlen(s) strlen(s)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef HASH_FUNCTION
 | 
			
		||||
#define HASH_FUNCTION(keyptr,keylen,hashv) HASH_JEN(keyptr, keylen, hashv)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef HASH_KEYCMP
 | 
			
		||||
#define HASH_KEYCMP(a,b,n) memcmp(a,b,n)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef uthash_noexpand_fyi
 | 
			
		||||
#define uthash_noexpand_fyi(tbl)          /* can be defined to log noexpand  */
 | 
			
		||||
#endif
 | 
			
		||||
@@ -105,6 +100,32 @@ typedef unsigned char uint8_t;
 | 
			
		||||
#define uthash_expand_fyi(tbl)            /* can be defined to log expands   */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#ifndef HASH_NONFATAL_OOM
 | 
			
		||||
#define HASH_NONFATAL_OOM 0
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if HASH_NONFATAL_OOM
 | 
			
		||||
/* malloc failures can be recovered from */
 | 
			
		||||
 | 
			
		||||
#ifndef uthash_nonfatal_oom
 | 
			
		||||
#define uthash_nonfatal_oom(obj) do {} while (0)    /* non-fatal OOM error */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define HASH_RECORD_OOM(oomed) do { (oomed) = 1; } while (0)
 | 
			
		||||
#define IF_HASH_NONFATAL_OOM(x) x
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
/* malloc failures result in lost memory, hash tables are unusable */
 | 
			
		||||
 | 
			
		||||
#ifndef uthash_fatal
 | 
			
		||||
#define uthash_fatal(msg) exit(-1)        /* fatal OOM error */
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define HASH_RECORD_OOM(oomed) uthash_fatal("out of memory")
 | 
			
		||||
#define IF_HASH_NONFATAL_OOM(x)
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* initial number of buckets */
 | 
			
		||||
#define HASH_INITIAL_NUM_BUCKETS 32U     /* initial number of buckets        */
 | 
			
		||||
#define HASH_INITIAL_NUM_BUCKETS_LOG2 5U /* lg2 of initial number of buckets */
 | 
			
		||||
@@ -113,11 +134,21 @@ typedef unsigned char uint8_t;
 | 
			
		||||
/* calculate the element whose hash handle address is hhp */
 | 
			
		||||
#define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho)))
 | 
			
		||||
/* calculate the hash handle from element address elp */
 | 
			
		||||
#define HH_FROM_ELMT(tbl,elp) ((UT_hash_handle *)(((char*)(elp)) + ((tbl)->hho)))
 | 
			
		||||
#define HH_FROM_ELMT(tbl,elp) ((UT_hash_handle*)(void*)(((char*)(elp)) + ((tbl)->hho)))
 | 
			
		||||
 | 
			
		||||
#define HASH_ROLLBACK_BKT(hh, head, itemptrhh)                                   \
 | 
			
		||||
do {                                                                             \
 | 
			
		||||
  struct UT_hash_handle *_hd_hh_item = (itemptrhh);                              \
 | 
			
		||||
  unsigned _hd_bkt;                                                              \
 | 
			
		||||
  HASH_TO_BKT(_hd_hh_item->hashv, (head)->hh.tbl->num_buckets, _hd_bkt);         \
 | 
			
		||||
  (head)->hh.tbl->buckets[_hd_bkt].count++;                                      \
 | 
			
		||||
  _hd_hh_item->hh_next = NULL;                                                   \
 | 
			
		||||
  _hd_hh_item->hh_prev = NULL;                                                   \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define HASH_VALUE(keyptr,keylen,hashv)                                          \
 | 
			
		||||
do {                                                                             \
 | 
			
		||||
  HASH_FCN(keyptr, keylen, hashv);                                               \
 | 
			
		||||
  HASH_FUNCTION(keyptr, keylen, hashv);                                          \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define HASH_FIND_BYHASHVALUE(hh,head,keyptr,keylen,hashval,out)                 \
 | 
			
		||||
@@ -134,23 +165,27 @@ do {
 | 
			
		||||
 | 
			
		||||
#define HASH_FIND(hh,head,keyptr,keylen,out)                                     \
 | 
			
		||||
do {                                                                             \
 | 
			
		||||
  unsigned _hf_hashv;                                                            \
 | 
			
		||||
  HASH_VALUE(keyptr, keylen, _hf_hashv);                                         \
 | 
			
		||||
  HASH_FIND_BYHASHVALUE(hh, head, keyptr, keylen, _hf_hashv, out);               \
 | 
			
		||||
  (out) = NULL;                                                                  \
 | 
			
		||||
  if (head) {                                                                    \
 | 
			
		||||
    unsigned _hf_hashv;                                                          \
 | 
			
		||||
    HASH_VALUE(keyptr, keylen, _hf_hashv);                                       \
 | 
			
		||||
    HASH_FIND_BYHASHVALUE(hh, head, keyptr, keylen, _hf_hashv, out);             \
 | 
			
		||||
  }                                                                              \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#ifdef HASH_BLOOM
 | 
			
		||||
#define HASH_BLOOM_BITLEN (1UL << HASH_BLOOM)
 | 
			
		||||
#define HASH_BLOOM_BYTELEN (HASH_BLOOM_BITLEN/8UL) + (((HASH_BLOOM_BITLEN%8UL)!=0UL) ? 1UL : 0UL)
 | 
			
		||||
#define HASH_BLOOM_MAKE(tbl)                                                     \
 | 
			
		||||
#define HASH_BLOOM_MAKE(tbl,oomed)                                               \
 | 
			
		||||
do {                                                                             \
 | 
			
		||||
  (tbl)->bloom_nbits = HASH_BLOOM;                                               \
 | 
			
		||||
  (tbl)->bloom_bv = (uint8_t*)uthash_malloc(HASH_BLOOM_BYTELEN);                 \
 | 
			
		||||
  if (!(tbl)->bloom_bv) {                                                        \
 | 
			
		||||
    uthash_fatal("out of memory");                                               \
 | 
			
		||||
    HASH_RECORD_OOM(oomed);                                                      \
 | 
			
		||||
  } else {                                                                       \
 | 
			
		||||
    uthash_bzero((tbl)->bloom_bv, HASH_BLOOM_BYTELEN);                           \
 | 
			
		||||
    (tbl)->bloom_sig = HASH_BLOOM_SIGNATURE;                                     \
 | 
			
		||||
  }                                                                              \
 | 
			
		||||
  uthash_bzero((tbl)->bloom_bv, HASH_BLOOM_BYTELEN);                             \
 | 
			
		||||
  (tbl)->bloom_sig = HASH_BLOOM_SIGNATURE;                                       \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define HASH_BLOOM_FREE(tbl)                                                     \
 | 
			
		||||
@@ -162,39 +197,49 @@ do {
 | 
			
		||||
#define HASH_BLOOM_BITTEST(bv,idx) (bv[(idx)/8U] & (1U << ((idx)%8U)))
 | 
			
		||||
 | 
			
		||||
#define HASH_BLOOM_ADD(tbl,hashv)                                                \
 | 
			
		||||
  HASH_BLOOM_BITSET((tbl)->bloom_bv, (hashv & (uint32_t)((1UL << (tbl)->bloom_nbits) - 1U)))
 | 
			
		||||
  HASH_BLOOM_BITSET((tbl)->bloom_bv, ((hashv) & (uint32_t)((1UL << (tbl)->bloom_nbits) - 1U)))
 | 
			
		||||
 | 
			
		||||
#define HASH_BLOOM_TEST(tbl,hashv)                                               \
 | 
			
		||||
  HASH_BLOOM_BITTEST((tbl)->bloom_bv, (hashv & (uint32_t)((1UL << (tbl)->bloom_nbits) - 1U)))
 | 
			
		||||
  HASH_BLOOM_BITTEST((tbl)->bloom_bv, ((hashv) & (uint32_t)((1UL << (tbl)->bloom_nbits) - 1U)))
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
#define HASH_BLOOM_MAKE(tbl)
 | 
			
		||||
#define HASH_BLOOM_MAKE(tbl,oomed)
 | 
			
		||||
#define HASH_BLOOM_FREE(tbl)
 | 
			
		||||
#define HASH_BLOOM_ADD(tbl,hashv)
 | 
			
		||||
#define HASH_BLOOM_TEST(tbl,hashv) (1)
 | 
			
		||||
#define HASH_BLOOM_BYTELEN 0U
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define HASH_MAKE_TABLE(hh,head)                                                 \
 | 
			
		||||
#define HASH_MAKE_TABLE(hh,head,oomed)                                           \
 | 
			
		||||
do {                                                                             \
 | 
			
		||||
  (head)->hh.tbl = (UT_hash_table*)uthash_malloc(sizeof(UT_hash_table));         \
 | 
			
		||||
  if (!(head)->hh.tbl) {                                                         \
 | 
			
		||||
    uthash_fatal("out of memory");                                               \
 | 
			
		||||
    HASH_RECORD_OOM(oomed);                                                      \
 | 
			
		||||
  } else {                                                                       \
 | 
			
		||||
    uthash_bzero((head)->hh.tbl, sizeof(UT_hash_table));                         \
 | 
			
		||||
    (head)->hh.tbl->tail = &((head)->hh);                                        \
 | 
			
		||||
    (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS;                      \
 | 
			
		||||
    (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2;            \
 | 
			
		||||
    (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head);                  \
 | 
			
		||||
    (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc(                    \
 | 
			
		||||
        HASH_INITIAL_NUM_BUCKETS * sizeof(struct UT_hash_bucket));               \
 | 
			
		||||
    (head)->hh.tbl->signature = HASH_SIGNATURE;                                  \
 | 
			
		||||
    if (!(head)->hh.tbl->buckets) {                                              \
 | 
			
		||||
      HASH_RECORD_OOM(oomed);                                                    \
 | 
			
		||||
      uthash_free((head)->hh.tbl, sizeof(UT_hash_table));                        \
 | 
			
		||||
    } else {                                                                     \
 | 
			
		||||
      uthash_bzero((head)->hh.tbl->buckets,                                      \
 | 
			
		||||
          HASH_INITIAL_NUM_BUCKETS * sizeof(struct UT_hash_bucket));             \
 | 
			
		||||
      HASH_BLOOM_MAKE((head)->hh.tbl, oomed);                                    \
 | 
			
		||||
      IF_HASH_NONFATAL_OOM(                                                      \
 | 
			
		||||
        if (oomed) {                                                             \
 | 
			
		||||
          uthash_free((head)->hh.tbl->buckets,                                   \
 | 
			
		||||
              HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket));           \
 | 
			
		||||
          uthash_free((head)->hh.tbl, sizeof(UT_hash_table));                    \
 | 
			
		||||
        }                                                                        \
 | 
			
		||||
      )                                                                          \
 | 
			
		||||
    }                                                                            \
 | 
			
		||||
  }                                                                              \
 | 
			
		||||
  uthash_bzero((head)->hh.tbl, sizeof(UT_hash_table));                           \
 | 
			
		||||
  (head)->hh.tbl->tail = &((head)->hh);                                          \
 | 
			
		||||
  (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS;                        \
 | 
			
		||||
  (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2;              \
 | 
			
		||||
  (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head);                    \
 | 
			
		||||
  (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc(                      \
 | 
			
		||||
      HASH_INITIAL_NUM_BUCKETS * sizeof(struct UT_hash_bucket));                 \
 | 
			
		||||
  if (!(head)->hh.tbl->buckets) {                                                \
 | 
			
		||||
    uthash_fatal("out of memory");                                               \
 | 
			
		||||
  }                                                                              \
 | 
			
		||||
  uthash_bzero((head)->hh.tbl->buckets,                                          \
 | 
			
		||||
      HASH_INITIAL_NUM_BUCKETS * sizeof(struct UT_hash_bucket));                 \
 | 
			
		||||
  HASH_BLOOM_MAKE((head)->hh.tbl);                                               \
 | 
			
		||||
  (head)->hh.tbl->signature = HASH_SIGNATURE;                                    \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define HASH_REPLACE_BYHASHVALUE_INORDER(hh,head,fieldname,keylen_in,hashval,add,replaced,cmpfcn) \
 | 
			
		||||
@@ -264,17 +309,58 @@ do {
 | 
			
		||||
} while (0)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#define HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh,head,keyptr,keylen_in,hashval,add,cmpfcn) \
 | 
			
		||||
#if HASH_NONFATAL_OOM
 | 
			
		||||
 | 
			
		||||
#define HASH_ADD_TO_TABLE(hh,head,keyptr,keylen_in,hashval,add,oomed)            \
 | 
			
		||||
do {                                                                             \
 | 
			
		||||
  if (!(oomed)) {                                                                \
 | 
			
		||||
    unsigned _ha_bkt;                                                            \
 | 
			
		||||
    (head)->hh.tbl->num_items++;                                                 \
 | 
			
		||||
    HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt);                  \
 | 
			
		||||
    HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], hh, &(add)->hh, oomed);    \
 | 
			
		||||
    if (oomed) {                                                                 \
 | 
			
		||||
      HASH_ROLLBACK_BKT(hh, head, &(add)->hh);                                   \
 | 
			
		||||
      HASH_DELETE_HH(hh, head, &(add)->hh);                                      \
 | 
			
		||||
      (add)->hh.tbl = NULL;                                                      \
 | 
			
		||||
      uthash_nonfatal_oom(add);                                                  \
 | 
			
		||||
    } else {                                                                     \
 | 
			
		||||
      HASH_BLOOM_ADD((head)->hh.tbl, hashval);                                   \
 | 
			
		||||
      HASH_EMIT_KEY(hh, head, keyptr, keylen_in);                                \
 | 
			
		||||
    }                                                                            \
 | 
			
		||||
  } else {                                                                       \
 | 
			
		||||
    (add)->hh.tbl = NULL;                                                        \
 | 
			
		||||
    uthash_nonfatal_oom(add);                                                    \
 | 
			
		||||
  }                                                                              \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#else
 | 
			
		||||
 | 
			
		||||
#define HASH_ADD_TO_TABLE(hh,head,keyptr,keylen_in,hashval,add,oomed)            \
 | 
			
		||||
do {                                                                             \
 | 
			
		||||
  unsigned _ha_bkt;                                                              \
 | 
			
		||||
  (head)->hh.tbl->num_items++;                                                   \
 | 
			
		||||
  HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt);                    \
 | 
			
		||||
  HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], hh, &(add)->hh, oomed);      \
 | 
			
		||||
  HASH_BLOOM_ADD((head)->hh.tbl, hashval);                                       \
 | 
			
		||||
  HASH_EMIT_KEY(hh, head, keyptr, keylen_in);                                    \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#define HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh,head,keyptr,keylen_in,hashval,add,cmpfcn) \
 | 
			
		||||
do {                                                                             \
 | 
			
		||||
  IF_HASH_NONFATAL_OOM( int _ha_oomed = 0; )                                     \
 | 
			
		||||
  (add)->hh.hashv = (hashval);                                                   \
 | 
			
		||||
  (add)->hh.key = (char*) (keyptr);                                              \
 | 
			
		||||
  (add)->hh.keylen = (unsigned) (keylen_in);                                     \
 | 
			
		||||
  if (!(head)) {                                                                 \
 | 
			
		||||
    (add)->hh.next = NULL;                                                       \
 | 
			
		||||
    (add)->hh.prev = NULL;                                                       \
 | 
			
		||||
    (head) = (add);                                                              \
 | 
			
		||||
    HASH_MAKE_TABLE(hh, head);                                                   \
 | 
			
		||||
    HASH_MAKE_TABLE(hh, add, _ha_oomed);                                         \
 | 
			
		||||
    IF_HASH_NONFATAL_OOM( if (!_ha_oomed) { )                                    \
 | 
			
		||||
      (head) = (add);                                                            \
 | 
			
		||||
    IF_HASH_NONFATAL_OOM( } )                                                    \
 | 
			
		||||
  } else {                                                                       \
 | 
			
		||||
    void *_hs_iter = (head);                                                     \
 | 
			
		||||
    (add)->hh.tbl = (head)->hh.tbl;                                              \
 | 
			
		||||
@@ -291,11 +377,7 @@ do {
 | 
			
		||||
      HASH_APPEND_LIST(hh, head, add);                                           \
 | 
			
		||||
    }                                                                            \
 | 
			
		||||
  }                                                                              \
 | 
			
		||||
  (head)->hh.tbl->num_items++;                                                   \
 | 
			
		||||
  HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt);                    \
 | 
			
		||||
  HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], &(add)->hh);                 \
 | 
			
		||||
  HASH_BLOOM_ADD((head)->hh.tbl, hashval);                                       \
 | 
			
		||||
  HASH_EMIT_KEY(hh, head, keyptr, keylen_in);                                    \
 | 
			
		||||
  HASH_ADD_TO_TABLE(hh, head, keyptr, keylen_in, hashval, add, _ha_oomed);       \
 | 
			
		||||
  HASH_FSCK(hh, head, "HASH_ADD_KEYPTR_BYHASHVALUE_INORDER");                    \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
@@ -314,24 +396,22 @@ do {
 | 
			
		||||
 | 
			
		||||
#define HASH_ADD_KEYPTR_BYHASHVALUE(hh,head,keyptr,keylen_in,hashval,add)        \
 | 
			
		||||
do {                                                                             \
 | 
			
		||||
  unsigned _ha_bkt;                                                              \
 | 
			
		||||
  IF_HASH_NONFATAL_OOM( int _ha_oomed = 0; )                                     \
 | 
			
		||||
  (add)->hh.hashv = (hashval);                                                   \
 | 
			
		||||
  (add)->hh.key = (const void *) (keyptr);                                       \
 | 
			
		||||
  (add)->hh.key = (const void*) (keyptr);                                        \
 | 
			
		||||
  (add)->hh.keylen = (unsigned) (keylen_in);                                     \
 | 
			
		||||
  if (!(head)) {                                                                 \
 | 
			
		||||
    (add)->hh.next = NULL;                                                       \
 | 
			
		||||
    (add)->hh.prev = NULL;                                                       \
 | 
			
		||||
    (head) = (add);                                                              \
 | 
			
		||||
    HASH_MAKE_TABLE(hh, head);                                                   \
 | 
			
		||||
    HASH_MAKE_TABLE(hh, add, _ha_oomed);                                         \
 | 
			
		||||
    IF_HASH_NONFATAL_OOM( if (!_ha_oomed) { )                                    \
 | 
			
		||||
      (head) = (add);                                                            \
 | 
			
		||||
    IF_HASH_NONFATAL_OOM( } )                                                    \
 | 
			
		||||
  } else {                                                                       \
 | 
			
		||||
    (add)->hh.tbl = (head)->hh.tbl;                                              \
 | 
			
		||||
    HASH_APPEND_LIST(hh, head, add);                                             \
 | 
			
		||||
  }                                                                              \
 | 
			
		||||
  (head)->hh.tbl->num_items++;                                                   \
 | 
			
		||||
  HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt);                    \
 | 
			
		||||
  HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], &(add)->hh);                 \
 | 
			
		||||
  HASH_BLOOM_ADD((head)->hh.tbl, hashval);                                       \
 | 
			
		||||
  HASH_EMIT_KEY(hh, head, keyptr, keylen_in);                                    \
 | 
			
		||||
  HASH_ADD_TO_TABLE(hh, head, keyptr, keylen_in, hashval, add, _ha_oomed);       \
 | 
			
		||||
  HASH_FSCK(hh, head, "HASH_ADD_KEYPTR_BYHASHVALUE");                            \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
@@ -394,17 +474,25 @@ do {
 | 
			
		||||
    HASH_DEL_IN_BKT((head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del);               \
 | 
			
		||||
    (head)->hh.tbl->num_items--;                                                 \
 | 
			
		||||
  }                                                                              \
 | 
			
		||||
  HASH_FSCK(hh, head, "HASH_DELETE");                                            \
 | 
			
		||||
  HASH_FSCK(hh, head, "HASH_DELETE_HH");                                         \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
/* convenience forms of HASH_FIND/HASH_ADD/HASH_DEL */
 | 
			
		||||
#define HASH_FIND_STR(head,findstr,out)                                          \
 | 
			
		||||
    HASH_FIND(hh,head,findstr,(unsigned)uthash_strlen(findstr),out)
 | 
			
		||||
do {                                                                             \
 | 
			
		||||
    unsigned _uthash_hfstr_keylen = (unsigned)uthash_strlen(findstr);            \
 | 
			
		||||
    HASH_FIND(hh, head, findstr, _uthash_hfstr_keylen, out);                     \
 | 
			
		||||
} while (0)
 | 
			
		||||
#define HASH_ADD_STR(head,strfield,add)                                          \
 | 
			
		||||
    HASH_ADD(hh,head,strfield[0],(unsigned)uthash_strlen(add->strfield),add)
 | 
			
		||||
do {                                                                             \
 | 
			
		||||
    unsigned _uthash_hastr_keylen = (unsigned)uthash_strlen((add)->strfield);    \
 | 
			
		||||
    HASH_ADD(hh, head, strfield[0], _uthash_hastr_keylen, add);                  \
 | 
			
		||||
} while (0)
 | 
			
		||||
#define HASH_REPLACE_STR(head,strfield,add,replaced)                             \
 | 
			
		||||
    HASH_REPLACE(hh,head,strfield[0],(unsigned)uthash_strlen(add->strfield),add,replaced)
 | 
			
		||||
do {                                                                             \
 | 
			
		||||
    unsigned _uthash_hrstr_keylen = (unsigned)uthash_strlen((add)->strfield);    \
 | 
			
		||||
    HASH_REPLACE(hh, head, strfield[0], _uthash_hrstr_keylen, add, replaced);    \
 | 
			
		||||
} while (0)
 | 
			
		||||
#define HASH_FIND_INT(head,findint,out)                                          \
 | 
			
		||||
    HASH_FIND(hh,head,findint,sizeof(int),out)
 | 
			
		||||
#define HASH_ADD_INT(head,intfield,add)                                          \
 | 
			
		||||
@@ -424,7 +512,8 @@ do {
 | 
			
		||||
 * This is for uthash developer only; it compiles away if HASH_DEBUG isn't defined.
 | 
			
		||||
 */
 | 
			
		||||
#ifdef HASH_DEBUG
 | 
			
		||||
#define HASH_OOPS(...) do { fprintf(stderr,__VA_ARGS__); exit(-1); } while (0)
 | 
			
		||||
#include <stdio.h>   /* fprintf, stderr */
 | 
			
		||||
#define HASH_OOPS(...) do { fprintf(stderr, __VA_ARGS__); exit(-1); } while (0)
 | 
			
		||||
#define HASH_FSCK(hh,head,where)                                                 \
 | 
			
		||||
do {                                                                             \
 | 
			
		||||
  struct UT_hash_handle *_thh;                                                   \
 | 
			
		||||
@@ -491,13 +580,6 @@ do {
 | 
			
		||||
#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* default to Jenkin's hash unless overridden e.g. DHASH_FUNCTION=HASH_SAX */
 | 
			
		||||
#ifdef HASH_FUNCTION
 | 
			
		||||
#define HASH_FCN HASH_FUNCTION
 | 
			
		||||
#else
 | 
			
		||||
#define HASH_FCN HASH_JEN
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
/* The Bernstein hash function, used in Perl prior to v5.6. Note (x<<5+x)=x*33. */
 | 
			
		||||
#define HASH_BER(key,keylen,hashv)                                               \
 | 
			
		||||
do {                                                                             \
 | 
			
		||||
@@ -596,8 +678,8 @@ do {
 | 
			
		||||
    case 4:  _hj_i += ( (unsigned)_hj_key[3] << 24 );  /* FALLTHROUGH */         \
 | 
			
		||||
    case 3:  _hj_i += ( (unsigned)_hj_key[2] << 16 );  /* FALLTHROUGH */         \
 | 
			
		||||
    case 2:  _hj_i += ( (unsigned)_hj_key[1] << 8 );   /* FALLTHROUGH */         \
 | 
			
		||||
    case 1:  _hj_i += _hj_key[0];                                                \
 | 
			
		||||
    default: ;                                         /* does not happen */     \
 | 
			
		||||
    case 1:  _hj_i += _hj_key[0];                      /* FALLTHROUGH */         \
 | 
			
		||||
    default: ;                                                                   \
 | 
			
		||||
  }                                                                              \
 | 
			
		||||
  HASH_JEN_MIX(_hj_i, _hj_j, hashv);                                             \
 | 
			
		||||
} while (0)
 | 
			
		||||
@@ -645,6 +727,8 @@ do {
 | 
			
		||||
    case 1: hashv += *_sfh_key;                                                  \
 | 
			
		||||
            hashv ^= hashv << 10;                                                \
 | 
			
		||||
            hashv += hashv >> 1;                                                 \
 | 
			
		||||
            break;                                                               \
 | 
			
		||||
    default: ;                                                                   \
 | 
			
		||||
  }                                                                              \
 | 
			
		||||
                                                                                 \
 | 
			
		||||
  /* Force "avalanching" of final 127 bits */                                    \
 | 
			
		||||
@@ -656,87 +740,6 @@ do {
 | 
			
		||||
  hashv += hashv >> 6;                                                           \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#ifdef HASH_USING_NO_STRICT_ALIASING
 | 
			
		||||
/* The MurmurHash exploits some CPU's (x86,x86_64) tolerance for unaligned reads.
 | 
			
		||||
 * For other types of CPU's (e.g. Sparc) an unaligned read causes a bus error.
 | 
			
		||||
 * MurmurHash uses the faster approach only on CPU's where we know it's safe.
 | 
			
		||||
 *
 | 
			
		||||
 * Note the preprocessor built-in defines can be emitted using:
 | 
			
		||||
 *
 | 
			
		||||
 *   gcc -m64 -dM -E - < /dev/null                  (on gcc)
 | 
			
		||||
 *   cc -## a.c (where a.c is a simple test file)   (Sun Studio)
 | 
			
		||||
 */
 | 
			
		||||
#if (defined(__i386__) || defined(__x86_64__)  || defined(_M_IX86))
 | 
			
		||||
#define MUR_GETBLOCK(p,i) p[i]
 | 
			
		||||
#else /* non intel */
 | 
			
		||||
#define MUR_PLUS0_ALIGNED(p) (((unsigned long)p & 3UL) == 0UL)
 | 
			
		||||
#define MUR_PLUS1_ALIGNED(p) (((unsigned long)p & 3UL) == 1UL)
 | 
			
		||||
#define MUR_PLUS2_ALIGNED(p) (((unsigned long)p & 3UL) == 2UL)
 | 
			
		||||
#define MUR_PLUS3_ALIGNED(p) (((unsigned long)p & 3UL) == 3UL)
 | 
			
		||||
#define WP(p) ((uint32_t*)((unsigned long)(p) & ~3UL))
 | 
			
		||||
#if (defined(__BIG_ENDIAN__) || defined(SPARC) || defined(__ppc__) || defined(__ppc64__))
 | 
			
		||||
#define MUR_THREE_ONE(p) ((((*WP(p))&0x00ffffff) << 8) | (((*(WP(p)+1))&0xff000000) >> 24))
 | 
			
		||||
#define MUR_TWO_TWO(p)   ((((*WP(p))&0x0000ffff) <<16) | (((*(WP(p)+1))&0xffff0000) >> 16))
 | 
			
		||||
#define MUR_ONE_THREE(p) ((((*WP(p))&0x000000ff) <<24) | (((*(WP(p)+1))&0xffffff00) >>  8))
 | 
			
		||||
#else /* assume little endian non-intel */
 | 
			
		||||
#define MUR_THREE_ONE(p) ((((*WP(p))&0xffffff00) >> 8) | (((*(WP(p)+1))&0x000000ff) << 24))
 | 
			
		||||
#define MUR_TWO_TWO(p)   ((((*WP(p))&0xffff0000) >>16) | (((*(WP(p)+1))&0x0000ffff) << 16))
 | 
			
		||||
#define MUR_ONE_THREE(p) ((((*WP(p))&0xff000000) >>24) | (((*(WP(p)+1))&0x00ffffff) <<  8))
 | 
			
		||||
#endif
 | 
			
		||||
#define MUR_GETBLOCK(p,i) (MUR_PLUS0_ALIGNED(p) ? ((p)[i]) :           \
 | 
			
		||||
                            (MUR_PLUS1_ALIGNED(p) ? MUR_THREE_ONE(p) : \
 | 
			
		||||
                             (MUR_PLUS2_ALIGNED(p) ? MUR_TWO_TWO(p) :  \
 | 
			
		||||
                                                      MUR_ONE_THREE(p))))
 | 
			
		||||
#endif
 | 
			
		||||
#define MUR_ROTL32(x,r) (((x) << (r)) | ((x) >> (32 - (r))))
 | 
			
		||||
#define MUR_FMIX(_h) \
 | 
			
		||||
do {                 \
 | 
			
		||||
  _h ^= _h >> 16;    \
 | 
			
		||||
  _h *= 0x85ebca6bu; \
 | 
			
		||||
  _h ^= _h >> 13;    \
 | 
			
		||||
  _h *= 0xc2b2ae35u; \
 | 
			
		||||
  _h ^= _h >> 16;    \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define HASH_MUR(key,keylen,hashv)                                     \
 | 
			
		||||
do {                                                                   \
 | 
			
		||||
  const uint8_t *_mur_data = (const uint8_t*)(key);                    \
 | 
			
		||||
  const int _mur_nblocks = (int)(keylen) / 4;                          \
 | 
			
		||||
  uint32_t _mur_h1 = 0xf88D5353u;                                      \
 | 
			
		||||
  uint32_t _mur_c1 = 0xcc9e2d51u;                                      \
 | 
			
		||||
  uint32_t _mur_c2 = 0x1b873593u;                                      \
 | 
			
		||||
  uint32_t _mur_k1 = 0;                                                \
 | 
			
		||||
  const uint8_t *_mur_tail;                                            \
 | 
			
		||||
  const uint32_t *_mur_blocks = (const uint32_t*)(_mur_data+(_mur_nblocks*4)); \
 | 
			
		||||
  int _mur_i;                                                          \
 | 
			
		||||
  for (_mur_i = -_mur_nblocks; _mur_i != 0; _mur_i++) {                \
 | 
			
		||||
    _mur_k1 = MUR_GETBLOCK(_mur_blocks,_mur_i);                        \
 | 
			
		||||
    _mur_k1 *= _mur_c1;                                                \
 | 
			
		||||
    _mur_k1 = MUR_ROTL32(_mur_k1,15);                                  \
 | 
			
		||||
    _mur_k1 *= _mur_c2;                                                \
 | 
			
		||||
                                                                       \
 | 
			
		||||
    _mur_h1 ^= _mur_k1;                                                \
 | 
			
		||||
    _mur_h1 = MUR_ROTL32(_mur_h1,13);                                  \
 | 
			
		||||
    _mur_h1 = (_mur_h1*5U) + 0xe6546b64u;                              \
 | 
			
		||||
  }                                                                    \
 | 
			
		||||
  _mur_tail = (const uint8_t*)(_mur_data + (_mur_nblocks*4));          \
 | 
			
		||||
  _mur_k1=0;                                                           \
 | 
			
		||||
  switch ((keylen) & 3U) {                                             \
 | 
			
		||||
    case 0: break;                                                     \
 | 
			
		||||
    case 3: _mur_k1 ^= (uint32_t)_mur_tail[2] << 16; /* FALLTHROUGH */ \
 | 
			
		||||
    case 2: _mur_k1 ^= (uint32_t)_mur_tail[1] << 8;  /* FALLTHROUGH */ \
 | 
			
		||||
    case 1: _mur_k1 ^= (uint32_t)_mur_tail[0];                         \
 | 
			
		||||
    _mur_k1 *= _mur_c1;                                                \
 | 
			
		||||
    _mur_k1 = MUR_ROTL32(_mur_k1,15);                                  \
 | 
			
		||||
    _mur_k1 *= _mur_c2;                                                \
 | 
			
		||||
    _mur_h1 ^= _mur_k1;                                                \
 | 
			
		||||
  }                                                                    \
 | 
			
		||||
  _mur_h1 ^= (uint32_t)(keylen);                                       \
 | 
			
		||||
  MUR_FMIX(_mur_h1);                                                   \
 | 
			
		||||
  hashv = _mur_h1;                                                     \
 | 
			
		||||
} while (0)
 | 
			
		||||
#endif  /* HASH_USING_NO_STRICT_ALIASING */
 | 
			
		||||
 | 
			
		||||
/* iterate over items in a known bucket to find desired item */
 | 
			
		||||
#define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,hashval,out)               \
 | 
			
		||||
do {                                                                             \
 | 
			
		||||
@@ -747,7 +750,7 @@ do {
 | 
			
		||||
  }                                                                              \
 | 
			
		||||
  while ((out) != NULL) {                                                        \
 | 
			
		||||
    if ((out)->hh.hashv == (hashval) && (out)->hh.keylen == (keylen_in)) {       \
 | 
			
		||||
      if (uthash_memcmp((out)->hh.key, keyptr, keylen_in) == 0) {                \
 | 
			
		||||
      if (HASH_KEYCMP((out)->hh.key, keyptr, keylen_in) == 0) {                  \
 | 
			
		||||
        break;                                                                   \
 | 
			
		||||
      }                                                                          \
 | 
			
		||||
    }                                                                            \
 | 
			
		||||
@@ -760,7 +763,7 @@ do {
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
/* add an item to a bucket  */
 | 
			
		||||
#define HASH_ADD_TO_BKT(head,addhh)                                              \
 | 
			
		||||
#define HASH_ADD_TO_BKT(head,hh,addhh,oomed)                                     \
 | 
			
		||||
do {                                                                             \
 | 
			
		||||
  UT_hash_bucket *_ha_head = &(head);                                            \
 | 
			
		||||
  _ha_head->count++;                                                             \
 | 
			
		||||
@@ -772,7 +775,12 @@ do {
 | 
			
		||||
  _ha_head->hh_head = (addhh);                                                   \
 | 
			
		||||
  if ((_ha_head->count >= ((_ha_head->expand_mult + 1U) * HASH_BKT_CAPACITY_THRESH)) \
 | 
			
		||||
      && !(addhh)->tbl->noexpand) {                                              \
 | 
			
		||||
    HASH_EXPAND_BUCKETS((addhh)->tbl);                                           \
 | 
			
		||||
    HASH_EXPAND_BUCKETS(addhh,(addhh)->tbl, oomed);                              \
 | 
			
		||||
    IF_HASH_NONFATAL_OOM(                                                        \
 | 
			
		||||
      if (oomed) {                                                               \
 | 
			
		||||
        HASH_DEL_IN_BKT(head,addhh);                                             \
 | 
			
		||||
      }                                                                          \
 | 
			
		||||
    )                                                                            \
 | 
			
		||||
  }                                                                              \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
@@ -821,53 +829,56 @@ do {
 | 
			
		||||
 *      ceil(n/b) = (n>>lb) + ( (n & (b-1)) ? 1:0)
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
#define HASH_EXPAND_BUCKETS(tbl)                                                 \
 | 
			
		||||
#define HASH_EXPAND_BUCKETS(hh,tbl,oomed)                                        \
 | 
			
		||||
do {                                                                             \
 | 
			
		||||
  unsigned _he_bkt;                                                              \
 | 
			
		||||
  unsigned _he_bkt_i;                                                            \
 | 
			
		||||
  struct UT_hash_handle *_he_thh, *_he_hh_nxt;                                   \
 | 
			
		||||
  UT_hash_bucket *_he_new_buckets, *_he_newbkt;                                  \
 | 
			
		||||
  _he_new_buckets = (UT_hash_bucket*)uthash_malloc(                              \
 | 
			
		||||
           2UL * (tbl)->num_buckets * sizeof(struct UT_hash_bucket));            \
 | 
			
		||||
           sizeof(struct UT_hash_bucket) * (tbl)->num_buckets * 2U);             \
 | 
			
		||||
  if (!_he_new_buckets) {                                                        \
 | 
			
		||||
    uthash_fatal("out of memory");                                               \
 | 
			
		||||
  }                                                                              \
 | 
			
		||||
  uthash_bzero(_he_new_buckets,                                                  \
 | 
			
		||||
          2UL * (tbl)->num_buckets * sizeof(struct UT_hash_bucket));             \
 | 
			
		||||
  (tbl)->ideal_chain_maxlen =                                                    \
 | 
			
		||||
     ((tbl)->num_items >> ((tbl)->log2_num_buckets+1U)) +                        \
 | 
			
		||||
     ((((tbl)->num_items & (((tbl)->num_buckets*2U)-1U)) != 0U) ? 1U : 0U);      \
 | 
			
		||||
  (tbl)->nonideal_items = 0;                                                     \
 | 
			
		||||
  for (_he_bkt_i = 0; _he_bkt_i < (tbl)->num_buckets; _he_bkt_i++) {             \
 | 
			
		||||
    _he_thh = (tbl)->buckets[ _he_bkt_i ].hh_head;                               \
 | 
			
		||||
    while (_he_thh != NULL) {                                                    \
 | 
			
		||||
      _he_hh_nxt = _he_thh->hh_next;                                             \
 | 
			
		||||
      HASH_TO_BKT(_he_thh->hashv, (tbl)->num_buckets * 2U, _he_bkt);             \
 | 
			
		||||
      _he_newbkt = &(_he_new_buckets[_he_bkt]);                                  \
 | 
			
		||||
      if (++(_he_newbkt->count) > (tbl)->ideal_chain_maxlen) {                   \
 | 
			
		||||
        (tbl)->nonideal_items++;                                                 \
 | 
			
		||||
        _he_newbkt->expand_mult = _he_newbkt->count / (tbl)->ideal_chain_maxlen; \
 | 
			
		||||
    HASH_RECORD_OOM(oomed);                                                      \
 | 
			
		||||
  } else {                                                                       \
 | 
			
		||||
    uthash_bzero(_he_new_buckets,                                                \
 | 
			
		||||
        sizeof(struct UT_hash_bucket) * (tbl)->num_buckets * 2U);                \
 | 
			
		||||
    (tbl)->ideal_chain_maxlen =                                                  \
 | 
			
		||||
       ((tbl)->num_items >> ((tbl)->log2_num_buckets+1U)) +                      \
 | 
			
		||||
       ((((tbl)->num_items & (((tbl)->num_buckets*2U)-1U)) != 0U) ? 1U : 0U);    \
 | 
			
		||||
    (tbl)->nonideal_items = 0;                                                   \
 | 
			
		||||
    for (_he_bkt_i = 0; _he_bkt_i < (tbl)->num_buckets; _he_bkt_i++) {           \
 | 
			
		||||
      _he_thh = (tbl)->buckets[ _he_bkt_i ].hh_head;                             \
 | 
			
		||||
      while (_he_thh != NULL) {                                                  \
 | 
			
		||||
        _he_hh_nxt = _he_thh->hh_next;                                           \
 | 
			
		||||
        HASH_TO_BKT(_he_thh->hashv, (tbl)->num_buckets * 2U, _he_bkt);           \
 | 
			
		||||
        _he_newbkt = &(_he_new_buckets[_he_bkt]);                                \
 | 
			
		||||
        if (++(_he_newbkt->count) > (tbl)->ideal_chain_maxlen) {                 \
 | 
			
		||||
          (tbl)->nonideal_items++;                                               \
 | 
			
		||||
          if (_he_newbkt->count > _he_newbkt->expand_mult * (tbl)->ideal_chain_maxlen) { \
 | 
			
		||||
            _he_newbkt->expand_mult++;                                           \
 | 
			
		||||
          }                                                                      \
 | 
			
		||||
        }                                                                        \
 | 
			
		||||
        _he_thh->hh_prev = NULL;                                                 \
 | 
			
		||||
        _he_thh->hh_next = _he_newbkt->hh_head;                                  \
 | 
			
		||||
        if (_he_newbkt->hh_head != NULL) {                                       \
 | 
			
		||||
          _he_newbkt->hh_head->hh_prev = _he_thh;                                \
 | 
			
		||||
        }                                                                        \
 | 
			
		||||
        _he_newbkt->hh_head = _he_thh;                                           \
 | 
			
		||||
        _he_thh = _he_hh_nxt;                                                    \
 | 
			
		||||
      }                                                                          \
 | 
			
		||||
      _he_thh->hh_prev = NULL;                                                   \
 | 
			
		||||
      _he_thh->hh_next = _he_newbkt->hh_head;                                    \
 | 
			
		||||
      if (_he_newbkt->hh_head != NULL) {                                         \
 | 
			
		||||
        _he_newbkt->hh_head->hh_prev = _he_thh;                                  \
 | 
			
		||||
      }                                                                          \
 | 
			
		||||
      _he_newbkt->hh_head = _he_thh;                                             \
 | 
			
		||||
      _he_thh = _he_hh_nxt;                                                      \
 | 
			
		||||
    }                                                                            \
 | 
			
		||||
    uthash_free((tbl)->buckets, (tbl)->num_buckets * sizeof(struct UT_hash_bucket)); \
 | 
			
		||||
    (tbl)->num_buckets *= 2U;                                                    \
 | 
			
		||||
    (tbl)->log2_num_buckets++;                                                   \
 | 
			
		||||
    (tbl)->buckets = _he_new_buckets;                                            \
 | 
			
		||||
    (tbl)->ineff_expands = ((tbl)->nonideal_items > ((tbl)->num_items >> 1)) ?   \
 | 
			
		||||
        ((tbl)->ineff_expands+1U) : 0U;                                          \
 | 
			
		||||
    if ((tbl)->ineff_expands > 1U) {                                             \
 | 
			
		||||
      (tbl)->noexpand = 1;                                                       \
 | 
			
		||||
      uthash_noexpand_fyi(tbl);                                                  \
 | 
			
		||||
    }                                                                            \
 | 
			
		||||
    uthash_expand_fyi(tbl);                                                      \
 | 
			
		||||
  }                                                                              \
 | 
			
		||||
  uthash_free((tbl)->buckets, (tbl)->num_buckets * sizeof(struct UT_hash_bucket)); \
 | 
			
		||||
  (tbl)->num_buckets *= 2U;                                                      \
 | 
			
		||||
  (tbl)->log2_num_buckets++;                                                     \
 | 
			
		||||
  (tbl)->buckets = _he_new_buckets;                                              \
 | 
			
		||||
  (tbl)->ineff_expands = ((tbl)->nonideal_items > ((tbl)->num_items >> 1)) ?     \
 | 
			
		||||
      ((tbl)->ineff_expands+1U) : 0U;                                            \
 | 
			
		||||
  if ((tbl)->ineff_expands > 1U) {                                               \
 | 
			
		||||
    (tbl)->noexpand = 1;                                                         \
 | 
			
		||||
    uthash_noexpand_fyi(tbl);                                                    \
 | 
			
		||||
  }                                                                              \
 | 
			
		||||
  uthash_expand_fyi(tbl);                                                        \
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -977,7 +988,8 @@ do {
 | 
			
		||||
        _src_hh = _src_hh->hh_next) {                                            \
 | 
			
		||||
        _elt = ELMT_FROM_HH((src)->hh_src.tbl, _src_hh);                         \
 | 
			
		||||
        if (cond(_elt)) {                                                        \
 | 
			
		||||
          _dst_hh = (UT_hash_handle*)(((char*)_elt) + _dst_hho);                 \
 | 
			
		||||
          IF_HASH_NONFATAL_OOM( int _hs_oomed = 0; )                             \
 | 
			
		||||
          _dst_hh = (UT_hash_handle*)(void*)(((char*)_elt) + _dst_hho);          \
 | 
			
		||||
          _dst_hh->key = _src_hh->key;                                           \
 | 
			
		||||
          _dst_hh->keylen = _src_hh->keylen;                                     \
 | 
			
		||||
          _dst_hh->hashv = _src_hh->hashv;                                       \
 | 
			
		||||
@@ -988,14 +1000,30 @@ do {
 | 
			
		||||
          }                                                                      \
 | 
			
		||||
          if ((dst) == NULL) {                                                   \
 | 
			
		||||
            DECLTYPE_ASSIGN(dst, _elt);                                          \
 | 
			
		||||
            HASH_MAKE_TABLE(hh_dst, dst);                                        \
 | 
			
		||||
            HASH_MAKE_TABLE(hh_dst, dst, _hs_oomed);                             \
 | 
			
		||||
            IF_HASH_NONFATAL_OOM(                                                \
 | 
			
		||||
              if (_hs_oomed) {                                                   \
 | 
			
		||||
                uthash_nonfatal_oom(_elt);                                       \
 | 
			
		||||
                (dst) = NULL;                                                    \
 | 
			
		||||
                continue;                                                        \
 | 
			
		||||
              }                                                                  \
 | 
			
		||||
            )                                                                    \
 | 
			
		||||
          } else {                                                               \
 | 
			
		||||
            _dst_hh->tbl = (dst)->hh_dst.tbl;                                    \
 | 
			
		||||
          }                                                                      \
 | 
			
		||||
          HASH_TO_BKT(_dst_hh->hashv, _dst_hh->tbl->num_buckets, _dst_bkt);      \
 | 
			
		||||
          HASH_ADD_TO_BKT(_dst_hh->tbl->buckets[_dst_bkt], _dst_hh);             \
 | 
			
		||||
          HASH_BLOOM_ADD(_dst_hh->tbl, _dst_hh->hashv);                          \
 | 
			
		||||
          HASH_ADD_TO_BKT(_dst_hh->tbl->buckets[_dst_bkt], hh_dst, _dst_hh, _hs_oomed); \
 | 
			
		||||
          (dst)->hh_dst.tbl->num_items++;                                        \
 | 
			
		||||
          IF_HASH_NONFATAL_OOM(                                                  \
 | 
			
		||||
            if (_hs_oomed) {                                                     \
 | 
			
		||||
              HASH_ROLLBACK_BKT(hh_dst, dst, _dst_hh);                           \
 | 
			
		||||
              HASH_DELETE_HH(hh_dst, dst, _dst_hh);                              \
 | 
			
		||||
              _dst_hh->tbl = NULL;                                               \
 | 
			
		||||
              uthash_nonfatal_oom(_elt);                                         \
 | 
			
		||||
              continue;                                                          \
 | 
			
		||||
            }                                                                    \
 | 
			
		||||
          )                                                                      \
 | 
			
		||||
          HASH_BLOOM_ADD(_dst_hh->tbl, _dst_hh->hashv);                          \
 | 
			
		||||
          _last_elt = _elt;                                                      \
 | 
			
		||||
          _last_elt_hh = _dst_hh;                                                \
 | 
			
		||||
        }                                                                        \
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
/*
 | 
			
		||||
Copyright (c) 2007-2017, Troy D. Hanson   http://troydhanson.github.com/uthash/
 | 
			
		||||
Copyright (c) 2007-2021, Troy D. Hanson   http://troydhanson.github.io/uthash/
 | 
			
		||||
All rights reserved.
 | 
			
		||||
 | 
			
		||||
Redistribution and use in source and binary forms, with or without
 | 
			
		||||
@@ -24,7 +24,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | 
			
		||||
#ifndef UTLIST_H
 | 
			
		||||
#define UTLIST_H
 | 
			
		||||
 | 
			
		||||
#define UTLIST_VERSION 2.0.2
 | 
			
		||||
#define UTLIST_VERSION 2.3.0
 | 
			
		||||
 | 
			
		||||
#include <assert.h>
 | 
			
		||||
 | 
			
		||||
@@ -358,8 +358,8 @@ do {
 | 
			
		||||
do {                                                                                           \
 | 
			
		||||
  LDECLTYPE(head) _tmp;                                                                        \
 | 
			
		||||
  if (head) {                                                                                  \
 | 
			
		||||
    LL_LOWER_BOUND(head, _tmp, add, cmp);                                                      \
 | 
			
		||||
    LL_APPEND_ELEM(head, _tmp, add);                                                           \
 | 
			
		||||
    LL_LOWER_BOUND2(head, _tmp, add, cmp, next);                                               \
 | 
			
		||||
    LL_APPEND_ELEM2(head, _tmp, add, next);                                                    \
 | 
			
		||||
  } else {                                                                                     \
 | 
			
		||||
    (head) = (add);                                                                            \
 | 
			
		||||
    (head)->next = NULL;                                                                       \
 | 
			
		||||
@@ -651,14 +651,14 @@ do {
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define DL_INSERT_INORDER(head,add,cmp)                                                        \
 | 
			
		||||
    DL_INSERT_INORDER2(head,add,cmp,next)
 | 
			
		||||
    DL_INSERT_INORDER2(head,add,cmp,prev,next)
 | 
			
		||||
 | 
			
		||||
#define DL_INSERT_INORDER2(head,add,cmp,next)                                                  \
 | 
			
		||||
#define DL_INSERT_INORDER2(head,add,cmp,prev,next)                                             \
 | 
			
		||||
do {                                                                                           \
 | 
			
		||||
  LDECLTYPE(head) _tmp;                                                                        \
 | 
			
		||||
  if (head) {                                                                                  \
 | 
			
		||||
    DL_LOWER_BOUND(head, _tmp, add, cmp);                                                      \
 | 
			
		||||
    DL_APPEND_ELEM(head, _tmp, add);                                                           \
 | 
			
		||||
    DL_LOWER_BOUND2(head, _tmp, add, cmp, next);                                               \
 | 
			
		||||
    DL_APPEND_ELEM2(head, _tmp, add, prev, next);                                              \
 | 
			
		||||
  } else {                                                                                     \
 | 
			
		||||
    (head) = (add);                                                                            \
 | 
			
		||||
    (head)->prev = (head);                                                                     \
 | 
			
		||||
@@ -825,7 +825,7 @@ do {
 | 
			
		||||
/* Here are VS2008 / NO_DECLTYPE replacements for a few functions */
 | 
			
		||||
 | 
			
		||||
#undef DL_INSERT_INORDER2
 | 
			
		||||
#define DL_INSERT_INORDER2(head,add,cmp,next)                                                  \
 | 
			
		||||
#define DL_INSERT_INORDER2(head,add,cmp,prev,next)                                             \
 | 
			
		||||
do {                                                                                           \
 | 
			
		||||
  if ((head) == NULL) {                                                                        \
 | 
			
		||||
    (add)->prev = (add);                                                                       \
 | 
			
		||||
@@ -838,7 +838,7 @@ do {
 | 
			
		||||
    (head) = (add);                                                                            \
 | 
			
		||||
  } else {                                                                                     \
 | 
			
		||||
    char *_tmp = (char*)(head);                                                                \
 | 
			
		||||
    while ((char*)(head)->next != _tmp && (cmp((head)->next, add)) < 0) {                      \
 | 
			
		||||
    while ((head)->next && (cmp((head)->next, add)) < 0) {                                     \
 | 
			
		||||
      (head) = (head)->next;                                                                   \
 | 
			
		||||
    }                                                                                          \
 | 
			
		||||
    (add)->prev = (head);                                                                      \
 | 
			
		||||
@@ -892,14 +892,14 @@ do {
 | 
			
		||||
} while (0)
 | 
			
		||||
 | 
			
		||||
#define CDL_INSERT_INORDER(head,add,cmp)                                                       \
 | 
			
		||||
    CDL_INSERT_INORDER2(head,add,cmp,next)
 | 
			
		||||
    CDL_INSERT_INORDER2(head,add,cmp,prev,next)
 | 
			
		||||
 | 
			
		||||
#define CDL_INSERT_INORDER2(head,add,cmp,next)                                                 \
 | 
			
		||||
#define CDL_INSERT_INORDER2(head,add,cmp,prev,next)                                            \
 | 
			
		||||
do {                                                                                           \
 | 
			
		||||
  LDECLTYPE(head) _tmp;                                                                        \
 | 
			
		||||
  if (head) {                                                                                  \
 | 
			
		||||
    CDL_LOWER_BOUND(head, _tmp, add, cmp);                                                     \
 | 
			
		||||
    CDL_APPEND_ELEM(head, _tmp, add);                                                          \
 | 
			
		||||
    CDL_LOWER_BOUND2(head, _tmp, add, cmp, next);                                              \
 | 
			
		||||
    CDL_APPEND_ELEM2(head, _tmp, add, prev, next);                                             \
 | 
			
		||||
  } else {                                                                                     \
 | 
			
		||||
    (head) = (add);                                                                            \
 | 
			
		||||
    (head)->next = (head);                                                                     \
 | 
			
		||||
@@ -1044,7 +1044,7 @@ do {
 | 
			
		||||
/* Here are VS2008 / NO_DECLTYPE replacements for a few functions */
 | 
			
		||||
 | 
			
		||||
#undef CDL_INSERT_INORDER2
 | 
			
		||||
#define CDL_INSERT_INORDER2(head,add,cmp,next)                                                 \
 | 
			
		||||
#define CDL_INSERT_INORDER2(head,add,cmp,prev,next)                                            \
 | 
			
		||||
do {                                                                                           \
 | 
			
		||||
  if ((head) == NULL) {                                                                        \
 | 
			
		||||
    (add)->prev = (add);                                                                       \
 | 
			
		||||
		Reference in New Issue
	
	Block a user