/*
 *  Copyright (c) 2020, 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 Doxygen group structure for OpenThread documentation.
 */

/**
 * @defgroup api  API
 * @brief
 *   This module includes the application programming interface to the OpenThread stack.
 *
 * @{
 *
 * @defgroup api-error Error
 *
 * @defgroup api-execution Execution
 *
 * @{
 *
 * @defgroup api-instance Instance
 * @defgroup api-tasklets Tasklets
 *
 * @}
 *
 * @defgroup api-net IPv6 Networking
 * @{
 *
 * @defgroup api-dns         DNSv6
 * @defgroup api-icmp6       ICMPv6
 * @defgroup api-ip6         IPv6
 * @defgroup api-udp-group   UDP
 *
 * @{
 *
 * @defgroup api-udp         UDP
 * @defgroup api-udp-forward UDP Forward
 *
 * @}
 *
 * @}
 *
 * @defgroup api-link Link
 *
 * @{
 *
 * @defgroup api-link-link Link
 * @defgroup api-link-raw  Raw Link
 *
 * @}
 *
 * @defgroup api-message Message
 *
 * @defgroup api-thread Thread
 *
 * @{
 *
 * @defgroup api-border-agent   Border Agent
 * @defgroup api-border-router  Border Router
 * @defgroup api-commissioner   Commissioner
 * @defgroup api-thread-general General
 * @brief This module includes functions for all Thread roles.
 * @defgroup api-joiner         Joiner
 * @defgroup api-thread-router  Router/Leader
 * @brief This module includes functions for Thread Routers and Leaders.
 * @defgroup api-server         Server
 *
 * @}
 *
 * @defgroup api-addons Add-Ons
 *
 * @{
 *
 * @defgroup api-channel-manager     Channel Manager
 * @defgroup api-channel-monitor     Channel Monitoring
 * @defgroup api-child-supervision   Child Supervision
 * @defgroup api-coap-group          CoAP
 *
 * @{
 *
 * @defgroup api-coap                CoAP
 * @defgroup api-coap-secure         CoAP Secure
 *
 * @}
 *
 * @defgroup api-cli                 Command Line Interface
 * @defgroup api-crypto              Crypto
 * @defgroup api-entropy             Entropy Source
 * @defgroup api-factory-diagnostics Factory Diagnostics
 * @defgroup api-heap                Heap
 * @defgroup api-jam-detection       Jam Detection
 * @defgroup api-logging             Logging
 * @defgroup api-ncp                 Network Co-Processor
 * @defgroup api-network-time        Network Time Synchronization
 * @defgroup api-random-group        Random Number Generator
 *
 * @{
 *
 * @defgroup api-random-crypto       RNG Cryptographic
 * @defgroup api-random-non-crypto   RNG Non-cryptographic
 *
 * @}
 *
 * @defgroup api-sntp                SNTP
 *
 * @}
 *
 * @}
 *
 */

/**
 * @defgroup platform  Platform Abstraction
 * @brief
 *   This module includes the platform abstraction used by the OpenThread stack.
 *
 * @{
 *
 * @defgroup plat-alarm               Alarm
 * @defgroup plat-ble                 BLE Host
 * @defgroup plat-entropy             Entropy
 * @defgroup plat-factory-diagnostics Factory Diagnostics
 * @defgroup plat-logging             Logging
 * @defgroup plat-memory              Memory
 * @defgroup plat-messagepool         Message Pool
 * @defgroup plat-misc                Miscellaneous
 * @defgroup plat-radio               Radio
 * @defgroup plat-settings            Settings
 * @defgroup plat-spi-slave           SPI Slave
 * @defgroup plat-time                Time Service
 * @defgroup plat-toolchain           Toolchain
 * @defgroup plat-uart                UART
 *
 * @}
 *
 */

