(
pl: backend::PRStartReqPayload,
phy: lrwn::PhyPayload,
)
| 294 | } |
| 295 | |
| 296 | async fn _handle_pr_start_req_data( |
| 297 | pl: backend::PRStartReqPayload, |
| 298 | phy: lrwn::PhyPayload, |
| 299 | ) -> Result<backend::PRStartAnsPayload> { |
| 300 | let sender_id = NetID::from_slice(&pl.base.sender_id)?; |
| 301 | let rx_info = roaming::ul_meta_data_to_rx_info(&pl.ul_meta_data)?; |
| 302 | let tx_info = roaming::ul_meta_data_to_tx_info(&pl.ul_meta_data)?; |
| 303 | let region_common_name = CommonName::from_str(&pl.ul_meta_data.rf_region)?; |
| 304 | let region_config_id = region::get_region_config_id(region_common_name)?; |
| 305 | let dr = pl.ul_meta_data.data_rate.unwrap_or_default(); |
| 306 | let validate_mic = roaming::get_passive_roaming_validate_mic(sender_id)?; |
| 307 | |
| 308 | let mut ufs = UplinkFrameSet { |
| 309 | uplink_set_id: Uuid::new_v4(), |
| 310 | dr, |
| 311 | ch: helpers::get_uplink_ch(®ion_config_id, tx_info.frequency, dr)?, |
| 312 | phy_payload: phy, |
| 313 | tx_info, |
| 314 | rx_info_set: rx_info, |
| 315 | gateway_private_up_map: HashMap::new(), |
| 316 | gateway_private_down_map: HashMap::new(), |
| 317 | gateway_tenant_id_map: HashMap::new(), |
| 318 | gateway_downlink_priority_map: HashMap::new(), |
| 319 | region_common_name, |
| 320 | region_config_id, |
| 321 | roaming_meta_data: Some(RoamingMetaData { |
| 322 | base_payload: pl.base.clone(), |
| 323 | ul_meta_data: pl.ul_meta_data.clone(), |
| 324 | }), |
| 325 | }; |
| 326 | |
| 327 | // get device-session |
| 328 | let d = device::get_for_phypayload(&mut ufs.phy_payload, ufs.dr, ufs.ch as u8).await?; |
| 329 | let pr_lifetime = roaming::get_passive_roaming_lifetime(sender_id)?; |
| 330 | let kek_label = roaming::get_passive_roaming_kek_label(sender_id)?; |
| 331 | let ds = d.get_device_session()?; |
| 332 | |
| 333 | // Only in case validate_mic=true and LoRaWAN=1.0.x. |
| 334 | let nwk_s_key = if validate_mic && ds.mac_version().to_string().starts_with("1.0") { |
| 335 | Some(keywrap::wrap( |
| 336 | &kek_label, |
| 337 | AES128Key::from_slice(&ds.nwk_s_enc_key)?, |
| 338 | )?) |
| 339 | } else { |
| 340 | None |
| 341 | }; |
| 342 | |
| 343 | // Only in case validate_mic=true and LoRaWAN=1.1.x. |
| 344 | let f_nwk_s_int_key = if validate_mic && ds.mac_version().to_string().starts_with("1.1") { |
| 345 | Some(keywrap::wrap( |
| 346 | &kek_label, |
| 347 | AES128Key::from_slice(&ds.f_nwk_s_int_key)?, |
| 348 | )?) |
| 349 | } else { |
| 350 | None |
| 351 | }; |
| 352 | |
| 353 | // In case of stateless, the payload is directly handled |
no test coverage detected