Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
LoRaMacMib.cpp
00001 /** 00002 / _____) _ | | 00003 ( (____ _____ ____ _| |_ _____ ____| |__ 00004 \____ \| ___ | (_ _) ___ |/ ___) _ \ 00005 _____) ) ____| | | || |_| ____( (___| | | | 00006 (______/|_____)_|_|_| \__)_____)\____)_| |_| 00007 (C)2013 Semtech 00008 ___ _____ _ ___ _ _____ ___ ___ ___ ___ 00009 / __|_ _/_\ / __| |/ / __/ _ \| _ \/ __| __| 00010 \__ \ | |/ _ \ (__| ' <| _| (_) | / (__| _| 00011 |___/ |_/_/ \_\___|_|\_\_| \___/|_|_\\___|___| 00012 embedded.connectivity.solutions=============== 00013 00014 Description: LoRaWAN stack layer that controls both MAC and PHY underneath 00015 00016 License: Revised BSD License, see LICENSE.TXT file include in the project 00017 00018 Maintainer: Miguel Luis ( Semtech ), Gregory Cristian ( Semtech ) and Daniel Jaeckle ( STACKFORCE ) 00019 00020 00021 Copyright (c) 2017, Arm Limited and affiliates. 00022 00023 SPDX-License-Identifier: BSD-3-Clause 00024 */ 00025 00026 #include "lorastack/mac/LoRaMac.h" 00027 #include "lorastack/mac/LoRaMacMib.h" 00028 00029 LoRaMacMib::LoRaMacMib() 00030 : _lora_mac(NULL), _lora_phy(NULL) 00031 { 00032 } 00033 00034 LoRaMacMib::~LoRaMacMib() 00035 { 00036 } 00037 00038 void LoRaMacMib::activate_mib_subsystem(LoRaMac *mac, LoRaPHY *phy) 00039 { 00040 _lora_mac = mac; 00041 _lora_phy = phy; 00042 } 00043 00044 lorawan_status_t LoRaMacMib::set_request(loramac_mib_req_confirm_t *mibSet, 00045 loramac_protocol_params *params) 00046 { 00047 if (mibSet == NULL || _lora_phy == NULL || _lora_mac == NULL) { 00048 return LORAWAN_STATUS_PARAMETER_INVALID; 00049 } 00050 00051 lorawan_status_t status = LORAWAN_STATUS_OK; 00052 verification_params_t verify; 00053 00054 00055 switch (mibSet->type ) { 00056 case MIB_DEVICE_CLASS : { 00057 params->dev_class = mibSet->param .dev_class ; 00058 switch (params->dev_class) { 00059 case CLASS_A : { 00060 // Set the radio into sleep to setup a defined state 00061 _lora_phy->put_radio_to_sleep(); 00062 break; 00063 } 00064 case CLASS_B : { 00065 break; 00066 } 00067 case CLASS_C : { 00068 // Set the is_node_ack_requested indicator to default 00069 params->is_node_ack_requested = false; 00070 // Set the radio into sleep mode in case we are still in RX mode 00071 _lora_phy->put_radio_to_sleep(); 00072 // Compute Rx2 windows parameters in case the RX2 datarate has changed 00073 _lora_phy->compute_rx_win_params( 00074 params->sys_params.rx2_channel.datarate, 00075 params->sys_params.min_rx_symb, 00076 params->sys_params.max_sys_rx_error, 00077 ¶ms->rx_window2_config); 00078 _lora_mac->open_continuous_rx2_window(); 00079 break; 00080 } 00081 } 00082 break; 00083 } 00084 case MIB_NETWORK_JOINED : { 00085 params->is_nwk_joined = mibSet->param .is_nwk_joined ; 00086 break; 00087 } 00088 case MIB_ADR : { 00089 params->sys_params.adr_on = mibSet->param .is_adr_enable ; 00090 break; 00091 } 00092 case MIB_NET_ID : { 00093 params->net_id = mibSet->param .net_id ; 00094 break; 00095 } 00096 case MIB_DEV_ADDR : { 00097 params->dev_addr = mibSet->param .dev_addr ; 00098 break; 00099 } 00100 case MIB_NWK_SKEY : { 00101 if (mibSet->param .nwk_skey != NULL) { 00102 memcpy(params->keys.nwk_skey, mibSet->param .nwk_skey , 00103 sizeof(params->keys.nwk_skey)); 00104 } else { 00105 status = LORAWAN_STATUS_PARAMETER_INVALID; 00106 } 00107 break; 00108 } 00109 case MIB_APP_SKEY : { 00110 if (mibSet->param .app_skey != NULL) { 00111 memcpy(params->keys.app_skey, mibSet->param .app_skey , 00112 sizeof(params->keys.app_skey)); 00113 } else { 00114 status = LORAWAN_STATUS_PARAMETER_INVALID; 00115 } 00116 break; 00117 } 00118 case MIB_PUBLIC_NETWORK : { 00119 params->is_nwk_public = mibSet->param .enable_public_nwk ; 00120 _lora_phy->setup_public_network_mode(params->is_nwk_public); 00121 break; 00122 } 00123 case MIB_REPEATER_SUPPORT : { 00124 params->is_repeater_supported = mibSet->param .enable_repeater_support ; 00125 break; 00126 } 00127 case MIB_RX2_CHANNEL : { 00128 verify.datarate = mibSet->param .rx2_channel .datarate ; 00129 00130 if (_lora_phy->verify(&verify, PHY_RX_DR ) == true) { 00131 params->sys_params.rx2_channel = mibSet->param .rx2_channel ; 00132 00133 if ((params->dev_class == CLASS_C ) 00134 && (params->is_nwk_joined == true)) { 00135 // We can only compute the RX window parameters directly, if we are already 00136 // in class c mode and joined. We cannot setup an RX window in case of any other 00137 // class type. 00138 // Set the radio into sleep mode in case we are still in RX mode 00139 _lora_phy->put_radio_to_sleep(); 00140 // Compute Rx2 windows parameters 00141 _lora_phy->compute_rx_win_params( 00142 params->sys_params.rx2_channel.datarate, 00143 params->sys_params.min_rx_symb, 00144 params->sys_params.max_sys_rx_error, 00145 ¶ms->rx_window2_config); 00146 00147 _lora_mac->open_continuous_rx2_window(); 00148 } 00149 } else { 00150 status = LORAWAN_STATUS_PARAMETER_INVALID; 00151 } 00152 break; 00153 } 00154 case MIB_RX2_DEFAULT_CHANNEL : { 00155 verify.datarate = mibSet->param .rx2_channel .datarate ; 00156 00157 if (_lora_phy->verify(&verify, PHY_RX_DR ) == true) { 00158 params->sys_params.rx2_channel = mibSet->param .default_rx2_channel ; 00159 } else { 00160 status = LORAWAN_STATUS_PARAMETER_INVALID; 00161 } 00162 break; 00163 } 00164 case MIB_CHANNELS_DEFAULT_MASK : 00165 case MIB_CHANNELS_MASK : { 00166 // channel masks must not be tempered with. 00167 // They should be manipulated only on request with certain 00168 // APIs like add_channel() and remove_channel() 00169 // You should be able to get these MIB parameters, not set 00170 status = LORAWAN_STATUS_SERVICE_UNKNOWN; 00171 break; 00172 } 00173 case MIB_CHANNELS_NB_REP : { 00174 if ((mibSet->param .channel_nb_rep >= 1) 00175 && (mibSet->param .channel_nb_rep <= 15)) { 00176 params->sys_params.retry_num = mibSet->param .channel_nb_rep ; 00177 } else { 00178 status = LORAWAN_STATUS_PARAMETER_INVALID; 00179 } 00180 break; 00181 } 00182 case MIB_MAX_RX_WINDOW_DURATION : { 00183 params->sys_params.max_rx_win_time = mibSet->param .max_rx_window ; 00184 break; 00185 } 00186 case MIB_RECEIVE_DELAY_1 : { 00187 params->sys_params.recv_delay1 = mibSet->param .recv_delay1 ; 00188 break; 00189 } 00190 case MIB_RECEIVE_DELAY_2 : { 00191 params->sys_params.recv_delay2 = mibSet->param .recv_delay2 ; 00192 break; 00193 } 00194 case MIB_JOIN_ACCEPT_DELAY_1 : { 00195 params->sys_params.join_accept_delay1 = mibSet->param .join_accept_delay1 ; 00196 break; 00197 } 00198 case MIB_JOIN_ACCEPT_DELAY_2 : { 00199 params->sys_params.join_accept_delay2 = mibSet->param .join_accept_delay2 ; 00200 break; 00201 } 00202 case MIB_CHANNELS_DEFAULT_DATARATE : { 00203 verify.datarate = mibSet->param .default_channel_data_rate ; 00204 00205 if (_lora_phy->verify(&verify, PHY_DEF_TX_DR ) == true) { 00206 params->sys_params.channel_data_rate = verify.datarate; 00207 } else { 00208 status = LORAWAN_STATUS_PARAMETER_INVALID; 00209 } 00210 break; 00211 } 00212 case MIB_CHANNELS_DATARATE : { 00213 verify.datarate = mibSet->param .channel_data_rate ; 00214 00215 if (_lora_phy->verify(&verify, PHY_TX_DR ) == true) { 00216 params->sys_params.channel_data_rate = verify.datarate; 00217 } else { 00218 status = LORAWAN_STATUS_PARAMETER_INVALID; 00219 } 00220 break; 00221 } 00222 case MIB_CHANNELS_DEFAULT_TX_POWER : { 00223 verify.tx_power = mibSet->param .default_channel_tx_pwr ; 00224 00225 if (_lora_phy->verify(&verify, PHY_DEF_TX_POWER ) == true) { 00226 params->sys_params.channel_tx_power = verify.tx_power; 00227 } else { 00228 status = LORAWAN_STATUS_PARAMETER_INVALID; 00229 } 00230 break; 00231 } 00232 case MIB_CHANNELS_TX_POWER : { 00233 verify.tx_power = mibSet->param .channel_tx_pwr ; 00234 00235 if (_lora_phy->verify(&verify, PHY_TX_POWER ) == true) { 00236 params->sys_params.channel_tx_power = verify.tx_power; 00237 } else { 00238 status = LORAWAN_STATUS_PARAMETER_INVALID; 00239 } 00240 break; 00241 } 00242 case MIB_UPLINK_COUNTER : { 00243 params->ul_frame_counter = mibSet->param .ul_frame_counter ; 00244 break; 00245 } 00246 case MIB_DOWNLINK_COUNTER : { 00247 params->dl_frame_counter = mibSet->param .dl_frame_counter ; 00248 break; 00249 } 00250 case MIB_SYSTEM_MAX_RX_ERROR : { 00251 params->sys_params.max_sys_rx_error = mibSet->param .max_rx_sys_error ; 00252 break; 00253 } 00254 case MIB_MIN_RX_SYMBOLS : { 00255 params->sys_params.min_rx_symb = mibSet->param .min_rx_symb ; 00256 break; 00257 } 00258 case MIB_ANTENNA_GAIN : { 00259 params->sys_params.antenna_gain = mibSet->param .antenna_gain ; 00260 break; 00261 } 00262 default: 00263 status = LORAWAN_STATUS_SERVICE_UNKNOWN; 00264 break; 00265 } 00266 00267 return status; 00268 } 00269 00270 lorawan_status_t LoRaMacMib::get_request(loramac_mib_req_confirm_t *mibGet, 00271 loramac_protocol_params *params) 00272 { 00273 lorawan_status_t status = LORAWAN_STATUS_OK; 00274 get_phy_params_t get_phy; 00275 phy_param_t phy_param; 00276 rx2_channel_params rx2_channel; 00277 00278 if( mibGet == NULL ) 00279 { 00280 return LORAWAN_STATUS_PARAMETER_INVALID; 00281 } 00282 00283 switch( mibGet->type ) 00284 { 00285 case MIB_DEVICE_CLASS : 00286 { 00287 mibGet->param .dev_class = params->dev_class; 00288 break; 00289 } 00290 case MIB_NETWORK_JOINED : 00291 { 00292 mibGet->param .is_nwk_joined = params->is_nwk_joined; 00293 break; 00294 } 00295 case MIB_ADR : 00296 { 00297 mibGet->param .is_adr_enable = params->sys_params.adr_on; 00298 break; 00299 } 00300 case MIB_NET_ID : 00301 { 00302 mibGet->param .net_id = params->net_id; 00303 break; 00304 } 00305 case MIB_DEV_ADDR : 00306 { 00307 mibGet->param .dev_addr = params->dev_addr; 00308 break; 00309 } 00310 case MIB_NWK_SKEY : 00311 { 00312 mibGet->param .nwk_skey =params->keys.nwk_skey; 00313 break; 00314 } 00315 case MIB_APP_SKEY : 00316 { 00317 mibGet->param .app_skey = params->keys.app_skey; 00318 break; 00319 } 00320 case MIB_PUBLIC_NETWORK : 00321 { 00322 mibGet->param .enable_public_nwk = params->is_nwk_public; 00323 break; 00324 } 00325 case MIB_REPEATER_SUPPORT : 00326 { 00327 mibGet->param .enable_repeater_support = params->is_repeater_supported; 00328 break; 00329 } 00330 case MIB_CHANNELS : 00331 { 00332 get_phy.attribute = PHY_CHANNELS ; 00333 phy_param = _lora_phy->get_phy_params( &get_phy ); 00334 00335 mibGet->param .channel_list = phy_param.channel_params ; 00336 break; 00337 } 00338 case MIB_RX2_CHANNEL : 00339 { 00340 mibGet->param .rx2_channel = params->sys_params.rx2_channel; 00341 break; 00342 } 00343 case MIB_RX2_DEFAULT_CHANNEL : 00344 { 00345 get_phy.attribute = PHY_DEF_RX2_DR ; 00346 phy_param = _lora_phy->get_phy_params( &get_phy ); 00347 rx2_channel.datarate = phy_param.value ; 00348 00349 get_phy.attribute = PHY_DEF_RX2_FREQUENCY ; 00350 phy_param = _lora_phy->get_phy_params( &get_phy ); 00351 rx2_channel.frequency = phy_param.value ; 00352 00353 mibGet->param .rx2_channel = rx2_channel; 00354 break; 00355 } 00356 case MIB_CHANNELS_DEFAULT_MASK : 00357 { 00358 get_phy.attribute = PHY_DEFAULT_CHANNEL_MASK ; 00359 phy_param = _lora_phy->get_phy_params( &get_phy ); 00360 00361 mibGet->param .default_channel_mask = phy_param.channel_mask ; 00362 break; 00363 } 00364 case MIB_CHANNELS_MASK : 00365 { 00366 get_phy.attribute = PHY_CHANNEL_MASK ; 00367 phy_param = _lora_phy->get_phy_params( &get_phy ); 00368 00369 mibGet->param .channel_mask = phy_param.channel_mask ; 00370 break; 00371 } 00372 case MIB_CHANNELS_NB_REP : 00373 { 00374 mibGet->param .channel_nb_rep = params->sys_params.retry_num; 00375 break; 00376 } 00377 case MIB_MAX_RX_WINDOW_DURATION : 00378 { 00379 mibGet->param .max_rx_window = params->sys_params.max_rx_win_time; 00380 break; 00381 } 00382 case MIB_RECEIVE_DELAY_1 : 00383 { 00384 mibGet->param .recv_delay1 = params->sys_params.recv_delay1; 00385 break; 00386 } 00387 case MIB_RECEIVE_DELAY_2 : 00388 { 00389 mibGet->param .recv_delay2 = params->sys_params.recv_delay2; 00390 break; 00391 } 00392 case MIB_JOIN_ACCEPT_DELAY_1 : 00393 { 00394 mibGet->param .join_accept_delay1 = params->sys_params.join_accept_delay1; 00395 break; 00396 } 00397 case MIB_JOIN_ACCEPT_DELAY_2 : 00398 { 00399 mibGet->param .join_accept_delay2 = params->sys_params.join_accept_delay2; 00400 break; 00401 } 00402 case MIB_CHANNELS_DEFAULT_DATARATE : 00403 { 00404 get_phy.attribute = PHY_DEF_TX_DR ; 00405 phy_param = _lora_phy->get_phy_params( &get_phy ); 00406 mibGet->param .default_channel_data_rate = phy_param.value ; 00407 break; 00408 } 00409 case MIB_CHANNELS_DATARATE : 00410 { 00411 mibGet->param .channel_data_rate = params->sys_params.channel_data_rate; 00412 break; 00413 } 00414 case MIB_CHANNELS_DEFAULT_TX_POWER : 00415 { 00416 get_phy.attribute = PHY_DEF_TX_POWER ; 00417 phy_param = _lora_phy->get_phy_params( &get_phy ); 00418 mibGet->param .default_channel_tx_pwr = phy_param.value ; 00419 break; 00420 } 00421 case MIB_CHANNELS_TX_POWER : 00422 { 00423 mibGet->param .channel_tx_pwr = params->sys_params.channel_tx_power; 00424 break; 00425 } 00426 case MIB_UPLINK_COUNTER : 00427 { 00428 mibGet->param .ul_frame_counter = params->ul_frame_counter; 00429 break; 00430 } 00431 case MIB_DOWNLINK_COUNTER : 00432 { 00433 mibGet->param .dl_frame_counter = params->dl_frame_counter; 00434 break; 00435 } 00436 case MIB_MULTICAST_CHANNEL : 00437 { 00438 mibGet->param .multicast_list = params->multicast_channels; 00439 break; 00440 } 00441 case MIB_SYSTEM_MAX_RX_ERROR : 00442 { 00443 mibGet->param .max_rx_sys_error = params->sys_params.max_sys_rx_error; 00444 break; 00445 } 00446 case MIB_MIN_RX_SYMBOLS : 00447 { 00448 mibGet->param .min_rx_symb = params->sys_params.min_rx_symb; 00449 break; 00450 } 00451 case MIB_ANTENNA_GAIN : 00452 { 00453 mibGet->param .antenna_gain = params->sys_params.antenna_gain; 00454 break; 00455 } 00456 default: 00457 status = LORAWAN_STATUS_SERVICE_UNKNOWN; 00458 break; 00459 } 00460 00461 return status; 00462 }
Generated on Tue Jul 12 2022 13:30:22 by
