pub struct AdminQueueFaultConfig {
    pub admin_submission_queue_faults: Vec<(CommandMatch, AdminQueueFaultBehavior<Command>)>,
    pub admin_completion_queue_faults: Vec<(CommandMatch, AdminQueueFaultBehavior<Completion>)>,
}Expand description
A fault configuration to inject faults into the admin submission and completion queues.
This struct maintains a mapping from CommandMatch to AdminQueueFaultBehavior for
submission and completion queues. When a command match is found, (and fault_active == true)
the associated fault is applied.
Both submission and completion queue faults match on commands
because completions do not contain enough identifying information to
match against. If there is more than one match for a given command, the
match defined first is prioritized. Faults are added via the
with_submission_queue_fault and with_completion_queue_fault methods and
can be chained. AdminQueueFaultConfig::new() creates an empty fault.
§Panics
Panics if a duplicate CommandMatch is added for either submission or
completion queues
§Example
Panic on CREATE_IO_COMPLETION_QUEUE and delay before sending completion for 500ms after GET_LOG_PAGE command is processed.
use mesh::CellUpdater;
use nvme_resources::fault::AdminQueueFaultConfig;
use nvme_resources::fault::CommandMatch;
use nvme_resources::fault::FaultConfiguration;
use nvme_resources::fault::AdminQueueFaultBehavior;
use nvme_spec::Command;
use std::time::Duration;
use zerocopy::FromZeros;
use zerocopy::IntoBytes;
pub fn build_admin_queue_fault() -> FaultConfiguration {
    let mut fault_start_updater = CellUpdater::new(false);
    // Setup command matches
    let mut command_io_queue = Command::new_zeroed();
    let mut command_log_page = Command::new_zeroed();
    let mut mask = Command::new_zeroed();
    command_io_queue.cdw0 = command_io_queue.cdw0.with_opcode(nvme_spec::AdminOpcode::CREATE_IO_COMPLETION_QUEUE.0);
    command_log_page.cdw0 = command_log_page.cdw0.with_opcode(nvme_spec::AdminOpcode::GET_LOG_PAGE.0);
    mask.cdw0 = mask.cdw0.with_opcode(u8::MAX);
    return FaultConfiguration::new(fault_start_updater.cell())
        .with_admin_queue_fault(
            AdminQueueFaultConfig::new().with_submission_queue_fault(
                CommandMatch {
                    command: command_io_queue,
                    mask: mask.as_bytes().try_into().expect("mask should be 64 bytes"),
                },
                AdminQueueFaultBehavior::Panic("Received a CREATE_IO_COMPLETION_QUEUE command".to_string()),
            ).with_completion_queue_fault(
                CommandMatch {
                    command: command_log_page,
                    mask: mask.as_bytes().try_into().expect("mask should be 64 bytes"),
                },
                AdminQueueFaultBehavior::Delay(Duration::from_millis(500)),
            )
        );
}Fields§
§admin_submission_queue_faults: Vec<(CommandMatch, AdminQueueFaultBehavior<Command>)>A map of NVME opcodes to the submission fault behavior for each. (This
would ideally be a HashMap, but mesh doesn’t support that type.
Given that this is not performance sensitive, the lookup is okay)
admin_completion_queue_faults: Vec<(CommandMatch, AdminQueueFaultBehavior<Completion>)>A map of NVME opcodes to the completion fault behavior for each.
Implementations§
Source§impl AdminQueueFaultConfig
 
impl AdminQueueFaultConfig
Sourcepub fn with_submission_queue_fault(
    self,
    pattern: CommandMatch,
    behaviour: AdminQueueFaultBehavior<Command>,
) -> Self
 
pub fn with_submission_queue_fault( self, pattern: CommandMatch, behaviour: AdminQueueFaultBehavior<Command>, ) -> Self
Add a CommandMatch -> AdminQueueFaultBehavior mapping for the submission queue.
§Panics
Panics if an identical CommandMatch has already been configured.
Sourcepub fn with_completion_queue_fault(
    self,
    pattern: CommandMatch,
    behaviour: AdminQueueFaultBehavior<Completion>,
) -> Self
 
pub fn with_completion_queue_fault( self, pattern: CommandMatch, behaviour: AdminQueueFaultBehavior<Completion>, ) -> Self
Add a CommandMatch -> AdminQueueFaultBehavior mapping for the completion queue.
§Panics
Panics if an identical CommandMatch has already been configured.
Trait Implementations§
Source§impl DefaultEncoding for AdminQueueFaultConfig
 
impl DefaultEncoding for AdminQueueFaultConfig
Source§impl<'encoding> StructDecodeMetadata<'encoding, Resource> for AdminQueueFaultConfig
 
impl<'encoding> StructDecodeMetadata<'encoding, Resource> for AdminQueueFaultConfig
Source§impl StructEncodeMetadata<Resource> for AdminQueueFaultConfig
 
impl StructEncodeMetadata<Resource> for AdminQueueFaultConfig
Auto Trait Implementations§
impl Freeze for AdminQueueFaultConfig
impl !RefUnwindSafe for AdminQueueFaultConfig
impl Send for AdminQueueFaultConfig
impl Sync for AdminQueueFaultConfig
impl Unpin for AdminQueueFaultConfig
impl !UnwindSafe for AdminQueueFaultConfig
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
    T: ?Sized,
 
impl<T> BorrowMut<T> for Twhere
    T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
 
fn borrow_mut(&mut self) -> &mut T
§impl<T> Instrument for T
 
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
 
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
 
fn in_current_span(self) -> Instrumented<Self>
§impl<T> MeshField for T
 
impl<T> MeshField for T
§impl<T> MeshPayload for T
 
impl<T> MeshPayload for T
§impl<T> SerializeMessage for Twhere
    T: 'static + MeshPayload + Send,
 
impl<T> SerializeMessage for Twhere
    T: 'static + MeshPayload + Send,
§fn compute_message_size(&mut self, sizer: MessageSizer<'_>)
 
fn compute_message_size(&mut self, sizer: MessageSizer<'_>)
MessageEncode::compute_message_size].§fn write_message(self, writer: MessageWriter<'_, '_, Resource>)
 
fn write_message(self, writer: MessageWriter<'_, '_, Resource>)
MessageEncode::write_message].