Skip to content

Commit dd4d707

Browse files
IntelCaisuijyao1
authored andcommitted
Add Definition for vdm errors and propagate the vdm upward in responder
1 parent c5f019a commit dd4d707

File tree

4 files changed

+67
-23
lines changed

4 files changed

+67
-23
lines changed

spdmlib/src/error.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,23 @@ impl Default for StatusCodeRNG {
244244
}
245245
}
246246

247+
#[allow(dead_code)]
248+
#[allow(non_camel_case_types)]
249+
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Default)]
250+
pub struct StatusCodeVdmError {
251+
pub vdm_error_code: u16,
252+
}
253+
254+
impl TryFrom<u16> for StatusCodeVdmError {
255+
type Error = ();
256+
257+
fn try_from(value: u16) -> core::result::Result<Self, Self::Error> {
258+
Ok(Self {
259+
vdm_error_code: value,
260+
})
261+
}
262+
}
263+
247264
#[allow(dead_code)]
248265
#[allow(non_camel_case_types)]
249266
#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)]
@@ -255,6 +272,7 @@ pub enum StatusCode {
255272
TRANSPORT(StatusCodeTransport),
256273
MEAS_COLLECT(StatusCodeMeasCollect),
257274
RNG(StatusCodeRNG),
275+
VDM(StatusCodeVdmError),
258276
}
259277

260278
impl Default for StatusCode {
@@ -279,6 +297,7 @@ impl TryFrom<u24> for StatusCode {
279297
code,
280298
)?)),
281299
6 => Ok(StatusCode::RNG(StatusCodeRNG::try_from(code)?)),
300+
7 => Ok(StatusCode::VDM(StatusCodeVdmError::try_from(code)?)),
282301
_ => Err(()),
283302
}
284303
}
@@ -296,6 +315,7 @@ impl TryInto<u24> for StatusCode {
296315
StatusCode::TRANSPORT(t) => Ok(u24::new((4 << 16) as u32 + (t as u16) as u32)),
297316
StatusCode::MEAS_COLLECT(m) => Ok(u24::new((5 << 16) as u32 + (m as u16) as u32)),
298317
StatusCode::RNG(r) => Ok(u24::new((6 << 16) as u32 + (r as u16) as u32)),
318+
StatusCode::VDM(v) => Ok(u24::new((7 << 16) as u32 + (v.vdm_error_code) as u32)),
299319
}
300320
}
301321
}
@@ -643,4 +663,17 @@ pub const SPDM_STATUS_LOW_ENTROPY: SpdmStatus = spdm_return_status!(
643663
StatusCode::RNG(StatusCodeRNG::LOW_ENTROPY)
644664
);
645665

666+
#[macro_export]
667+
macro_rules! SPDM_STATUS_VDM_DEFINED_ERROR {
668+
($vdm_error_code:expr) => {
669+
SpdmStatus {
670+
severity: StatusSeverity::ERROR,
671+
status_code: StatusCode::VDM(StatusCodeVdmError {
672+
vdm_error_code: $vdm_error_code,
673+
}),
674+
error_data: None,
675+
};
676+
};
677+
}
678+
646679
pub type SpdmResult<T = ()> = core::result::Result<T, SpdmStatus>;

spdmlib/src/requester/context.rs

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,17 @@
22
//
33
// SPDX-License-Identifier: Apache-2.0 or MIT
44

5-
#[allow(unused_imports)]
5+
#[cfg(feature = "chunk-cap")]
66
use crate::common::SpdmCodec;
77
use crate::common::{self, SpdmDeviceIo, SpdmTransportEncap};
88
use crate::common::{ManagedBufferA, ST1};
99
use crate::config;
10-
use crate::error::{SpdmResult, SPDM_STATUS_RECEIVE_FAIL, SPDM_STATUS_SEND_FAIL};
11-
#[allow(unused_imports)]
12-
use crate::error::{
13-
SPDM_STATUS_ERROR_PEER, SPDM_STATUS_INVALID_MSG_FIELD, SPDM_STATUS_INVALID_MSG_SIZE,
14-
};
15-
#[allow(unused_imports)]
10+
use crate::error::*;
11+
#[cfg(any(feature = "chunk-cap", feature = "mut-auth"))]
1612
use crate::message::*;
1713
use crate::protocol::*;
1814

19-
#[allow(unused_imports)]
15+
#[cfg(feature = "chunk-cap")]
2016
use codec::{Codec, Reader, Writer};
2117
use spin::Mutex;
2218
extern crate alloc;

spdmlib/src/responder/context.rs

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,20 @@
33
// SPDX-License-Identifier: Apache-2.0 or MIT
44

