use std::collections::VecDeque;
use std::fmt;
use std::result;
use std::sync::{Arc, Mutex};
use devices::virtio::net::device::VirtioNetBackend;
use devices::virtio::Net;
pub struct NetworkInterfaceConfig {
pub iface_id: String,
pub backend: VirtioNetBackend,
pub mac: [u8; 6],
pub features: u32,
}
#[derive(Debug)]
pub enum NetworkInterfaceError {
CreateNetworkDevice(devices::virtio::net::Error),
DeviceIdNotFound,
}
impl fmt::Display for NetworkInterfaceError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
use self::NetworkInterfaceError::*;
match *self {
CreateNetworkDevice(ref e) => write!(f, "Could not create Network Device: {e:?}"),
DeviceIdNotFound => write!(f, "Invalid interface ID - not found."),
}
}
}
type Result<T> = result::Result<T, NetworkInterfaceError>;
#[derive(Default)]
pub struct NetBuilder {
pub list: VecDeque<Arc<Mutex<Net>>>,
}
impl NetBuilder {
pub fn new() -> Self {
NetBuilder {
list: VecDeque::new(),
}
}
pub fn insert(&mut self, config: NetworkInterfaceConfig) -> Result<()> {
let net_dev = Arc::new(Mutex::new(Self::create_net(config)?));
self.list.push_back(net_dev);
Ok(())
}
pub fn create_net(cfg: NetworkInterfaceConfig) -> Result<Net> {
Net::new(cfg.iface_id, cfg.backend, cfg.mac, cfg.features)
.map_err(NetworkInterfaceError::CreateNetworkDevice)
}
}