Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers thread_network_data_storage.h Source File

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_ */