BA
/
BaBoRo1
Embed:
(wiki syntax)
Show/hide line numbers
thread_network_data_storage.h
00001 /* 00002 * Copyright (c) 2014-2017, Arm Limited and affiliates. 00003 * SPDX-License-Identifier: BSD-3-Clause 00004 * 00005 * Redistribution and use in source and binary forms, with or without 00006 * modification, are permitted provided that the following conditions are met: 00007 * 00008 * 1. Redistributions of source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer. 00010 * 2. Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in the 00012 * documentation and/or other materials provided with the distribution. 00013 * 3. Neither the name of the copyright holder nor the 00014 * names of its contributors may be used to endorse or promote products 00015 * derived from this software without specific prior written permission. 00016 * 00017 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00018 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00019 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00020 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE 00021 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00022 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00023 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00024 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00025 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00026 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00027 * POSSIBILITY OF SUCH DAMAGE. 00028 */ 00029 00030 /* 00031 * \file thread_network_data_storage.h 00032 * \brief Add short description about this file!!! 00033 * 00034 */ 00035 00036 #ifndef THREAD_NETWORK_DATA_PROXY_H_ 00037 #define THREAD_NETWORK_DATA_PROXY_H_ 00038 00039 #include "ns_list.h" 00040 #include "thread_constants.h" 00041 00042 struct link_configuration; 00043 struct thread_commissioner; 00044 00045 typedef struct thread_network_data_context_entry_s { 00046 unsigned cid: 4; /*!< 4-bit Context ID */ 00047 bool compression: 1; /*!< C (Compression) flag */ 00048 bool stableData: 1; 00049 bool canDelete: 1; 00050 uint8_t contextPrefixLength; /*!< Context prefix length in bits */ 00051 uint32_t context_reuse_delay; /*!< Time in seconds */ 00052 ns_list_link_t link; /*!< List link entry */ 00053 } thread_network_data_context_entry_t; 00054 00055 typedef struct thread_network_local_data_context_entry_s { 00056 unsigned cid: 4; /*!< 4-bit Context ID */ 00057 bool compression: 1; /*!< C (Compression) flag */ 00058 uint8_t contextPrefixLength; /*!< Context prefix length in bits */ 00059 bool stableData: 1; 00060 } thread_network_local_data_context_entry_t; 00061 00062 typedef NS_LIST_HEAD (thread_network_data_context_entry_t, link) thread_data_context_list_t; 00063 00064 typedef struct thread_network_data_temporary_route_or_dhcpv6_server_entry_s { 00065 uint16_t routerID; /*!< Services UL16 */ 00066 signed Prf: 2; 00067 bool P_preferred: 1; 00068 bool P_slaac: 1; 00069 bool P_dhcp: 1; 00070 bool P_configure: 1; 00071 bool P_default_route: 1; 00072 bool stableData: 1; 00073 bool P_on_mesh: 1; 00074 bool P_nd_dns: 1; 00075 bool canDelete: 1; 00076 ns_list_link_t link; /*!< List link entry */ 00077 } thread_network_server_data_entry_t; 00078 00079 typedef struct thread_border_router_tlv_entry_t { 00080 uint16_t routerID; /*!< Services UL16 */ 00081 signed Prf: 2; /* P_preference */ 00082 bool P_preferred: 1; /* P_preferred */ 00083 bool P_slaac: 1; /* P_slaac */ 00084 bool P_dhcp: 1; /* P_dhcp */ 00085 bool P_configure: 1; /* P_configure */ 00086 bool P_default_route: 1; /* P_default */ 00087 bool stableData: 1; /* P_stable */ 00088 bool P_on_mesh: 1; /* P_on_mesh */ 00089 bool P_nd_dns: 1; /* P_nd_dns */ 00090 } thread_border_router_tlv_entry_t; 00091 00092 typedef struct thread_prefix_tlv { 00093 uint8_t domainId; 00094 uint8_t *Prefix; 00095 uint8_t PrefixLen; 00096 } thread_prefix_tlv_t; 00097 00098 typedef NS_LIST_HEAD (thread_network_server_data_entry_t, link) thread_network_server_data_list_t; 00099 00100 typedef struct thread_network_data_service_server_entry_s { 00101 uint16_t router_id; /*!< Services UL16 */ 00102 uint8_t *server_data; 00103 uint8_t server_data_length; 00104 bool stable : 1; 00105 bool can_delete : 1; 00106 ns_list_link_t link; /*!< List link entry */ 00107 } thread_network_data_service_server_entry_t; 00108 00109 typedef NS_LIST_HEAD (thread_network_data_service_server_entry_t, link) thread_network_data_service_server_list_t; 00110 00111 typedef struct thread_network_data_service_cache_entry_s { 00112 bool T : 1; 00113 unsigned S_id : 4; 00114 bool S_stable : 1; 00115 uint32_t S_enterprise_number; 00116 uint8_t *S_service_data; 00117 uint8_t S_service_data_length; 00118 thread_network_data_service_server_list_t server_list; 00119 ns_list_link_t link; /*!< List link entry */ 00120 } thread_network_data_service_cache_entry_t; 00121 00122 /** This List Not inlude ::/0 Routes those are listed separately */ 00123 typedef struct thread_network_data_prefix_cache_entry_s { 00124 uint8_t domainId; 00125 uint8_t servicesPrefix [16]; /*!< Services Prefix */ 00126 uint8_t servicesPrefixLen ; /*!< Prefix length in bits This Can Be 1-128 */ 00127 thread_data_context_list_t contextList; 00128 thread_network_server_data_list_t routeList; 00129 thread_network_server_data_list_t borderRouterList; 00130 ns_list_link_t link ; /*!< List link entry */ 00131 } thread_network_data_prefix_cache_entry_t; 00132 00133 typedef struct thread_network_local_data_entry_s { 00134 uint8_t domainId; 00135 uint8_t servicesPrefix[16]; /*!< Services Prefix */ 00136 uint8_t servicesPrefixLen; /*!< Prefix length in bits This Can Be 1-128 */ 00137 bool routeActive: 1; 00138 bool routeDataStable: 1; 00139 bool dhcpv6ServerActive: 1; 00140 bool dhcpv6ServerDataStable: 1; 00141 bool slaacServerActive: 1; 00142 bool slaacServerDataStable: 1; 00143 bool slaacPreferred: 1; 00144 unsigned preference: 2; 00145 bool configure: 1; 00146 bool defaultRoute: 1; 00147 bool onMesh: 1; 00148 bool ndDns: 1; 00149 ns_list_link_t link; /*!< List link entry */ 00150 } thread_network_local_data_entry_t; 00151 00152 /* The contents of the Service TLV & Server Set tuple */ 00153 typedef struct thread_network_data_service_entry_s { 00154 bool T : 1; // '1' if S_enterprise number is THREAD_ENTERPRISE_NUMBER; otherwise, '0'. 00155 unsigned S_id : 4; 00156 uint32_t S_enterprise_number; 00157 uint8_t *S_service_data; 00158 uint8_t S_service_data_length; 00159 uint8_t *S_server_data; 00160 uint8_t S_server_data_length; 00161 bool S_stable; 00162 ns_list_link_t link; /*!< List link entry */ 00163 } thread_network_data_service_entry_t; 00164 00165 typedef NS_LIST_HEAD (thread_network_data_service_cache_entry_t, link) thread_network_data_service_cache_list_t; 00166 typedef NS_LIST_HEAD (thread_network_data_prefix_cache_entry_t, link) thread_network_prefix_list_t; 00167 typedef NS_LIST_HEAD (thread_network_local_data_entry_t, link) thread_network_data_prefix_list_t; 00168 typedef NS_LIST_HEAD (thread_network_data_service_entry_t, link) thread_network_data_service_list_t; 00169 00170 /** Network Data Main struct for seprate local data and Global */ 00171 typedef struct thread_network_data_cache_entry_s { 00172 thread_network_prefix_list_t localPrefixList ; /*!< Local parsed or generated service list */ 00173 thread_network_data_service_cache_list_t service_list; 00174 uint8_t networkDataTlvSize ; /*!< Network data TLV Size */ 00175 uint8_t network_data[THREAD_MAX_NETWORK_DATA_SIZE]; 00176 uint16_t network_data_len; 00177 uint32_t contex_id_reuse_timeout; 00178 uint8_t network_data_update_delay; 00179 bool stableUpdatePushed: 1; 00180 bool temporaryUpdatePushed: 1; 00181 } thread_network_data_cache_entry_t; 00182 00183 typedef struct thread_network_local_data_cache_entry_s { 00184 thread_network_data_prefix_list_t prefix_list; /*!< Local parsed or generated service list */ 00185 thread_network_data_service_list_t service_list; 00186 uint16_t registered_rloc16;/*!< Address used for latest registration */ 00187 bool release_old_address:1;/*!< true if release of old address is needed */ 00188 bool publish_active:1;/*!< true when publish is active */ 00189 bool publish_pending:1;/*!< true when publish attempt made during active publish */ 00190 } thread_network_local_data_cache_entry_t; 00191 00192 /** 00193 * Initialise Thread Network Data cache 00194 * 00195 * \param cachePtr Pointer to Network Data Structure which will be initialized 00196 * 00197 */ 00198 void thread_network_data_base_init(thread_network_data_cache_entry_t *cachePtr); 00199 00200 void thread_network_local_server_data_base_init(thread_network_local_data_cache_entry_t *cachePtr); 00201 00202 void thread_network_data_free_and_clean(thread_network_data_cache_entry_t *cachePtr); 00203 00204 void thread_network_data_router_id_mark_delete(thread_network_data_cache_entry_t *cachePtr, uint16_t routerID, bool subSet); 00205 00206 bool thread_network_data_router_id_free(thread_network_data_cache_entry_t *cachePtr, bool subSet, struct protocol_interface_info_entry *curInterface); 00207 00208 void thread_network_local_data_free_and_clean(thread_network_local_data_cache_entry_t *cachePtr, int8_t interface_id); 00209 00210 void thread_network_data_context_re_use_timer_update(thread_network_data_cache_entry_t *cachePtr, uint32_t ticks, lowpan_context_list_t *context_list); 00211 00212 /** 00213 * Add new route information to route List 00214 * 00215 * \param networkDataList Pointer main network data structure 00216 * \param prefixTlv Prefix TLV (domainID, Prefix, PrefixLen) 00217 * \param service Route TLV 00218 * 00219 * return 0, ADD OK 00220 * return <0 Add Not OK 00221 */ 00222 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); 00223 00224 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); 00225 00226 /** 00227 * Add new DHCPv6 Server information to route List 00228 * 00229 * \param networkDataList Pointer main network data structure 00230 * \param prefixTlv Prefix TLV (domainID, Prefix, PrefixLen) 00231 * \param service On Mesh prefix TLV 00232 * 00233 * return 0, ADD OK 00234 * return <0 Add Not OK 00235 */ 00236 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); 00237 00238 00239 /** 00240 * Del DHCPv6 Server information to route List 00241 * 00242 * \param networkDataList Pointer main network data structure 00243 * \param prefixTlv Prefix TLV (domainID, Prefix, PrefixLen) 00244 * \param service On Mesh prefix TLV 00245 * 00246 * return 0, Del OK 00247 * return <0 Del Not OK 00248 */ 00249 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); 00250 00251 /** 00252 * Add new Local DHCPv6 Server information to route List 00253 * 00254 * \param networkDataList Pointer main network data structure 00255 * \param prefixTlv Prefix TLV (domainID, Prefix, PrefixLen) 00256 * \param service On Mesh prefix TLV 00257 * 00258 * return 0, ADD OK 00259 * return <0 Add Not OK 00260 */ 00261 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); 00262 00263 /** 00264 * Del Local DHCPv6 Server information to route List 00265 * 00266 * \param networkDataList Pointer main network data structure 00267 * \param prefixTlv Prefix TLV (domainID, Prefix, PrefixLen) 00268 * 00269 * return 0, Del OK 00270 * return <0 Del Not OK 00271 */ 00272 int thread_local_server_list_del_on_mesh_server(thread_network_local_data_cache_entry_t *networkDataList, thread_prefix_tlv_t *prefixTlv); 00273 00274 int thread_local_service_list_add(thread_network_local_data_cache_entry_t *networkDataList, thread_network_data_service_entry_t *service); 00275 00276 int thread_local_service_list_del(thread_network_local_data_cache_entry_t *networkDataList, thread_network_data_service_entry_t *service); 00277 00278 /** 00279 * Add new local route information to route List 00280 * 00281 * \param networkDataList Pointer main network data structure 00282 * \param prefixTlv Prefix TLV (domainID, Prefix, PrefixLen) 00283 * \param route HAS Route TLV 00284 * 00285 * return 0, ADD OK 00286 * return <0 Add Not OK 00287 */ 00288 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); 00289 00290 /** 00291 * Del local route information to route List 00292 * 00293 * \param networkDataList Pointer main network data structure 00294 * \param prefixTlv Prefix TLV (domainID, Prefix, PrefixLen) 00295 * 00296 * return 0, Del OK 00297 * return <0 Del Not OK 00298 */ 00299 int thread_local_server_del_route(thread_network_local_data_cache_entry_t *networkDataList, thread_prefix_tlv_t *prefixTlv); 00300 00301 /** 00302 * Add new 6LoWPAN contexts information to Network Data list 00303 * 00304 * \param networkDataList Network Data structure pointer 00305 * \param prefixTlv Prefix TLV (domainID, Prefix, PrefixLen) 00306 * \param context Context TLV 00307 * 00308 * return 0, ADD OK 00309 * return <0 Add Not OK 00310 */ 00311 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); 00312 00313 /** 00314 * Add new 6LoWPAN contexts information to Network Data list 00315 * 00316 * \param networkDataList Network Interface 00317 * \param prefixPtr pointer 6LoWPAN Contexts 00318 * \param prefixLength indicate prefix pointer valid information in bits 00319 * 00320 * return 0, ADD OK 00321 * return <0 Add Not OK 00322 */ 00323 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); 00324 00325 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); 00326 00327 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); 00328 00329 /** 00330 * Write Network Data full list or stable subset to given pointer 00331 * 00332 * \param networkDataList Network Data structure pointer 00333 * \param ptr pointer for write Network Data 00334 * \param fullList Boolean to select Full data or stable subset 00335 * 00336 * return Updated Pointer value end of Network Data 00337 */ 00338 uint16_t thread_network_data_service_set_size(thread_network_data_cache_entry_t *networkDataList, bool fullList); 00339 uint16_t thread_network_data_prefix_set_size(thread_network_data_cache_entry_t *networkDataList, bool fullList); 00340 uint8_t *thread_network_data_prefix_set_write(thread_network_data_cache_entry_t *networkDataList, uint8_t *ptr); 00341 uint8_t *thread_network_data_service_set_write(thread_network_data_cache_entry_t *networkDataList, uint8_t *ptr); 00342 bool thread_network_data_service_hosted_by_this_router_id(thread_network_data_service_cache_entry_t *dataList, uint16_t router_id); 00343 uint16_t thread_network_data_service_child_id_from_networkdata_get(thread_network_data_cache_entry_t *networkDataList, uint16_t router_short_addr); 00344 00345 uint8_t * thread_nd_own_service_list_data_write(thread_network_local_data_cache_entry_t *serverDataList, uint8_t *ptr, uint16_t routerID); 00346 00347 uint16_t thread_nd_own_service_list_data_size(thread_network_local_data_cache_entry_t *serverDataList); 00348 00349 void thread_nd_network_data_print(thread_network_data_cache_entry_t *networkData, uint16_t routerId); 00350 bool thread_nd_dhcp_anycast_address_mapping_from_network_data(thread_network_data_cache_entry_t *networkDataList, uint16_t *rlocAddress, uint8_t contexId); 00351 bool thread_nd_service_anycast_address_mapping_from_network_data(thread_network_data_cache_entry_t *networkDataList, uint16_t *rlocAddress, uint8_t S_id); 00352 00353 bool thread_nd_on_mesh_address_valid(thread_network_server_data_entry_t *curRoute); 00354 thread_network_server_data_entry_t *thread_nd_hosted_by_this_routerid(uint16_t routerId, thread_network_server_data_list_t *list); 00355 bool thread_network_data_services_registered(thread_network_data_cache_entry_t *cachePtr, uint16_t routerID); 00356 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); 00357 00358 #endif /* THREAD_NETWORK_DATA_PROXY_H_ */
Generated on Tue Jul 12 2022 12:22:25 by
