ipmi_rs/connection/
completion_code.rs

1#[derive(Clone, Copy, Debug, PartialEq)]
2pub enum ResponseUnavailableReason {
3    Unknown,
4    SDRInUpdate,
5    DeviceInFwUpdate,
6    BMCInitializing,
7}
8
9#[derive(Clone, Copy, Debug, PartialEq)]
10pub enum CompletionCode {
11    Success,
12    NodeBusy,
13    InvalidCommand,
14    InvalidCommandForLun,
15    ProcessingTimeout,
16    OutOfSpace,
17    ReservationCancelledOrInvalidId,
18    RequestDataTruncated,
19    RequestDataLenInvalid,
20    RequestDataLengthLimitExceeded,
21    ParameterOutOfRange,
22    CannotReturnNumOfRequestedBytes,
23    RequestedDatapointNotPresent,
24    InvalidDataFieldInRequest,
25    CommandIllegalForSensorOrRecord,
26    ResponseUnavailable { reason: ResponseUnavailableReason },
27    CannotExecuteDuplicateRequest,
28    DestinationUnavailable,
29    InsufficientPrivilege,
30    CannotExecuteCommandInCurrentState,
31    SubFunctionDisabled,
32    Unspecified,
33    Oem(u8),
34    CommandSpecific(u8),
35    Reserved(u8),
36}
37
38impl From<u8> for CompletionCode {
39    fn from(value: u8) -> Self {
40        match value {
41            0x00 => Self::Success,
42            0xC0 => Self::NodeBusy,
43            0xC1 => Self::InvalidCommand,
44            0xC2 => Self::InvalidCommandForLun,
45            0xC3 => Self::ProcessingTimeout,
46            0xC4 => Self::OutOfSpace,
47            0xC5 => Self::ReservationCancelledOrInvalidId,
48            0xC6 => Self::RequestDataTruncated,
49            0xC7 => Self::RequestDataLenInvalid,
50            0xC8 => Self::RequestDataLengthLimitExceeded,
51            0xC9 => Self::ParameterOutOfRange,
52            0xCA => Self::CannotReturnNumOfRequestedBytes,
53            0xCB => Self::RequestedDatapointNotPresent,
54            0xCC => Self::InvalidDataFieldInRequest,
55            0xCD => Self::CommandIllegalForSensorOrRecord,
56            0xCE => Self::ResponseUnavailable {
57                reason: ResponseUnavailableReason::Unknown,
58            },
59            0xCF => Self::CannotExecuteDuplicateRequest,
60            0xD0 => Self::ResponseUnavailable {
61                reason: ResponseUnavailableReason::SDRInUpdate,
62            },
63            0xD1 => Self::ResponseUnavailable {
64                reason: ResponseUnavailableReason::DeviceInFwUpdate,
65            },
66            0xD2 => Self::ResponseUnavailable {
67                reason: ResponseUnavailableReason::BMCInitializing,
68            },
69            0xD3 => Self::DestinationUnavailable,
70            0xD4 => Self::InsufficientPrivilege,
71            0xD5 => Self::CannotExecuteCommandInCurrentState,
72            0xD6 => Self::SubFunctionDisabled,
73            0xFF => Self::Unspecified,
74            0x01..=0x7E => Self::Oem(value),
75            0x80..=0xBE => Self::CommandSpecific(value),
76            v => Self::Reserved(v),
77        }
78    }
79}
80
81impl CompletionCode {
82    pub fn is_success(&self) -> bool {
83        matches!(self, Self::Success)
84    }
85
86    pub fn is_reserved(&self) -> bool {
87        matches!(self, Self::Reserved(_))
88    }
89}