diff --git a/Cargo.lock b/Cargo.lock index 4bb933e..66e2477 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1145,6 +1145,7 @@ version = "0.1.0" dependencies = [ "chrono", "deku", + "env_logger", "heapless", "log", "mctp", diff --git a/pldm-platform/Cargo.toml b/pldm-platform/Cargo.toml index 98107bc..dc9a810 100644 --- a/pldm-platform/Cargo.toml +++ b/pldm-platform/Cargo.toml @@ -17,6 +17,10 @@ num-derive = { workspace = true } num-traits = { workspace = true } pldm = { workspace = true } +[dev-dependencies] +deku = { workspace = true, features = ["logging"] } +env_logger = { workspace = true } + [features] default = ["std"] alloc = ["pldm/alloc", "deku/alloc"] diff --git a/pldm-platform/examples/decodepdr.rs b/pldm-platform/examples/decodepdr.rs new file mode 100644 index 0000000..5eec163 --- /dev/null +++ b/pldm-platform/examples/decodepdr.rs @@ -0,0 +1,39 @@ +//! Decode a single Get PDR Response +//! +//! This has basic handling, see requester.rs for a real implementation. + +use pldm_platform::deku::DekuContainerRead; +use pldm_platform::proto::*; + +use log::*; + +fn main() { + env_logger::init(); + + let a: Vec<_> = std::env::args().collect(); + let f = a.get(1).expect("Need input file argument"); + println!("loading {f}"); + let d = std::fs::read(f).unwrap(); + + let ((rest, _), pdrrsp) = GetPDRResp::from_bytes((&d, 0)) + .map_err(|e| { + println!("GetPDR parse error {e:?}"); + panic!("Bad GetPDR response") + }) + .unwrap(); + println!("rsp {pdrrsp:?}"); + assert!(rest.len() == 0); + + let ((rest, _), pdr) = Pdr::from_bytes((&pdrrsp.record_data, 0)) + .map_err(|e| { + trace!("GetPDR parse error {e}"); + panic!("Bad GetPDR response") + }) + .unwrap(); + if !rest.is_empty() { + panic!("Extra PDR response"); + } + assert!(rest.len() == 0); + + println!("PDR {pdr:?}"); +} diff --git a/pldm-platform/src/proto.rs b/pldm-platform/src/proto.rs index 2c05d66..e93c71d 100644 --- a/pldm-platform/src/proto.rs +++ b/pldm-platform/src/proto.rs @@ -652,7 +652,7 @@ pub struct GetPDRResp { /// CRC over entire PDR, when transfer_flag == end // TODO - #[deku(cond = "*transfer_flag & xfer_flag::END != 0")] + #[deku(cond = "*transfer_flag == xfer_flag::END")] pub crc: Option, }