xref: /DragonOS/kernel/src/driver/net/virtio_net.rs (revision 731bc2b32d7b37298883d7a15b6dca659b436ee4)
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