use std::io::Error;
use std::os::unix::io::RawFd;
use std::sync::Arc;
#[cfg(feature = "pci")]
mod pci;
#[cfg(feature = "vhost-user")]
mod vhost_user;
#[cfg(feature = "vhost-vdpa")]
mod vhost_vdpa;
#[cfg(feature = "pci")]
pub use pci::Pci;
#[cfg(feature = "vhost-user")]
pub use vhost_user::VhostUser;
#[cfg(feature = "vhost-vdpa")]
pub use vhost_vdpa::VhostVdpa;
use crate::util::bytevalued::ByteValued;
use crate::util::eventfd::EventFd;
use crate::util::iova::Iova;
use crate::virtqueue::{Virtqueue, VirtqueueLayout};
pub trait IovaTranslator: Send + Sync {
fn translate_addr(&self, addr: usize, len: usize) -> Result<Iova, Error>;
}
pub trait VirtioTransport<C: ByteValued, R: Copy>: Send + Sync {
fn max_queues(&self) -> Option<usize>;
fn max_mem_regions(&self) -> u64;
fn mem_region_alignment(&self) -> usize;
fn alloc_queue_mem(&mut self, layout: &VirtqueueLayout) -> Result<&mut [u8], Error>;
fn map_mem_region(
&mut self,
addr: usize,
len: usize,
fd: RawFd,
fd_offset: i64,
) -> Result<Iova, Error>;
fn unmap_mem_region(&mut self, addr: usize, len: usize) -> Result<(), Error>;
fn iova_translator(&self) -> Box<dyn IovaTranslator>;
fn setup_queues(&mut self, queues: &[Virtqueue<R>]) -> Result<(), Error>;
fn get_features(&self) -> u64;
fn get_config(&self) -> Result<C, Error>;
fn get_submission_notifier(&self, queue_idx: usize) -> Box<dyn QueueNotifier>;
fn get_completion_fd(&self, queue_idx: usize) -> Arc<EventFd>;
}
pub trait QueueNotifier: Send + Sync {
fn notify(&self) -> Result<(), Error>;
}