Skip to content

Commit 0f946c2

Browse files
authored
feat: fd-commands (#4)
- [x] QueryDownstreamDevices (dc25fdf) - [x] test_query_downstream_devices_request_codec - [x] test_query_downstream_devices_response_codec - [x] QueryDownstreamIdentifiers (dc25fdf) - [x] test_query_downstream_identifiers_request_codec - [x] test_query_downstream_identifiers_response_codec - [x] GetDownstreamFirmwareParameters (b63b0f6) - [x] test_get_downstream_firmware_parameters_request_codec - [x] test_get_downstream_firmware_parameters_response_codec - [x] test_device_parameter_table_codec - [x] test_get_downstream_firmware_parameters_portion_codec - [x] RequestDownstreamDeviceUpdate (69aac44) - [x] test_request_downstream_device_update_request_codec - [x] test_request_downstream_device_update_response_codec - [x] GetPackageData (ab8f458) - [x] test_get_package_data_request_codec - [x] test_get_package_data_response_codec - [x] GetDeviceMetaData (1face4e) - [x] test_get_device_meta_data_request_codec - [x] test_get_device_meta_data_response_codec - [x] GetMetaData (116aebd) - [x] test_get_metadata_request_codec - [x] test_get_meta_data_response_codec --------- Signed-off-by: leongross <[email protected]>
1 parent c8f162b commit 0f946c2

17 files changed

+2539
-39
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ authors = ["Caliptra contributors", "OpenPRoT contributors"]
55
edition = "2024"
66

77
[dependencies]
8-
zerocopy = {version = "0.8.17", features = ["derive"]}
8+
zerocopy = { version = "0.8.17", features = ["derive"] }
99
bitfield = "0.14.0"

src/codec.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use zerocopy::{FromBytes, Immutable, IntoBytes};
66
pub enum PldmCodecError {
77
BufferTooShort,
88
Unsupported,
9+
InvalidData,
910
}
1011

1112
/// A trait for encoding and decoding PLDM (Platform Level Data Model) messages.
@@ -37,7 +38,39 @@ pub trait PldmCodec: core::fmt::Debug + Sized {
3738
fn decode(buffer: &[u8]) -> Result<Self, PldmCodecError>;
3839
}
3940

41+
/// A trait for encoding and decoding PLDM messages with explicit lifetime requirements.
42+
///
43+
/// This trait is similar to `PldmCodec` but supports types that borrow data from the buffer
44+
/// during decoding, requiring an explicit lifetime parameter.
45+
pub trait PldmCodecWithLifetime<'a>: core::fmt::Debug + Sized {
46+
/// Encodes the PLDM message into the provided byte buffer.
47+
///
48+
/// # Arguments
49+
///
50+
/// * `buffer` - A mutable reference to a byte slice where the encoded message will be stored.
51+
///
52+
/// # Returns
53+
///
54+
/// A `Result` containing the size of the encoded message on success, or a `PldmCodecError` on failure.
55+
fn encode(&self, buffer: &mut [u8]) -> Result<usize, PldmCodecError>;
56+
57+
/// Decodes a PLDM message from the provided byte buffer.
58+
///
59+
/// # Arguments
60+
///
61+
/// * `buffer` - A reference to a byte slice containing the encoded message. The decoded
62+
/// type may hold references to this buffer.
63+
///
64+
/// # Returns
65+
///
66+
/// A `Result` containing the decoded message on success, or a `PldmCodecError` on failure.
67+
fn decode(buffer: &'a [u8]) -> Result<Self, PldmCodecError>;
68+
}
69+
4070
// Default implementation of PldmCodec for types that can leverage zerocopy.
71+
// TODO: can we generalize this to use sub-struct encodes when possible?
72+
// There are structs like PldmFirmwareString that contain variable-length data
73+
// that would need special handling.
4174
impl<T> PldmCodec for T
4275
where
4376
T: core::fmt::Debug + Sized + FromBytes + IntoBytes + Immutable,

src/message/firmware_update/get_fw_params.rs

Lines changed: 43 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -257,8 +257,7 @@ impl PldmCodec for GetFirmwareParametersResponse {
257257
offset += core::mem::size_of::<u8>();
258258

259259
let bytes = self.parms.encode(&mut buffer[offset..])?;
260-
offset += bytes;
261-
Ok(offset)
260+
Ok(offset + bytes)
262261
}
263262

264263
fn decode(buffer: &[u8]) -> Result<Self, PldmCodecError> {
@@ -331,32 +330,71 @@ mod test {
331330
}
332331

333332
#[test]
334-
fn test_get_firmware_parameters_request() {
333+
fn test_get_firmware_parameters_request_codec() {
335334
let request = GetFirmwareParametersRequest::new(0, PldmMsgType::Request);
336335
let mut buffer = [0u8; PLDM_MSG_HEADER_LEN];
337336
request.encode(&mut buffer).unwrap();
337+
338338
let decoded_request = GetFirmwareParametersRequest::decode(&buffer).unwrap();
339339
assert_eq!(request, decoded_request);
340+
341+
// Test buffer too short error
342+
let mut buffer = [0u8; PLDM_MSG_HEADER_LEN - 1];
343+
assert_eq!(
344+
request.encode(&mut buffer).unwrap_err(),
345+
PldmCodecError::BufferTooShort
346+
);
347+
348+
assert_eq!(
349+
GetFirmwareParametersRequest::decode(&buffer).unwrap_err(),
350+
PldmCodecError::BufferTooShort
351+
);
340352
}
341353

342354
#[test]
343-
fn test_get_firmware_parameters() {
355+
fn test_get_firmware_parameters_codec() {
344356
let firmware_parameters = construct_firmware_params();
345357
let mut buffer = [0u8; 1024];
346358
let size = firmware_parameters.encode(&mut buffer).unwrap();
347359
assert_eq!(size, firmware_parameters.codec_size_in_bytes());
360+
348361
let decoded_firmware_parameters = FirmwareParameters::decode(&buffer[..size]).unwrap();
349362
assert_eq!(firmware_parameters, decoded_firmware_parameters);
363+
364+
// Test buffer too short error
365+
let mut short_buffer = [0u8; 1];
366+
assert_eq!(
367+
firmware_parameters.encode(&mut short_buffer).unwrap_err(),
368+
PldmCodecError::BufferTooShort
369+
);
370+
371+
assert_eq!(
372+
FirmwareParameters::decode(&short_buffer).unwrap_err(),
373+
PldmCodecError::BufferTooShort
374+
);
350375
}
351376

352377
#[test]
353-
fn test_get_firmware_parameters_response() {
378+
fn test_get_firmware_parameters_response_codec() {
354379
let firmware_parameters = construct_firmware_params();
355380
let response = GetFirmwareParametersResponse::new(0, 0, &firmware_parameters);
356381
let mut buffer = [0u8; 1024];
357382
let size = response.encode(&mut buffer).unwrap();
358383
assert_eq!(size, response.codec_size_in_bytes());
384+
359385
let decoded_response = GetFirmwareParametersResponse::decode(&buffer[..size]).unwrap();
360386
assert_eq!(response, decoded_response);
387+
388+
// Test buffer too short error
389+
let mut short_buffer = [0u8; 1];
390+
assert_eq!(
391+
response.encode(&mut short_buffer).unwrap_err(),
392+
PldmCodecError::BufferTooShort
393+
);
394+
395+
assert_eq!(
396+
GetFirmwareParametersResponse::decode(&short_buffer).unwrap_err(),
397+
PldmCodecError::BufferTooShort
398+
);
361399
}
362400
}

0 commit comments

Comments
 (0)