55
use super::app_message_handler::dispatch_secured_app_message_cb;
6-
#[allow(unused_imports)]
6+
#[cfg(feature = "chunk-cap")]
77
use crate::common::{self, SpdmCodec};
88
use crate::common::{session::SpdmSessionState, SpdmDeviceIo, SpdmTransportEncap};
99
use crate::common::{SpdmConnectionState, ST1};
1010
use crate::config::{self, MAX_SPDM_MSG_SIZE, RECEIVER_BUFFER_SIZE};
11-
use crate::error::{SpdmResult, SPDM_STATUS_INVALID_STATE_LOCAL, SPDM_STATUS_UNSUPPORTED_CAP};
12-
#[allow(unused_imports)]
13-
use crate::error::{SPDM_STATUS_INVALID_MSG_FIELD, SPDM_STATUS_INVALID_STATE_PEER};
14-
11+
use crate::error::*;
1512
use crate::message::*;
1613
use crate::protocol::{SpdmRequestCapabilityFlags, SpdmResponseCapabilityFlags};
1714
use crate::watchdog::{reset_watchdog, start_watchdog};
1815
use codec::{Codec, Reader, Writer};
1916
extern crate alloc;
2017
use core::ops::DerefMut;
2118

22-
#[allow(unused_imports)]
19+
#[cfg(feature = "chunk-cap")]
2320
use crate::protocol::SpdmVersion;
2421

2522
use alloc::sync::Arc;
@@ -808,8 +805,16 @@ impl ResponderContext {
808805
self.common.chunk_context.chunk_status = common::SpdmChunkStatus::Idle;
809806
}
810807

811-
// Error Response contained in rsp_slice, remap error to Ok(()) for dispatcher.
812-
(Ok(()), rsp_slice)
808+
// Propagate the error upward if it is VDM defined error, otherwise remap to Ok.
809+
let result = result.or_else(|e| {
810+
if e.severity == StatusSeverity::ERROR && matches!(e.status_code, StatusCode::VDM(_)) {
811+
Err(e)
812+
} else {
813+
Ok(())
814+
}
815+
});
816+
817+
(result, rsp_slice)
813818
}
814819

815820
#[cfg(feature = "chunk-cap")]
@@ -964,7 +969,7 @@ impl ResponderContext {
964969
);
965970
}
966971

967-
let response_to_large_request_size = if chunk_send_request
972+
let (response_status, response_to_large_request_size) = if chunk_send_request
968973
.chunk_sender_attributes
969974
.contains(SpdmChunkSenderAttributes::LAST_CHUNK)
970975
{
@@ -1021,13 +1026,13 @@ impl ResponderContext {
10211026
self.common.chunk_context.chunk_message_data[..send_buffer.len()]
10221027
.copy_from_slice(send_buffer);
10231028
self.common.chunk_context.transferred_size = send_buffer.len();
1024-
send_buffer.len()
1029+
(status, send_buffer.len())
10251030
}
10261031
} else {
10271032
return (status, None);
10281033
}
10291034
} else {
1030-
0
1035+
(Ok(()), 0)
10311036
};
10321037

10331038
let response = SpdmMessage {
@@ -1053,7 +1058,7 @@ impl ResponderContext {
10531058
);
10541059
}
10551060

1056-
(Ok(()), Some(writer.used_slice()))
1061+
(response_status, Some(writer.used_slice()))
10571062
} else {
10581063
error!("!!! chunk_send : invalid chunk send request !!!\n");
10591064
self.write_spdm_error(SpdmErrorCode::SpdmErrorInvalidRequest, 0, writer);

spdmlib/src/responder/vendor_rsp.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
// SPDX-License-Identifier: Apache-2.0 or MIT
44

55
use crate::common::SpdmCodec;
6-
use crate::error::SpdmResult;
76
use crate::error::SPDM_STATUS_INVALID_MSG_FIELD;
87
use crate::error::SPDM_STATUS_INVALID_STATE_LOCAL;
8+
use crate::error::{SpdmResult, StatusCode, StatusSeverity};
99
use crate::message::*;
1010
use crate::responder::*;
1111

@@ -16,8 +16,18 @@ impl ResponderContext {
1616
bytes: &[u8],
1717
writer: &'a mut Writer,
1818
) -> (SpdmResult, Option<&'a [u8]>) {
19-
let (_, rsp_slice) = self.write_spdm_vendor_defined_response(session_id, bytes, writer);
20-
(Ok(()), rsp_slice)
19+
let (spdm_status, rsp_slice) =
20+
self.write_spdm_vendor_defined_response(session_id, bytes, writer);
21+
22+
// Propagate the error upward if it is VDM defined error, otherwise convert to Ok.
23+
let result = spdm_status.or_else(|e| {
24+
if e.severity == StatusSeverity::ERROR && matches!(e.status_code, StatusCode::VDM(_)) {
25+
Err(e)
26+
} else {
27+
Ok(())
28+
}
29+
});
30+
(result, rsp_slice)
2131
}
2232

2333
pub fn write_spdm_vendor_defined_response<'a>(

0 commit comments

Comments
 (0)