Skip to content

Commit a8594d2

Browse files
leongrossYour Name
authored andcommitted
fd-commands: add/replace response codes using pldm_completion_code
Signed-off-by: leongross <[email protected]>
1 parent 9423913 commit a8594d2

File tree

4 files changed

+172
-151
lines changed

4 files changed

+172
-151
lines changed

src/message/firmware_update/get_package_data.rs

Lines changed: 69 additions & 131 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
// Licensed under the Apache-2.0 license
22

3-
use crate::protocol;
43
use crate::protocol::base::{
5-
InstanceId, PldmMsgHeader, PldmMsgType, PldmSupportedType, TransferOperationFlag,
6-
PLDM_MSG_HEADER_LEN,
4+
InstanceId, PldmBaseCompletionCode, PldmMsgHeader, PldmMsgType, PldmSupportedType,
5+
TransferOperationFlag, PLDM_MSG_HEADER_LEN,
76
};
87

8+
use crate::pldm_completion_code;
9+
910
use crate::protocol::firmware_update::{FwUpdateCmd, FwUpdateCompletionCode};
1011
use zerocopy::{FromBytes, Immutable, IntoBytes};
1112

@@ -43,39 +44,24 @@ impl GetPackageDataRequest {
4344
}
4445
}
4546

46-
pub enum GetPackageDataCodes {
47-
BaseCodes(protocol::base::PldmBaseCompletionCode),
48-
CommandNotExpected,
49-
NoPackageData,
50-
InvalidTransferHandle,
51-
InvalidTransferOperationFlag,
52-
}
53-
54-
impl From<GetPackageDataCodes> for u8 {
55-
fn from(code: GetPackageDataCodes) -> Self {
56-
match code {
57-
GetPackageDataCodes::BaseCodes(code) => code as u8,
58-
GetPackageDataCodes::CommandNotExpected => {
59-
FwUpdateCompletionCode::CommandNotExpected as u8
60-
}
61-
GetPackageDataCodes::NoPackageData => FwUpdateCompletionCode::NoPackageData as u8,
62-
GetPackageDataCodes::InvalidTransferHandle => {
63-
FwUpdateCompletionCode::InvalidTransferHandle as u8
64-
}
65-
GetPackageDataCodes::InvalidTransferOperationFlag => {
66-
FwUpdateCompletionCode::InvalidTransferOperationFlag as u8
67-
}
68-
}
47+
pldm_completion_code! {
48+
GetPackageDataCode {
49+
CommandNotExpected,
50+
NoPackageData,
51+
InvalidTransferHandle,
52+
InvalidTransferOperationFlag
6953
}
7054
}
7155

56+
#[derive(Debug, Clone, FromBytes, IntoBytes, Immutable, PartialEq)]
57+
#[repr(C, packed)]
7258
pub struct GetPackageDataResponse<'a> {
7359
pub hdr: PldmMsgHeader<[u8; PLDM_MSG_HEADER_LEN]>,
7460

7561
/// PLDM_BASE_CODES, COMMAND_NOT_EXPECTED, NO_PACKAGE_DATA,
7662
/// INVALID_TRANSFER_HANDLE, INVALID_TRANSFER_OPERATION_FLAG
7763
///
78-
/// See [GetPackageDataCodes]
64+
/// See [GetPackageDataCode]
7965
pub completion_code: u8,
8066
pub next_data_transfer_handle: u32,
8167
pub transfer_flag: u8,
@@ -89,7 +75,7 @@ pub struct GetPackageDataResponse<'a> {
8975
impl<'a> GetPackageDataResponse<'a> {
9076
pub fn new(
9177
instance_id: InstanceId,
92-
completion_code: GetPackageDataCodes,
78+
completion_code: GetPackageDataCode,
9379
next_data_transfer_handle: u32,
9480
transfer_flag: TransferOperationFlag,
9581
portion_of_package_data: &'a [u8],
@@ -114,6 +100,9 @@ impl<'a> GetPackageDataResponse<'a> {
114100
/// RequestUpdate command response that it has data that shall be retrieved and restored by the UA. The
115101
/// firmware device metadata retrieved by this command will be sent back to the FD through the
116102
/// GetMetaData command after all component images have been transferred.
103+
///
104+
#[derive(Debug, Clone, FromBytes, IntoBytes, Immutable, PartialEq)]
105+
#[repr(C, packed)]
117106
pub struct GetDeviceMetaDataRequest {
118107
pub hdr: PldmMsgHeader<[u8; PLDM_MSG_HEADER_LEN]>,
119108
pub data_transfer_handle: u32,
@@ -139,38 +128,17 @@ impl GetDeviceMetaDataRequest {
139128
}
140129
}
141130

142-
pub enum GetDeviceMetaDataCodes {
143-
BaseCodes(protocol::base::PldmBaseCompletionCode),
131+
pldm_completion_code! {
132+
GetDeviceMetaDataCodes {
144133
InvalidStateForCommand,
145134
NoDeviceMetadata,
146135
InvalidTransferHandle,
147136
InvalidTransferOperationFlag,
148137
PackageDataError,
149-
}
150-
151-
impl From<GetDeviceMetaDataCodes> for u8 {
152-
fn from(code: GetDeviceMetaDataCodes) -> Self {
153-
match code {
154-
GetDeviceMetaDataCodes::BaseCodes(code) => code as u8,
155-
GetDeviceMetaDataCodes::InvalidStateForCommand => {
156-
FwUpdateCompletionCode::InvalidStateForCommand as u8
157-
}
158-
GetDeviceMetaDataCodes::NoDeviceMetadata => {
159-
FwUpdateCompletionCode::NoDeviceMetadata as u8
160-
}
161-
GetDeviceMetaDataCodes::InvalidTransferHandle => {
162-
FwUpdateCompletionCode::InvalidTransferHandle as u8
163-
}
164-
GetDeviceMetaDataCodes::InvalidTransferOperationFlag => {
165-
FwUpdateCompletionCode::InvalidTransferOperationFlag as u8
166-
}
167-
GetDeviceMetaDataCodes::PackageDataError => {
168-
FwUpdateCompletionCode::PackageDataError as u8
169-
}
170-
}
171-
}
172-
}
138+
}}
173139

140+
#[derive(Debug, Clone, FromBytes, IntoBytes, Immutable, PartialEq)]
141+
#[repr(C, packed)]
174142
pub struct GetDeviceMetaDataResponse<'a> {
175143
pub hdr: PldmMsgHeader<[u8; PLDM_MSG_HEADER_LEN]>,
176144

@@ -217,6 +185,8 @@ impl<'a> GetDeviceMetaDataResponse<'a> {
217185
/// [GetDeviceMetaData] command. This command shall only be used if the FD indicated in the
218186
/// [RequestUpdate] response that it had device metadata that needed to be obtained by the UA. The FD can
219187
/// send this command when it is in any state, except the IDLE and LEARN COMPONENTS state.
188+
#[derive(Debug, Clone, FromBytes, IntoBytes, Immutable, PartialEq)]
189+
#[repr(C, packed)]
220190
pub struct GetMetaDataRequest {
221191
pub hdr: PldmMsgHeader<[u8; PLDM_MSG_HEADER_LEN]>,
222192
pub data_transfer_handle: u32,
@@ -242,35 +212,23 @@ impl GetMetaDataRequest {
242212
}
243213
}
244214

245-
pub enum GetMetaDataCodes {
246-
BaseCodes(protocol::base::PldmBaseCompletionCode),
247-
CommandNotExpected,
248-
InvalidTransferHandle,
249-
InvalidTransferOperationFlag,
250-
}
251-
252-
impl From<GetMetaDataCodes> for u8 {
253-
fn from(code: GetMetaDataCodes) -> Self {
254-
match code {
255-
GetMetaDataCodes::BaseCodes(code) => code as u8,
256-
GetMetaDataCodes::CommandNotExpected => {
257-
FwUpdateCompletionCode::CommandNotExpected as u8
258-
}
259-
GetMetaDataCodes::InvalidTransferHandle => {
260-
FwUpdateCompletionCode::InvalidTransferHandle as u8
261-
}
262-
GetMetaDataCodes::InvalidTransferOperationFlag => {
263-
FwUpdateCompletionCode::InvalidTransferOperationFlag as u8
264-
}
265-
}
215+
pldm_completion_code! {
216+
GetMetaDataCode {
217+
CommandNotExpected,
218+
InvalidTransferHandle,
219+
InvalidTransferOperationFlag,
266220
}
267221
}
268222

223+
#[derive(Debug, Clone, FromBytes, IntoBytes, Immutable, PartialEq)]
224+
#[repr(C, packed)]
269225
pub struct GetMetaDataResponse<'a> {
270226
pub hdr: PldmMsgHeader<[u8; PLDM_MSG_HEADER_LEN]>,
271227

272228
/// PLDM_BASE_CODES, COMMAND_NOT_EXPECTED, INVALID_TRANSFER_HANDLE,
273229
/// INVALID_TRANSFER_OPERATION_FLAG
230+
///
231+
/// See [GetMetaDataCode]
274232
pub completion_code: u8,
275233
pub next_data_transfer_handle: u32,
276234
pub transfer_flag: u8,
@@ -286,7 +244,7 @@ pub struct GetMetaDataResponse<'a> {
286244
impl<'a> GetMetaDataResponse<'a> {
287245
pub fn new(
288246
instance_id: InstanceId,
289-
completion_code: GetMetaDataCodes,
247+
completion_code: GetMetaDataCode,
290248
next_data_transfer_handle: u32,
291249
transfer_flag: TransferOperationFlag,
292250
portion_of_device_metadata: &'a [u8],
@@ -308,73 +266,53 @@ impl<'a> GetMetaDataResponse<'a> {
308266

309267
#[cfg(test)]
310268
mod tests {
269+
use super::*;
311270
use crate::protocol;
312271

313-
use super::*;
272+
use crate::codec::PldmCodec;
314273

315-
//TODO: Add a test that behaves like the example in DSP0267, Fig. 11
316-
//TODO: take ensure that the creation of these packages fits to the
317-
// description of Table 28, PortionOfPackageData Field
318274
#[test]
319-
fn test_get_package_data() {
275+
fn test_get_package_data_request() {
320276
let instance_id: InstanceId = 0x01;
321-
//TODO: use FwUpdateCompletionCode
322-
let completion_code =
323-
GetPackageDataCodes::BaseCodes(protocol::base::PldmBaseCompletionCode::Success);
324-
let next_data_transfer_handle: u32 = 0x00000010;
325-
let transfer_flag = TransferOperationFlag::GetFirstPart;
326-
let portion_of_package_data: &[u8] = &[0xAA; GET_PACKAGE_DATA_PORTION_SIZE];
327-
328-
let response = GetPackageDataResponse::new(
329-
instance_id,
330-
completion_code,
331-
next_data_transfer_handle,
332-
transfer_flag,
333-
portion_of_package_data,
334-
);
335-
assert_eq!(response.hdr.rq(), PldmMsgType::Response as u8);
336-
assert_eq!(
337-
response.completion_code,
338-
GetPackageDataCodes::BaseCodes(protocol::base::PldmBaseCompletionCode::Success).into()
339-
);
340-
assert_eq!(
341-
response.next_data_transfer_handle,
342-
next_data_transfer_handle
343-
);
344-
assert_eq!(response.transfer_flag, transfer_flag as u8);
345-
assert_eq!(response.portion_of_package_data, portion_of_package_data);
277+
let data_transfer_handle: u32 = 0x12345678;
278+
let transfer_operation_flag = TransferOperationFlag::GetFirstPart;
279+
280+
let request =
281+
GetPackageDataRequest::new(instance_id, data_transfer_handle, transfer_operation_flag);
282+
283+
let mut buffer = [0u8; core::mem::size_of::<GetPackageDataRequest>()];
284+
request.encode(&mut buffer).unwrap();
285+
let decoded = GetPackageDataRequest::decode(&buffer).unwrap();
286+
287+
assert_eq!(request, decoded);
346288
}
347289

348290
#[test]
349-
fn test_get_device_metadata() {
291+
fn test_get_data_response() {
350292
let instance_id: InstanceId = 0x01;
351-
let completion_code =
352-
GetDeviceMetaDataCodes::BaseCodes(protocol::base::PldmBaseCompletionCode::Success);
353-
let next_data_transfer_handle: u32 = 0x00000020;
354-
let transfer_flag = TransferOperationFlag::GetFirstPart;
355-
let portion_of_device_metadata: &[u8] = &[0xBB; 0xff];
356-
let response = GetDeviceMetaDataResponse::new(
293+
let next_data_transfer_handle: u32 = 0x12345678;
294+
let transfer_operation_flag = TransferOperationFlag::GetFirstPart;
295+
let portion = [0u8; 0xff];
296+
297+
let request = GetPackageDataResponse::new(
357298
instance_id,
358-
completion_code,
299+
GetPackageDataCode::BaseCodes(PldmBaseCompletionCode::Success),
359300
next_data_transfer_handle,
360-
transfer_flag,
361-
portion_of_device_metadata,
301+
transfer_operation_flag,
302+
&portion,
362303
);
363304

364-
assert_eq!(response.hdr.rq(), PldmMsgType::Response as u8);
365-
assert_eq!(
366-
response.completion_code,
367-
GetDeviceMetaDataCodes::BaseCodes(protocol::base::PldmBaseCompletionCode::Success)
368-
.into()
369-
);
370-
assert_eq!(
371-
response.next_data_transfer_handle,
372-
next_data_transfer_handle
373-
);
374-
assert_eq!(response.transfer_flag, transfer_flag as u8);
375-
assert_eq!(
376-
response.portion_of_device_metadata,
377-
portion_of_device_metadata
378-
);
305+
//TODO: encoding for response does not work atm due to unknown sizes
306+
// let mut buffer = [0u8; core::mem::size_of::<GetPackageDataResponse>()];
307+
// request.encode(&mut buffer).unwrap();
308+
// let decoded = GetPackageDataResponse::decode(&buffer).unwrap();
309+
310+
assert_eq!(request, decoded);
379311
}
312+
313+
#[test]
314+
fn test_get_device_metadata_request() {}
315+
316+
#[test]
317+
fn test_get_device_metadata_reponse() {}
380318
}

0 commit comments

Comments
 (0)