mirror of https://github.com/ARMmbed/mbed-os.git
362 lines
17 KiB
C
362 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_network_data_storage.h
|
|
* \brief Add short description about this file!!!
|
|
*
|
|
*/
|
|
|
|
#ifndef THREAD_NETWORK_DATA_PROXY_H_
|
|
#define THREAD_NETWORK_DATA_PROXY_H_
|
|
|
|
#include "ns_list.h"
|
|
#include "thread_constants.h"
|
|
|
|
struct link_configuration;
|
|
struct thread_commissioner;
|
|
|
|
typedef struct thread_network_data_context_entry_s {
|
|
unsigned cid: 4; /*!< 4-bit Context ID */
|
|
bool compression: 1; /*!< C (Compression) flag */
|
|
bool stableData: 1;
|
|
bool canDelete: 1;
|
|
uint8_t contextPrefixLength; /*!< Context prefix length in bits */
|
|
uint32_t context_reuse_delay; /*!< Time in seconds */
|
|
ns_list_link_t link; /*!< List link entry */
|
|
} thread_network_data_context_entry_t;
|
|
|
|
typedef struct thread_network_local_data_context_entry_s {
|
|
unsigned cid: 4; /*!< 4-bit Context ID */
|
|
bool compression: 1; /*!< C (Compression) flag */
|
|
uint8_t contextPrefixLength; /*!< Context prefix length in bits */
|
|
bool stableData: 1;
|
|
} thread_network_local_data_context_entry_t;
|
|
|
|
typedef NS_LIST_HEAD(thread_network_data_context_entry_t, link) thread_data_context_list_t;
|
|
|
|
typedef struct thread_network_data_temporary_route_or_dhcpv6_server_entry_s {
|
|
uint16_t routerID; /*!< Services UL16 */
|
|
signed Prf: 2;
|
|
bool P_preferred: 1;
|
|
bool P_slaac: 1;
|
|
bool P_dhcp: 1;
|
|
bool P_configure: 1;
|
|
bool P_default_route: 1;
|
|
bool stableData: 1;
|
|
bool P_on_mesh: 1;
|
|
bool P_nd_dns: 1;
|
|
bool P_res1: 1;
|
|
bool canDelete: 1;
|
|
ns_list_link_t link; /*!< List link entry */
|
|
} thread_network_server_data_entry_t;
|
|
|
|
typedef struct thread_border_router_tlv_entry_t {
|
|
uint16_t routerID; /*!< Services UL16 */
|
|
signed Prf: 2; /* P_preference */
|
|
bool P_preferred: 1; /* P_preferred */
|
|
bool P_slaac: 1; /* P_slaac */
|
|
bool P_dhcp: 1; /* P_dhcp */
|
|
bool P_configure: 1; /* P_configure */
|
|
bool P_default_route: 1; /* P_default */
|
|
bool stableData: 1; /* P_stable */
|
|
bool P_on_mesh: 1; /* P_on_mesh */
|
|
bool P_nd_dns: 1; /* P_nd_dns */
|
|
bool P_res1: 1; /* P_res1 */
|
|
} thread_border_router_tlv_entry_t;
|
|
|
|
typedef struct thread_prefix_tlv {
|
|
uint8_t domainId;
|
|
uint8_t *Prefix;
|
|
uint8_t PrefixLen;
|
|
} thread_prefix_tlv_t;
|
|
|
|
typedef NS_LIST_HEAD(thread_network_server_data_entry_t, link) thread_network_server_data_list_t;
|
|
|
|
typedef struct thread_network_data_service_server_entry_s {
|
|
uint16_t router_id; /*!< Services UL16 */
|
|
uint8_t *server_data;
|
|
uint8_t server_data_length;
|
|
bool stable : 1;
|
|
bool can_delete : 1;
|
|
ns_list_link_t link; /*!< List link entry */
|
|
} thread_network_data_service_server_entry_t;
|
|
|
|
typedef NS_LIST_HEAD(thread_network_data_service_server_entry_t, link) thread_network_data_service_server_list_t;
|
|
|
|
typedef struct thread_network_data_service_cache_entry_s {
|
|
bool T : 1;
|
|
unsigned S_id : 4;
|
|
bool S_stable : 1;
|
|
uint32_t S_enterprise_number;
|
|
uint8_t *S_service_data;
|
|
uint8_t S_service_data_length;
|
|
thread_network_data_service_server_list_t server_list;
|
|
ns_list_link_t link; /*!< List link entry */
|
|
} thread_network_data_service_cache_entry_t;
|
|
|
|
/** This List Not inlude ::/0 Routes those are listed separately */
|
|
typedef struct thread_network_data_prefix_cache_entry_s {
|
|
uint8_t domainId;
|
|
uint8_t servicesPrefix[16]; /*!< Services Prefix */
|
|
uint8_t servicesPrefixLen; /*!< Prefix length in bits This Can Be 1-128 */
|
|
thread_data_context_list_t contextList;
|
|
thread_network_server_data_list_t routeList;
|
|
thread_network_server_data_list_t borderRouterList;
|
|
ns_list_link_t link; /*!< List link entry */
|
|
} thread_network_data_prefix_cache_entry_t;
|
|
|
|
typedef struct thread_network_local_data_entry_s {
|
|
uint8_t domainId;
|
|
uint8_t servicesPrefix[16]; /*!< Services Prefix */
|
|
uint8_t servicesPrefixLen; /*!< Prefix length in bits This Can Be 1-128 */
|
|
bool routeActive: 1;
|
|
bool routeDataStable: 1;
|
|
bool brActive: 1;
|
|
bool dhcpv6ServerActive: 1;
|
|
bool brDataStable: 1;
|
|
bool slaacServerActive: 1;
|
|
bool slaacPreferred: 1;
|
|
unsigned preference: 2;
|
|
bool configure: 1;
|
|
bool defaultRoute: 1;
|
|
bool onMesh: 1;
|
|
bool ndDns: 1;
|
|
bool res1: 1;
|
|
ns_list_link_t link; /*!< List link entry */
|
|
} thread_network_local_data_entry_t;
|
|
|
|
/* The contents of the Service TLV & Server Set tuple */
|
|
typedef struct thread_network_data_service_entry_s {
|
|
bool T : 1; // '1' if S_enterprise number is THREAD_ENTERPRISE_NUMBER; otherwise, '0'.
|
|
unsigned S_id : 4;
|
|
uint32_t S_enterprise_number;
|
|
uint8_t *S_service_data;
|
|
uint8_t S_service_data_length;
|
|
uint8_t *S_server_data;
|
|
uint8_t S_server_data_length;
|
|
bool S_stable;
|
|
ns_list_link_t link; /*!< List link entry */
|
|
} thread_network_data_service_entry_t;
|
|
|
|
typedef NS_LIST_HEAD(thread_network_data_service_cache_entry_t, link) thread_network_data_service_cache_list_t;
|
|
typedef NS_LIST_HEAD(thread_network_data_prefix_cache_entry_t, link) thread_network_prefix_list_t;
|
|
typedef NS_LIST_HEAD(thread_network_local_data_entry_t, link) thread_network_data_prefix_list_t;
|
|
typedef NS_LIST_HEAD(thread_network_data_service_entry_t, link) thread_network_data_service_list_t;
|
|
|
|
/** Network Data Main struct for seprate local data and Global */
|
|
typedef struct thread_network_data_cache_entry_s {
|
|
thread_network_prefix_list_t localPrefixList; /*!< Local parsed or generated service list */
|
|
thread_network_data_service_cache_list_t service_list;
|
|
uint8_t networkDataTlvSize; /*!< Network data TLV Size */
|
|
uint8_t network_data[THREAD_MAX_NETWORK_DATA_SIZE];
|
|
uint16_t network_data_len;
|
|
uint32_t contex_id_reuse_timeout;
|
|
uint8_t network_data_update_delay;
|
|
bool stableUpdatePushed: 1;
|
|
bool temporaryUpdatePushed: 1;
|
|
} thread_network_data_cache_entry_t;
|
|
|
|
typedef struct thread_network_local_data_cache_entry_s {
|
|
thread_network_data_prefix_list_t prefix_list; /*!< Local parsed or generated service list */
|
|
thread_network_data_service_list_t service_list;
|
|
uint16_t registered_rloc16;/*!< Address used for latest registration */
|
|
uint16_t publish_coap_req_id;/*!< Non-zero when publish is active */
|
|
bool release_old_address: 1; /*!< true if network data can be released from old address */
|
|
bool publish_pending: 1; /*!< true when publish attempt made during active publish */
|
|
} thread_network_local_data_cache_entry_t;
|
|
|
|
/**
|
|
* Initialise Thread Network Data cache
|
|
*
|
|
* \param cachePtr Pointer to Network Data Structure which will be initialized
|
|
*
|
|
*/
|
|
void thread_network_data_base_init(thread_network_data_cache_entry_t *cachePtr);
|
|
|
|
void thread_network_local_server_data_base_init(thread_network_local_data_cache_entry_t *cachePtr);
|
|
|
|
void thread_network_data_free_and_clean(thread_network_data_cache_entry_t *cachePtr);
|
|
|
|
void thread_network_data_router_id_mark_delete(thread_network_data_cache_entry_t *cachePtr, uint16_t routerID, bool subSet);
|
|
|
|
bool thread_network_data_router_id_free(thread_network_data_cache_entry_t *cachePtr, bool subSet, struct protocol_interface_info_entry *curInterface);
|
|
|
|
void thread_network_local_data_free_and_clean(thread_network_local_data_cache_entry_t *cachePtr, int8_t interface_id);
|
|
|
|
void thread_network_data_context_re_use_timer_update(int8_t id, thread_network_data_cache_entry_t *cachePtr, uint32_t ticks, lowpan_context_list_t *context_list);
|
|
|
|
/**
|
|
* Add new route information to route List
|
|
*
|
|
* \param networkDataList Pointer main network data structure
|
|
* \param prefixTlv Prefix TLV (domainID, Prefix, PrefixLen)
|
|
* \param service Route TLV
|
|
*
|
|
* return 0, ADD OK
|
|
* return <0 Add Not OK
|
|
*/
|
|
int thread_nd_local_list_add_route(thread_network_data_cache_entry_t *networkDataList, thread_prefix_tlv_t *prefixTlv, thread_border_router_tlv_entry_t *service);
|
|
|
|
int thread_nd_local_list_add_service(thread_network_data_cache_entry_t *networkDataList, thread_network_data_service_entry_t *service, thread_network_data_service_server_entry_t *server);
|
|
|
|
/**
|
|
* Add new DHCPv6 Server information to route List
|
|
*
|
|
* \param networkDataList Pointer main network data structure
|
|
* \param prefixTlv Prefix TLV (domainID, Prefix, PrefixLen)
|
|
* \param service On Mesh prefix TLV
|
|
*
|
|
* return 0, ADD OK
|
|
* return <0 Add Not OK
|
|
*/
|
|
int thread_nd_local_list_add_on_mesh_prefix(thread_network_data_cache_entry_t *networkDataList, thread_prefix_tlv_t *prefixTlv, thread_border_router_tlv_entry_t *service);
|
|
|
|
|
|
/**
|
|
* Del DHCPv6 Server information to route List
|
|
*
|
|
* \param networkDataList Pointer main network data structure
|
|
* \param prefixTlv Prefix TLV (domainID, Prefix, PrefixLen)
|
|
* \param service On Mesh prefix TLV
|
|
*
|
|
* return 0, Del OK
|
|
* return <0 Del Not OK
|
|
*/
|
|
int thread_nd_local_list_del_on_mesh_server(thread_network_data_cache_entry_t *networkDataList, thread_prefix_tlv_t *prefixTlv, thread_border_router_tlv_entry_t *service);
|
|
|
|
/**
|
|
* Add new Local DHCPv6 Server information to route List
|
|
*
|
|
* \param networkDataList Pointer main network data structure
|
|
* \param prefixTlv Prefix TLV (domainID, Prefix, PrefixLen)
|
|
* \param service On Mesh prefix TLV
|
|
*
|
|
* return 0, ADD OK
|
|
* return <0 Add Not OK
|
|
*/
|
|
int thread_local_server_list_add_on_mesh_server(thread_network_local_data_cache_entry_t *networkDataList, thread_prefix_tlv_t *prefixTlv, thread_border_router_tlv_entry_t *service);
|
|
|
|
/**
|
|
* Del Local DHCPv6 Server information to route List
|
|
*
|
|
* \param networkDataList Pointer main network data structure
|
|
* \param prefixTlv Prefix TLV (domainID, Prefix, PrefixLen)
|
|
*
|
|
* return 0, Del OK
|
|
* return <0 Del Not OK
|
|
*/
|
|
int thread_local_server_list_del_on_mesh_server(thread_network_local_data_cache_entry_t *networkDataList, thread_prefix_tlv_t *prefixTlv);
|
|
|
|
int thread_local_service_list_add(thread_network_local_data_cache_entry_t *networkDataList, thread_network_data_service_entry_t *service);
|
|
|
|
int thread_local_service_list_del(thread_network_local_data_cache_entry_t *networkDataList, thread_network_data_service_entry_t *service);
|
|
|
|
/**
|
|
* Add new local route information to route List
|
|
*
|
|
* \param networkDataList Pointer main network data structure
|
|
* \param prefixTlv Prefix TLV (domainID, Prefix, PrefixLen)
|
|
* \param route HAS Route TLV
|
|
*
|
|
* return 0, ADD OK
|
|
* return <0 Add Not OK
|
|
*/
|
|
int thread_local_server_add_route(thread_network_local_data_cache_entry_t *networkDataList, thread_prefix_tlv_t *prefixTlv, thread_border_router_tlv_entry_t *route);
|
|
|
|
/**
|
|
* Del local route information to route List
|
|
*
|
|
* \param networkDataList Pointer main network data structure
|
|
* \param prefixTlv Prefix TLV (domainID, Prefix, PrefixLen)
|
|
*
|
|
* return 0, Del OK
|
|
* return <0 Del Not OK
|
|
*/
|
|
int thread_local_server_del_route(thread_network_local_data_cache_entry_t *networkDataList, thread_prefix_tlv_t *prefixTlv);
|
|
|
|
/**
|
|
* Add new 6LoWPAN contexts information to Network Data list
|
|
*
|
|
* \param networkDataList Network Data structure pointer
|
|
* \param prefixTlv Prefix TLV (domainID, Prefix, PrefixLen)
|
|
* \param context Context TLV
|
|
*
|
|
* return 0, ADD OK
|
|
* return <0 Add Not OK
|
|
*/
|
|
int thread_nd_local_list_add_contexts(thread_network_data_cache_entry_t *networkDataList, thread_prefix_tlv_t *prefixTlv, thread_network_local_data_context_entry_t *context);
|
|
|
|
/**
|
|
* Add new 6LoWPAN contexts information to Network Data list
|
|
*
|
|
* \param networkDataList Network Interface
|
|
* \param prefixPtr pointer 6LoWPAN Contexts
|
|
* \param prefixLength indicate prefix pointer valid information in bits
|
|
*
|
|
* return 0, ADD OK
|
|
* return <0 Add Not OK
|
|
*/
|
|
uint8_t thread_nd_context_id_allocate(thread_network_data_cache_entry_t *networkDataList, thread_network_local_data_cache_entry_t *localDataList, uint8_t *prefixPtr, uint8_t prefixLength);
|
|
|
|
int thread_nd_verify_contex_id_is_free(thread_network_data_cache_entry_t *list, uint8_t *prefixPtr, thread_network_local_data_context_entry_t *context);
|
|
|
|
thread_network_data_service_cache_entry_t *thread_network_data_service_entry_find(thread_network_data_service_cache_list_t *list, thread_network_data_service_entry_t *service);
|
|
|
|
/**
|
|
* Write Network Data full list or stable subset to given pointer
|
|
*
|
|
* \param networkDataList Network Data structure pointer
|
|
* \param ptr pointer for write Network Data
|
|
* \param fullList Boolean to select Full data or stable subset
|
|
*
|
|
* return Updated Pointer value end of Network Data
|
|
*/
|
|
uint16_t thread_network_data_service_set_size(thread_network_data_cache_entry_t *networkDataList, bool fullList);
|
|
uint16_t thread_network_data_prefix_set_size(thread_network_data_cache_entry_t *networkDataList, bool fullList);
|
|
uint8_t *thread_network_data_prefix_set_write(thread_network_data_cache_entry_t *networkDataList, uint8_t *ptr);
|
|
uint8_t *thread_network_data_service_set_write(thread_network_data_cache_entry_t *networkDataList, uint8_t *ptr);
|
|
bool thread_network_data_service_hosted_by_this_router_id(thread_network_data_service_cache_entry_t *dataList, uint16_t router_id);
|
|
uint16_t thread_network_data_service_child_id_from_networkdata_get(thread_network_data_cache_entry_t *networkDataList, uint16_t router_short_addr);
|
|
thread_network_data_prefix_cache_entry_t *thread_prefix_entry_find(thread_network_prefix_list_t *list, thread_prefix_tlv_t *prefixTlv);
|
|
uint8_t *thread_nd_own_service_list_data_write(thread_network_local_data_cache_entry_t *serverDataList, uint8_t *ptr, uint16_t routerID);
|
|
|
|
uint16_t thread_nd_own_service_list_data_size(thread_network_local_data_cache_entry_t *serverDataList);
|
|
|
|
void thread_nd_network_data_print(thread_network_data_cache_entry_t *networkData, uint16_t routerId);
|
|
bool thread_nd_dhcp_anycast_address_mapping_from_network_data(thread_network_data_cache_entry_t *networkDataList, uint16_t *rlocAddress, uint8_t contexId);
|
|
bool thread_nd_service_anycast_address_mapping_from_network_data(thread_network_data_cache_entry_t *networkDataList, uint16_t *rlocAddress, uint8_t S_id);
|
|
|
|
bool thread_nd_on_mesh_address_valid(thread_network_server_data_entry_t *curRoute);
|
|
thread_network_server_data_entry_t *thread_nd_hosted_by_this_routerid(uint16_t routerId, thread_network_server_data_list_t *list);
|
|
bool thread_network_data_services_registered(thread_network_data_cache_entry_t *cachePtr, uint16_t routerID);
|
|
int thread_network_data_resulting_tlv_size(thread_network_data_cache_entry_t *networkDataStorage, uint8_t *network_data_ptr, uint16_t network_data_length, uint16_t router_id);
|
|
|
|
#endif /* THREAD_NETWORK_DATA_PROXY_H_ */
|