/*
 *  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-dnssd-server         DNS-SD Server
 * @defgroup api-icmp6                ICMPv6
 * @defgroup api-ip6                  IPv6
 * @defgroup api-srp                  SRP
 * @defgroup api-ping-sender          Ping Sender
 * @defgroup api-tcp                  TCP
 * @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-metrics         Link Metrics
 * @defgroup api-link-raw             Raw Link
 *
 * @}
 *
 * @defgroup api-message              Message
 *
 * @defgroup api-multi-radio          Multi Radio Link
 * @defgroup api-trel                 TREL - Thread Stack
 *
 * @defgroup api-thread               Thread
 *
 * @{
 *
 * @defgroup api-backbone-router      Backbone Router
 * @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-operational-dataset  Operational Dataset
 * @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 - Thread Stack
 * @defgroup api-factory-diagnostics  Factory Diagnostics - Thread Stack
 * @defgroup api-heap                 Heap
 * @defgroup api-history-tracker      History Tracker
 * @defgroup api-jam-detection        Jam Detection
 * @defgroup api-logging              Logging - Thread Stack
 * @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-crypto              Crypto - Platform
 * @defgroup plat-entropy             Entropy
 * @defgroup plat-factory-diagnostics Factory Diagnostics - Platform
 * @defgroup plat-logging             Logging - Platform
 * @defgroup plat-memory              Memory
 * @defgroup plat-messagepool         Message Pool
 * @defgroup plat-misc                Miscellaneous
 * @defgroup plat-otns                Network Simulator
 * @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-trel                TREL - Platform
 *
 * @}
 *
 */
