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

Method log_downlink_frame

chirpstack/src/downlink/tx_ack.rs:609–706  ·  view source on GitHub ↗
(&mut self)

Source from the content-addressed store, hash-verified

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 {

Callers 2

_handleMethod · 0.80
_handle_relayedMethod · 0.80

Calls 10

log_downlink_for_gatewayFunction · 0.85
log_downlink_for_deviceFunction · 0.85
unwrapMethod · 0.80
as_refMethod · 0.80
to_stringMethod · 0.80
containsMethod · 0.80
decrypt_f_optsMethod · 0.80
intoMethod · 0.45
decrypt_frm_payloadMethod · 0.45
to_vecMethod · 0.45

Tested by

no test coverage detected