11// Licensed under the Apache-2.0 license
22
3- use crate :: protocol;
43use 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+
910use crate :: protocol:: firmware_update:: { FwUpdateCmd , FwUpdateCompletionCode } ;
1011use 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) ]
7258pub 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> {
8975impl < ' 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) ]
117106pub 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) ]
174142pub 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) ]
220190pub 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) ]
269225pub 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> {
286244impl < ' 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) ]
310268mod 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