#  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.
#

_openthread_config_file = ""
if (current_os == "fuchsia") {
  _openthread_config_file = "<openthread-config-fuchsia.h>"
}

declare_args() {
  # OpenThread config header.
  openthread_config_file = _openthread_config_file

  # Extra deps for OpenThread configuration.
  openthread_config_deps = []

  # Include directories for project specific configs.
  openthread_project_include_dirs = []

  # OpenThread project-specific core config header
  openthread_project_core_config_file = ""

  # OpenThread platform-specific config check header
  openthread_core_config_platform_check_file = ""

  # Extra deps for OpenThread core configuration.
  openthread_core_config_deps = []

  # Use external platform.
  openthread_external_platform = ""

  # Use external mbedtls. If blank, internal mbedtls will be used.
  openthread_external_mbedtls = ""

  # Package name for OpenThread.
  openthread_package_name = "OPENTHREAD"

  # Package version for OpenThread.
  openthread_package_version = "1.0.0"
}

declare_args() {
  # Configure OpenThread via GN arguments.
  openthread_enable_core_config_args = openthread_project_core_config_file == ""
}

if (openthread_enable_core_config_args) {
  declare_args() {
    # Thread version: 1.1, 1.2
    openthread_config_thread_version = "1.2"

    # Log output: none, debug_uart, app, platform
    openthread_config_log_output = ""

    # Enable assertions.
    openthread_config_assert_enable = true

    # Enable backbone router functionality
    openthread_config_backbone_router_enable = false

    # Enable border agent support
    openthread_config_border_agent_enable = false

    # Enable border router support
    openthread_config_border_router_enable = false

    # Enable border routing support
    openthread_config_border_routing_enable = false

    # Enable channel manager support
    openthread_config_channel_manager_enable = false

    # Enable channel monitor support
    openthread_config_channel_monitor_enable = false

    # Enable child supervision support
    openthread_config_child_supervision_enable = false

    # Enable coap api support
    openthread_config_coap_api_enable = false

    # Enable secure coap api support
    openthread_config_coap_secure_api_enable = false

    # Enable coap observe (RFC7641) api support
    openthread_config_coap_observe_api_enable = false

    # Enable commissioner support
    openthread_config_commissioner_enable = false

    # Enable csl receiver
    openthread_config_mac_csl_receiver_enable = false

    # Enable DHCP6 client support
    openthread_config_dhcp6_client_enable = false

    # Enable DHCP6 server support
    openthread_config_dhcp6_server_enable = false

    # Enable diagnostic support
    openthread_config_diag_enable = false

    # Enable DNS client support
    openthread_config_dns_client_enable = false

    # Enable DNS-SD server support
    openthread_config_dnssd_server_enable = false

    # Enable ECDSA support
    openthread_config_ecdsa_enable = false

    # Enable Domain Unicast Address feature for Thread 1.2
    openthread_config_dua_enable = false

    # Enable Multicast Listener Registration feature for Thread 1.2
    openthread_config_mlr_enable = false

    # Enable external heap support
    openthread_config_heap_external_enable = false

    # Enable ipv6 fragmentation support
    openthread_config_ip6_fragmentation_enable = false

    # Enable jam detection support
    openthread_config_jam_detection_enable = false

    # Enable joiner support
    openthread_config_joiner_enable = false

    # Enable legacy network support
    openthread_config_legacy_enable = false

    # Enable link metrics initiator
    openthread_config_link_metrics_initiator_enable = false

    # Enable link metrics subject
    openthread_config_link_metrics_subject_enable = false

    # Enable link raw service
    openthread_config_link_raw_enable = false

    # Enable dynamic log level control
    openthread_config_log_level_dynamic_enable = false

    # Enable mac filter support
    openthread_config_mac_filter_enable = false

    # Enable use built-in heap for message buffers
    openthread_config_message_use_heap = false

    # Enable MLE long routes extension (experimental, breaks Thread conformance]
    openthread_config_mle_long_routes_enable = false

    # Enable TMF network diagnostics on MTDs
    openthread_config_tmf_network_diag_mtd_enable = false

    # Enable multiple instances
    openthread_config_multiple_instance_enable = false

    # Enable platform netif support
    openthread_config_platform_netif_enable = false

    # Enable platform UDP support
    openthread_config_platform_udp_enable = false

    # Enable Thread Test Harness reference device support
    openthread_config_reference_device_enable = false

    # Enable support for injecting Service entries into the Thread Network Data
    openthread_config_tmf_netdata_service_enable = false

    # Enable volatile-only storage of settings
    openthread_settings_ram = false

    # Enable support for adding of auto-configured SLAAC addresses by OpenThread
    openthread_config_ip6_slaac_enable = false

    # Enable SNTP Client support
    openthread_config_sntp_client_enable = false

    # Enable SRP Client support
    openthread_config_srp_client_enable = false

    # Enable SRP Server support
    openthread_config_srp_server_enable = false

    # Enable ping sender support
    openthread_config_ping_sender = false

    # Enable the time synchronization service feature
    openthread_config_time_sync_enable = false

    # Enable UDP forward support
    openthread_config_udp_forward_enable = false

    # Enable full logs
    openthread_config_full_logs = false

    # Enable OTNS support
    openthread_config_otns_enable = false

    # Enable NCP SPI support
    openthread_config_ncp_spi_enable = false

    # Enable NCP HDLC support
    openthread_config_ncp_hdlc_enable = false

    # Enable builtin mbedtls management
    openthread_config_enable_builtin_mbedtls_management =
        openthread_external_mbedtls == ""
  }
}

if (openthread_external_mbedtls != "") {
  mbedtls_target = openthread_external_mbedtls
} else {
  mbedtls_target = "../../third_party/mbedtls"
}
