1*bb4ee6a4SAndroid Build Coastguard Worker // Copyright 2017 The ChromiumOS Authors 2*bb4ee6a4SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*bb4ee6a4SAndroid Build Coastguard Worker // found in the LICENSE file. 4*bb4ee6a4SAndroid Build Coastguard Worker 5*bb4ee6a4SAndroid Build Coastguard Worker //! Implements vhost-based virtio devices. 6*bb4ee6a4SAndroid Build Coastguard Worker 7*bb4ee6a4SAndroid Build Coastguard Worker use base::Error as SysError; 8*bb4ee6a4SAndroid Build Coastguard Worker use base::TubeError; 9*bb4ee6a4SAndroid Build Coastguard Worker use net_util::Error as TapError; 10*bb4ee6a4SAndroid Build Coastguard Worker use remain::sorted; 11*bb4ee6a4SAndroid Build Coastguard Worker use thiserror::Error; 12*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))] 13*bb4ee6a4SAndroid Build Coastguard Worker use vhost::Error as VhostError; 14*bb4ee6a4SAndroid Build Coastguard Worker 15*bb4ee6a4SAndroid Build Coastguard Worker mod control_socket; 16*bb4ee6a4SAndroid Build Coastguard Worker pub mod user; 17*bb4ee6a4SAndroid Build Coastguard Worker 18*bb4ee6a4SAndroid Build Coastguard Worker pub use self::control_socket::*; 19*bb4ee6a4SAndroid Build Coastguard Worker 20*bb4ee6a4SAndroid Build Coastguard Worker cfg_if::cfg_if! { 21*bb4ee6a4SAndroid Build Coastguard Worker if #[cfg(any(target_os = "android", target_os = "linux"))] { 22*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "net")] 23*bb4ee6a4SAndroid Build Coastguard Worker mod net; 24*bb4ee6a4SAndroid Build Coastguard Worker pub mod vsock; 25*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_arch = "arm", target_arch = "aarch64"))] 26*bb4ee6a4SAndroid Build Coastguard Worker pub mod scmi; 27*bb4ee6a4SAndroid Build Coastguard Worker mod worker; 28*bb4ee6a4SAndroid Build Coastguard Worker 29*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(feature = "net")] 30*bb4ee6a4SAndroid Build Coastguard Worker pub use self::net::Net; 31*bb4ee6a4SAndroid Build Coastguard Worker pub use self::vsock::Vsock; 32*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_arch = "arm", target_arch = "aarch64"))] 33*bb4ee6a4SAndroid Build Coastguard Worker pub use self::scmi::Scmi; 34*bb4ee6a4SAndroid Build Coastguard Worker } else if #[cfg(windows)] {} 35*bb4ee6a4SAndroid Build Coastguard Worker } 36*bb4ee6a4SAndroid Build Coastguard Worker 37*bb4ee6a4SAndroid Build Coastguard Worker #[sorted] 38*bb4ee6a4SAndroid Build Coastguard Worker #[derive(Error, Debug)] 39*bb4ee6a4SAndroid Build Coastguard Worker pub enum Error { 40*bb4ee6a4SAndroid Build Coastguard Worker /// Cloning kill event failed. 41*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to clone kill event: {0}")] 42*bb4ee6a4SAndroid Build Coastguard Worker CloneKillEvent(SysError), 43*bb4ee6a4SAndroid Build Coastguard Worker /// Creating kill event failed. 44*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to create kill event: {0}")] 45*bb4ee6a4SAndroid Build Coastguard Worker CreateKillEvent(SysError), 46*bb4ee6a4SAndroid Build Coastguard Worker /// Creating tube failed. 47*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to create tube: {0}")] 48*bb4ee6a4SAndroid Build Coastguard Worker CreateTube(TubeError), 49*bb4ee6a4SAndroid Build Coastguard Worker /// Creating wait context failed. 50*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to create poll context: {0}")] 51*bb4ee6a4SAndroid Build Coastguard Worker CreateWaitContext(SysError), 52*bb4ee6a4SAndroid Build Coastguard Worker /// Enabling tap interface failed. 53*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to enable tap interface: {0}")] 54*bb4ee6a4SAndroid Build Coastguard Worker TapEnable(TapError), 55*bb4ee6a4SAndroid Build Coastguard Worker /// Open tap device failed. 56*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to open tap device: {0}")] 57*bb4ee6a4SAndroid Build Coastguard Worker TapOpen(TapError), 58*bb4ee6a4SAndroid Build Coastguard Worker /// Setting tap IP failed. 59*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to set tap IP: {0}")] 60*bb4ee6a4SAndroid Build Coastguard Worker TapSetIp(TapError), 61*bb4ee6a4SAndroid Build Coastguard Worker /// Setting tap mac address failed. 62*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to set tap mac address: {0}")] 63*bb4ee6a4SAndroid Build Coastguard Worker TapSetMacAddress(TapError), 64*bb4ee6a4SAndroid Build Coastguard Worker /// Setting tap netmask failed. 65*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to set tap netmask: {0}")] 66*bb4ee6a4SAndroid Build Coastguard Worker TapSetNetmask(TapError), 67*bb4ee6a4SAndroid Build Coastguard Worker /// Setting tap interface offload flags failed. 68*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to set tap interface offload flags: {0}")] 69*bb4ee6a4SAndroid Build Coastguard Worker TapSetOffload(TapError), 70*bb4ee6a4SAndroid Build Coastguard Worker /// Setting vnet header size failed. 71*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to set vnet header size: {0}")] 72*bb4ee6a4SAndroid Build Coastguard Worker TapSetVnetHdrSize(TapError), 73*bb4ee6a4SAndroid Build Coastguard Worker /// Get features failed. 74*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))] 75*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to get features: {0}")] 76*bb4ee6a4SAndroid Build Coastguard Worker VhostGetFeatures(VhostError), 77*bb4ee6a4SAndroid Build Coastguard Worker /// Vhost IOTLB required but not supported. 78*bb4ee6a4SAndroid Build Coastguard Worker #[error("Vhost IOTLB required but not supported")] 79*bb4ee6a4SAndroid Build Coastguard Worker VhostIotlbUnsupported, 80*bb4ee6a4SAndroid Build Coastguard Worker /// Failed to create vhost event. 81*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to create vhost event: {0}")] 82*bb4ee6a4SAndroid Build Coastguard Worker VhostIrqCreate(SysError), 83*bb4ee6a4SAndroid Build Coastguard Worker /// Failed to read vhost event. 84*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to read vhost event: {0}")] 85*bb4ee6a4SAndroid Build Coastguard Worker VhostIrqRead(SysError), 86*bb4ee6a4SAndroid Build Coastguard Worker /// Net set backend failed. 87*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))] 88*bb4ee6a4SAndroid Build Coastguard Worker #[error("net set backend failed: {0}")] 89*bb4ee6a4SAndroid Build Coastguard Worker VhostNetSetBackend(VhostError), 90*bb4ee6a4SAndroid Build Coastguard Worker /// Failed to open vhost device. 91*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))] 92*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to open vhost device: {0}")] 93*bb4ee6a4SAndroid Build Coastguard Worker VhostOpen(VhostError), 94*bb4ee6a4SAndroid Build Coastguard Worker /// Set features failed. 95*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))] 96*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to set features: {0}")] 97*bb4ee6a4SAndroid Build Coastguard Worker VhostSetFeatures(VhostError), 98*bb4ee6a4SAndroid Build Coastguard Worker /// Set mem table failed. 99*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))] 100*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to set mem table: {0}")] 101*bb4ee6a4SAndroid Build Coastguard Worker VhostSetMemTable(VhostError), 102*bb4ee6a4SAndroid Build Coastguard Worker /// Set owner failed. 103*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))] 104*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to set owner: {0}")] 105*bb4ee6a4SAndroid Build Coastguard Worker VhostSetOwner(VhostError), 106*bb4ee6a4SAndroid Build Coastguard Worker /// Set vring addr failed. 107*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))] 108*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to set vring addr: {0}")] 109*bb4ee6a4SAndroid Build Coastguard Worker VhostSetVringAddr(VhostError), 110*bb4ee6a4SAndroid Build Coastguard Worker /// Set vring base failed. 111*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))] 112*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to set vring base: {0}")] 113*bb4ee6a4SAndroid Build Coastguard Worker VhostSetVringBase(VhostError), 114*bb4ee6a4SAndroid Build Coastguard Worker /// Set vring call failed. 115*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))] 116*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to set vring call: {0}")] 117*bb4ee6a4SAndroid Build Coastguard Worker VhostSetVringCall(VhostError), 118*bb4ee6a4SAndroid Build Coastguard Worker /// Set vring kick failed. 119*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))] 120*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to set vring kick: {0}")] 121*bb4ee6a4SAndroid Build Coastguard Worker VhostSetVringKick(VhostError), 122*bb4ee6a4SAndroid Build Coastguard Worker /// Set vring num failed. 123*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))] 124*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to set vring num: {0}")] 125*bb4ee6a4SAndroid Build Coastguard Worker VhostSetVringNum(VhostError), 126*bb4ee6a4SAndroid Build Coastguard Worker /// Failed to set CID for guest. 127*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))] 128*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to set CID for guest: {0}")] 129*bb4ee6a4SAndroid Build Coastguard Worker VhostVsockSetCid(VhostError), 130*bb4ee6a4SAndroid Build Coastguard Worker /// Failed to start vhost-vsock driver. 131*bb4ee6a4SAndroid Build Coastguard Worker #[cfg(any(target_os = "android", target_os = "linux"))] 132*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed to start vhost-vsock driver: {0}")] 133*bb4ee6a4SAndroid Build Coastguard Worker VhostVsockStart(VhostError), 134*bb4ee6a4SAndroid Build Coastguard Worker #[error("queue missing vring base")] 135*bb4ee6a4SAndroid Build Coastguard Worker VringBaseMissing, 136*bb4ee6a4SAndroid Build Coastguard Worker /// Error while waiting for events. 137*bb4ee6a4SAndroid Build Coastguard Worker #[error("failed waiting for events: {0}")] 138*bb4ee6a4SAndroid Build Coastguard Worker WaitError(SysError), 139*bb4ee6a4SAndroid Build Coastguard Worker } 140*bb4ee6a4SAndroid Build Coastguard Worker 141*bb4ee6a4SAndroid Build Coastguard Worker pub type Result<T> = std::result::Result<T, Error>; 142