pub struct FidoPassthroughDevice {
    device: Arc<Mutex<FidoDevice>>,
    state: Arc<RwLock<DeviceState>>,
    control_transfer_state: Arc<RwLock<ControlTransferState>>,
    transfer_job_queue: Arc<AsyncJobQueue>,
    kill_evt: Event,
    worker_thread: Option<WorkerThread<()>>,
    pending_in_transfers: Arc<Mutex<VecDeque<(FidoTransferHandle, Arc<Mutex<Option<FidoTransfer>>>)>>>,
}
Expand description

Host-level fido passthrough device that handles USB operations and relays them to the appropriate virtual fido device.

Fields§

§device: Arc<Mutex<FidoDevice>>

The virtual FIDO device implementation.

§state: Arc<RwLock<DeviceState>>

The state of the device as seen by the backend provider.

§control_transfer_state: Arc<RwLock<ControlTransferState>>

The state of the control transfer exchange with the xhci layer.

§transfer_job_queue: Arc<AsyncJobQueue>§kill_evt: Event§worker_thread: Option<WorkerThread<()>>§pending_in_transfers: Arc<Mutex<VecDeque<(FidoTransferHandle, Arc<Mutex<Option<FidoTransfer>>>)>>>

Implementations§

source§

impl FidoPassthroughDevice

source

pub fn new( device: Arc<Mutex<FidoDevice>>, state: DeviceState, event_loop: Arc<EventLoop> ) -> Result<Self>

source

pub fn read_hidraw_file(&mut self) -> Result<()>

This function is called from the low-level event handler when the monitored fd is ready to transmit data from the host to the guest.

source

pub fn handle_control( transfer: &mut FidoTransfer, device: &Arc<Mutex<FidoDevice>> ) -> Result<()>

This function is called by a queued job to handle all communication related to USB control transfer packets between the guest and the virtual security key.

source

pub fn handle_interrupt_out( transfer: &mut FidoTransfer, device: &Arc<Mutex<FidoDevice>> ) -> Result<()>

This function is called by a queued job to handle all USB OUT requests from the guest down to the host by writing the given FidoTransfer data into the hidraw file.

Trait Implementations§

source§

impl AsRawDescriptor for FidoPassthroughDevice

source§

fn as_raw_descriptor(&self) -> RawDescriptor

Returns the underlying raw descriptor. Read more
source§

impl BackendDevice for FidoPassthroughDevice

source§

fn submit_backend_transfer( &mut self, transfer: BackendTransferType ) -> BackendResult<BackendTransferHandle>

Submits a transfer to the specific backend implementation.
source§

fn detach_event_handler( &self, _event_loop: &Arc<EventLoop> ) -> BackendResult<()>

This is called by a generic backend provider when a USB detach message is received from the vm control socket. It detaches the backend device from the backend provider event loop.
source§

fn request_transfer_buffer(&mut self, size: usize) -> TransferBuffer

Gets a buffer used for data transfer between the host and this device. The buffer returned by this function must be consumed by submit_backend_transfer().
source§

fn build_bulk_transfer( &mut self, _ep_addr: u8, _transfer_buffer: TransferBuffer, _stream_id: Option<u16> ) -> BackendResult<BackendTransferType>

Requests the backend to build a backend-specific bulk transfer request
source§

fn build_interrupt_transfer( &mut self, ep_addr: u8, transfer_buffer: TransferBuffer ) -> BackendResult<BackendTransferType>

Requests the backend to build a backend-specific interrupt transfer request
source§

fn get_control_transfer_state(&mut self) -> Arc<RwLock<ControlTransferState>>

Returns the ControlTransferState for the given backend device.
source§

fn get_device_state(&mut self) -> Arc<RwLock<DeviceState>>

Returns the DeviceState for the given backend device. This state contains all the backend-agnostic state for all generic USB backends.
source§

fn get_active_config_descriptor( &mut self ) -> BackendResult<ConfigDescriptorTree>

Gets the device active config descriptor tree.
source§

fn get_config_descriptor( &mut self, config: u8 ) -> BackendResult<ConfigDescriptorTree>

Gets a specific device config descriptor tree.
source§

fn get_config_descriptor_by_index( &mut self, config_index: u8 ) -> BackendResult<ConfigDescriptorTree>

Gets a specific device config descriptor tree by index.
source§

fn get_device_descriptor_tree(&mut self) -> BackendResult<DeviceDescriptorTree>

Gets the device descriptor tree.
source§

fn get_active_configuration(&mut self) -> BackendResult<u8>

Gets the device current active configuration.
source§

fn set_active_configuration(&mut self, config: u8) -> BackendResult<()>

Sets the device active configuration.
source§

fn clear_feature( &mut self, _value: u16, _index: u16 ) -> BackendResult<TransferStatus>

Handles a clear feature endpoint request for the given device.
source§

fn create_endpoints( &mut self, _config_descriptor: &ConfigDescriptorTree ) -> BackendResult<()>

Creates endpoints for the device with the given config descriptor tree.
source§

impl Drop for FidoPassthroughDevice

source§

fn drop(&mut self)

Executes the destructor for this type. Read more
source§

impl XhciBackendDevice for FidoPassthroughDevice

source§

fn get_backend_type(&self) -> BackendType

Returns the type of USB device provided by this device.
source§

fn get_vid(&self) -> u16

Get vendor id of this device.
source§

fn get_pid(&self) -> u16

Get product id of this device.
source§

fn set_address(&mut self, _address: UsbDeviceAddress)

Set address of this backend.
source§

fn reset(&mut self) -> BackendResult<()>

Reset the backend device.
source§

fn get_speed(&self) -> Option<DeviceSpeed>

Get speed of this device.
source§

fn alloc_streams(&self, _ep: u8, _num_streams: u16) -> BackendResult<()>

Allocate streams for the endpoint
source§

fn free_streams(&self, _ep: u8) -> BackendResult<()>

Free streams for the endpoint
source§

fn stop(&mut self)

Stop the backend device, allowing it to execute cleanup routines.

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> AsRawDescriptors for T
where T: AsRawDescriptor,

source§

fn as_raw_descriptors(&self) -> Vec<i32>

Returns the underlying raw descriptors. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V