mbed-os/nanostack/thread_management_if.h

449 lines
17 KiB
C

/*
* Copyright (c) 2014-2018, Arm Limited and affiliates.
* SPDX-License-Identifier: BSD-3-Clause
*
* 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 thread_management_if.h
* \brief Thread management interface.
*
* This interface is used for configuring Thread devices.
* After creating the Thread interface, you can use this interface to configure the Thread device
* behaviour. When you are done with the configurations, you need to call interface up to enable a Thread node.
*
*/
#ifndef THREAD_MANAGEMENT_IF_H_
#define THREAD_MANAGEMENT_IF_H_
#include "ns_types.h"
#include "net_interface.h" /* Declaration for channel_list_s. */
#ifdef __cplusplus
extern "C" {
#endif
/*
* Current protocol version of the Thread implementation.
*/
#define THREAD_BEACON_PROTOCOL_ID 3 /**< Beacon Protocol ID */
#define THREAD_BEACON_PROTOCOL_VERSION 1 /**< Beacon Protocol version */
/**
* Thread network configuration.
*
* You can use this structure in start-up in case of a static configuration.
* This data can also be read after joining the Thread network.
* If this data is not provided to the stack, the device starts the commissioning process to join the Thread network.
*
* If the data is provided, all fields must be initialised to 0.
*
* If XPANID and MASTER KEY are provided, the device starts out-of-band commissioning. The values must be initialised to other than 0.
* If mesh_local_eid is initialised to 0 it is randomized at start-up.
* If extended_random_mac is initialised to 0 it is randomized at start-up.
*
* If timestamp values are set to 0 it triggers a network configuration update when joining the network.
*
* */
typedef struct link_configuration {
uint8_t name[16]; /**< Name of the Thread network*/
uint8_t master_key[16]; /**< Master key of the thread network*/
uint8_t PSKc[16]; /**< PSKc value that is calculated from commissioning credentials credentials,XPANID and network name*/
uint8_t mesh_local_ula_prefix[8]; /**< Mesh local ula prefix*/
uint8_t extented_pan_id[8]; /**< Extended pan id*/
uint8_t channel_mask[8]; /**< channel page and mask only supported is page 0*/
uint8_t channel_page;/**< channel page supported pages 0*/
uint16_t key_rotation; /**< Key rotation time in hours*/
uint32_t key_sequence; /**< Key sequence counter */
uint16_t panId; /**< network id*/
uint8_t version; /**< current protocol version*/
uint16_t rfChannel; /**< current rf channel*/
uint8_t securityPolicy; /**< Commission Security Policy*/
uint8_t securityPolicyExt; /**< Additional Security Policy byte*/
uint64_t timestamp;/**< commissioning data set timestamp. [48 bit timestamp seconds]-[15 bit timestamp ticks]-[U bit] */
} link_configuration_s;
/**
* Security policy options. Default for all is '1';
*/
#define SECURITY_POLICY_ALL_SECURITY 0xff
#define SECURITY_POLICY_OUT_OF_BAND_COMMISSIONING_ALLOWED 0x80 /**< Obtaining the Master Key for out-of-band commissioning is enabled when this is set. */
#define SECURITY_POLICY_NATIVE_COMMISSIONING_ALLOWED 0x40 /**< Native Commissioning using PSKc is allowed when this is set. */
#define SECURITY_POLICY_ALL_ROUTERS_JOIN_ALLOWED 0x20 /**< Thread 1.x Routers are enabled when this is set. */
#define SECURITY_POLICY_EXTERNAL_COMMISSIONER_ALLOWED 0x10 /**< This indicates that external Commissioner authentication is allowed using PSKc. */
#define SECURITY_POLICY_BEACON_PAYLOAD_ENABLED 0x08 /**< Thread 1.x Beacons are enabled when this is set. */
/**
* Mandatory device information
*
* This information is required if commissioning is enabled for this device.
*/
typedef struct {
uint8_t eui64[8];/**< eui64 of the device. This field is used to identify device when joining to network Mandatory*/
uint8_t mesh_local_eid[8]; /**< Mesh local extented id*/
uint8_t extended_random_mac[8]; /**< Extended random mac which is generated during commissioning*/
uint8_t *PSKd_ptr;/**< Device credentials used to authenticate device to commissioner Mandatory length 6-32*/
uint8_t PSKd_len;/**< Length of PSKd_ptr*/
char *provisioning_uri_ptr;/**< Provisioning url max 64 bytes*/
char *vendor_name_ptr;/**< Vendor name optional max 32 bytes*/
char *vendor_model_ptr;/**< Vendor model optional max 32 bytes*/
char *vendor_sw_version_ptr;/**< Vendor SW version optional max 16 bytes*/
uint8_t vendor_stack_version[6];/**< Vendor stack version optional all 0 indicates not set*/
uint8_t *vendor_data_ptr;/**< optional Array max 64 bytes*/
uint8_t vendor_data_len;/**< optional Array length max 64 bytes*/
} device_configuration_s;
/**
* Initialize Thread stack to node mode.
*
* If static configuration is given and new one is updated by commissioner
* it will override current setup. it is safe to always give this as
* default configuration.
*
* \param interface_id Network interface ID.
* \param channel_list A pointer to channel list. Can be NULL if all channels accepted.
* \param device_configuration A pointer to device configuration.
* \param static_configuration A pointer to static configuration. Can be NULL.
*
* \return 0, Init OK.
* \return <0 Init fail.
*/
int thread_management_node_init(
int8_t interface_id,
channel_list_s *channel_list,
device_configuration_s *device_configuration,
link_configuration_s *static_configuration);
/**
* Thread device type.
*
* REED - Router enabled End device. Device can become router or end device depending on network conditions.
* FED - Full End Device. Device creates links and makes address queries but does not become router.
* MED - Minimal End Device. Device communicates through parent. With radio on
* SED - Sleepy End Device. Device communicates through parent. Uses data poll to sleep.
*/
typedef enum {
THREAD_DEVICE_REED = 1,
THREAD_DEVICE_FED,
THREAD_DEVICE_MED,
THREAD_DEVICE_SED,
} thread_device_type_e;
/**
* Change thread device type.
*
* This function modifies the thread device mode. Default values are given in
* function arm_nwk_interface_configure_6lowpan_bootstrap_set().
*
* If this function is called when interface is up re-attach is made.
*
* \param interface_id Network interface ID.
* \param device_type Device type of current bootstrap.
*
* \return 0, Set OK.
* \return <0 Set fail.
*/
int thread_management_device_type_set(int8_t interface_id, thread_device_type_e device_type);
/**
* Get Thread network settings.
*
* Configuration is a pointer to the static configuration and only valid in current context.
*
* \param interface_id Network interface ID.
*
* \return Pointer to link configuration.
* \return NULL Failure.
*/
link_configuration_s *thread_management_configuration_get(int8_t interface_id);
/** Store Thread network link configuration settings to NVM.
*
* Storing is asynchronous operation and this method makes a request to store link
* configuration settings. Operation will be completed in the background.
* Once settings has been stored the Thread network will be restarted with new
* configuration settings.
*
* /param interface Id of network interface. -1 if interface_id is not available.
* /param link_config Pointer to a structure containing link configuration parameters
*
* /return 0 if store request has been delivered successfully to lower layer.
* /return -1 if storing failed (request not delivered to lower layer)
* /return -2 if store request delivered to lower layer but given interface_id was not valid.
*/
int thread_management_link_configuration_store(int8_t interface_id, link_configuration_s *link_config);
/** Configure extra TLVs in nanostack .
*
* Storing is asynchronous operation and this method makes a request to store link
* configuration settings. Operation will be completed in the background.
* Once settings has been stored the Thread network will be restarted with new
* configuration settings.
*
* /param interface Id of network interface. -1 if interface_id is not available.
* /param additional_ptr Pointer to the extra TLV that is to be configured in nanostack
* /param additional_len Length of the additional TLV
*
* /return 0 if store request is successful.
* /return < 0 if request is failed.
*/
int thread_management_link_configuration_add(int8_t interface_id, uint8_t *additional_ptr, uint8_t additional_len);
/** Delete Thread network link configuration settings.
*
* Deletion is asynchronous operation and this method makes a request to delete link
* configuration settings. Operation will be completed in the background.
* Once settings has been deleted the Thread network will be restarted with default settings.
*
* /param interface Id of network interface. -1 can be used if interface_id is not available.
*
* /return 0 if delete request has been delivered successfully to lower layer.
* /return -1 if delete failed (request not delivered to lower layer)
* /return -2 if delete request delivered to lower layer but given interface_id was not valid.
*/
int thread_management_link_configuration_delete(int8_t interface_id);
/**
* Get Thread device settings.
*
* Configuration is a pointer to the static device configuration and only valid in current context.
*
* \param interface_id Network interface ID.
*
* \return Pointer to Device configuration.
* \return NULL Failure.
*/
device_configuration_s *thread_management_device_configuration_get(int8_t interface_id);
/**
* Thread router max child count set.
*
* This function is used to limit the number of children allowed for parent.
*
* \param interface_id Network interface ID.
* \param maxChildCount Min accepted value is 0 and max 32.
*
* \return 0, Set OK.
* \return <0 Set Fail.
*/
int thread_management_max_child_count(
int8_t interface_id,
uint8_t maxChildCount);
/**
* Set Thread device link timeout.
*
* \param interface_id Network interface ID.
* \param link_timeout New timeout value in seconds.
*
* \return 0, Set OK.
* \return <0 Set Fail.
*/
int8_t thread_management_set_link_timeout(int8_t interface_id, uint32_t link_timeout);
/**
* Get link timeout from Thread device.
*
* \param interface_id Network interface ID.
* \param link_timeout [out] A pointer to the location for writing the timeout.
*
* \return 0, Get OK
* \return <0 Get Fail
*/
int8_t thread_management_get_link_timeout(int8_t interface_id, uint32_t *link_timeout);
/**
* Set Thread request full network data.
*
* \param interface_id Network interface ID.
* \param full_nwk_data Whether or not to request full network data.
*
* \return 0, Set OK.
* \return <0 Set Fail.
*/
int8_t thread_management_set_request_full_nwk_data(int8_t interface_id, bool full_nwk_data);
/**
* Get Thread request full network data.
*
* \param interface_id Network interface ID.
* \param full_nwk_data [out] Request full network data
*
* \return 0, Get OK.
* \return <0 Get Fail.
*/
int8_t thread_management_get_request_full_nwk_data(int8_t interface_id, bool *full_nwk_data);
/**
* Additional Thread device settings. Changing these can cause non-compliance with Thread.
*
*/
/**
* Diagnostics functions.
*/
/**
* Get leader mesh local 16 address.
*
* \param interface_id Network interface ID.
* \param address_ptr A pointer to the location of address after copying.
*
* \return 0, Read OK.
* \return <0 Read fail.
*/
int thread_management_get_leader_address(int8_t interface_id, uint8_t *address_ptr);
/**
* Get leader anycast address.
*
* Address should be used when contacting Leader without need to know the actual routing details.
* This address will remain valid even after leader changes.
*
* \param interface_id Network interface ID.
* \param address_ptr A pointer to the location of address after copying.
*
* \return 0, Read OK.
* \return <0 Read fail. Not connected to Thread network.
*/
int thread_management_get_leader_aloc(int8_t interface_id, uint8_t *address_ptr);
/**
* Get parent link local 16 address.
*
* \param interface_id Network interface ID.
* \param address_ptr A pointer to the location of address after copying.
*
* \return 0, Read OK.
* \return <0 Read fail.
*/
int thread_management_get_parent_address(int8_t interface_id, uint8_t *address_ptr);
/**
* Get own mesh local 64 address.
*
* \param interface_id Network interface ID.
* \param address_ptr A pointer to the location of address after copying.
*
* \return 0, Read OK.
* \return <0 Read fail.
*/
int thread_management_get_ml64_address(int8_t interface_id, uint8_t *address_ptr);
/**
* Get own mesh local 16 address.
*
* \param interface_id Network interface ID.
* \param address_ptr A pointer to the location of address after copying.
*
* \return 0, Read OK.
* \return <0 Read fail.
*/
int thread_management_get_ml16_address(int8_t interface_id, uint8_t *address_ptr);
/**
* Get commissioner address.
*
* This function returns the commissioner address where you can continue provisioning traffic.
* If the commissioner is not present this function returns a failure.
*
* \param interface_id Network interface ID.
* \param address_ptr A pointer to the location of address after copying.
* \param port_ptr A pointer to the location of port after copying.
*
* \return 0, Read OK.
* \return <0 Read fail.
*/
int thread_management_get_commissioner_address(int8_t interface_id, uint8_t *address_ptr, uint16_t *port_ptr);
/**
* Set device certificate.
*
* This function sets device certificate
*
* \param interface_id Network interface ID.
* \param device_certificate_ptr A pointer to the device certificate.
* \param device_certificate_len Length of device certificate.
* \param priv_key_ptr A private key
* \param priv_key_len Length of a private key
*
* \return 0, OK.
* \return <0 fail.
*/
int thread_management_device_certificate_set(int8_t interface_id, const unsigned char *device_certificate_ptr, uint16_t device_certificate_len, const unsigned char *priv_key_ptr, uint16_t priv_key_len);
/**
* Set network certificate.
*
* This function sets network certificate
*
* \param interface_id Network interface ID.
* \param network_certificate_ptr A pointer array to the network certificate chain.
* \param network_certificate_len An array of lengths of network certificates in chain.
* \param priv_key_ptr A private key
* \param priv_key_len Length of a private key
*
* \return 0, OK.
* \return <0 fail.
*/
int thread_management_network_certificate_set(int8_t interface_id, const unsigned char *network_certificate_ptr, uint16_t network_certificate_len, const unsigned char *priv_key_ptr, uint16_t priv_key_len);
/**
* Set Thread partition weighting.
*
* This function sets weighting value for Thread network partition. Interface will be restarted if interface is active and
* new weighting value is different than previous weighting value.
*
* \param interface_id Network interface ID.
* \param partition_weighting New weighting value for Thread partition
*
* \return 0, OK.
* \return <0 fail.
*/
int thread_management_partition_weighting_set(int8_t interface_id, uint8_t partition_weighting);
/**
* Set Thread Sleepy End Device parent packet buffer size.
*
* This function can be used to adjust count of packets SED parent is storing.
*
* \param interface_id Network interface ID.
* \param small_packets_per_child_count Number of small packets parent is storing for each SED.
* \param big_packets_total_count Number of big packets parent can store for all SEDs.
*
* \return 0, OK.
* \return <0 fail.
*/
int thread_management_sed_parent_buffer_size_set(int8_t interface_id, uint16_t small_packets_per_child_count, uint16_t big_packets_total_count);
#ifdef __cplusplus
}
#endif
#endif /* THREAD_MANAGEMENT_IF_H_ */