@@ -283,6 +283,72 @@ impl<'a> GetDeviceMetaDataResponse<'a> {
283283 }
284284}
285285
286+ impl < ' a > PldmCodecWithLifetime < ' a > for GetDeviceMetaDataResponse < ' a > {
287+ fn encode ( & self , buffer : & mut [ u8 ] ) -> Result < usize , PldmCodecError > {
288+ let size = core:: mem:: size_of :: < Self > ( ) - core:: mem:: size_of :: < & ' a [ u8 ] > ( ) ;
289+ if buffer. len ( ) < size + self . portion_of_device_metadata . len ( ) {
290+ return Err ( PldmCodecError :: BufferTooShort ) ;
291+ }
292+
293+ let mut offset = 0 ;
294+ self . hdr
295+ . write_to_prefix ( & mut buffer[ offset..] )
296+ . map_err ( |_| PldmCodecError :: BufferTooShort ) ?;
297+ offset += PLDM_MSG_HEADER_LEN ;
298+
299+ buffer[ offset] = self . completion_code ;
300+ offset += 1 ;
301+
302+ buffer[ offset..offset + size_of :: < u32 > ( ) ]
303+ . copy_from_slice ( & self . next_data_transfer_handle . to_le_bytes ( ) ) ;
304+ offset += size_of :: < u32 > ( ) ;
305+
306+ buffer[ offset] = self . transfer_flag ;
307+ offset += size_of :: < u8 > ( ) ;
308+
309+ buffer[ offset..offset + self . portion_of_device_metadata . len ( ) ]
310+ . copy_from_slice ( self . portion_of_device_metadata ) ;
311+
312+ Ok ( size)
313+ }
314+
315+ fn decode ( buffer : & ' a [ u8 ] ) -> Result < Self , PldmCodecError > {
316+ let size = core:: mem:: size_of :: < Self > ( ) - core:: mem:: size_of :: < & ' a [ u8 ] > ( ) ;
317+ if buffer. len ( ) < size {
318+ return Err ( PldmCodecError :: BufferTooShort ) ;
319+ }
320+
321+ let mut offset = 0 ;
322+ let hdr = PldmMsgHeader :: read_from_prefix ( & buffer[ offset..] )
323+ . map_err ( |_| PldmCodecError :: BufferTooShort ) ?
324+ . 0 ;
325+ offset += PLDM_MSG_HEADER_LEN ;
326+
327+ let completion_code = buffer[ offset] ;
328+ offset += size_of :: < u8 > ( ) ;
329+
330+ let next_data_transfer_handle = u32:: from_le_bytes (
331+ buffer[ offset..offset + 4 ]
332+ . try_into ( )
333+ . map_err ( |_| PldmCodecError :: BufferTooShort ) ?,
334+ ) ;
335+ offset += size_of :: < u32 > ( ) ;
336+
337+ let transfer_flag = buffer[ offset] ;
338+ offset += size_of :: < u8 > ( ) ;
339+
340+ let portion_of_device_metadata = & buffer[ offset..] ;
341+
342+ Ok ( Self {
343+ hdr,
344+ completion_code,
345+ next_data_transfer_handle,
346+ transfer_flag,
347+ portion_of_device_metadata,
348+ } )
349+ }
350+ }
351+
286352/// The FD sends this command to transfer the data that was originally obtained by the UA through the
287353/// [GetDeviceMetaData] command. This command shall only be used if the FD indicated in the
288354/// [RequestUpdate] response that it had device metadata that needed to be obtained by the UA. The FD can
@@ -438,7 +504,7 @@ mod tests {
438504 use crate :: codec:: PldmCodec ;
439505
440506 #[ test]
441- fn test_get_package_data_request ( ) {
507+ fn test_get_package_data_request_codec ( ) {
442508 let instance_id: InstanceId = 0x01 ;
443509 let data_transfer_handle: u32 = 0x12345678 ;
444510 let transfer_operation_flag = TransferOperationFlag :: GetFirstPart ;
@@ -454,7 +520,7 @@ mod tests {
454520 }
455521
456522 #[ test]
457- fn test_get_package_data_response ( ) {
523+ fn test_get_package_data_response_codec ( ) {
458524 const PORTION_LEN : usize = 10 ;
459525
460526 let instance_id: InstanceId = 0x01 ;
@@ -475,15 +541,13 @@ mod tests {
475541 - core:: mem:: size_of :: < usize > ( )
476542 + PORTION_LEN ] ;
477543
478- dbg ! ( & buffer_fitted. len( ) ) ;
479-
480544 resp. encode ( & mut buffer_fitted) . unwrap ( ) ;
481545 let decoded = GetPackageDataResponse :: decode ( & buffer_fitted) . unwrap ( ) ;
482546 assert_eq ! ( resp, decoded) ;
483547 }
484548
485549 #[ test]
486- fn test_get_device_metadata_request ( ) {
550+ fn test_get_metadata_request_codec ( ) {
487551 let instance_id: InstanceId = 0x01 ;
488552 let data_transfer_handle = 0x12345678 ;
489553 let req = GetMetaDataRequest :: new (
@@ -500,7 +564,7 @@ mod tests {
500564 }
501565
502566 #[ test]
503- fn test_get_device_metadata_response ( ) {
567+ fn test_get_meta_data_response_codec ( ) {
504568 let instance_id: InstanceId = 0x01 ;
505569 let data_transfer_handle = 0x12345678 ;
506570 let payload = [ 11u8 ; 20 ] ;
@@ -513,10 +577,52 @@ mod tests {
513577 & payload,
514578 ) ;
515579
516- let mut buffer = [ 0u8 ; 9 + 20 ] ;
580+ let mut buffer =
581+ [ 0u8 ; core:: mem:: size_of :: < GetMetaDataResponse > ( ) - core:: mem:: size_of :: < & [ u8 ] > ( ) + 20 ] ;
517582 resp. encode ( & mut buffer) . unwrap ( ) ;
518583
519584 let decoded = GetMetaDataResponse :: decode ( & mut buffer) . unwrap ( ) ;
520585 assert_eq ! ( resp, decoded) ;
521586 }
587+
588+ #[ test]
589+ fn test_get_device_meta_data_request_codec ( ) {
590+ let instance_id: InstanceId = 0x01 ;
591+ let data_transfer_handle = 0x12345678 ;
592+ let req = GetDeviceMetaDataRequest :: new (
593+ instance_id,
594+ data_transfer_handle,
595+ TransferOperationFlag :: GetFirstPart ,
596+ ) ;
597+
598+ let mut buffer = [ 0u8 ; core:: mem:: size_of :: < GetDeviceMetaDataRequest > ( ) ] ;
599+ req. encode ( & mut buffer) . unwrap ( ) ;
600+
601+ let decoded = GetDeviceMetaDataRequest :: decode ( & buffer) . unwrap ( ) ;
602+ assert_eq ! ( req, decoded) ;
603+ }
604+
605+ #[ test]
606+ fn test_get_device_meta_data_response_codec ( ) {
607+ let instance_id: InstanceId = 0x01 ;
608+ let data_transfer_handle = 0x12345678 ;
609+ const TEST_PAYLOAD_LEN : usize = 20 ;
610+ let payload = [ 11u8 ; TEST_PAYLOAD_LEN ] ;
611+
612+ let resp = GetDeviceMetaDataResponse :: new (
613+ instance_id,
614+ GetDeviceMetaDataCodes :: BaseCodes ( PldmBaseCompletionCode :: Success ) ,
615+ data_transfer_handle,
616+ TransferOperationFlag :: GetFirstPart ,
617+ & payload,
618+ ) ;
619+
620+ let mut buffer = [ 0u8 ; core:: mem:: size_of :: < GetDeviceMetaDataResponse > ( )
621+ - core:: mem:: size_of :: < & [ u8 ] > ( )
622+ + TEST_PAYLOAD_LEN ] ;
623+ resp. encode ( & mut buffer) . unwrap ( ) ;
624+
625+ let decoded = GetDeviceMetaDataResponse :: decode ( & mut buffer) . unwrap ( ) ;
626+ assert_eq ! ( resp, decoded) ;
627+ }
522628}
0 commit comments