(
&self,
net_id: NetID,
)
| 159 | } |
| 160 | |
| 161 | async fn start_pr_session( |
| 162 | &self, |
| 163 | net_id: NetID, |
| 164 | ) -> Result<internal::PassiveRoamingDeviceSession> { |
| 165 | info!(net_id = %net_id, dev_addr = %self.mac_payload.fhdr.devaddr, "Starting passive-roaming session"); |
| 166 | let rf_region = self |
| 167 | .uplink_frame_set |
| 168 | .region_common_name |
| 169 | .to_string() |
| 170 | .replace('_', "-"); |
| 171 | |
| 172 | let mut pr_req = backend::PRStartReqPayload { |
| 173 | phy_payload: self.uplink_frame_set.phy_payload.to_vec()?, |
| 174 | ul_meta_data: backend::ULMetaData { |
| 175 | ul_freq: Some((self.uplink_frame_set.tx_info.frequency as f64) / 1_000_000.0), |
| 176 | data_rate: Some(self.uplink_frame_set.dr), |
| 177 | recv_time: helpers::get_rx_timestamp_chrono(&self.uplink_frame_set.rx_info_set), |
| 178 | rf_region: rf_region.clone(), |
| 179 | gw_cnt: Some(self.uplink_frame_set.rx_info_set.len()), |
| 180 | gw_info: roaming::rx_info_to_gw_info( |
| 181 | &rf_region, |
| 182 | &self.uplink_frame_set.rx_info_set, |
| 183 | )?, |
| 184 | ..Default::default() |
| 185 | }, |
| 186 | ..Default::default() |
| 187 | }; |
| 188 | |
| 189 | #[cfg(test)] |
| 190 | { |
| 191 | pr_req.base.transaction_id = 1234; |
| 192 | } |
| 193 | |
| 194 | let client = roaming::get(&net_id).await?; |
| 195 | let async_receiver = match client.is_async() { |
| 196 | false => None, |
| 197 | true => Some( |
| 198 | get_async_receiver(pr_req.base.transaction_id, client.get_async_timeout()).await?, |
| 199 | ), |
| 200 | }; |
| 201 | |
| 202 | let pr_start_ans = client |
| 203 | .pr_start_req(backend::Role::SNS, &mut pr_req, async_receiver) |
| 204 | .await?; |
| 205 | let sess_id = Uuid::new_v4(); |
| 206 | |
| 207 | Ok(internal::PassiveRoamingDeviceSession { |
| 208 | session_id: sess_id.as_bytes().to_vec(), |
| 209 | net_id: net_id.to_vec(), |
| 210 | dev_addr: self.mac_payload.fhdr.devaddr.to_vec(), |
| 211 | validate_mic: roaming::get_passive_roaming_validate_mic(net_id)?, |
| 212 | lifetime: { |
| 213 | let lt = pr_start_ans.lifetime.unwrap_or_default() as i64; |
| 214 | if lt == 0 { |
| 215 | None |
| 216 | } else { |
| 217 | Some((Utc::now() + Duration::try_seconds(lt).unwrap_or_default()).into()) |
| 218 | } |
no test coverage detected