(&mut self)
| 607 | } |
| 608 | |
| 609 | async fn log_downlink_frame(&mut self) -> Result<()> { |
| 610 | trace!("Logging downlink frame"); |
| 611 | let df = self.downlink_frame.as_ref().unwrap(); |
| 612 | let gw_df = df |
| 613 | .downlink_frame |
| 614 | .as_ref() |
| 615 | .ok_or_else(|| anyhow!("downlink_frame is None"))?; |
| 616 | let dfi = self.downlink_frame_item.as_ref().unwrap(); |
| 617 | let phy = self.phy_payload.as_mut().unwrap(); |
| 618 | |
| 619 | let dfl = stream_pb::DownlinkFrameLog { |
| 620 | time: Some(Utc::now().into()), |
| 621 | phy_payload: dfi.phy_payload.clone(), |
| 622 | tx_info: dfi.tx_info.clone(), |
| 623 | downlink_id: gw_df.downlink_id, |
| 624 | gateway_id: gw_df.gateway_id.clone(), |
| 625 | f_type: match &phy.mhdr.f_type { |
| 626 | FType::JoinAccept => common::FType::JoinAccept, |
| 627 | FType::UnconfirmedDataDown => common::FType::UnconfirmedDataDown, |
| 628 | FType::ConfirmedDataDown => common::FType::ConfirmedDataDown, |
| 629 | FType::Proprietary => common::FType::Proprietary, |
| 630 | _ => { |
| 631 | return Err(anyhow!("Unepxected FType: {}", phy.mhdr.f_type)); |
| 632 | } |
| 633 | } |
| 634 | .into(), |
| 635 | dev_addr: match &phy.payload { |
| 636 | Payload::MACPayload(pl) => pl.fhdr.devaddr.to_string(), |
| 637 | _ => "".to_string(), |
| 638 | }, |
| 639 | dev_eui: { |
| 640 | if !df.dev_eui.is_empty() { |
| 641 | EUI64::from_slice(&df.dev_eui)?.to_string() |
| 642 | } else { |
| 643 | "".to_string() |
| 644 | } |
| 645 | }, |
| 646 | plaintext_f_opts: false, |
| 647 | plaintext_frm_payload: false, |
| 648 | }; |
| 649 | |
| 650 | // Log for gateway (with potentially encrypted mac-commands). |
| 651 | info!(gateway_id = %dfl.gateway_id, "Log downlink-frame for gateway"); |
| 652 | stream::frame::log_downlink_for_gateway(&dfl).await?; |
| 653 | |
| 654 | // Downlink is not related to a device / DevEUI, e.g. it could be a multicast |
| 655 | // or proprietary downlink. Therefore we can't log it for a specific DevEUI. |
| 656 | if df.dev_eui.is_empty() { |
| 657 | trace!("Downlink does not have dev_eui set (multicast downlink)"); |
| 658 | return Ok(()); |
| 659 | } |
| 660 | |
| 661 | let nwk_s_enc_key = AES128Key::from_slice(&df.nwk_s_enc_key)?; |
| 662 | |
| 663 | // Set the full frame-counter value. |
| 664 | // This is needed to decrypt the mac-commands and / or FrmPayload (in case of Relay). |
| 665 | if let Payload::MACPayload(pl) = &mut phy.payload { |
| 666 | if pl.f_port.unwrap_or(0) == 0 { |
no test coverage detected