blob: b3bf607d8ad8ce4ed7df2d714db512c6fb95a057 [file] [log] [blame]
// Copyright 2021 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
mod block;
mod handler;
mod net;
mod worker;
pub use self::block::*;
pub use self::net::*;
use remain::sorted;
use thiserror::Error as ThisError;
use vm_memory::GuestMemoryError;
use vmm_vhost::Error as VhostError;
#[sorted]
#[derive(ThisError, Debug)]
pub enum Error {
/// Failed to copy config to a buffer.
#[error("failed to copy config to a buffer: {0}")]
CopyConfig(std::io::Error),
/// Failed to create `base::Event`.
#[error("failed to create Event: {0}")]
CreateEvent(base::Error),
/// Failed to get config.
#[error("failed to get config: {0}")]
GetConfig(VhostError),
/// Failed to get features.
#[error("failed to get features: {0}")]
GetFeatures(VhostError),
/// Failed to get host address.
#[error("failed to get host address: {0}")]
GetHostAddress(GuestMemoryError),
/// Failed to get protocol features.
#[error("failed to get protocol features: {0}")]
GetProtocolFeatures(VhostError),
/// Failed to get number of queues.
#[error("failed to get number of queues: {0}")]
GetQueueNum(VhostError),
/// Failed to get vring base offset.
#[error("failed to get vring base offset: {0}")]
GetVringBase(VhostError),
/// Invalid config offset is given.
#[error("invalid config offset is given: {data_len} + {offset} > {config_len}")]
InvalidConfigOffset {
data_len: u64,
offset: u64,
config_len: u64,
},
/// MSI-X config is unavailable.
#[error("MSI-X config is unavailable")]
MsixConfigUnavailable,
/// MSI-X irqfd is unavailable.
#[error("MSI-X irqfd is unavailable")]
MsixIrqfdUnavailable,
/// Failed to reset owner.
#[error("failed to reset owner: {0}")]
ResetOwner(VhostError),
/// Failed to set features.
#[error("failed to set features: {0}")]
SetFeatures(VhostError),
/// Failed to set memory map regions.
#[error("failed to set memory map regions: {0}")]
SetMemTable(VhostError),
/// Failed to set owner.
#[error("failed to set owner: {0}")]
SetOwner(VhostError),
/// Failed to set protocol features.
#[error("failed to set protocol features: {0}")]
SetProtocolFeatures(VhostError),
/// Failed to set vring address.
#[error("failed to set vring address: {0}")]
SetVringAddr(VhostError),
/// Failed to set vring base offset.
#[error("failed to set vring base offset: {0}")]
SetVringBase(VhostError),
/// Failed to set eventfd to signal used vring buffers.
#[error("failed to set eventfd to signal used vring buffers: {0}")]
SetVringCall(VhostError),
/// Failed to enable or disable vring.
#[error("failed to enable or disable vring: {0}")]
SetVringEnable(VhostError),
/// Failed to set eventfd for adding buffers to vring.
#[error("failed to set eventfd for adding buffers to vring: {0}")]
SetVringKick(VhostError),
/// Failed to set the size of the queue.
#[error("failed to set the size of the queue: {0}")]
SetVringNum(VhostError),
/// Failed to connect socket.
#[error("failed to connect socket: {0}")]
SocketConnect(std::io::Error),
}
pub type Result<T> = std::result::Result<T, Error>;