From 382af40f508158f101031ef688fe280bdefd8f20 Mon Sep 17 00:00:00 2001 From: Eduardo Montoya Date: Fri, 11 Feb 2022 08:30:09 +0100 Subject: [PATCH] openthread: add libraries based on commit ce77ab3c Update OpenThread libraries with newest commit and remove the ones not intended for certification. Include nRF52840 Thread 1.2 libraries as well. Signed-off-by: Eduardo Montoya --- .../include/openthread/backbone_router_ftd.h | 17 +- openthread/include/openthread/border_router.h | 17 + openthread/include/openthread/coap.h | 9 + .../include/openthread/history_tracker.h | 79 +- openthread/include/openthread/instance.h | 2 +- openthread/include/openthread/ip6.h | 4 +- openthread/include/openthread/joiner.h | 16 +- openthread/include/openthread/link.h | 27 + .../include/openthread/platform/crypto.h | 29 +- .../openthread/platform/dso_transport.h | 202 + .../include/openthread/platform/logging.h | 3 - .../include/openthread/platform/radio.h | 8 +- .../include/openthread/platform/settings.h | 3 +- openthread/include/openthread/platform/trel.h | 209 + openthread/include/openthread/random_crypto.h | 7 - openthread/include/openthread/tcp.h | 49 +- openthread/include/openthread/thread_ftd.h | 12 + openthread/include/openthread/trel.h | 168 + .../v1.1/ftd/cc312/libopenthread-cli-ftd.a | Bin 201768 -> 0 bytes .../v1.1/ftd/cc312/libopenthread-cli-mtd.a | Bin 177696 -> 0 bytes .../v1.1/ftd/cc312/libopenthread-ftd.a | Bin 1217962 -> 0 bytes .../v1.1/ftd/cc312/libopenthread-mtd.a | Bin 963530 -> 0 bytes .../v1.1/ftd/oberon/libopenthread-cli-ftd.a | Bin 0 -> 195076 bytes .../v1.1/ftd/oberon/libopenthread-ftd.a | Bin 0 -> 1249606 bytes .../nrf_security_mbedtls_configuration.h | 1234 ++---- .../oberon}/openthread_lib_configuration.txt | 33 +- .../v1.1/master/cc312/libopenthread-cli-ftd.a | Bin 224854 -> 0 bytes .../v1.1/master/cc312/libopenthread-cli-mtd.a | Bin 185656 -> 0 bytes .../v1.1/master/cc312/libopenthread-ftd.a | Bin 1341548 -> 0 bytes .../v1.1/master/cc312/libopenthread-mtd.a | Bin 1041382 -> 0 bytes .../cc312/openthread_lib_configuration.txt | 158 - .../v1.1/mtd/cc312/libopenthread-cli-ftd.a | Bin 199914 -> 0 bytes .../v1.1/mtd/cc312/libopenthread-cli-mtd.a | Bin 175842 -> 0 bytes .../v1.1/mtd/cc312/libopenthread-ftd.a | Bin 1208846 -> 0 bytes .../v1.1/mtd/cc312/libopenthread-mtd.a | Bin 950808 -> 0 bytes .../nrf_security_mbedtls_configuration.h | 3924 ----------------- .../v1.1/mtd/oberon/libopenthread-cli-mtd.a | Bin 0 -> 171348 bytes .../v1.1/mtd/oberon/libopenthread-mtd.a | Bin 0 -> 991558 bytes .../nrf_security_mbedtls_configuration.h | 1234 ++---- .../oberon}/openthread_lib_configuration.txt | 43 +- .../v1.1/ftd/cc310/libopenthread-cli-ftd.a | Bin 201688 -> 0 bytes .../v1.1/ftd/cc310/libopenthread-cli-mtd.a | Bin 177616 -> 0 bytes .../v1.1/ftd/cc310/libopenthread-ftd.a | Bin 1217050 -> 0 bytes .../v1.1/ftd/cc310/libopenthread-hdlc.a | Bin 4652 -> 0 bytes .../v1.1/ftd/cc310/libopenthread-mtd.a | Bin 962630 -> 0 bytes .../v1.1/ftd/cc310/libopenthread-ncp-ftd.a | Bin 191440 -> 0 bytes .../v1.1/ftd/cc310/libopenthread-ncp-mtd.a | Bin 169856 -> 0 bytes .../v1.1/ftd/cc310/libopenthread-spinel-ncp.a | Bin 55092 -> 0 bytes .../nrf_security_mbedtls_configuration.h | 3924 ----------------- .../cc310/openthread_lib_configuration.txt | 157 - .../v1.1/ftd/oberon/libopenthread-cli-ftd.a | Bin 201688 -> 194984 bytes .../v1.1/ftd/oberon/libopenthread-cli-mtd.a | Bin 177616 -> 0 bytes .../v1.1/ftd/oberon/libopenthread-ftd.a | Bin 1217106 -> 1248434 bytes .../v1.1/ftd/oberon/libopenthread-hdlc.a | Bin 4652 -> 0 bytes .../v1.1/ftd/oberon/libopenthread-mtd.a | Bin 962646 -> 0 bytes .../v1.1/ftd/oberon/libopenthread-ncp-ftd.a | Bin 191440 -> 0 bytes .../v1.1/ftd/oberon/libopenthread-ncp-mtd.a | Bin 169856 -> 0 bytes .../ftd/oberon/libopenthread-spinel-ncp.a | Bin 55092 -> 0 bytes .../nrf_security_mbedtls_configuration.h | 1216 ++--- .../oberon/openthread_lib_configuration.txt | 42 +- .../v1.1/master/cc310/libopenthread-cli-ftd.a | Bin 224778 -> 0 bytes .../v1.1/master/cc310/libopenthread-cli-mtd.a | Bin 185568 -> 0 bytes .../v1.1/master/cc310/libopenthread-ftd.a | Bin 1340636 -> 0 bytes .../v1.1/master/cc310/libopenthread-hdlc.a | Bin 4652 -> 0 bytes .../v1.1/master/cc310/libopenthread-mtd.a | Bin 1040470 -> 0 bytes .../v1.1/master/cc310/libopenthread-ncp-ftd.a | Bin 223398 -> 0 bytes .../v1.1/master/cc310/libopenthread-ncp-mtd.a | Bin 189658 -> 0 bytes .../master/cc310/libopenthread-spinel-ncp.a | Bin 55092 -> 0 bytes .../nrf_security_mbedtls_configuration.h | 3924 ----------------- .../cc310/openthread_lib_configuration.txt | 163 - .../master/oberon/libopenthread-cli-ftd.a | Bin 224778 -> 243030 bytes .../master/oberon/libopenthread-cli-mtd.a | Bin 185568 -> 0 bytes .../v1.1/master/oberon/libopenthread-ftd.a | Bin 1340644 -> 1404258 bytes .../v1.1/master/oberon/libopenthread-hdlc.a | Bin 4652 -> 0 bytes .../v1.1/master/oberon/libopenthread-mtd.a | Bin 1040466 -> 0 bytes .../master/oberon/libopenthread-ncp-ftd.a | Bin 223398 -> 0 bytes .../master/oberon/libopenthread-ncp-mtd.a | Bin 189658 -> 0 bytes .../master/oberon/libopenthread-spinel-ncp.a | Bin 55092 -> 0 bytes .../nrf_security_mbedtls_configuration.h | 1216 ++--- .../oberon/openthread_lib_configuration.txt | 27 +- .../v1.1/mtd/cc310/libopenthread-cli-ftd.a | Bin 199834 -> 0 bytes .../v1.1/mtd/cc310/libopenthread-cli-mtd.a | Bin 175762 -> 0 bytes .../v1.1/mtd/cc310/libopenthread-ftd.a | Bin 1207946 -> 0 bytes .../v1.1/mtd/cc310/libopenthread-hdlc.a | Bin 4652 -> 0 bytes .../v1.1/mtd/cc310/libopenthread-mtd.a | Bin 949916 -> 0 bytes .../v1.1/mtd/cc310/libopenthread-ncp-ftd.a | Bin 186402 -> 0 bytes .../v1.1/mtd/cc310/libopenthread-ncp-mtd.a | Bin 164820 -> 0 bytes .../v1.1/mtd/cc310/libopenthread-spinel-ncp.a | Bin 55092 -> 0 bytes .../nrf_security_mbedtls_configuration.h | 3924 ----------------- .../v1.1/mtd/oberon/libopenthread-cli-ftd.a | Bin 199834 -> 0 bytes .../v1.1/mtd/oberon/libopenthread-cli-mtd.a | Bin 175762 -> 171264 bytes .../v1.1/mtd/oberon/libopenthread-ftd.a | Bin 1207962 -> 0 bytes .../v1.1/mtd/oberon/libopenthread-hdlc.a | Bin 4652 -> 0 bytes .../v1.1/mtd/oberon/libopenthread-mtd.a | Bin 949932 -> 990434 bytes .../v1.1/mtd/oberon/libopenthread-ncp-ftd.a | Bin 186402 -> 0 bytes .../v1.1/mtd/oberon/libopenthread-ncp-mtd.a | Bin 164820 -> 0 bytes .../mtd/oberon/libopenthread-spinel-ncp.a | Bin 55092 -> 0 bytes .../nrf_security_mbedtls_configuration.h | 1216 ++--- .../oberon/openthread_lib_configuration.txt | 40 +- .../hard-float/v1.1/rcp/libopenthread-hdlc.a | Bin 4652 -> 0 bytes .../hard-float/v1.1/rcp/libopenthread-radio.a | Bin 142110 -> 0 bytes .../hard-float/v1.1/rcp/libopenthread-rcp.a | Bin 73850 -> 0 bytes .../v1.1/rcp/libopenthread-spinel-rcp.a | Bin 53062 -> 0 bytes .../v1.1/rcp/openthread_lib_configuration.txt | 162 - .../v1.2/ftd/oberon/libopenthread-cli-ftd.a | Bin 0 -> 206538 bytes .../v1.2/ftd/oberon/libopenthread-ftd.a | Bin 0 -> 1338448 bytes .../nrf_security_mbedtls_configuration.h | 1216 ++--- .../oberon}/openthread_lib_configuration.txt | 56 +- 108 files changed, 2692 insertions(+), 22078 deletions(-) create mode 100644 openthread/include/openthread/platform/dso_transport.h create mode 100644 openthread/include/openthread/platform/trel.h create mode 100644 openthread/include/openthread/trel.h delete mode 100644 openthread/lib/cortex-m33/hard-float/v1.1/ftd/cc312/libopenthread-cli-ftd.a delete mode 100644 openthread/lib/cortex-m33/hard-float/v1.1/ftd/cc312/libopenthread-cli-mtd.a delete mode 100644 openthread/lib/cortex-m33/hard-float/v1.1/ftd/cc312/libopenthread-ftd.a delete mode 100644 openthread/lib/cortex-m33/hard-float/v1.1/ftd/cc312/libopenthread-mtd.a create mode 100644 openthread/lib/cortex-m33/hard-float/v1.1/ftd/oberon/libopenthread-cli-ftd.a create mode 100644 openthread/lib/cortex-m33/hard-float/v1.1/ftd/oberon/libopenthread-ftd.a rename openthread/lib/cortex-m33/hard-float/v1.1/{master/cc312 => ftd/oberon}/nrf_security_mbedtls_configuration.h (73%) rename openthread/lib/cortex-m33/hard-float/v1.1/{mtd/cc312 => ftd/oberon}/openthread_lib_configuration.txt (86%) delete mode 100644 openthread/lib/cortex-m33/hard-float/v1.1/master/cc312/libopenthread-cli-ftd.a delete mode 100644 openthread/lib/cortex-m33/hard-float/v1.1/master/cc312/libopenthread-cli-mtd.a delete mode 100644 openthread/lib/cortex-m33/hard-float/v1.1/master/cc312/libopenthread-ftd.a delete mode 100644 openthread/lib/cortex-m33/hard-float/v1.1/master/cc312/libopenthread-mtd.a delete mode 100644 openthread/lib/cortex-m33/hard-float/v1.1/master/cc312/openthread_lib_configuration.txt delete mode 100644 openthread/lib/cortex-m33/hard-float/v1.1/mtd/cc312/libopenthread-cli-ftd.a delete mode 100644 openthread/lib/cortex-m33/hard-float/v1.1/mtd/cc312/libopenthread-cli-mtd.a delete mode 100644 openthread/lib/cortex-m33/hard-float/v1.1/mtd/cc312/libopenthread-ftd.a delete mode 100644 openthread/lib/cortex-m33/hard-float/v1.1/mtd/cc312/libopenthread-mtd.a delete mode 100644 openthread/lib/cortex-m33/hard-float/v1.1/mtd/cc312/nrf_security_mbedtls_configuration.h create mode 100644 openthread/lib/cortex-m33/hard-float/v1.1/mtd/oberon/libopenthread-cli-mtd.a create mode 100644 openthread/lib/cortex-m33/hard-float/v1.1/mtd/oberon/libopenthread-mtd.a rename openthread/lib/cortex-m33/hard-float/v1.1/{ftd/cc312 => mtd/oberon}/nrf_security_mbedtls_configuration.h (73%) rename openthread/lib/cortex-m33/hard-float/v1.1/{ftd/cc312 => mtd/oberon}/openthread_lib_configuration.txt (82%) delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/ftd/cc310/libopenthread-cli-ftd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/ftd/cc310/libopenthread-cli-mtd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/ftd/cc310/libopenthread-ftd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/ftd/cc310/libopenthread-hdlc.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/ftd/cc310/libopenthread-mtd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/ftd/cc310/libopenthread-ncp-ftd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/ftd/cc310/libopenthread-ncp-mtd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/ftd/cc310/libopenthread-spinel-ncp.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/ftd/cc310/nrf_security_mbedtls_configuration.h delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/ftd/cc310/openthread_lib_configuration.txt delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/ftd/oberon/libopenthread-cli-mtd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/ftd/oberon/libopenthread-hdlc.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/ftd/oberon/libopenthread-mtd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/ftd/oberon/libopenthread-ncp-ftd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/ftd/oberon/libopenthread-ncp-mtd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/ftd/oberon/libopenthread-spinel-ncp.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/master/cc310/libopenthread-cli-ftd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/master/cc310/libopenthread-cli-mtd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/master/cc310/libopenthread-ftd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/master/cc310/libopenthread-hdlc.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/master/cc310/libopenthread-mtd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/master/cc310/libopenthread-ncp-ftd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/master/cc310/libopenthread-ncp-mtd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/master/cc310/libopenthread-spinel-ncp.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/master/cc310/nrf_security_mbedtls_configuration.h delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/master/cc310/openthread_lib_configuration.txt delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/master/oberon/libopenthread-cli-mtd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/master/oberon/libopenthread-hdlc.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/master/oberon/libopenthread-mtd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/master/oberon/libopenthread-ncp-ftd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/master/oberon/libopenthread-ncp-mtd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/master/oberon/libopenthread-spinel-ncp.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/mtd/cc310/libopenthread-cli-ftd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/mtd/cc310/libopenthread-cli-mtd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/mtd/cc310/libopenthread-ftd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/mtd/cc310/libopenthread-hdlc.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/mtd/cc310/libopenthread-mtd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/mtd/cc310/libopenthread-ncp-ftd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/mtd/cc310/libopenthread-ncp-mtd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/mtd/cc310/libopenthread-spinel-ncp.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/mtd/cc310/nrf_security_mbedtls_configuration.h delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/mtd/oberon/libopenthread-cli-ftd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/mtd/oberon/libopenthread-ftd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/mtd/oberon/libopenthread-hdlc.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/mtd/oberon/libopenthread-ncp-ftd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/mtd/oberon/libopenthread-ncp-mtd.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/mtd/oberon/libopenthread-spinel-ncp.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/rcp/libopenthread-hdlc.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/rcp/libopenthread-radio.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/rcp/libopenthread-rcp.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/rcp/libopenthread-spinel-rcp.a delete mode 100644 openthread/lib/cortex-m4/hard-float/v1.1/rcp/openthread_lib_configuration.txt create mode 100644 openthread/lib/cortex-m4/hard-float/v1.2/ftd/oberon/libopenthread-cli-ftd.a create mode 100644 openthread/lib/cortex-m4/hard-float/v1.2/ftd/oberon/libopenthread-ftd.a rename openthread/lib/cortex-m4/hard-float/{v1.1/rcp => v1.2/ftd/oberon}/nrf_security_mbedtls_configuration.h (74%) rename openthread/lib/cortex-m4/hard-float/{v1.1/mtd/cc310 => v1.2/ftd/oberon}/openthread_lib_configuration.txt (77%) diff --git a/openthread/include/openthread/backbone_router_ftd.h b/openthread/include/openthread/backbone_router_ftd.h index 741aade2c7..746d599275 100644 --- a/openthread/include/openthread/backbone_router_ftd.h +++ b/openthread/include/openthread/backbone_router_ftd.h @@ -273,6 +273,19 @@ void otBackboneRouterMulticastListenerClear(otInstance *aInstance); */ otError otBackboneRouterMulticastListenerAdd(otInstance *aInstance, const otIp6Address *aAddress, uint32_t aTimeout); +/** + * This method configures the ability to increase or not the BBR Dataset Sequence Number when a + * BBR recovers its BBR Dataset from the Leader's Network Data. + * + * Note: available only when `OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE` is enabled. + * Only used for certification. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[in] aSkip Whether to skip the increase of Sequence Number or not. + * + */ +void otBackboneRouterConfigSkipSeqNumIncrease(otInstance *aInstance, bool aSkip); + #define OT_BACKBONE_ROUTER_MULTICAST_LISTENER_ITERATOR_INIT \ 0 ///< Initializer for otBackboneRouterMulticastListenerIterator @@ -351,12 +364,12 @@ void otBackboneRouterSetNdProxyCallback(otInstance * aInstanc * Represents the Backbone Router ND Proxy info. * */ -struct otBackboneRouterNdProxyInfo +typedef struct otBackboneRouterNdProxyInfo { otIp6InterfaceIdentifier *mMeshLocalIid; ///< Mesh-local IID uint32_t mTimeSinceLastTransaction; ///< Time since last transaction (Seconds) uint16_t mRloc16; ///< RLOC16 -}; +} otBackboneRouterNdProxyInfo; /** * This method gets the Backbone Router ND Proxy info. diff --git a/openthread/include/openthread/border_router.h b/openthread/include/openthread/border_router.h index 7774727b40..4161e19255 100644 --- a/openthread/include/openthread/border_router.h +++ b/openthread/include/openthread/border_router.h @@ -117,6 +117,23 @@ otError otBorderRoutingGetOmrPrefix(otInstance *aInstance, otIp6Prefix *aPrefix) */ otError otBorderRoutingGetOnLinkPrefix(otInstance *aInstance, otIp6Prefix *aPrefix); +/** + * This function returns the local NAT64 prefix. + * + * This prefix might not be advertised in the Thread network. + * + * This function is only available when `OPENTHREAD_CONFIG_BORDER_ROUTING_NAT64_ENABLE` + * is enabled. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[out] aPrefix A pointer to where the prefix will be output to. + * + * @retval OT_ERROR_INVALID_STATE The Border Routing Manager is not initialized yet. + * @retval OT_ERROR_NONE Successfully retrieved the NAT64 prefix. + * + */ +otError otBorderRoutingGetNat64Prefix(otInstance *aInstance, otIp6Prefix *aPrefix); + /** * This method provides a full or stable copy of the local Thread Network Data. * diff --git a/openthread/include/openthread/coap.h b/openthread/include/openthread/coap.h index 7e2312040f..396d53573f 100644 --- a/openthread/include/openthread/coap.h +++ b/openthread/include/openthread/coap.h @@ -717,6 +717,15 @@ otCoapType otCoapMessageGetType(const otMessage *aMessage); */ otCoapCode otCoapMessageGetCode(const otMessage *aMessage); +/** + * This function sets the Code value. + * + * @param[inout] aMessage A pointer to the CoAP message to initialize. + * @param[in] aCode CoAP message code. + * + */ +void otCoapMessageSetCode(otMessage *aMessage, otCoapCode aCode); + /** * This method returns the CoAP Code as human readable string. * diff --git a/openthread/include/openthread/history_tracker.h b/openthread/include/openthread/history_tracker.h index 0cce3e75ee..dfb098f27c 100644 --- a/openthread/include/openthread/history_tracker.h +++ b/openthread/include/openthread/history_tracker.h @@ -29,6 +29,7 @@ #include #include +#include #include #ifdef __cplusplus @@ -38,18 +39,13 @@ extern "C" { /** * @addtogroup api-history-tracker * - * @{ - * - */ - -/** * @brief - * This header defines the public API for History Tracker. + * Records the history of different events, for example RX and TX messages or network info changes. All tracked + * entries are timestamped. * - * History Tracker module records history of different events (e.g. RX and TX messages or network info changes, etc.) - * as the Thread network operates. All tracked entries are timestamped. + * The functions in this module are available when `OPENTHREAD_CONFIG_HISTOR_TRACKER_ENABLE` is enabled. * - * The functions in this module are available when `OPENTHREAD_CONFIG_HISTOR_TRACKER_ENABLE` is enabled. + * @{ * */ @@ -196,6 +192,36 @@ typedef struct otHistoryTrackerNeighborInfo bool mIsChild : 1; ///< Indicates whether or not the neighbor is a child. } otHistoryTrackerNeighborInfo; +/** + * This enumeration defines the events for a Network Data entry (i.e., whether an entry is added or removed). + * + */ +typedef enum +{ + OT_HISTORY_TRACKER_NET_DATA_ENTRY_ADDED = 0, ///< Network data entry is added. + OT_HISTORY_TRACKER_NET_DATA_ENTRY_REMOVED = 1, ///< Network data entry is removed. +} otHistoryTrackerNetDataEvent; + +/** + * This structure represent a Network Data on mesh prefix info. + * + */ +typedef struct otHistoryTrackerOnMeshPrefixInfo +{ + otBorderRouterConfig mPrefix; ///< The on mesh prefix entry. + otHistoryTrackerNetDataEvent mEvent; ///< Indicates the event (added/removed). +} otHistoryTrackerOnMeshPrefixInfo; + +/** + * This structure represent a Network Data extern route info. + * + */ +typedef struct otHistoryTrackerExternalRouteInfo +{ + otExternalRouteConfig mRoute; ///< The external route entry. + otHistoryTrackerNetDataEvent mEvent; ///< Indicates the event (added/removed). +} otHistoryTrackerExternalRouteInfo; + /** * This function initializes an `otHistoryTrackerIterator`. * @@ -316,6 +342,41 @@ const otHistoryTrackerNeighborInfo *otHistoryTrackerIterateNeighborHistory(otIns otHistoryTrackerIterator *aIterator, uint32_t * aEntryAge); +/** + * This function iterates over the entries in the Network Data on mesh prefix entry history list. + * + * @param[in] aInstance A pointer to the OpenThread instance. + * @param[inout] aIterator A pointer to an iterator. MUST be initialized or the behavior is undefined. + * @param[out] aEntryAge A pointer to a variable to output the entry's age. MUST NOT be NULL. + * Age is provided as the duration (in milliseconds) from when entry was recorded to + * @p aIterator initialization time. It is set to `OT_HISTORY_TRACKER_MAX_AGE` for entries + * older than max age. + * + * @returns The `otHistoryTrackerOnMeshPrefixInfo` entry or `NULL` if no more entries in the list. + * + */ +const otHistoryTrackerOnMeshPrefixInfo *otHistoryTrackerIterateOnMeshPrefixHistory(otInstance * aInstance, + otHistoryTrackerIterator *aIterator, + uint32_t * aEntryAge); + +/** + * This function iterates over the entries in the Network Data external route entry history list. + * + * @param[in] aInstance A pointer to the OpenThread instance. + * @param[inout] aIterator A pointer to an iterator. MUST be initialized or the behavior is undefined. + * @param[out] aEntryAge A pointer to a variable to output the entry's age. MUST NOT be NULL. + * Age is provided as the duration (in milliseconds) from when entry was recorded to + * @p aIterator initialization time. It is set to `OT_HISTORY_TRACKER_MAX_AGE` for entries + * older than max age. + * + * @returns The `otHistoryTrackerExternalRouteInfo` entry or `NULL` if no more entries in the list. + * + */ +const otHistoryTrackerExternalRouteInfo *otHistoryTrackerIterateExternalRouteHistory( + otInstance * aInstance, + otHistoryTrackerIterator *aIterator, + uint32_t * aEntryAge); + /** * This function converts a given entry age to a human-readable string. * diff --git a/openthread/include/openthread/instance.h b/openthread/include/openthread/instance.h index 242a970248..71f5d39e0f 100644 --- a/openthread/include/openthread/instance.h +++ b/openthread/include/openthread/instance.h @@ -53,7 +53,7 @@ extern "C" { * @note This number versions both OpenThread platform and user APIs. * */ -#define OPENTHREAD_API_VERSION (175) +#define OPENTHREAD_API_VERSION (189) /** * @addtogroup api-instance diff --git a/openthread/include/openthread/ip6.h b/openthread/include/openthread/ip6.h index e802359ce6..62f18e9b8e 100644 --- a/openthread/include/openthread/ip6.h +++ b/openthread/include/openthread/ip6.h @@ -329,8 +329,8 @@ const otNetifAddress *otIp6GetUnicastAddresses(otInstance *aInstance); * * @retval OT_ERROR_NONE Successfully subscribed to the Network Interface Multicast Address. * @retval OT_ERROR_ALREADY The multicast address is already subscribed. - * @retval OT_ERROR_INVALID_ARGS The IP Address indicated by @p aAddress is invalid address. - * @retval OT_ERROR_INVALID_STATE The Network Interface is not up. + * @retval OT_ERROR_INVALID_ARGS The IP Address indicated by @p aAddress is an invalid multicast address. + * @retval OT_ERROR_REJECTED The IP Address indicated by @p aAddress is an internal multicast address. * @retval OT_ERROR_NO_BUFS The Network Interface is already storing the maximum allowed external multicast * addresses. * diff --git a/openthread/include/openthread/joiner.h b/openthread/include/openthread/joiner.h index 15e35c2d51..8453c3ac7a 100644 --- a/openthread/include/openthread/joiner.h +++ b/openthread/include/openthread/joiner.h @@ -146,7 +146,7 @@ void otJoinerStop(otInstance *aInstance); otJoinerState otJoinerGetState(otInstance *aInstance); /** - * This method gets the Joiner ID. + * This function gets the Joiner ID. * * If a Joiner Discerner is not set, Joiner ID is the first 64 bits of the result of computing SHA-256 over * factory-assigned IEEE EUI-64. Otherwise the Joiner ID is calculated from the Joiner Discerner value. @@ -161,7 +161,7 @@ otJoinerState otJoinerGetState(otInstance *aInstance); const otExtAddress *otJoinerGetId(otInstance *aInstance); /** - * This method sets the Joiner Discerner. + * This function sets the Joiner Discerner. * * The Joiner Discerner is used to calculate the Joiner ID used during commissioning/joining process. * @@ -180,7 +180,7 @@ const otExtAddress *otJoinerGetId(otInstance *aInstance); otError otJoinerSetDiscerner(otInstance *aInstance, otJoinerDiscerner *aDiscerner); /** - * This method gets the Joiner Discerner. + * This function gets the Joiner Discerner. * * @param[in] aInstance A pointer to the OpenThread instance. * @@ -189,6 +189,16 @@ otError otJoinerSetDiscerner(otInstance *aInstance, otJoinerDiscerner *aDiscerne */ const otJoinerDiscerner *otJoinerGetDiscerner(otInstance *aInstance); +/** + * This function converts a given joiner state enumeration value to a human-readable string. + * + * @param[in] aState The joiner state. + * + * @returns A human-readable string representation of @p aState. + * + */ +const char *otJoinerStateToString(otJoinerState aState); + /** * @} * diff --git a/openthread/include/openthread/link.h b/openthread/include/openthread/link.h index 228913533b..1a6b0a84b4 100644 --- a/openthread/include/openthread/link.h +++ b/openthread/include/openthread/link.h @@ -864,6 +864,33 @@ void otLinkFilterClearAllRssIn(otInstance *aInstance); */ otError otLinkFilterGetNextRssIn(otInstance *aInstance, otMacFilterIterator *aIterator, otMacFilterEntry *aEntry); +/** + * This function enables/disables IEEE 802.15.4 radio filter mode. + * + * This function is available when OPENTHREAD_CONFIG_MAC_FILTER_ENABLE configuration is enabled. + * + * The radio filter is mainly intended for testing. It can be used to temporarily block all tx/rx on the 802.15.4 radio. + * When radio filter is enabled, radio is put to sleep instead of receive (to ensure device does not receive any frame + * and/or potentially send ack). Also the frame transmission requests return immediately without sending the frame over + * the air (return "no ack" error if ack is requested, otherwise return success). + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[in] aFilterEnabled TRUE to enable radio filter, FALSE to disable + * + */ +void otLinkSetRadioFilterEnabled(otInstance *aInstance, bool aFilterEnabled); + +/** + * This function indicates whether the IEEE 802.15.4 radio filter is enabled or not. + * + * This function is available when OPENTHREAD_CONFIG_MAC_FILTER_ENABLE configuration is enabled. + * + * @retval TRUE If the radio filter is enabled. + * @retval FALSE If the radio filter is disabled. + * + */ +bool otLinkIsRadioFilterEnabled(otInstance *aInstance); + /** * This method converts received signal strength to link quality. * diff --git a/openthread/include/openthread/platform/crypto.h b/openthread/include/openthread/platform/crypto.h index efe40ab705..0d9bf5ca3e 100644 --- a/openthread/include/openthread/platform/crypto.h +++ b/openthread/include/openthread/platform/crypto.h @@ -133,11 +133,8 @@ typedef struct otCryptoContext /** * Initialize the Crypto module. * - * @retval OT_ERROR_NONE Successfully initialized Crypto module. - * @retval OT_ERROR_FAILED Failed to initialize Crypto module. - * */ -otError otPlatCryptoInit(void); +void otPlatCryptoInit(void); /** * Import a key into PSA ITS. @@ -469,6 +466,30 @@ otError otPlatCryptoSha256Update(otCryptoContext *aContext, const void *aBuf, ui */ otError otPlatCryptoSha256Finish(otCryptoContext *aContext, uint8_t *aHash, uint16_t aHashSize); +/** + * Initialize cryptographically-secure pseudorandom number generator (CSPRNG). + * + */ +void otPlatCryptoRandomInit(void); + +/** + * Deinitialize cryptographically-secure pseudorandom number generator (CSPRNG). + * + */ +void otPlatCryptoRandomDeinit(void); + +/** + * Fills a given buffer with cryptographically secure random bytes. + * + * @param[out] aBuffer A pointer to a buffer to fill with the random bytes. + * @param[in] aSize Size of buffer (number of bytes to fill). + * + * @retval OT_ERROR_NONE Successfully filled buffer with random values. + * @retval OT_ERROR_FAILED Operation failed. + * + */ +otError otPlatCryptoRandomGet(uint8_t *aBuffer, uint16_t aSize); + /** * @} * diff --git a/openthread/include/openthread/platform/dso_transport.h b/openthread/include/openthread/platform/dso_transport.h new file mode 100644 index 0000000000..348ee828a9 --- /dev/null +++ b/openthread/include/openthread/platform/dso_transport.h @@ -0,0 +1,202 @@ +/* + * Copyright (c) 2021, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file + * @brief + * This file includes the platform abstraction for DNS Stateful Operations (DSO) transport. + */ + +#ifndef OPENTHREAD_PLATFORM_DSO_TRANSPORT_H_ +#define OPENTHREAD_PLATFORM_DSO_TRANSPORT_H_ + +#include + +#include +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * This structure represents a DSO connection. + * + * It is an opaque struct (the platform implementation only deals with pointers to this struct). + * + */ +typedef struct otPlatDsoConnection otPlatDsoConnection; + +/** + * This function can be used by DSO platform implementation to get the the OpenThread instance associated with a + * connection instance. + * + * @param[in] aConnection A pointer to the DSO connection. + * + * @returns A pointer to the `otInstance`. + * + */ +extern otInstance *otPlatDsoGetInstance(otPlatDsoConnection *aConnection); + +/** + * This function starts or stops listening for incoming connection requests on transport layer. + * + * For DNS-over-TLS, the transport layer MUST listen on port 853 and follow RFC 7858. + * + * While listening is enabled, if a connection request is received, the `otPlatDsoAccept()` callback MUST be called. + * + * @param[in] aInstance The OpenThread instance. + * @param[in] aEnable TRUE to start listening, FALSE to stop listening. + * + */ +void otPlatDsoEnableListening(otInstance *aInstance, bool aEnable); + +/** + * This function is a callback from the DSO platform to indicate an incoming connection request when listening is + * enabled. + * + * This function determines whether or not to accept the connection request. It returns a non-null `otPlatDsoConnection` + * pointer if the request is to be accepted, or `NULL` if the request is to be rejected. + * + * If a non-null connection pointer is returned, the platform layer MUST continue establishing the connection with the + * peer. The platform reports the outcome by invoking `otPlatDsoHandleConnected()` callback on success or + * `otPlatDsoHandleDisconnected()` callback on failure. + * + * @param[in] aInstance The OpenThread instance. + * @param[in] aPeerSockAddr The socket address (IPv6 address and port number) of the peer requesting connection. + * + * @returns A pointer to the `otPlatDsoConnection` to use if to accept, or `NULL` if to reject. + * + */ +extern otPlatDsoConnection *otPlatDsoAccept(otInstance *aInstance, const otSockAddr *aPeerSockAddr); + +/** + * This function requests the platform layer to initiate establishing a connection with a peer. + * + * The platform reports the outcome by invoking `otPlatDsoHandleConnected()` callback on success or + * `otPlatDsoHandleDisconnected()` callback (on failure). + * + * @param[in] aConnection The connection. + * @param[in] aPeerSockAddr The socket address (IPv6 address and port number) of the peer to connect to. + * + */ +void otPlatDsoConnect(otPlatDsoConnection *aConnection, const otSockAddr *aPeerSockAddr); + +/** + * This function is a callback from the platform layer to indicate that a connection is successfully established. + * + * It MUST be called either after accepting an incoming connection (`otPlatDsoAccept`) or after a `otPlatDsoConnect()` + * call. + * + * Only after this callback, the connection can be used to send and receive messages. + * + * @param[in] aConnection The connection. + * + */ +extern void otPlatDsoHandleConnected(otPlatDsoConnection *aConnection); + +/** + * This function sends a DSO message to the peer on a connection. + * + * This function is used only after the connection is successfully established (after `otPlatDsoHandleConnected()` + * callback). + * + * This function passes the ownership of the @p aMessage to the DSO platform layer, and the platform implementation is + * expected to free the message once it is no longer needed. + * + * The @p aMessage contains the DNS message (starting with DNS header). Note that it does not contain the the length + * field that is needed when sending over TLS/TCP transport. The platform layer MUST therefore include the length + * field when passing the message to TLS/TCP layer. + * + * @param[in] aConnection The connection to send on. + * @param[in] aMessage The message to send. + * + */ +void otPlatDsoSend(otPlatDsoConnection *aConnection, otMessage *aMessage); + +/** + * This function is a callback from the platform layer to indicate that a DNS message was received over a connection. + * + * The platform MUST call this function only after the connection is successfully established (after callback + * `otPlatDsoHandleConnected()` is invoked). + * + * This function passes the ownership of the @p aMessage from the DSO platform layer to OpenThread. OpenThread will + * free the message when no longer needed. + * + * The @p aMessage MUST contain the DNS message (starting with DNS header) and not include the length field that may + * be included in TCP/TLS exchange. + * + * @param[in] aConnection The connection on which the message was received. + * @param[in] aMessage The received message. + * + */ +extern void otPlatDsoHandleReceive(otPlatDsoConnection *aConnection, otMessage *aMessage); + +/** + * This enumeration defines disconnect modes. + * + */ +typedef enum +{ + OT_PLAT_DSO_DISCONNECT_MODE_GRACEFULLY_CLOSE, ///< Gracefully close the connection. + OT_PLAT_DSO_DISCONNECT_MODE_FORCIBLY_ABORT, ///< Forcibly abort the connection. +} otPlatDsoDisconnectMode; + +/** + * This function requests a connection to be disconnected. + * + * After calling this function, the DSO platform implementation MUST NOT maintain `aConnection` pointer (platform + * MUST NOT call any callbacks using this `Connection` pointer anymore). In particular, calling `otPlatDsoDisconnect()` + * MUST NOT trigger the callback `otPlatDsoHandleDisconnected()`. + * + * @param[in] aConnection The connection to disconnect + * @param[in] aMode The disconnect mode (close gracefully or forcibly abort). + * + */ +void otPlatDsoDisconnect(otPlatDsoConnection *aConnection, otPlatDsoDisconnectMode aMode); + +/** + * This function is a callback from the platform layer to indicate that peer closed/aborted the connection or the + * connection establishment failed (e.g., peer rejected a connection request). + * + * After calling this function, the DSO platform implementation MUST NOT maintain `aConnection` pointer (platform + * MUST NOT call any callbacks using this `Connection` pointer anymore). + * + * @param[in] aConnection The connection which disconnected. + * @param[in] aMode The disconnect mode (closed gracefully or forcibly aborted). + * + */ +extern void otPlatDsoHandleDisconnected(otPlatDsoConnection *aConnection, otPlatDsoDisconnectMode aMode); + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // OPENTHREAD_PLATFORM_DSO_TRANSPORT_H_ diff --git a/openthread/include/openthread/platform/logging.h b/openthread/include/openthread/platform/logging.h index acf88cd22f..4c62744c36 100644 --- a/openthread/include/openthread/platform/logging.h +++ b/openthread/include/openthread/platform/logging.h @@ -157,9 +157,6 @@ void otPlatLog(otLogLevel aLogLevel, otLogRegion aLogRegion, const char *aFormat /** * This (optional) platform function outputs a prepared log line. * - * This platform function is used by OpenThread core when `OPENTHREAD_CONFIG_LOG_DEFINE_AS_MACRO_ONLY` is not enabled - * (in this case, the OT core itself will prepare a full log line). - * * Note that this function is optional and if not provided by platform layer, a default (weak) implementation is * provided and used by OpenThread core as `otPlatLog(aLogLevel, aLogResion, "%s", aLogLine)`. * diff --git a/openthread/include/openthread/platform/radio.h b/openthread/include/openthread/platform/radio.h index 50dd24ba43..2d7a654b9c 100644 --- a/openthread/include/openthread/platform/radio.h +++ b/openthread/include/openthread/platform/radio.h @@ -57,7 +57,7 @@ extern "C" { */ /** - * @defgroup radio-types Types + * @defgroup radio-types Radio Types * * @brief * This module includes the platform abstraction for a radio frame. @@ -286,7 +286,7 @@ typedef struct otRadioFrame * If `mIsHeaderUpdated` is not set, then the frame counter and key CSL IE not set in the frame by * OpenThread core and it is the responsibility of the radio platform to assign them. The platform * must update the frame header (assign counter and CSL IE values) before sending the frame over the air, - * however if the transmission gets aborted and the frame is never sent over the air (e.g., channel + * however if the the transmission gets aborted and the frame is never sent over the air (e.g., channel * access error) the platform may choose to not update the header. If the platform updates the header, * it must also set this flag before passing the frame back from the `otPlatRadioTxDone()` callback. * @@ -399,7 +399,7 @@ typedef struct otLinkMetrics */ /** - * @defgroup radio-config Configuration + * @defgroup radio-config Radio Configuration * * @brief * This module includes the platform abstraction for radio configuration. @@ -643,7 +643,7 @@ uint32_t otPlatRadioGetBusSpeed(otInstance *aInstance); */ /** - * @defgroup radio-operation Operation + * @defgroup radio-operation Radio Operation * * @brief * This module includes the platform abstraction for radio operations. diff --git a/openthread/include/openthread/platform/settings.h b/openthread/include/openthread/platform/settings.h index 17a68a0228..39e0613bb6 100644 --- a/openthread/include/openthread/platform/settings.h +++ b/openthread/include/openthread/platform/settings.h @@ -54,7 +54,7 @@ extern "C" { /** * This enumeration defines the keys of settings. * - * Note: When adding a new setings key, if the settings corresponding to the key contains security sensitive + * Note: When adding a new settings key, if the settings corresponding to the key contains security sensitive * information, the developer MUST add the key to the array `kCriticalKeys`. * */ @@ -73,6 +73,7 @@ enum OT_SETTINGS_KEY_SRP_ECDSA_KEY = 0x000b, ///< SRP client ECDSA public/private key pair. OT_SETTINGS_KEY_SRP_CLIENT_INFO = 0x000c, ///< The SRP client info (selected SRP server address). OT_SETTINGS_KEY_SRP_SERVER_INFO = 0x000d, ///< The SRP server info (UDP port). + OT_SETTINGS_KEY_NAT64_PREFIX = 0x000e, ///< NAT64 prefix. }; /** diff --git a/openthread/include/openthread/platform/trel.h b/openthread/include/openthread/platform/trel.h new file mode 100644 index 0000000000..d4e0475a60 --- /dev/null +++ b/openthread/include/openthread/platform/trel.h @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2021, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file + * @brief + * This file includes the platform abstraction for Thread Radio Encapsulation Link (TREL) using DNS-SD and UDP/IPv6. + * + */ + +#ifndef OPENTHREAD_PLATFORM_TREL_H_ +#define OPENTHREAD_PLATFORM_TREL_H_ + +#include + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup plat-trel + * + * @brief + * This module includes the platform abstraction for Thread Radio Encapsulation Link (TREL) using DNS-SD and + * UDP/IPv6. + * + * @{ + * + */ + +/** + * This function initializes and enables TREL platform layer. + * + * Upon this call, the platform layer MUST perform the following: + * + * 1) TREL platform layer MUST open a UDP socket to listen for and receive TREL messages from peers. The socket is + * bound to an ephemeral port number chosen by the platform layer. The port number MUST be returned in @p aUdpPort. + * The socket is also bound to network interface(s) on which TREL is to be supported. The socket and the chosen port + * should stay valid while TREL is enabled. + * + * 2) Platform layer MUST initiate an ongoing DNS-SD browse on the service name "_trel._udp" within the local browsing + * domain to discover other devices supporting TREL. The ongoing browse will produce two different types of events: + * "add" events and "remove" events. When the browse is started, it should produce an "add" event for every TREL peer + * currently present on the network. Whenever a TREL peer goes offline, a "remove" event should be produced. "remove" + * events are not guaranteed, however. When a TREL service instance is discovered, a new ongoing DNS-SD query for an + * AAAA record should be started on the hostname indicated in the SRV record of the discovered instance. If multiple + * host IPv6 addressees are discovered for a peer, one with highest scope among all addresses MUST be reported (if + * there are multiple address at same scope, one must be selected randomly). + * + * TREL platform MUST signal back the discovered peer info using `otPlatTrelHandleDiscoveredPeerInfo()` callback. This + * callback MUST be invoked when a new peer is discovered, when there is a change in an existing entry (e.g., new + * TXT record or new port number or new IPv6 address), or when the peer is removed. + * + * @param[in] aInstance The OpenThread instance. + * @param[out] aUdpPort A pointer to return the selected port number by platform layer. + * + */ +void otPlatTrelEnable(otInstance *aInstance, uint16_t *aUdpPort); + +/** + * This function disables TREL platform layer. + * + * After this call, the platform layer MUST stop DNS-SD browse on the service name "_trel._udp", stop advertising the + * TREL DNS-SD service (from `otPlatTrelRegisterService()`) and MUST close the UDP socket used to receive TREL messages. + * + * @pram[in] aInstance The OpenThread instance. + * + */ +void otPlatTrelDisable(otInstance *aInstance); + +/** + * This structure represents a TREL peer info discovered using DNS-SD browse on the service name "_trel._udp". + * + */ +typedef struct otPlatTrelPeerInfo +{ + /** + * This boolean flag indicates whether the entry is being removed or added. + * + * - TRUE indicates that peer is removed. + * - FALSE indicates that it is a new entry or an update to an existing entry. + * + */ + bool mRemoved; + + /** + * The TXT record data (encoded as specified by DNS-SD) from the SRV record of the discovered TREL peer service + * instance. + * + */ + const uint8_t *mTxtData; + + uint16_t mTxtLength; ///< Number of bytes in @p mTxtData buffer. + + /** + * The TREL peer socket address (IPv6 address and port number). + * + * The port number is determined from the SRV record of the discovered TREL peer service instance. The IPv6 address + * is determined from the DNS-SD query for AAAA records on the hostname indicated in the SRV record of the + * discovered service instance. If multiple host IPv6 addressees are discovered, one with highest scope is used. + * + */ + otSockAddr mSockAddr; +} otPlatTrelPeerInfo; + +/** + * This is a callback function from platform layer to report a discovered TREL peer info. + * + * @note The @p aInfo structure and its content (e.g., the `mTxtData` buffer) does not need to persist after returning + * from this call. OpenThread code will make a copy of all the info it needs. + * + * @param[in] aInstance The OpenThread instance. + * @param[in] aInfo A pointer to the TREL peer info. + * + */ +extern void otPlatTrelHandleDiscoveredPeerInfo(otInstance *aInstance, const otPlatTrelPeerInfo *aInfo); + +/** + * This function registers a new service to be advertised using DNS-SD [RFC6763]. + * + * The service name is "_trel._udp". The platform should use its own hostname, which when combined with the service + * name and the local DNS-SD domain name will produce the full service instance name, for example + * "example-host._trel._udp.local.". + * + * The domain under which the service instance name appears will be 'local' for mDNS, and will be whatever domain is + * used for service registration in the case of a non-mDNS local DNS-SD service. + * + * A subsequent call to this function updates the previous service. It is used to update the TXT record data and/or the + * port number. + * + * The @p aTxtData buffer is not persisted after the return from this function. The platform layer MUST NOT keep the + * pointer and instead copy the content if needed. + * + * @param[in] aInstance The OpenThread instance. + * @param[in] aPort The port number to include in the SRV record of the advertised service. + * @param[in] aTxtData A pointer to the TXT record data (encoded) to be include in the advertised service. + * @param[in] aTxtLength The length of @p aTxtData (number of bytes). + * + * + */ +void otPlatTrelRegisterService(otInstance *aInstance, uint16_t aPort, const uint8_t *aTxtData, uint8_t aTxtLength); + +/** + * This function requests a TREL UDP packet to be sent to a given destination. + * + * @param[in] aInstance The OpenThread instance structure. + * @param[in] aUdpPayload A pointer to UDP payload. + * @param[in] aUdpPayloadLen The payload length (number of bytes). + * @param[in] aDestSockAddr The destination socket address. + * + */ +void otPlatTrelSend(otInstance * aInstance, + const uint8_t * aUdpPayload, + uint16_t aUdpPayloadLen, + const otSockAddr *aDestSockAddr); + +/** + * This function is a callback from platform to notify of a received TREL UDP packet. + * + * @note The buffer content (up to its specified length) may get changed during processing by OpenThread core (e.g., + * decrypted in place), so the platform implementation should expect that after returning from this function the + * @p aBuffer content may have been altered. + * + * @param[in] aInstance The OpenThread instance structure. + * @param[in] aBuffer A buffer containing the received UDP payload. + * @param[in] aLength UDP payload length (number of bytes). + * + */ +extern void otPlatTrelHandleReceived(otInstance *aInstance, uint8_t *aBuffer, uint16_t aLength); + +/** + * @} + * + */ + +#ifdef __cplusplus +} // end of extern "C" +#endif + +#endif // OPENTHREAD_PLATFORM_TREL_H_ diff --git a/openthread/include/openthread/random_crypto.h b/openthread/include/openthread/random_crypto.h index da4ba7b010..937136a782 100644 --- a/openthread/include/openthread/random_crypto.h +++ b/openthread/include/openthread/random_crypto.h @@ -63,13 +63,6 @@ extern "C" { */ otError otRandomCryptoFillBuffer(uint8_t *aBuffer, uint16_t aSize); -/** - * This function returns initialized mbedtls_ctr_drbg_context. - * - * @returns A pointer to initialized mbedtls_ctr_drbg_context. - */ -mbedtls_ctr_drbg_context *otRandomCryptoMbedTlsContextGet(void); - /** * @} * diff --git a/openthread/include/openthread/tcp.h b/openthread/include/openthread/tcp.h index a0d4b3a099..46f12c4598 100644 --- a/openthread/include/openthread/tcp.h +++ b/openthread/include/openthread/tcp.h @@ -191,6 +191,16 @@ typedef enum otTcpDisconnectedReason */ typedef void (*otTcpDisconnected)(otTcpEndpoint *aEndpoint, otTcpDisconnectedReason aReason); +/** + * OT_TCP_ENDPOINT_TCB_SIZE_BASE and OT_TCP_ENDPOINT_TCB_NUM_POINTERS are + * chosen such that the mTcb field of otTcpEndpoint has the same size as + * struct tcpcb in TCPlp. This is necessary because the mTcb field, although + * opaque in its declaration, is treated as struct tcpcb in the TCP + * implementation. + */ +#define OT_TCP_ENDPOINT_TCB_SIZE_BASE 368 +#define OT_TCP_ENDPOINT_TCB_NUM_PTR 36 + /** * This structure represents a TCP endpoint. * @@ -205,9 +215,14 @@ typedef void (*otTcpDisconnected)(otTcpEndpoint *aEndpoint, otTcpDisconnectedRea */ struct otTcpEndpoint { - struct otTcpEndpoint *mNext; ///< A pointer to the next TCP endpoint (internal use only) - otInstance * mInstance; ///< A pointer to the OpenThread instance associated with this TCP endpoint - void * mContext; ///< A pointer to application-specific context + union + { + uint8_t mSize[OT_TCP_ENDPOINT_TCB_SIZE_BASE + OT_TCP_ENDPOINT_TCB_NUM_PTR * sizeof(void *)]; + uint64_t mAlign; + } mTcb; + + struct otTcpEndpoint *mNext; ///< A pointer to the next TCP endpoint (internal use only) + void * mContext; ///< A pointer to application-specific context otTcpEstablished mEstablishedCallback; ///< "Established" callback function otTcpSendDone mSendDoneCallback; ///< "Send done" callback function @@ -217,7 +232,8 @@ struct otTcpEndpoint uint32_t mTimers[4]; - /* Other implementation-defined fields go here. */ + otLinkedBuffer mReceiveLinks[2]; + otSockAddr mSockAddr; }; /** @@ -438,7 +454,7 @@ otError otTcpSendByExtension(otTcpEndpoint *aEndpoint, size_t aNumBytes, uint32_ * @retval OT_ERROR_FAILED Failed to complete the operation. * */ -otError otTcpReceiveByReference(const otTcpEndpoint *aEndpoint, const otLinkedBuffer **aBuffer); +otError otTcpReceiveByReference(otTcpEndpoint *aEndpoint, const otLinkedBuffer **aBuffer); /** * Reorganizes the receive buffer to be entirely contiguous in memory. @@ -598,6 +614,16 @@ typedef otTcpIncomingConnectionAction (*otTcpAcceptReady)(otTcpListener * aLis */ typedef void (*otTcpAcceptDone)(otTcpListener *aListener, otTcpEndpoint *aEndpoint, const otSockAddr *aPeer); +/** + * OT_TCP_LISTENER_TCB_SIZE_BASE and OT_TCP_LISTENER_TCB_NUM_POINTERS are + * chosen such that the mTcbListener field of otTcpListener has the same size + * as struct tcpcb_listen in TCPlp. This is necessary because the mTcbListen + * field, though opaque in its declaration, is treated as struct tcpcb in the + * TCP implementation. + */ +#define OT_TCP_LISTENER_TCB_SIZE_BASE 16 +#define OT_TCP_LISTENER_TCB_NUM_PTR 3 + /** * This structure represents a TCP listener. * @@ -610,14 +636,17 @@ typedef void (*otTcpAcceptDone)(otTcpListener *aListener, otTcpEndpoint *aEndpoi */ struct otTcpListener { - struct otTcpListener *mNext; ///< A pointer to the next TCP listener (internal use only) - otInstance * mInstance; ///< A pointer to the OpenThread instance associated with this TCP listener - void * mContext; ///< A pointer to application-specific context + union + { + uint8_t mSize[OT_TCP_LISTENER_TCB_SIZE_BASE + OT_TCP_LISTENER_TCB_NUM_PTR * sizeof(void *)]; + void * mAlign; + } mTcbListen; + + struct otTcpListener *mNext; ///< A pointer to the next TCP listener (internal use only) + void * mContext; ///< A pointer to application-specific context otTcpAcceptReady mAcceptReadyCallback; ///< "Accept ready" callback function otTcpAcceptDone mAcceptDoneCallback; ///< "Accept done" callback function - - /* Other implementation-defined fields go here. */ }; /** diff --git a/openthread/include/openthread/thread_ftd.h b/openthread/include/openthread/thread_ftd.h index b6ad860f1f..c54ea74e7e 100644 --- a/openthread/include/openthread/thread_ftd.h +++ b/openthread/include/openthread/thread_ftd.h @@ -739,6 +739,18 @@ void otThreadRegisterNeighborTableCallback(otInstance *aInstance, otNeighborTabl */ void otThreadSetCcmEnabled(otInstance *aInstance, bool aEnabled); +/** + * This function sets whether the Security Policy TLV version-threshold for routing (VR field) is enabled. + * + * @note This API requires `OPENTHREAD_CONFIG_REFERENCE_DEVICE_ENABLE`, and is only used by Thread Test Harness + * to indicate that thread protocol version check VR should be skipped. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[in] aEnabled TRUE to enable Security Policy TLV version-threshold for routing, FALSE otherwise. + * + */ +void otThreadSetThreadVersionCheckEnabled(otInstance *aInstance, bool aEnabled); + /** * This function gets the range of router IDs that are allowed to assign to nodes within the thread network. * diff --git a/openthread/include/openthread/trel.h b/openthread/include/openthread/trel.h new file mode 100644 index 0000000000..d8ee67f7f4 --- /dev/null +++ b/openthread/include/openthread/trel.h @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2021, The OpenThread Authors. + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holder nor the + * names of its contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +/** + * @file + * @brief + * This file defines the OpenThread TREL (Thread Radio Encapsulation Link) APIs for Thread Over Infrastructure. + * + */ + +#ifndef OPENTHREAD_TREL_H_ +#define OPENTHREAD_TREL_H_ + +#include +#include +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @addtogroup api-trel + * + * @brief + * This file defines Thread Radio Encapsulation Link (TREL) APIs for Thread Over Infrastructure. + * + * The functions in this file require `OPENTHREAD_CONFIG_RADIO_LINK_TREL_ENABLE` to be enabled. + * + * @{ + * + */ + +/** + * This struct represents a TREL peer. + * + */ +typedef struct otTrelPeer +{ + otExtAddress mExtAddress; ///< The Extended MAC Address of TREL peer. + otExtendedPanId mExtPanId; ///< The Extended PAN Identifier of TREL peer. + otSockAddr mSockAddr; ///< The IPv6 socket address of TREL peer. +} otTrelPeer; + +/** + * This type represents an iterator for iterating over TREL peer table entries. + * + */ +typedef uint16_t otTrelPeerIterator; + +/** + * This function enables TREL operation. + * + * This function initiates an ongoing DNS-SD browse on the service name "_trel._udp" within the local browsing domain + * to discover other devices supporting TREL. Device also registers a new service to be advertised using DNS-SD, + * with the service name is "_trel._udp" indicating its support for TREL. Device is then ready to receive TREL messages + * from peers. + * + * @note By default the OpenThread stack enables the TREL operation on start. + * + * @param[in] aInstance The OpenThread instance. + * + */ +void otTrelEnable(otInstance *aInstance); + +/** + * This function disables TREL operation. + * + * This function stops the DNS-SD browse on the service name "_trel._udp", stops advertising TREL DNS-SD service, and + * clears the TREL peer table. + * + * @param[in] aInstance The OpenThread instance. + * + */ +void otTrelDisable(otInstance *aInstance); + +/** + * This function indicates whether the TREL operation is enabled. + * + * @param[in] aInstance The OpenThread instance. + * + * @retval TRUE if the TREL operation is enabled. + * @retval FALSE if the TREL operation is disabled. + * + */ +bool otTrelIsEnabled(otInstance *aInstance); + +/** + * This function initializes a peer table iterator. + * + * @param[in] aInstance The OpenThread instance. + * @param[in] aIterator The iterator to initialize. + * + */ +void otTrelInitPeerIterator(otInstance *aInstance, otTrelPeerIterator *aIterator); + +/** + * This function iterates over the peer table entries and get the next entry from the table + * + * @param[in] aInstance The OpenThread instance. + * @param[in] aIterator The iterator. MUST be initialized. + * + * @returns A pointer to the next `otTrelPeer` entry or `NULL` if no more entries in the table. + * + */ +const otTrelPeer *otTrelGetNextPeer(otInstance *aInstance, otTrelPeerIterator *aIterator); + +/** + * This function sets the filter mode (enables/disables filtering). + * + * When filter mode is enabled, any rx and tx traffic through TREL interface is silently dropped. This is mainly + * intended for use during testing. + * + * Unlike `otTrel{Enable/Disable}()` which fully starts/stops the TREL operation, when filter mode is enabled the + * TREL interface continues to be enabled. + * + * @param[in] aInstance The OpenThread instance. + * @param[in] aFiltered TRUE to enable filter mode, FALSE to disable filter mode. + * + */ +void otTrelSetFilterEnabled(otInstance *aInstance, bool aEnable); + +/** + * This function indicates whether or not the filter mode is enabled. + * + * @param[in] aInstance The OpenThread instance. + * + * @retval TRUE if the TREL filter mode is enabled. + * @retval FALSE if the TREL filter mode is disabled. + * + */ +bool otTrelIsFilterEnabled(otInstance *aInstance); + +/** + * @} + * + */ + +#ifdef __cplusplus +} // extern "C" +#endif + +#endif // OPENTHREAD_TREL_H_ diff --git a/openthread/lib/cortex-m33/hard-float/v1.1/ftd/cc312/libopenthread-cli-ftd.a b/openthread/lib/cortex-m33/hard-float/v1.1/ftd/cc312/libopenthread-cli-ftd.a deleted file mode 100644 index 9a90d8710e9214f8445682f9dcbe327bc8649847..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 201768 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 FA@Gx53m_b|gF0mu+iL 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