init
Embed:
(wiki syntax)
Show/hide line numbers
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:24:47 by
1.7.2