Do not fail on corrupted mac-commands.

This will print a warn log in case of a corrupted mac-command that can
not be decoded instead of failing on the uplink.
This commit is contained in:
Orne Brocaar 2023-10-10 09:56:50 +01:00
parent eccb09cb1b
commit fc3a94521f
2 changed files with 25 additions and 12 deletions

View File

@ -9,7 +9,7 @@ use redis::streams::StreamReadReply;
use serde_json::json;
use tokio::sync::mpsc;
use tokio::task;
use tracing::{debug, error, trace};
use tracing::{debug, error, trace, warn};
use lrwn::EUI64;
@ -278,10 +278,14 @@ pub async fn get_frame_logs(
let pl = api::UplinkFrameLog::decode(&mut Cursor::new(b))?;
let mut phy = lrwn::PhyPayload::from_slice(&pl.phy_payload)?;
if pl.plaintext_f_opts {
phy.decode_f_opts_to_mac_commands()?;
if let Err(e) = phy.decode_f_opts_to_mac_commands() {
warn!(error = %e, "Decode f_opts to mac-commands error");
}
}
if pl.plaintext_frm_payload {
phy.decode_frm_payload()?;
if let Err(e) = phy.decode_frm_payload() {
warn!(error = %e, "Decode frm_payload error");
}
}
let pl = api::LogItem {
@ -312,10 +316,14 @@ pub async fn get_frame_logs(
let pl = api::DownlinkFrameLog::decode(&mut Cursor::new(b))?;
let mut phy = lrwn::PhyPayload::from_slice(&pl.phy_payload)?;
if pl.plaintext_f_opts {
phy.decode_f_opts_to_mac_commands()?;
if let Err(e) = phy.decode_f_opts_to_mac_commands() {
warn!(error = %e, "Decode f_opts to mac-commands error");
}
}
if pl.plaintext_frm_payload {
phy.decode_frm_payload()?;
if let Err(e) = phy.decode_frm_payload() {
warn!(error = %e, "Decode frm_payload error");
}
}
let pl = api::LogItem {

View File

@ -611,14 +611,16 @@ impl Data {
trace!("Decrypting mac-commands");
let ds = self.device_session.as_ref().unwrap();
if ds.mac_version().to_string().starts_with("1.0") {
self.phy_payload
.decode_f_opts_to_mac_commands()
.context("Decode mac-commands")?;
if let Err(e) = self.phy_payload.decode_f_opts_to_mac_commands() {
// This avoids failing in case of a corrupted mac-command in the frm_payload.
warn!(error = %e, "Decoding f_opts mac-commands failed");
}
} else {
let nwk_s_enc_key = AES128Key::from_slice(&ds.nwk_s_enc_key)?;
self.phy_payload
.decrypt_f_opts(&nwk_s_enc_key)
.context("Decrypt f_opts")?;
if let Err(e) = self.phy_payload.decrypt_f_opts(&nwk_s_enc_key) {
// This avoids failing in case of a corrupted mac-command in the frm_payload.
warn!(error = %e, "Decrypting f_opts mac-commands failed");
}
}
Ok(())
@ -636,7 +638,10 @@ impl Data {
// Mac-commands (f_port=0) or Relay payload (f_port=226).
if f_port == 0 || f_port == lrwn::LA_FPORT_RELAY {
let nwk_s_enc_key = AES128Key::from_slice(&ds.nwk_s_enc_key)?;
self.phy_payload.decrypt_frm_payload(&nwk_s_enc_key)?;
if let Err(e) = self.phy_payload.decrypt_frm_payload(&nwk_s_enc_key) {
// This avoids failing in case of a corrupted mac-command in the frm_payload.
warn!(error = %e, "Decrypting frm_payload failed");
}
} else if !self._is_end_to_end_encrypted() {
if let Some(app_s_key) = &ds.app_s_key {
let app_s_key = AES128Key::from_slice(&app_s_key.aes_key)?;