113776c11Slogin use core::{ 2e32effb1SLoGin any::Any, 313776c11Slogin cell::UnsafeCell, 413776c11Slogin fmt::Debug, 513776c11Slogin ops::{Deref, DerefMut}, 613776c11Slogin }; 713776c11Slogin 8c566df45SLoGin use alloc::{ 9e32effb1SLoGin string::{String, ToString}, 10c566df45SLoGin sync::{Arc, Weak}, 11e32effb1SLoGin vec::Vec, 12c566df45SLoGin }; 13881ff6f9Syuyi2439 use smoltcp::{iface, phy, wire}; 14e32effb1SLoGin use unified_init::macros::unified_init; 15e32effb1SLoGin use virtio_drivers::device::net::VirtIONet; 1613776c11Slogin 17e32effb1SLoGin use super::NetDevice; 1813776c11Slogin use crate::{ 19881ff6f9Syuyi2439 arch::rand::rand, 20b087521eSChiichen driver::{ 2106d5e247SLoGin base::{ 22e32effb1SLoGin class::Class, 23e32effb1SLoGin device::{ 24e32effb1SLoGin bus::Bus, 25e32effb1SLoGin driver::{Driver, DriverCommonData}, 26e32effb1SLoGin Device, DeviceCommonData, DeviceId, DeviceType, IdTable, 2706d5e247SLoGin }, 28e32effb1SLoGin kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState}, 29e32effb1SLoGin kset::KSet, 30e32effb1SLoGin }, 31e32effb1SLoGin virtio::{ 32e32effb1SLoGin irq::virtio_irq_manager, 33e32effb1SLoGin sysfs::{virtio_bus, virtio_device_manager, virtio_driver_manager}, 34e32effb1SLoGin transport::VirtIOTransport, 35e32effb1SLoGin virtio_impl::HalImpl, 36e32effb1SLoGin VirtIODevice, VirtIODeviceIndex, VirtIODriver, VIRTIO_VENDOR_ID, 37e32effb1SLoGin }, 38d470019bSLoGin }, 39e2841179SLoGin exception::{irqdesc::IrqReturn, IrqNumber}, 40e32effb1SLoGin filesystem::kernfs::KernFSInode, 41e32effb1SLoGin init::initcall::INITCALL_POSTCORE, 42e32effb1SLoGin kerror, 43e32effb1SLoGin libs::{ 44e32effb1SLoGin rwlock::{RwLockReadGuard, RwLockWriteGuard}, 45e32effb1SLoGin spinlock::{SpinLock, SpinLockGuard}, 46e32effb1SLoGin }, 47e32effb1SLoGin net::{generate_iface_id, net_core::poll_ifaces_try_lock_onetime, NET_DEVICES}, 4813776c11Slogin time::Instant, 4913776c11Slogin }; 5091e9d4abSLoGin use system_error::SystemError; 5113776c11Slogin 52e32effb1SLoGin static mut VIRTIO_NET_DRIVER: Option<Arc<VirtIONetDriver>> = None; 53e32effb1SLoGin 54e32effb1SLoGin const DEVICE_NAME: &str = "virtio_net"; 55e32effb1SLoGin 56e32effb1SLoGin #[inline(always)] 57e32effb1SLoGin fn virtio_net_driver() -> Arc<VirtIONetDriver> { 58e32effb1SLoGin unsafe { VIRTIO_NET_DRIVER.as_ref().unwrap().clone() } 5913776c11Slogin } 6013776c11Slogin 61e32effb1SLoGin pub struct VirtIoNetImpl { 62e32effb1SLoGin inner: VirtIONet<HalImpl, VirtIOTransport, 2>, 63e32effb1SLoGin } 64e32effb1SLoGin 65e32effb1SLoGin impl VirtIoNetImpl { 66e32effb1SLoGin const fn new(inner: VirtIONet<HalImpl, VirtIOTransport, 2>) -> Self { 67e32effb1SLoGin Self { inner } 6813776c11Slogin } 6913776c11Slogin } 7013776c11Slogin 71e32effb1SLoGin impl Deref for VirtIoNetImpl { 72e32effb1SLoGin type Target = VirtIONet<HalImpl, VirtIOTransport, 2>; 73e32effb1SLoGin fn deref(&self) -> &Self::Target { 74e32effb1SLoGin &self.inner 75e32effb1SLoGin } 76e32effb1SLoGin } 7713776c11Slogin 78e32effb1SLoGin impl DerefMut for VirtIoNetImpl { 79e32effb1SLoGin fn deref_mut(&mut self) -> &mut Self::Target { 80e32effb1SLoGin &mut self.inner 81e32effb1SLoGin } 82e32effb1SLoGin } 83e32effb1SLoGin 84e32effb1SLoGin unsafe impl Send for VirtIoNetImpl {} 85e32effb1SLoGin unsafe impl Sync for VirtIoNetImpl {} 86e32effb1SLoGin 87e32effb1SLoGin #[derive(Debug)] 88e32effb1SLoGin struct VirtIONicDeviceInnerWrapper(UnsafeCell<VirtIONicDeviceInner>); 89e32effb1SLoGin unsafe impl Send for VirtIONicDeviceInnerWrapper {} 90e32effb1SLoGin unsafe impl Sync for VirtIONicDeviceInnerWrapper {} 91e32effb1SLoGin 92e32effb1SLoGin impl Deref for VirtIONicDeviceInnerWrapper { 93e32effb1SLoGin type Target = VirtIONicDeviceInner; 9413776c11Slogin fn deref(&self) -> &Self::Target { 9513776c11Slogin unsafe { &*self.0.get() } 9613776c11Slogin } 9713776c11Slogin } 98e32effb1SLoGin impl DerefMut for VirtIONicDeviceInnerWrapper { 9913776c11Slogin fn deref_mut(&mut self) -> &mut Self::Target { 10013776c11Slogin unsafe { &mut *self.0.get() } 10113776c11Slogin } 10213776c11Slogin } 10313776c11Slogin 104b5b571e0SLoGin #[allow(clippy::mut_from_ref)] 105e32effb1SLoGin impl VirtIONicDeviceInnerWrapper { 106e32effb1SLoGin fn force_get_mut(&self) -> &mut <VirtIONicDeviceInnerWrapper as Deref>::Target { 10713776c11Slogin unsafe { &mut *self.0.get() } 10813776c11Slogin } 10913776c11Slogin } 11013776c11Slogin 111e32effb1SLoGin /// Virtio网络设备驱动(加锁) 112e32effb1SLoGin pub struct VirtIONicDeviceInner { 113e32effb1SLoGin pub inner: Arc<SpinLock<VirtIoNetImpl>>, 114e32effb1SLoGin } 115e32effb1SLoGin 116e32effb1SLoGin impl Clone for VirtIONicDeviceInner { 117e32effb1SLoGin fn clone(&self) -> Self { 118e32effb1SLoGin return VirtIONicDeviceInner { 119e32effb1SLoGin inner: self.inner.clone(), 120e32effb1SLoGin }; 121e32effb1SLoGin } 122e32effb1SLoGin } 123e32effb1SLoGin 124e32effb1SLoGin impl Debug for VirtIONicDeviceInner { 12513776c11Slogin fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { 126e32effb1SLoGin f.debug_struct("VirtIONicDriver").finish() 12713776c11Slogin } 12813776c11Slogin } 12913776c11Slogin 130e32effb1SLoGin #[cast_to([sync] VirtIODevice)] 131*731bc2b3SLoGin #[cast_to([sync] Device)] 132e32effb1SLoGin pub struct VirtioInterface { 133e32effb1SLoGin device_inner: VirtIONicDeviceInnerWrapper, 13413776c11Slogin iface_id: usize, 135e32effb1SLoGin iface_name: String, 136e2841179SLoGin dev_id: Arc<DeviceId>, 137e32effb1SLoGin iface: SpinLock<iface::Interface>, 138e32effb1SLoGin inner: SpinLock<InnerVirtIOInterface>, 139e32effb1SLoGin locked_kobj_state: LockedKObjectState, 14013776c11Slogin } 14113776c11Slogin 142e32effb1SLoGin #[derive(Debug)] 143e32effb1SLoGin struct InnerVirtIOInterface { 144e32effb1SLoGin name: Option<String>, 145e32effb1SLoGin virtio_index: Option<VirtIODeviceIndex>, 146e32effb1SLoGin device_common: DeviceCommonData, 147e32effb1SLoGin kobj_common: KObjectCommonData, 148e32effb1SLoGin } 149e32effb1SLoGin 150e32effb1SLoGin impl core::fmt::Debug for VirtioInterface { 15113776c11Slogin fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { 15213776c11Slogin f.debug_struct("VirtioInterface") 15313776c11Slogin .field("iface_id", &self.iface_id) 154e32effb1SLoGin .field("iface_name", &self.iface_name) 155e32effb1SLoGin .field("dev_id", &self.dev_id) 156e32effb1SLoGin .field("inner", &self.inner) 157e32effb1SLoGin .field("locked_kobj_state", &self.locked_kobj_state) 15813776c11Slogin .finish() 15913776c11Slogin } 16013776c11Slogin } 16113776c11Slogin 162e32effb1SLoGin impl VirtioInterface { 163e32effb1SLoGin pub fn new(mut device_inner: VirtIONicDeviceInner, dev_id: Arc<DeviceId>) -> Arc<Self> { 16413776c11Slogin let iface_id = generate_iface_id(); 165881ff6f9Syuyi2439 let mut iface_config = iface::Config::new(wire::HardwareAddress::Ethernet( 166e32effb1SLoGin wire::EthernetAddress(device_inner.inner.lock().mac_address()), 16713776c11Slogin )); 168881ff6f9Syuyi2439 iface_config.random_seed = rand() as u64; 169881ff6f9Syuyi2439 170e32effb1SLoGin let iface = iface::Interface::new(iface_config, &mut device_inner, Instant::now().into()); 17113776c11Slogin 17213776c11Slogin let result = Arc::new(VirtioInterface { 173e32effb1SLoGin device_inner: VirtIONicDeviceInnerWrapper(UnsafeCell::new(device_inner)), 17413776c11Slogin iface_id, 175e32effb1SLoGin locked_kobj_state: LockedKObjectState::default(), 17613776c11Slogin iface: SpinLock::new(iface), 177e32effb1SLoGin iface_name: format!("eth{}", iface_id), 178e2841179SLoGin dev_id, 179e32effb1SLoGin inner: SpinLock::new(InnerVirtIOInterface { 180e32effb1SLoGin name: None, 181e32effb1SLoGin virtio_index: None, 182e32effb1SLoGin device_common: DeviceCommonData::default(), 183e32effb1SLoGin kobj_common: KObjectCommonData::default(), 184e32effb1SLoGin }), 18513776c11Slogin }); 18613776c11Slogin 187e32effb1SLoGin result.inner().device_common.driver = 188e32effb1SLoGin Some(Arc::downgrade(&virtio_net_driver()) as Weak<dyn Driver>); 189e32effb1SLoGin 19013776c11Slogin return result; 19113776c11Slogin } 192e32effb1SLoGin 193e32effb1SLoGin fn inner(&self) -> SpinLockGuard<InnerVirtIOInterface> { 194e32effb1SLoGin return self.inner.lock(); 19513776c11Slogin } 19613776c11Slogin 197e32effb1SLoGin /// 获取网卡接口的名称 198e32effb1SLoGin #[allow(dead_code)] 199e32effb1SLoGin pub fn iface_name(&self) -> String { 200e32effb1SLoGin self.iface_name.clone() 201e32effb1SLoGin } 202e32effb1SLoGin } 203e32effb1SLoGin 204e32effb1SLoGin impl VirtIODevice for VirtioInterface { 205e2841179SLoGin fn handle_irq(&self, _irq: IrqNumber) -> Result<IrqReturn, SystemError> { 206e2841179SLoGin poll_ifaces_try_lock_onetime().ok(); 207e2841179SLoGin return Ok(IrqReturn::Handled); 208e2841179SLoGin } 209e2841179SLoGin 210e2841179SLoGin fn dev_id(&self) -> &Arc<DeviceId> { 211e2841179SLoGin return &self.dev_id; 212e2841179SLoGin } 213e32effb1SLoGin fn set_virtio_device_index(&self, index: VirtIODeviceIndex) { 214e32effb1SLoGin self.inner().virtio_index = Some(index); 215e2841179SLoGin } 216e2841179SLoGin 217e32effb1SLoGin fn virtio_device_index(&self) -> Option<VirtIODeviceIndex> { 218e32effb1SLoGin return self.inner().virtio_index; 219e32effb1SLoGin } 220e32effb1SLoGin 221e32effb1SLoGin fn set_device_name(&self, name: String) { 222e32effb1SLoGin self.inner().name = Some(name); 223e32effb1SLoGin } 224e32effb1SLoGin 225e32effb1SLoGin fn device_name(&self) -> String { 226e32effb1SLoGin self.inner() 227e32effb1SLoGin .name 228e32effb1SLoGin .clone() 229e32effb1SLoGin .unwrap_or_else(|| "virtio_net".to_string()) 230e32effb1SLoGin } 231e32effb1SLoGin 232e32effb1SLoGin fn device_type_id(&self) -> u32 { 233e32effb1SLoGin virtio_drivers::transport::DeviceType::Network as u32 234e32effb1SLoGin } 235e32effb1SLoGin 236e32effb1SLoGin fn vendor(&self) -> u32 { 237e32effb1SLoGin VIRTIO_VENDOR_ID.into() 238e32effb1SLoGin } 239e32effb1SLoGin } 240e32effb1SLoGin 241e32effb1SLoGin impl Drop for VirtioInterface { 242e2841179SLoGin fn drop(&mut self) { 243e2841179SLoGin // 从全局的网卡接口信息表中删除这个网卡的接口信息 244e32effb1SLoGin NET_DEVICES.write_irqsave().remove(&self.iface_id); 245e2841179SLoGin } 246e2841179SLoGin } 247e2841179SLoGin 248e32effb1SLoGin impl Device for VirtioInterface { 249e32effb1SLoGin fn dev_type(&self) -> DeviceType { 250e32effb1SLoGin DeviceType::Net 251e32effb1SLoGin } 252e32effb1SLoGin 253e32effb1SLoGin fn id_table(&self) -> IdTable { 254e32effb1SLoGin IdTable::new(DEVICE_NAME.to_string(), None) 255e32effb1SLoGin } 256e32effb1SLoGin 257e32effb1SLoGin fn bus(&self) -> Option<Weak<dyn Bus>> { 258e32effb1SLoGin self.inner().device_common.bus.clone() 259e32effb1SLoGin } 260e32effb1SLoGin 261e32effb1SLoGin fn set_bus(&self, bus: Option<Weak<dyn Bus>>) { 262e32effb1SLoGin self.inner().device_common.bus = bus; 263e32effb1SLoGin } 264e32effb1SLoGin 265e32effb1SLoGin fn class(&self) -> Option<Arc<dyn Class>> { 266e32effb1SLoGin let mut guard = self.inner(); 267e32effb1SLoGin let r = guard.device_common.class.clone()?.upgrade(); 268e32effb1SLoGin if r.is_none() { 269e32effb1SLoGin guard.device_common.class = None; 270e32effb1SLoGin } 271e32effb1SLoGin 272e32effb1SLoGin return r; 273e32effb1SLoGin } 274e32effb1SLoGin 275e32effb1SLoGin fn set_class(&self, class: Option<Weak<dyn Class>>) { 276e32effb1SLoGin self.inner().device_common.class = class; 277e32effb1SLoGin } 278e32effb1SLoGin 279e32effb1SLoGin fn driver(&self) -> Option<Arc<dyn Driver>> { 280e32effb1SLoGin let r = self.inner().device_common.driver.clone()?.upgrade(); 281e32effb1SLoGin if r.is_none() { 282e32effb1SLoGin self.inner().device_common.driver = None; 283e32effb1SLoGin } 284e32effb1SLoGin 285e32effb1SLoGin return r; 286e32effb1SLoGin } 287e32effb1SLoGin 288e32effb1SLoGin fn set_driver(&self, driver: Option<Weak<dyn Driver>>) { 289e32effb1SLoGin self.inner().device_common.driver = driver; 290e32effb1SLoGin } 291e32effb1SLoGin 292e32effb1SLoGin fn is_dead(&self) -> bool { 293e32effb1SLoGin false 294e32effb1SLoGin } 295e32effb1SLoGin 296e32effb1SLoGin fn can_match(&self) -> bool { 297*731bc2b3SLoGin self.inner().device_common.can_match 298e32effb1SLoGin } 299e32effb1SLoGin 300e32effb1SLoGin fn set_can_match(&self, can_match: bool) { 301e32effb1SLoGin self.inner().device_common.can_match = can_match; 302e32effb1SLoGin } 303e32effb1SLoGin 304e32effb1SLoGin fn state_synced(&self) -> bool { 305e32effb1SLoGin true 306e32effb1SLoGin } 307e32effb1SLoGin } 308e32effb1SLoGin 309e32effb1SLoGin impl VirtIONicDeviceInner { 310e32effb1SLoGin pub fn new(driver_net: VirtIONet<HalImpl, VirtIOTransport, 2>) -> Self { 311881ff6f9Syuyi2439 let mut iface_config = iface::Config::new(wire::HardwareAddress::Ethernet( 312881ff6f9Syuyi2439 wire::EthernetAddress(driver_net.mac_address()), 31313776c11Slogin )); 31413776c11Slogin 315881ff6f9Syuyi2439 iface_config.random_seed = rand() as u64; 316881ff6f9Syuyi2439 317e32effb1SLoGin let inner = Arc::new(SpinLock::new(VirtIoNetImpl::new(driver_net))); 318e32effb1SLoGin let result = VirtIONicDeviceInner { inner }; 31913776c11Slogin return result; 32013776c11Slogin } 32113776c11Slogin } 32213776c11Slogin 323e32effb1SLoGin pub struct VirtioNetToken { 324e32effb1SLoGin driver: VirtIONicDeviceInner, 32513776c11Slogin rx_buffer: Option<virtio_drivers::device::net::RxBuffer>, 32613776c11Slogin } 32713776c11Slogin 328e32effb1SLoGin impl VirtioNetToken { 32913776c11Slogin pub fn new( 330e32effb1SLoGin driver: VirtIONicDeviceInner, 33113776c11Slogin rx_buffer: Option<virtio_drivers::device::net::RxBuffer>, 33213776c11Slogin ) -> Self { 33313776c11Slogin return Self { driver, rx_buffer }; 33413776c11Slogin } 33513776c11Slogin } 33613776c11Slogin 337e32effb1SLoGin impl phy::Device for VirtIONicDeviceInner { 338e32effb1SLoGin type RxToken<'a> = VirtioNetToken where Self: 'a; 339e32effb1SLoGin type TxToken<'a> = VirtioNetToken where Self: 'a; 34013776c11Slogin 34113776c11Slogin fn receive( 34213776c11Slogin &mut self, 34313776c11Slogin _timestamp: smoltcp::time::Instant, 34413776c11Slogin ) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> { 34513776c11Slogin match self.inner.lock().receive() { 34613776c11Slogin Ok(buf) => Some(( 34713776c11Slogin VirtioNetToken::new(self.clone(), Some(buf)), 34813776c11Slogin VirtioNetToken::new(self.clone(), None), 34913776c11Slogin )), 35013776c11Slogin Err(virtio_drivers::Error::NotReady) => None, 35113776c11Slogin Err(err) => panic!("VirtIO receive failed: {}", err), 35213776c11Slogin } 35313776c11Slogin } 35413776c11Slogin 35513776c11Slogin fn transmit(&mut self, _timestamp: smoltcp::time::Instant) -> Option<Self::TxToken<'_>> { 35613776c11Slogin // kdebug!("VirtioNet: transmit"); 35740609970SGnoCiYeH if self.inner.lock_irqsave().can_send() { 35813776c11Slogin // kdebug!("VirtioNet: can send"); 35913776c11Slogin return Some(VirtioNetToken::new(self.clone(), None)); 36013776c11Slogin } else { 36113776c11Slogin // kdebug!("VirtioNet: can not send"); 36213776c11Slogin return None; 36313776c11Slogin } 36413776c11Slogin } 36513776c11Slogin 36613776c11Slogin fn capabilities(&self) -> phy::DeviceCapabilities { 36713776c11Slogin let mut caps = phy::DeviceCapabilities::default(); 36813776c11Slogin // 网卡的最大传输单元. 请与IP层的MTU进行区分。这个值应当是网卡的最大传输单元,而不是IP层的MTU。 36913776c11Slogin caps.max_transmission_unit = 2000; 37013776c11Slogin /* 37113776c11Slogin Maximum burst size, in terms of MTU. 37213776c11Slogin The network device is unable to send or receive bursts large than the value returned by this function. 37313776c11Slogin If None, there is no fixed limit on burst size, e.g. if network buffers are dynamically allocated. 37413776c11Slogin */ 37513776c11Slogin caps.max_burst_size = Some(1); 37613776c11Slogin return caps; 37713776c11Slogin } 37813776c11Slogin } 37913776c11Slogin 380e32effb1SLoGin impl phy::TxToken for VirtioNetToken { 38113776c11Slogin fn consume<R, F>(self, len: usize, f: F) -> R 38213776c11Slogin where 38313776c11Slogin F: FnOnce(&mut [u8]) -> R, 38413776c11Slogin { 38513776c11Slogin // // 为了线程安全,这里需要对VirtioNet进行加【写锁】,以保证对设备的互斥访问。 38613776c11Slogin let mut driver_net = self.driver.inner.lock(); 38713776c11Slogin let mut tx_buf = driver_net.new_tx_buffer(len); 38813776c11Slogin let result = f(tx_buf.packet_mut()); 38913776c11Slogin driver_net.send(tx_buf).expect("virtio_net send failed"); 39013776c11Slogin return result; 39113776c11Slogin } 39213776c11Slogin } 39313776c11Slogin 394e32effb1SLoGin impl phy::RxToken for VirtioNetToken { 39513776c11Slogin fn consume<R, F>(self, f: F) -> R 39613776c11Slogin where 39713776c11Slogin F: FnOnce(&mut [u8]) -> R, 39813776c11Slogin { 39913776c11Slogin // 为了线程安全,这里需要对VirtioNet进行加【写锁】,以保证对设备的互斥访问。 40013776c11Slogin let mut rx_buf = self.rx_buffer.unwrap(); 40113776c11Slogin let result = f(rx_buf.packet_mut()); 40213776c11Slogin self.driver 40313776c11Slogin .inner 40413776c11Slogin .lock() 40513776c11Slogin .recycle_rx_buffer(rx_buf) 40613776c11Slogin .expect("virtio_net recv failed"); 40713776c11Slogin result 40813776c11Slogin } 40913776c11Slogin } 41013776c11Slogin 41113776c11Slogin /// @brief virtio-net 驱动的初始化与测试 412e32effb1SLoGin pub fn virtio_net(transport: VirtIOTransport, dev_id: Arc<DeviceId>) { 413e32effb1SLoGin let driver_net: VirtIONet<HalImpl, VirtIOTransport, 2> = 414e32effb1SLoGin match VirtIONet::<HalImpl, VirtIOTransport, 2>::new(transport, 4096) { 41513776c11Slogin Ok(net) => net, 41613776c11Slogin Err(_) => { 41713776c11Slogin kerror!("VirtIONet init failed"); 41813776c11Slogin return; 41913776c11Slogin } 42013776c11Slogin }; 421881ff6f9Syuyi2439 let mac = wire::EthernetAddress::from_bytes(&driver_net.mac_address()); 422e32effb1SLoGin let dev_inner = VirtIONicDeviceInner::new(driver_net); 423e32effb1SLoGin let iface = VirtioInterface::new(dev_inner, dev_id); 424e32effb1SLoGin kdebug!("To add virtio net: {}, mac: {}", iface.device_name(), mac); 425e32effb1SLoGin virtio_device_manager() 426e32effb1SLoGin .device_add(iface.clone() as Arc<dyn VirtIODevice>) 427e32effb1SLoGin .expect("Add virtio net failed"); 42813776c11Slogin } 42913776c11Slogin 430e32effb1SLoGin impl NetDevice for VirtioInterface { 431881ff6f9Syuyi2439 fn mac(&self) -> wire::EthernetAddress { 432e32effb1SLoGin let mac: [u8; 6] = self.device_inner.inner.lock().mac_address(); 433881ff6f9Syuyi2439 return wire::EthernetAddress::from_bytes(&mac); 43413776c11Slogin } 43513776c11Slogin 43613776c11Slogin #[inline] 43713776c11Slogin fn nic_id(&self) -> usize { 43813776c11Slogin return self.iface_id; 43913776c11Slogin } 44013776c11Slogin 44113776c11Slogin #[inline] 44213776c11Slogin fn name(&self) -> String { 443e32effb1SLoGin return self.iface_name.clone(); 44413776c11Slogin } 44513776c11Slogin 44613776c11Slogin fn update_ip_addrs(&self, ip_addrs: &[wire::IpCidr]) -> Result<(), SystemError> { 44713776c11Slogin if ip_addrs.len() != 1 { 44813776c11Slogin return Err(SystemError::EINVAL); 44913776c11Slogin } 45013776c11Slogin 45113776c11Slogin self.iface.lock().update_ip_addrs(|addrs| { 45213776c11Slogin let dest = addrs.iter_mut().next(); 453b5b571e0SLoGin 454b5b571e0SLoGin if let Some(dest) = dest { 45513776c11Slogin *dest = ip_addrs[0]; 456b5b571e0SLoGin } else { 457881ff6f9Syuyi2439 addrs 458881ff6f9Syuyi2439 .push(ip_addrs[0]) 459881ff6f9Syuyi2439 .expect("Push wire::IpCidr failed: full"); 46013776c11Slogin } 46113776c11Slogin }); 46213776c11Slogin return Ok(()); 46313776c11Slogin } 46413776c11Slogin 465881ff6f9Syuyi2439 fn poll(&self, sockets: &mut iface::SocketSet) -> Result<(), SystemError> { 46613776c11Slogin let timestamp: smoltcp::time::Instant = Instant::now().into(); 46713776c11Slogin let mut guard = self.iface.lock(); 468e32effb1SLoGin let poll_res = guard.poll(timestamp, self.device_inner.force_get_mut(), sockets); 46913776c11Slogin // todo: notify!!! 470971462beSGnoCiYeH // kdebug!("Virtio Interface poll:{poll_res}"); 47113776c11Slogin if poll_res { 47213776c11Slogin return Ok(()); 47313776c11Slogin } 47479a452ceShoumkh return Err(SystemError::EAGAIN_OR_EWOULDBLOCK); 47513776c11Slogin } 47613776c11Slogin 47713776c11Slogin #[inline(always)] 478881ff6f9Syuyi2439 fn inner_iface(&self) -> &SpinLock<iface::Interface> { 47913776c11Slogin return &self.iface; 48013776c11Slogin } 48113776c11Slogin // fn as_any_ref(&'static self) -> &'static dyn core::any::Any { 48213776c11Slogin // return self; 48313776c11Slogin // } 48413776c11Slogin } 48513776c11Slogin 486e32effb1SLoGin impl KObject for VirtioInterface { 48706d5e247SLoGin fn as_any_ref(&self) -> &dyn core::any::Any { 48806d5e247SLoGin self 48906d5e247SLoGin } 49006d5e247SLoGin 491e32effb1SLoGin fn set_inode(&self, inode: Option<Arc<KernFSInode>>) { 492e32effb1SLoGin self.inner().kobj_common.kern_inode = inode; 49306d5e247SLoGin } 49406d5e247SLoGin 495e32effb1SLoGin fn inode(&self) -> Option<Arc<KernFSInode>> { 496e32effb1SLoGin self.inner().kobj_common.kern_inode.clone() 49706d5e247SLoGin } 49806d5e247SLoGin 499e32effb1SLoGin fn parent(&self) -> Option<Weak<dyn KObject>> { 500e32effb1SLoGin self.inner().kobj_common.parent.clone() 50106d5e247SLoGin } 50206d5e247SLoGin 503e32effb1SLoGin fn set_parent(&self, parent: Option<Weak<dyn KObject>>) { 504e32effb1SLoGin self.inner().kobj_common.parent = parent; 50506d5e247SLoGin } 50606d5e247SLoGin 507e32effb1SLoGin fn kset(&self) -> Option<Arc<KSet>> { 508e32effb1SLoGin self.inner().kobj_common.kset.clone() 50906d5e247SLoGin } 51006d5e247SLoGin 511e32effb1SLoGin fn set_kset(&self, kset: Option<Arc<KSet>>) { 512e32effb1SLoGin self.inner().kobj_common.kset = kset; 51306d5e247SLoGin } 51406d5e247SLoGin 515e32effb1SLoGin fn kobj_type(&self) -> Option<&'static dyn KObjType> { 516e32effb1SLoGin self.inner().kobj_common.kobj_type 51706d5e247SLoGin } 51806d5e247SLoGin 51906d5e247SLoGin fn name(&self) -> String { 520e32effb1SLoGin self.device_name() 52106d5e247SLoGin } 52206d5e247SLoGin 52306d5e247SLoGin fn set_name(&self, _name: String) { 524e32effb1SLoGin // do nothing 52506d5e247SLoGin } 52606d5e247SLoGin 527e32effb1SLoGin fn kobj_state(&self) -> RwLockReadGuard<KObjectState> { 528e32effb1SLoGin self.locked_kobj_state.read() 52906d5e247SLoGin } 53006d5e247SLoGin 531e32effb1SLoGin fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> { 532e32effb1SLoGin self.locked_kobj_state.write() 53306d5e247SLoGin } 53406d5e247SLoGin 535e32effb1SLoGin fn set_kobj_state(&self, state: KObjectState) { 536e32effb1SLoGin *self.locked_kobj_state.write() = state; 537a03c4f9dSLoGin } 538a03c4f9dSLoGin 539e32effb1SLoGin fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) { 540e32effb1SLoGin self.inner().kobj_common.kobj_type = ktype; 54106d5e247SLoGin } 54206d5e247SLoGin } 54306d5e247SLoGin 544e32effb1SLoGin #[unified_init(INITCALL_POSTCORE)] 545e32effb1SLoGin fn virtio_net_driver_init() -> Result<(), SystemError> { 546e32effb1SLoGin let driver = VirtIONetDriver::new(); 547e32effb1SLoGin virtio_driver_manager() 548e32effb1SLoGin .register(driver.clone() as Arc<dyn VirtIODriver>) 549e32effb1SLoGin .expect("Add virtio net driver failed"); 550e32effb1SLoGin unsafe { 551e32effb1SLoGin VIRTIO_NET_DRIVER = Some(driver); 552e32effb1SLoGin } 553e32effb1SLoGin 554e32effb1SLoGin return Ok(()); 555e32effb1SLoGin } 556*731bc2b3SLoGin 557e32effb1SLoGin #[derive(Debug)] 558e32effb1SLoGin #[cast_to([sync] VirtIODriver)] 559*731bc2b3SLoGin #[cast_to([sync] Driver)] 560e32effb1SLoGin struct VirtIONetDriver { 561e32effb1SLoGin inner: SpinLock<InnerVirtIODriver>, 562e32effb1SLoGin kobj_state: LockedKObjectState, 563e32effb1SLoGin } 564e32effb1SLoGin 565e32effb1SLoGin impl VirtIONetDriver { 566e32effb1SLoGin pub fn new() -> Arc<Self> { 567e32effb1SLoGin let inner = InnerVirtIODriver { 568e32effb1SLoGin driver_common: DriverCommonData::default(), 569e32effb1SLoGin kobj_common: KObjectCommonData::default(), 570e32effb1SLoGin }; 571e32effb1SLoGin Arc::new(VirtIONetDriver { 572e32effb1SLoGin inner: SpinLock::new(inner), 573e32effb1SLoGin kobj_state: LockedKObjectState::default(), 574e32effb1SLoGin }) 575e32effb1SLoGin } 576e32effb1SLoGin 577e32effb1SLoGin fn inner(&self) -> SpinLockGuard<InnerVirtIODriver> { 578e32effb1SLoGin return self.inner.lock(); 579e32effb1SLoGin } 580e32effb1SLoGin } 581e32effb1SLoGin 582e32effb1SLoGin #[derive(Debug)] 583e32effb1SLoGin struct InnerVirtIODriver { 584e32effb1SLoGin driver_common: DriverCommonData, 585e32effb1SLoGin kobj_common: KObjectCommonData, 586e32effb1SLoGin } 587e32effb1SLoGin 588e32effb1SLoGin impl VirtIODriver for VirtIONetDriver { 589e32effb1SLoGin fn probe(&self, device: &Arc<dyn VirtIODevice>) -> Result<(), SystemError> { 590e32effb1SLoGin let iface = device 591e32effb1SLoGin .clone() 592e32effb1SLoGin .arc_any() 593e32effb1SLoGin .downcast::<VirtioInterface>() 594e32effb1SLoGin .map_err(|_| { 595e32effb1SLoGin kerror!( 596e32effb1SLoGin "VirtIONetDriver::probe() failed: device is not a VirtioInterface. Device: '{:?}'", 597e32effb1SLoGin device.name() 598e32effb1SLoGin ); 599e32effb1SLoGin SystemError::EINVAL 600e32effb1SLoGin })?; 601e32effb1SLoGin 602e32effb1SLoGin // 将网卡的接口信息注册到全局的网卡接口信息表中 603e32effb1SLoGin NET_DEVICES 604e32effb1SLoGin .write_irqsave() 605e32effb1SLoGin .insert(iface.nic_id(), iface.clone()); 606e32effb1SLoGin 607e32effb1SLoGin virtio_irq_manager() 608e32effb1SLoGin .register_device(iface.clone()) 609e32effb1SLoGin .expect("Register virtio net failed"); 610e32effb1SLoGin 611e32effb1SLoGin return Ok(()); 612e32effb1SLoGin } 613e32effb1SLoGin } 614e32effb1SLoGin 615e32effb1SLoGin impl Driver for VirtIONetDriver { 616e32effb1SLoGin fn id_table(&self) -> Option<IdTable> { 617e32effb1SLoGin Some(IdTable::new(DEVICE_NAME.to_string(), None)) 618e32effb1SLoGin } 619e32effb1SLoGin 620e32effb1SLoGin fn add_device(&self, device: Arc<dyn Device>) { 621e32effb1SLoGin let iface = device 622e32effb1SLoGin .arc_any() 623e32effb1SLoGin .downcast::<VirtioInterface>() 624e32effb1SLoGin .expect("VirtIONetDriver::add_device() failed: device is not a VirtioInterface"); 625e32effb1SLoGin 626e32effb1SLoGin self.inner() 627e32effb1SLoGin .driver_common 628e32effb1SLoGin .devices 629e32effb1SLoGin .push(iface as Arc<dyn Device>); 630e32effb1SLoGin } 631e32effb1SLoGin 632e32effb1SLoGin fn delete_device(&self, device: &Arc<dyn Device>) { 633e32effb1SLoGin let _iface = device 634e32effb1SLoGin .clone() 635e32effb1SLoGin .arc_any() 636e32effb1SLoGin .downcast::<VirtioInterface>() 637e32effb1SLoGin .expect("VirtIONetDriver::delete_device() failed: device is not a VirtioInterface"); 638e32effb1SLoGin 639e32effb1SLoGin let mut guard = self.inner(); 640e32effb1SLoGin let index = guard 641e32effb1SLoGin .driver_common 642e32effb1SLoGin .devices 643e32effb1SLoGin .iter() 644e32effb1SLoGin .position(|dev| Arc::ptr_eq(device, dev)) 645e32effb1SLoGin .expect("VirtIONetDriver::delete_device() failed: device not found"); 646e32effb1SLoGin 647e32effb1SLoGin guard.driver_common.devices.remove(index); 648e32effb1SLoGin } 649e32effb1SLoGin 650e32effb1SLoGin fn devices(&self) -> Vec<Arc<dyn Device>> { 651e32effb1SLoGin self.inner().driver_common.devices.clone() 652e32effb1SLoGin } 653e32effb1SLoGin 654e32effb1SLoGin fn bus(&self) -> Option<Weak<dyn Bus>> { 655e32effb1SLoGin Some(Arc::downgrade(&virtio_bus()) as Weak<dyn Bus>) 656e32effb1SLoGin } 657e32effb1SLoGin 658e32effb1SLoGin fn set_bus(&self, _bus: Option<Weak<dyn Bus>>) { 659e32effb1SLoGin // do nothing 660e32effb1SLoGin } 661e32effb1SLoGin } 662e32effb1SLoGin 663e32effb1SLoGin impl KObject for VirtIONetDriver { 664e32effb1SLoGin fn as_any_ref(&self) -> &dyn Any { 665e32effb1SLoGin self 666e32effb1SLoGin } 667e32effb1SLoGin 668e32effb1SLoGin fn set_inode(&self, inode: Option<Arc<KernFSInode>>) { 669e32effb1SLoGin self.inner().kobj_common.kern_inode = inode; 670e32effb1SLoGin } 671e32effb1SLoGin 672e32effb1SLoGin fn inode(&self) -> Option<Arc<KernFSInode>> { 673e32effb1SLoGin self.inner().kobj_common.kern_inode.clone() 674e32effb1SLoGin } 675e32effb1SLoGin 676e32effb1SLoGin fn parent(&self) -> Option<Weak<dyn KObject>> { 677e32effb1SLoGin self.inner().kobj_common.parent.clone() 678e32effb1SLoGin } 679e32effb1SLoGin 680e32effb1SLoGin fn set_parent(&self, parent: Option<Weak<dyn KObject>>) { 681e32effb1SLoGin self.inner().kobj_common.parent = parent; 682e32effb1SLoGin } 683e32effb1SLoGin 684e32effb1SLoGin fn kset(&self) -> Option<Arc<KSet>> { 685e32effb1SLoGin self.inner().kobj_common.kset.clone() 686e32effb1SLoGin } 687e32effb1SLoGin 688e32effb1SLoGin fn set_kset(&self, kset: Option<Arc<KSet>>) { 689e32effb1SLoGin self.inner().kobj_common.kset = kset; 690e32effb1SLoGin } 691e32effb1SLoGin 692e32effb1SLoGin fn kobj_type(&self) -> Option<&'static dyn KObjType> { 693e32effb1SLoGin self.inner().kobj_common.kobj_type 694e32effb1SLoGin } 695e32effb1SLoGin 696e32effb1SLoGin fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) { 697e32effb1SLoGin self.inner().kobj_common.kobj_type = ktype; 698e32effb1SLoGin } 699e32effb1SLoGin 700e32effb1SLoGin fn name(&self) -> String { 701e32effb1SLoGin DEVICE_NAME.to_string() 702e32effb1SLoGin } 703e32effb1SLoGin 704e32effb1SLoGin fn set_name(&self, _name: String) { 705e32effb1SLoGin // do nothing 706e32effb1SLoGin } 707e32effb1SLoGin 708e32effb1SLoGin fn kobj_state(&self) -> RwLockReadGuard<KObjectState> { 709e32effb1SLoGin self.kobj_state.read() 710e32effb1SLoGin } 711e32effb1SLoGin 712e32effb1SLoGin fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> { 713e32effb1SLoGin self.kobj_state.write() 714e32effb1SLoGin } 715e32effb1SLoGin 716e32effb1SLoGin fn set_kobj_state(&self, state: KObjectState) { 717e32effb1SLoGin *self.kobj_state.write() = state; 718e32effb1SLoGin } 719e32effb1SLoGin } 720