MCPcopy Create free account
hub / github.com/chirpstack/chirpstack / _handle_pr_start_req_data

Function _handle_pr_start_req_data

chirpstack/src/api/backend/mod.rs:296–373  ·  view source on GitHub ↗
(
    pl: backend::PRStartReqPayload,
    phy: lrwn::PhyPayload,
)

Source from the content-addressed store, hash-verified

294}
295
296async 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(&region_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

Callers 1

_handle_pr_start_reqFunction · 0.85

Calls 14

ul_meta_data_to_rx_infoFunction · 0.85
ul_meta_data_to_tx_infoFunction · 0.85
get_region_config_idFunction · 0.85
get_uplink_chFunction · 0.85
get_for_phypayloadFunction · 0.85
wrapFunction · 0.85
get_device_sessionMethod · 0.80
to_stringMethod · 0.80

Tested by

no test coverage detected