Gleb Klochkov / Mbed OS Climatcontroll_Main

Dependencies:   esp8266-driver

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers protocol_6lowpan_interface.c Source File

protocol_6lowpan_interface.c

00001 /*
00002  * Copyright (c) 2015-2017, Arm Limited and affiliates.
00003  * SPDX-License-Identifier: Apache-2.0
00004  *
00005  * Licensed under the Apache License, Version 2.0 (the "License");
00006  * you may not use this file except in compliance with the License.
00007  * You may obtain a copy of the License at
00008  *
00009  *     http://www.apache.org/licenses/LICENSE-2.0
00010  *
00011  * Unless required by applicable law or agreed to in writing, software
00012  * distributed under the License is distributed on an "AS IS" BASIS,
00013  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
00014  * See the License for the specific language governing permissions and
00015  * limitations under the License.
00016  */
00017 
00018 /*
00019  * \file protocol_6lowpan_interface.c
00020  * \brief Add short description about this file!!!
00021  *
00022  */
00023 #include "nsconfig.h"
00024 #include "string.h"
00025 #include "ns_types.h"
00026 #include "eventOS_event.h"
00027 #include "eventOS_scheduler.h"
00028 #include "ns_trace.h"
00029 #include "nsdynmemLIB.h"
00030 #include "NWK_INTERFACE/Include/protocol.h"
00031 #include "Common_Protocols/udp.h"
00032 #include "Common_Protocols/ipv6_constants.h"
00033 #include "Common_Protocols/icmpv6.h"
00034 #include "Common_Protocols/icmpv6_radv.h"
00035 #include "6LoWPAN/Bootstraps/network_lib.h"
00036 #include "6LoWPAN/Bootstraps/protocol_6lowpan.h"
00037 #include "6LoWPAN/Bootstraps/protocol_6lowpan_bootstrap.h"
00038 #include "Service_Libs/blacklist/blacklist.h"
00039 #include "6LoWPAN/MAC/mac_helper.h"
00040 #include "mac_api.h"
00041 
00042 #ifdef HAVE_RPL
00043 #include "RPL/rpl_control.h"
00044 #endif
00045 #include "6LoWPAN/IPHC_Decode/cipv6.h"
00046 #ifndef NO_MLE
00047 #include "MLE/mle.h"
00048 #endif
00049 #include "6LoWPAN/Mesh/mesh.h"
00050 #include "6LoWPAN/Thread/thread_common.h"
00051 
00052 #ifdef ECC
00053 #include "libX509_V3.h"
00054 #include "ecc.h"
00055 #endif
00056 #include "ccmLIB.h"
00057 #include "shalib.h"
00058 #include "Security/TLS/tls_lib.h"
00059 #include "Security/Common/sec_lib.h"
00060 #include "net_nvm_api.h"
00061 #include "Security/PANA/pana.h"
00062 #include "Security/PANA/pana_internal_api.h"
00063 #include "Common_Protocols/tcp.h"
00064 
00065 #include "6LoWPAN/ND/nd_router_object.h"
00066 #include "platform/arm_hal_interrupt.h"
00067 #include "common_functions.h"
00068 #include "mac_api.h"
00069 #include "6LoWPAN/lowpan_adaptation_interface.h"
00070 #include "6LoWPAN/Fragmentation/cipv6_fragmenter.h"
00071 #include "libNET/src/net_load_balance_internal.h"
00072 
00073 
00074 
00075 static int8_t set_6lowpan_nwk_down(protocol_interface_info_entry_t *cur)
00076 {
00077     int8_t ret_val = -1;
00078     // Check first current state
00079     if (cur->lowpan_info & INTERFACE_NWK_ACTIVE) {
00080         /* Change Active -> Idle */
00081         /* Disable Protocols Timers */
00082         if (!thread_info(cur)) {
00083             if (cur->lowpan_info & INTERFACE_NWK_BOOTSRAP_MLE) {
00084 #ifndef NO_MLE
00085                 mle_class_list_clean(cur->id);
00086                 blacklist_clear();
00087 #endif
00088             }
00089         }
00090         uint16_t pan_id = cur->mac_parameters->pan_id;
00091         if (cur->interface_mode == INTERFACE_UP) {
00092             if (cur->mac_api) {
00093                 mlme_reset_t reset;
00094                 reset.SetDefaultPIB = true;
00095                 cur->mac_parameters->pan_id = 0xffff;
00096                 cur->mac_parameters->SecurityEnabled = false;
00097                 cur->mac_parameters->security_frame_counter = 0;
00098                 cur->mac_parameters->mac_security_level = 0;
00099                 cur->mac_api->mlme_req(cur->mac_api, MLME_RESET, &reset);
00100             }
00101             cur->interface_mode = INTERFACE_IDLE;
00102             net_load_balance_internal_state_activate(cur, false);
00103         }
00104         lowpan_adaptation_interface_reset(cur->id);
00105         reassembly_interface_reset(cur->id);
00106 
00107         icmp_nd_routers_init();
00108         if (cur->lowpan_info & INTERFACE_NWK_BOOTSRAP_PANA_AUTHENTICATION) {
00109             pana_reset_values(pan_id);
00110         }
00111 
00112         if (cur->pana_sec_info_temp) {
00113             ns_dyn_mem_free(cur->pana_sec_info_temp);
00114             cur->pana_sec_info_temp = 0;
00115         }
00116         /* Init RPL Timers */
00117         cur->bootsrap_state_machine_cnt = 0;
00118         mac_helper_free_scan_confirm(&cur->mac_parameters->nwk_scan_params);
00119 
00120         cur->lowpan_info &= ~INTERFACE_NWK_ROUTER_DEVICE;
00121         cur->lowpan_info &= ~(INTERFACE_NWK_BOOTSRAP_ACTIVE | INTERFACE_NWK_ACTIVE);
00122         cur->interface_mode = INTERFACE_IDLE;
00123         ret_val = 0;
00124     }
00125     return ret_val;
00126 }
00127 
00128 static int8_t set_6lowpan_nwk_up(protocol_interface_info_entry_t *cur)
00129 {
00130     int8_t ret_val = 1;
00131 
00132     if ((cur->lowpan_info & INTERFACE_NWK_ACTIVE) == 0) {
00133         /* Change Idle-> Active */
00134         icmp_nd_routers_init();
00135         cur->nwk_bootstrap_state = ER_ACTIVE_SCAN;
00136         cur->lowpan_info |= INTERFACE_NWK_BOOTSRAP_ACTIVE | INTERFACE_NWK_ACTIVE; //Set Active Bootsrap
00137         cur->lowpan_info &= ~INTERFACE_NWK_BOOTSRAP_ADDRESS_REGISTER_READY; //Clear Bind
00138         cur->bootsrap_state_machine_cnt = 2;
00139         //Possible mac_mlme_start_req(call)
00140         mac_helper_panid_set(cur, 0xffff);
00141         mac_helper_mac16_address_set(cur, 0xffff);
00142 
00143         if (cur->lowpan_info & INTERFACE_NWK_BOOTSRAP_PANA_AUTHENTICATION) {
00144             mac_helper_default_security_level_set(cur, SEC_NONE);
00145         }
00146         cur->interface_mode = INTERFACE_UP;
00147         ret_val = 0;
00148     }
00149     return ret_val;
00150 }
00151 
00152 int8_t nwk_6lowpan_up(protocol_interface_info_entry_t *cur)
00153 {
00154     int8_t ret_val;
00155 
00156     ret_val = set_6lowpan_nwk_up(cur);
00157     if (ret_val == 0) {
00158         protocol_6lowpan_interface_common_init(cur);
00159 
00160         cur->nwk_mode = ARM_NWK_GP_IP_MODE;
00161         nwk_filter_params_s *filter = &(cur->mac_parameters->nwk_filter_params);
00162         filter->nwk_active_scan_level = 2;
00163     }
00164 
00165     return ret_val;
00166 }
00167 
00168 int8_t nwk_6lowpan_down(protocol_interface_info_entry_t *cur)
00169 {
00170     int8_t ret_val;
00171     neighbor_cache_flush(&cur->neigh_cache);
00172     ret_val = set_6lowpan_nwk_down(cur);
00173     protocol_core_interface_info_reset(cur);
00174     return ret_val;
00175 }