Kenji Arai / mbed-os_TYBLE16

Dependents:   TYBLE16_simple_data_logger TYBLE16_MP3_Air

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-2018, 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 "Service_Libs/mac_neighbor_table/mac_neighbor_table.h"
00041 #include "mac_api.h"
00042 
00043 #ifdef HAVE_RPL
00044 #include "RPL/rpl_control.h"
00045 #endif
00046 #include "6LoWPAN/IPHC_Decode/cipv6.h"
00047 #ifndef NO_MLE
00048 #include "MLE/mle.h"
00049 #endif
00050 #include "6LoWPAN/Mesh/mesh.h"
00051 #include "6LoWPAN/Thread/thread_common.h"
00052 
00053 #ifdef ECC
00054 #include "libX509_V3.h"
00055 #include "ecc.h"
00056 #endif
00057 #include "ccmLIB.h"
00058 #include "shalib.h"
00059 #include "Security/TLS/tls_lib.h"
00060 #include "Security/Common/sec_lib.h"
00061 #include "net_nvm_api.h"
00062 #include "Security/PANA/pana.h"
00063 #include "Security/PANA/pana_internal_api.h"
00064 #include "Common_Protocols/tcp.h"
00065 
00066 #include "6LoWPAN/ND/nd_router_object.h"
00067 #include "platform/arm_hal_interrupt.h"
00068 #include "common_functions.h"
00069 #include "mac_api.h"
00070 #include "6LoWPAN/MAC/mpx_api.h"
00071 #include "6LoWPAN/lowpan_adaptation_interface.h"
00072 #include "6LoWPAN/Fragmentation/cipv6_fragmenter.h"
00073 #include "libNET/src/net_load_balance_internal.h"
00074 
00075 
00076 
00077 static int8_t set_6lowpan_nwk_down(protocol_interface_info_entry_t *cur)
00078 {
00079     int8_t ret_val = -1;
00080     // Check first current state
00081     if (cur->lowpan_info & INTERFACE_NWK_ACTIVE) {
00082         /* Change Active -> Idle */
00083         /* Disable Protocols Timers */
00084         if (!thread_info(cur)) {
00085             mac_neighbor_table_neighbor_list_clean(mac_neighbor_info(cur));
00086 #ifndef NO_MLE
00087             if (cur->lowpan_info & INTERFACE_NWK_BOOTSRAP_MLE) {
00088 
00089                 blacklist_clear();
00090 
00091             }
00092 #endif
00093         }
00094         if (cur->lowpan_info & INTERFACE_NWK_BOOTSRAP_PANA_AUTHENTICATION) {
00095             pana_reset_values(cur->mac_parameters->pan_id);
00096         }
00097 
00098         if (cur->interface_mode == INTERFACE_UP) {
00099             if (cur->mac_api) {
00100                 mlme_reset_t reset;
00101                 reset.SetDefaultPIB = true;
00102                 cur->mac_parameters->pan_id = 0xffff;
00103                 cur->mac_parameters->SecurityEnabled = false;
00104                 cur->mac_parameters->security_frame_counter = 0;
00105                 cur->mac_parameters->mac_security_level = 0;
00106                 cur->mac_api->mlme_req(cur->mac_api, MLME_RESET, &reset);
00107             }
00108             cur->interface_mode = INTERFACE_IDLE;
00109             net_load_balance_internal_state_activate(cur, false);
00110         }
00111         lowpan_adaptation_interface_reset(cur->id);
00112         reassembly_interface_reset(cur->id);
00113 
00114         icmp_nd_routers_init();
00115 
00116         if (cur->pana_sec_info_temp) {
00117             ns_dyn_mem_free(cur->pana_sec_info_temp);
00118             cur->pana_sec_info_temp = 0;
00119         }
00120         /* Init RPL Timers */
00121         cur->bootsrap_state_machine_cnt = 0;
00122         mac_helper_free_scan_confirm(&cur->mac_parameters->nwk_scan_params);
00123 
00124         cur->lowpan_info &= ~INTERFACE_NWK_ROUTER_DEVICE;
00125         cur->lowpan_info &= ~(INTERFACE_NWK_BOOTSRAP_ACTIVE | INTERFACE_NWK_ACTIVE);
00126         cur->interface_mode = INTERFACE_IDLE;
00127         ret_val = 0;
00128     }
00129     return ret_val;
00130 }
00131 
00132 static int8_t set_6lowpan_nwk_up(protocol_interface_info_entry_t *cur)
00133 {
00134     int8_t ret_val = 1;
00135 
00136     if ((cur->lowpan_info & INTERFACE_NWK_ACTIVE) == 0) {
00137         /* Change Idle-> Active */
00138         icmp_nd_routers_init();
00139         cur->nwk_bootstrap_state = ER_ACTIVE_SCAN;
00140         cur->lowpan_info |= INTERFACE_NWK_BOOTSRAP_ACTIVE | INTERFACE_NWK_ACTIVE; //Set Active Bootsrap
00141         cur->lowpan_info &= ~INTERFACE_NWK_BOOTSRAP_ADDRESS_REGISTER_READY; //Clear Bind
00142         cur->bootsrap_state_machine_cnt = 2;
00143         //Possible mac_mlme_start_req(call)
00144         mac_helper_panid_set(cur, 0xffff);
00145         mac_helper_mac16_address_set(cur, 0xffff);
00146 
00147         if (cur->lowpan_info & INTERFACE_NWK_BOOTSRAP_PANA_AUTHENTICATION) {
00148             mac_helper_default_security_level_set(cur, SEC_NONE);
00149         }
00150         cur->interface_mode = INTERFACE_UP;
00151         ret_val = 0;
00152     }
00153     return ret_val;
00154 }
00155 
00156 int8_t nwk_6lowpan_up(protocol_interface_info_entry_t *cur)
00157 {
00158     int8_t ret_val;
00159 
00160     ret_val = set_6lowpan_nwk_up(cur);
00161     if (ret_val == 0) {
00162         protocol_6lowpan_interface_common_init(cur);
00163 
00164         cur->nwk_mode = ARM_NWK_GP_IP_MODE;
00165         nwk_filter_params_s *filter = &(cur->mac_parameters->nwk_filter_params);
00166         filter->nwk_active_scan_level = 2;
00167     }
00168 
00169     return ret_val;
00170 }
00171 
00172 int8_t nwk_6lowpan_down(protocol_interface_info_entry_t *cur)
00173 {
00174     int8_t ret_val;
00175     neighbor_cache_flush(&cur->neigh_cache);
00176     ret_val = set_6lowpan_nwk_down(cur);
00177     protocol_core_interface_info_reset(cur);
00178     return ret_val;
00179 }