xref: /DragonOS/kernel/src/driver/net/virtio_net.rs (revision 7b0ef10895108a0de5ff5ef3d2f93f40cf2e33a5)
1 use core::{
2     any::Any,
3     cell::UnsafeCell,
4     fmt::Debug,
5     ops::{Deref, DerefMut},
6 };
7 
8 use alloc::{
9     collections::LinkedList,
10     string::{String, ToString},
11     sync::{Arc, Weak},
12     vec::Vec,
13 };
14 use log::{debug, error};
15 use smoltcp::{iface, phy, wire};
16 use unified_init::macros::unified_init;
17 use virtio_drivers::device::net::VirtIONet;
18 
19 use super::{NetDeivceState, NetDevice, NetDeviceCommonData, Operstate};
20 use crate::{
21     arch::rand::rand,
22     driver::{
23         base::{
24             class::Class,
25             device::{
26                 bus::Bus,
27                 driver::{Driver, DriverCommonData},
28                 Device, DeviceCommonData, DeviceId, DeviceType, IdTable,
29             },
30             kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
31             kset::KSet,
32         },
33         net::register_netdevice,
34         virtio::{
35             irq::virtio_irq_manager,
36             sysfs::{virtio_bus, virtio_device_manager, virtio_driver_manager},
37             transport::VirtIOTransport,
38             virtio_impl::HalImpl,
39             VirtIODevice, VirtIODeviceIndex, VirtIODriver, VirtIODriverCommonData, VirtioDeviceId,
40             VIRTIO_VENDOR_ID,
41         },
42     },
43     exception::{irqdesc::IrqReturn, IrqNumber},
44     filesystem::kernfs::KernFSInode,
45     init::initcall::INITCALL_POSTCORE,
46     libs::{
47         rwlock::{RwLockReadGuard, RwLockWriteGuard},
48         spinlock::{SpinLock, SpinLockGuard},
49     },
50     net::{generate_iface_id, net_core::poll_ifaces_try_lock_onetime, NET_DEVICES},
51     time::Instant,
52 };
53 use system_error::SystemError;
54 
55 static mut VIRTIO_NET_DRIVER: Option<Arc<VirtIONetDriver>> = None;
56 
57 const VIRTIO_NET_BASENAME: &str = "virtio_net";
58 
59 #[inline(always)]
60 #[allow(dead_code)]
61 fn virtio_net_driver() -> Arc<VirtIONetDriver> {
62     unsafe { VIRTIO_NET_DRIVER.as_ref().unwrap().clone() }
63 }
64 
65 /// virtio net device
66 #[derive(Debug)]
67 #[cast_to([sync] VirtIODevice)]
68 #[cast_to([sync] Device)]
69 pub struct VirtIONetDevice {
70     dev_id: Arc<DeviceId>,
71     inner: SpinLock<InnerVirtIONetDevice>,
72     locked_kobj_state: LockedKObjectState,
73 }
74 
75 unsafe impl Send for VirtIONetDevice {}
76 unsafe impl Sync for VirtIONetDevice {}
77 
78 struct InnerVirtIONetDevice {
79     device_inner: VirtIONicDeviceInner,
80     name: Option<String>,
81     virtio_index: Option<VirtIODeviceIndex>,
82     kobj_common: KObjectCommonData,
83     device_common: DeviceCommonData,
84 }
85 
86 impl Debug for InnerVirtIONetDevice {
87     fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
88         f.debug_struct("InnerVirtIOBlkDevice").finish()
89     }
90 }
91 
92 impl VirtIONetDevice {
93     pub fn new(transport: VirtIOTransport, dev_id: Arc<DeviceId>) -> Option<Arc<Self>> {
94         // 设置中断
95         if let Err(err) = transport.setup_irq(dev_id.clone()) {
96             error!("VirtIONetDevice '{dev_id:?}' setup_irq failed: {:?}", err);
97             return None;
98         }
99 
100         let driver_net: VirtIONet<HalImpl, VirtIOTransport, 2> =
101             match VirtIONet::<HalImpl, VirtIOTransport, 2>::new(transport, 4096) {
102                 Ok(net) => net,
103                 Err(_) => {
104                     error!("VirtIONet init failed");
105                     return None;
106                 }
107             };
108         let mac = wire::EthernetAddress::from_bytes(&driver_net.mac_address());
109         debug!("VirtIONetDevice mac: {:?}", mac);
110         let device_inner = VirtIONicDeviceInner::new(driver_net);
111 
112         let dev = Arc::new(Self {
113             dev_id,
114             inner: SpinLock::new(InnerVirtIONetDevice {
115                 device_inner,
116                 name: None,
117                 virtio_index: None,
118                 kobj_common: KObjectCommonData::default(),
119                 device_common: DeviceCommonData::default(),
120             }),
121             locked_kobj_state: LockedKObjectState::default(),
122         });
123 
124         // dev.set_driver(Some(Arc::downgrade(&virtio_net_driver()) as Weak<dyn Driver>));
125 
126         return Some(dev);
127     }
128 
129     fn inner(&self) -> SpinLockGuard<InnerVirtIONetDevice> {
130         return self.inner.lock();
131     }
132 }
133 
134 impl KObject for VirtIONetDevice {
135     fn as_any_ref(&self) -> &dyn Any {
136         self
137     }
138 
139     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
140         self.inner().kobj_common.kern_inode = inode;
141     }
142 
143     fn inode(&self) -> Option<Arc<KernFSInode>> {
144         self.inner().kobj_common.kern_inode.clone()
145     }
146 
147     fn parent(&self) -> Option<Weak<dyn KObject>> {
148         self.inner().kobj_common.parent.clone()
149     }
150 
151     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
152         self.inner().kobj_common.parent = parent;
153     }
154 
155     fn kset(&self) -> Option<Arc<KSet>> {
156         self.inner().kobj_common.kset.clone()
157     }
158 
159     fn set_kset(&self, kset: Option<Arc<KSet>>) {
160         self.inner().kobj_common.kset = kset;
161     }
162 
163     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
164         self.inner().kobj_common.kobj_type
165     }
166 
167     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
168         self.inner().kobj_common.kobj_type = ktype;
169     }
170 
171     fn name(&self) -> String {
172         self.device_name()
173     }
174 
175     fn set_name(&self, _name: String) {
176         // do nothing
177     }
178 
179     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
180         self.locked_kobj_state.read()
181     }
182 
183     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
184         self.locked_kobj_state.write()
185     }
186 
187     fn set_kobj_state(&self, state: KObjectState) {
188         *self.locked_kobj_state.write() = state;
189     }
190 }
191 
192 impl Device for VirtIONetDevice {
193     fn dev_type(&self) -> DeviceType {
194         DeviceType::Net
195     }
196 
197     fn id_table(&self) -> IdTable {
198         IdTable::new(VIRTIO_NET_BASENAME.to_string(), None)
199     }
200 
201     fn bus(&self) -> Option<Weak<dyn Bus>> {
202         self.inner().device_common.bus.clone()
203     }
204 
205     fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
206         self.inner().device_common.bus = bus;
207     }
208 
209     fn class(&self) -> Option<Arc<dyn Class>> {
210         let mut guard = self.inner();
211         let r = guard.device_common.class.clone()?.upgrade();
212         if r.is_none() {
213             guard.device_common.class = None;
214         }
215 
216         return r;
217     }
218 
219     fn set_class(&self, class: Option<Weak<dyn Class>>) {
220         self.inner().device_common.class = class;
221     }
222 
223     fn driver(&self) -> Option<Arc<dyn Driver>> {
224         let r = self.inner().device_common.driver.clone()?.upgrade();
225         if r.is_none() {
226             self.inner().device_common.driver = None;
227         }
228 
229         return r;
230     }
231 
232     fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
233         self.inner().device_common.driver = driver;
234     }
235 
236     fn is_dead(&self) -> bool {
237         false
238     }
239 
240     fn can_match(&self) -> bool {
241         self.inner().device_common.can_match
242     }
243 
244     fn set_can_match(&self, can_match: bool) {
245         self.inner().device_common.can_match = can_match;
246     }
247     fn state_synced(&self) -> bool {
248         true
249     }
250 
251     fn dev_parent(&self) -> Option<Weak<dyn Device>> {
252         self.inner().device_common.get_parent_weak_or_clear()
253     }
254 
255     fn set_dev_parent(&self, parent: Option<Weak<dyn Device>>) {
256         self.inner().device_common.parent = parent;
257     }
258 }
259 
260 impl VirtIODevice for VirtIONetDevice {
261     fn handle_irq(&self, _irq: IrqNumber) -> Result<IrqReturn, SystemError> {
262         poll_ifaces_try_lock_onetime().ok();
263         return Ok(IrqReturn::Handled);
264     }
265 
266     fn dev_id(&self) -> &Arc<DeviceId> {
267         return &self.dev_id;
268     }
269 
270     fn set_device_name(&self, name: String) {
271         self.inner().name = Some(name);
272     }
273 
274     fn device_name(&self) -> String {
275         self.inner()
276             .name
277             .clone()
278             .unwrap_or_else(|| "virtio_net".to_string())
279     }
280 
281     fn set_virtio_device_index(&self, index: VirtIODeviceIndex) {
282         self.inner().virtio_index = Some(index);
283     }
284 
285     fn virtio_device_index(&self) -> Option<VirtIODeviceIndex> {
286         return self.inner().virtio_index;
287     }
288 
289     fn device_type_id(&self) -> u32 {
290         virtio_drivers::transport::DeviceType::Network as u32
291     }
292 
293     fn vendor(&self) -> u32 {
294         VIRTIO_VENDOR_ID.into()
295     }
296 
297     fn irq(&self) -> Option<IrqNumber> {
298         None
299     }
300 }
301 
302 pub struct VirtIoNetImpl {
303     inner: VirtIONet<HalImpl, VirtIOTransport, 2>,
304 }
305 
306 impl VirtIoNetImpl {
307     const fn new(inner: VirtIONet<HalImpl, VirtIOTransport, 2>) -> Self {
308         Self { inner }
309     }
310 }
311 
312 impl Deref for VirtIoNetImpl {
313     type Target = VirtIONet<HalImpl, VirtIOTransport, 2>;
314     fn deref(&self) -> &Self::Target {
315         &self.inner
316     }
317 }
318 
319 impl DerefMut for VirtIoNetImpl {
320     fn deref_mut(&mut self) -> &mut Self::Target {
321         &mut self.inner
322     }
323 }
324 
325 unsafe impl Send for VirtIoNetImpl {}
326 unsafe impl Sync for VirtIoNetImpl {}
327 
328 #[derive(Debug)]
329 struct VirtIONicDeviceInnerWrapper(UnsafeCell<VirtIONicDeviceInner>);
330 unsafe impl Send for VirtIONicDeviceInnerWrapper {}
331 unsafe impl Sync for VirtIONicDeviceInnerWrapper {}
332 
333 impl Deref for VirtIONicDeviceInnerWrapper {
334     type Target = VirtIONicDeviceInner;
335     fn deref(&self) -> &Self::Target {
336         unsafe { &*self.0.get() }
337     }
338 }
339 impl DerefMut for VirtIONicDeviceInnerWrapper {
340     fn deref_mut(&mut self) -> &mut Self::Target {
341         unsafe { &mut *self.0.get() }
342     }
343 }
344 
345 #[allow(clippy::mut_from_ref)]
346 impl VirtIONicDeviceInnerWrapper {
347     fn force_get_mut(&self) -> &mut <VirtIONicDeviceInnerWrapper as Deref>::Target {
348         unsafe { &mut *self.0.get() }
349     }
350 }
351 
352 /// Virtio网络设备驱动(加锁)
353 pub struct VirtIONicDeviceInner {
354     pub inner: Arc<SpinLock<VirtIoNetImpl>>,
355 }
356 
357 impl Clone for VirtIONicDeviceInner {
358     fn clone(&self) -> Self {
359         return VirtIONicDeviceInner {
360             inner: self.inner.clone(),
361         };
362     }
363 }
364 
365 impl Debug for VirtIONicDeviceInner {
366     fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
367         f.debug_struct("VirtIONicDriver").finish()
368     }
369 }
370 
371 #[cast_to([sync] NetDevice)]
372 #[cast_to([sync] Device)]
373 pub struct VirtioInterface {
374     device_inner: VirtIONicDeviceInnerWrapper,
375     iface_id: usize,
376     iface_name: String,
377     iface: SpinLock<iface::Interface>,
378     inner: SpinLock<InnerVirtIOInterface>,
379     locked_kobj_state: LockedKObjectState,
380 }
381 
382 #[derive(Debug)]
383 struct InnerVirtIOInterface {
384     kobj_common: KObjectCommonData,
385     device_common: DeviceCommonData,
386     netdevice_common: NetDeviceCommonData,
387 }
388 
389 impl core::fmt::Debug for VirtioInterface {
390     fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
391         f.debug_struct("VirtioInterface")
392             .field("iface_id", &self.iface_id)
393             .field("iface_name", &self.iface_name)
394             .field("inner", &self.inner)
395             .field("locked_kobj_state", &self.locked_kobj_state)
396             .finish()
397     }
398 }
399 
400 impl VirtioInterface {
401     pub fn new(mut device_inner: VirtIONicDeviceInner) -> Arc<Self> {
402         let iface_id = generate_iface_id();
403         let mut iface_config = iface::Config::new(wire::HardwareAddress::Ethernet(
404             wire::EthernetAddress(device_inner.inner.lock().mac_address()),
405         ));
406         iface_config.random_seed = rand() as u64;
407 
408         let iface = iface::Interface::new(iface_config, &mut device_inner, Instant::now().into());
409 
410         let result = Arc::new(VirtioInterface {
411             device_inner: VirtIONicDeviceInnerWrapper(UnsafeCell::new(device_inner)),
412             iface_id,
413             locked_kobj_state: LockedKObjectState::default(),
414             iface: SpinLock::new(iface),
415             iface_name: format!("eth{}", iface_id),
416             inner: SpinLock::new(InnerVirtIOInterface {
417                 kobj_common: KObjectCommonData::default(),
418                 device_common: DeviceCommonData::default(),
419                 netdevice_common: NetDeviceCommonData::default(),
420             }),
421         });
422 
423         return result;
424     }
425 
426     fn inner(&self) -> SpinLockGuard<InnerVirtIOInterface> {
427         return self.inner.lock();
428     }
429 
430     /// 获取网卡接口的名称
431     #[allow(dead_code)]
432     pub fn iface_name(&self) -> String {
433         self.iface_name.clone()
434     }
435 }
436 
437 impl Drop for VirtioInterface {
438     fn drop(&mut self) {
439         // 从全局的网卡接口信息表中删除这个网卡的接口信息
440         NET_DEVICES.write_irqsave().remove(&self.iface_id);
441     }
442 }
443 
444 impl Device for VirtioInterface {
445     fn dev_type(&self) -> DeviceType {
446         DeviceType::Net
447     }
448 
449     fn id_table(&self) -> IdTable {
450         IdTable::new(VIRTIO_NET_BASENAME.to_string(), None)
451     }
452 
453     fn bus(&self) -> Option<Weak<dyn Bus>> {
454         self.inner().device_common.bus.clone()
455     }
456 
457     fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
458         self.inner().device_common.bus = bus;
459     }
460 
461     fn class(&self) -> Option<Arc<dyn Class>> {
462         let mut guard = self.inner();
463         let r = guard.device_common.class.clone()?.upgrade();
464         if r.is_none() {
465             guard.device_common.class = None;
466         }
467 
468         return r;
469     }
470 
471     fn set_class(&self, class: Option<Weak<dyn Class>>) {
472         self.inner().device_common.class = class;
473     }
474 
475     fn driver(&self) -> Option<Arc<dyn Driver>> {
476         let r = self.inner().device_common.driver.clone()?.upgrade();
477         if r.is_none() {
478             self.inner().device_common.driver = None;
479         }
480 
481         return r;
482     }
483 
484     fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
485         self.inner().device_common.driver = driver;
486     }
487 
488     fn is_dead(&self) -> bool {
489         false
490     }
491 
492     fn can_match(&self) -> bool {
493         self.inner().device_common.can_match
494     }
495 
496     fn set_can_match(&self, can_match: bool) {
497         self.inner().device_common.can_match = can_match;
498     }
499 
500     fn state_synced(&self) -> bool {
501         true
502     }
503 
504     fn dev_parent(&self) -> Option<Weak<dyn Device>> {
505         self.inner().device_common.get_parent_weak_or_clear()
506     }
507 
508     fn set_dev_parent(&self, parent: Option<Weak<dyn Device>>) {
509         self.inner().device_common.parent = parent;
510     }
511 }
512 
513 impl VirtIONicDeviceInner {
514     pub fn new(driver_net: VirtIONet<HalImpl, VirtIOTransport, 2>) -> Self {
515         let mut iface_config = iface::Config::new(wire::HardwareAddress::Ethernet(
516             wire::EthernetAddress(driver_net.mac_address()),
517         ));
518 
519         iface_config.random_seed = rand() as u64;
520 
521         let inner = Arc::new(SpinLock::new(VirtIoNetImpl::new(driver_net)));
522         let result = VirtIONicDeviceInner { inner };
523         return result;
524     }
525 }
526 
527 pub struct VirtioNetToken {
528     driver: VirtIONicDeviceInner,
529     rx_buffer: Option<virtio_drivers::device::net::RxBuffer>,
530 }
531 
532 impl VirtioNetToken {
533     pub fn new(
534         driver: VirtIONicDeviceInner,
535         rx_buffer: Option<virtio_drivers::device::net::RxBuffer>,
536     ) -> Self {
537         return Self { driver, rx_buffer };
538     }
539 }
540 
541 impl phy::Device for VirtIONicDeviceInner {
542     type RxToken<'a> = VirtioNetToken where Self: 'a;
543     type TxToken<'a> = VirtioNetToken where Self: 'a;
544 
545     fn receive(
546         &mut self,
547         _timestamp: smoltcp::time::Instant,
548     ) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
549         match self.inner.lock().receive() {
550             Ok(buf) => Some((
551                 VirtioNetToken::new(self.clone(), Some(buf)),
552                 VirtioNetToken::new(self.clone(), None),
553             )),
554             Err(virtio_drivers::Error::NotReady) => None,
555             Err(err) => panic!("VirtIO receive failed: {}", err),
556         }
557     }
558 
559     fn transmit(&mut self, _timestamp: smoltcp::time::Instant) -> Option<Self::TxToken<'_>> {
560         // debug!("VirtioNet: transmit");
561         if self.inner.lock_irqsave().can_send() {
562             // debug!("VirtioNet: can send");
563             return Some(VirtioNetToken::new(self.clone(), None));
564         } else {
565             // debug!("VirtioNet: can not send");
566             return None;
567         }
568     }
569 
570     fn capabilities(&self) -> phy::DeviceCapabilities {
571         let mut caps = phy::DeviceCapabilities::default();
572         // 网卡的最大传输单元. 请与IP层的MTU进行区分。这个值应当是网卡的最大传输单元,而不是IP层的MTU。
573         caps.max_transmission_unit = 2000;
574         /*
575            Maximum burst size, in terms of MTU.
576            The network device is unable to send or receive bursts large than the value returned by this function.
577            If None, there is no fixed limit on burst size, e.g. if network buffers are dynamically allocated.
578         */
579         caps.max_burst_size = Some(1);
580         return caps;
581     }
582 }
583 
584 impl phy::TxToken for VirtioNetToken {
585     fn consume<R, F>(self, len: usize, f: F) -> R
586     where
587         F: FnOnce(&mut [u8]) -> R,
588     {
589         // // 为了线程安全,这里需要对VirtioNet进行加【写锁】,以保证对设备的互斥访问。
590         let mut driver_net = self.driver.inner.lock();
591         let mut tx_buf = driver_net.new_tx_buffer(len);
592         let result = f(tx_buf.packet_mut());
593         driver_net.send(tx_buf).expect("virtio_net send failed");
594         return result;
595     }
596 }
597 
598 impl phy::RxToken for VirtioNetToken {
599     fn consume<R, F>(self, f: F) -> R
600     where
601         F: FnOnce(&mut [u8]) -> R,
602     {
603         // 为了线程安全,这里需要对VirtioNet进行加【写锁】,以保证对设备的互斥访问。
604         let mut rx_buf = self.rx_buffer.unwrap();
605         let result = f(rx_buf.packet_mut());
606         self.driver
607             .inner
608             .lock()
609             .recycle_rx_buffer(rx_buf)
610             .expect("virtio_net recv failed");
611         result
612     }
613 }
614 
615 /// @brief virtio-net 驱动的初始化与测试
616 pub fn virtio_net(
617     transport: VirtIOTransport,
618     dev_id: Arc<DeviceId>,
619     dev_parent: Option<Arc<dyn Device>>,
620 ) {
621     let virtio_net_deivce = VirtIONetDevice::new(transport, dev_id);
622     if let Some(virtio_net_deivce) = virtio_net_deivce {
623         debug!("VirtIONetDevice '{:?}' created", virtio_net_deivce.dev_id);
624         if let Some(dev_parent) = dev_parent {
625             virtio_net_deivce.set_dev_parent(Some(Arc::downgrade(&dev_parent)));
626         }
627         virtio_device_manager()
628             .device_add(virtio_net_deivce.clone() as Arc<dyn VirtIODevice>)
629             .expect("Add virtio net failed");
630     }
631 }
632 
633 impl NetDevice for VirtioInterface {
634     fn mac(&self) -> wire::EthernetAddress {
635         let mac: [u8; 6] = self.device_inner.inner.lock().mac_address();
636         return wire::EthernetAddress::from_bytes(&mac);
637     }
638 
639     #[inline]
640     fn nic_id(&self) -> usize {
641         return self.iface_id;
642     }
643 
644     #[inline]
645     fn iface_name(&self) -> String {
646         return self.iface_name.clone();
647     }
648 
649     fn update_ip_addrs(&self, ip_addrs: &[wire::IpCidr]) -> Result<(), SystemError> {
650         if ip_addrs.len() != 1 {
651             return Err(SystemError::EINVAL);
652         }
653 
654         self.iface.lock().update_ip_addrs(|addrs| {
655             let dest = addrs.iter_mut().next();
656 
657             if let Some(dest) = dest {
658                 *dest = ip_addrs[0];
659             } else {
660                 addrs
661                     .push(ip_addrs[0])
662                     .expect("Push wire::IpCidr failed: full");
663             }
664         });
665         return Ok(());
666     }
667 
668     fn poll(&self, sockets: &mut iface::SocketSet) -> Result<(), SystemError> {
669         let timestamp: smoltcp::time::Instant = Instant::now().into();
670         let mut guard = self.iface.lock();
671         let poll_res = guard.poll(timestamp, self.device_inner.force_get_mut(), sockets);
672         // todo: notify!!!
673         // debug!("Virtio Interface poll:{poll_res}");
674         if poll_res {
675             return Ok(());
676         }
677         return Err(SystemError::EAGAIN_OR_EWOULDBLOCK);
678     }
679 
680     #[inline(always)]
681     fn inner_iface(&self) -> &SpinLock<iface::Interface> {
682         return &self.iface;
683     }
684     // fn as_any_ref(&'static self) -> &'static dyn core::any::Any {
685     //     return self;
686     // }
687 
688     fn addr_assign_type(&self) -> u8 {
689         return self.inner().netdevice_common.addr_assign_type;
690     }
691 
692     fn net_device_type(&self) -> u16 {
693         self.inner().netdevice_common.net_device_type = 1; // 以太网设备
694         return self.inner().netdevice_common.net_device_type;
695     }
696 
697     fn net_state(&self) -> NetDeivceState {
698         return self.inner().netdevice_common.state;
699     }
700 
701     fn set_net_state(&self, state: NetDeivceState) {
702         self.inner().netdevice_common.state |= state;
703     }
704 
705     fn operstate(&self) -> Operstate {
706         return self.inner().netdevice_common.operstate;
707     }
708 
709     fn set_operstate(&self, state: Operstate) {
710         self.inner().netdevice_common.operstate = state;
711     }
712 }
713 
714 impl KObject for VirtioInterface {
715     fn as_any_ref(&self) -> &dyn core::any::Any {
716         self
717     }
718 
719     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
720         self.inner().kobj_common.kern_inode = inode;
721     }
722 
723     fn inode(&self) -> Option<Arc<KernFSInode>> {
724         self.inner().kobj_common.kern_inode.clone()
725     }
726 
727     fn parent(&self) -> Option<Weak<dyn KObject>> {
728         self.inner().kobj_common.parent.clone()
729     }
730 
731     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
732         self.inner().kobj_common.parent = parent;
733     }
734 
735     fn kset(&self) -> Option<Arc<KSet>> {
736         self.inner().kobj_common.kset.clone()
737     }
738 
739     fn set_kset(&self, kset: Option<Arc<KSet>>) {
740         self.inner().kobj_common.kset = kset;
741     }
742 
743     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
744         self.inner().kobj_common.kobj_type
745     }
746 
747     fn name(&self) -> String {
748         self.iface_name.clone()
749     }
750 
751     fn set_name(&self, _name: String) {
752         // do nothing
753     }
754 
755     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
756         self.locked_kobj_state.read()
757     }
758 
759     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
760         self.locked_kobj_state.write()
761     }
762 
763     fn set_kobj_state(&self, state: KObjectState) {
764         *self.locked_kobj_state.write() = state;
765     }
766 
767     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
768         self.inner().kobj_common.kobj_type = ktype;
769     }
770 }
771 
772 #[unified_init(INITCALL_POSTCORE)]
773 fn virtio_net_driver_init() -> Result<(), SystemError> {
774     let driver = VirtIONetDriver::new();
775     virtio_driver_manager()
776         .register(driver.clone() as Arc<dyn VirtIODriver>)
777         .expect("Add virtio net driver failed");
778     unsafe {
779         VIRTIO_NET_DRIVER = Some(driver);
780     }
781 
782     return Ok(());
783 }
784 
785 #[derive(Debug)]
786 #[cast_to([sync] VirtIODriver)]
787 #[cast_to([sync] Driver)]
788 struct VirtIONetDriver {
789     inner: SpinLock<InnerVirtIODriver>,
790     kobj_state: LockedKObjectState,
791 }
792 
793 impl VirtIONetDriver {
794     pub fn new() -> Arc<Self> {
795         let inner = InnerVirtIODriver {
796             virtio_driver_common: VirtIODriverCommonData::default(),
797             driver_common: DriverCommonData::default(),
798             kobj_common: KObjectCommonData::default(),
799         };
800 
801         let id_table = VirtioDeviceId::new(
802             virtio_drivers::transport::DeviceType::Network as u32,
803             VIRTIO_VENDOR_ID.into(),
804         );
805         let result = VirtIONetDriver {
806             inner: SpinLock::new(inner),
807             kobj_state: LockedKObjectState::default(),
808         };
809         result.add_virtio_id(id_table);
810 
811         return Arc::new(result);
812     }
813 
814     fn inner(&self) -> SpinLockGuard<InnerVirtIODriver> {
815         return self.inner.lock();
816     }
817 }
818 
819 #[derive(Debug)]
820 struct InnerVirtIODriver {
821     virtio_driver_common: VirtIODriverCommonData,
822     driver_common: DriverCommonData,
823     kobj_common: KObjectCommonData,
824 }
825 
826 impl VirtIODriver for VirtIONetDriver {
827     fn probe(&self, device: &Arc<dyn VirtIODevice>) -> Result<(), SystemError> {
828         log::debug!("VirtIONetDriver::probe()");
829         let virtio_net_device = device
830             .clone()
831             .arc_any()
832             .downcast::<VirtIONetDevice>()
833             .map_err(|_| {
834                 error!(
835                     "VirtIONetDriver::probe() failed: device is not a VirtIODevice. Device: '{:?}'",
836                     device.name()
837                 );
838                 SystemError::EINVAL
839             })?;
840 
841         let iface: Arc<VirtioInterface> =
842             VirtioInterface::new(virtio_net_device.inner().device_inner.clone());
843         // 标识网络设备已经启动
844         iface.set_net_state(NetDeivceState::__LINK_STATE_START);
845         // 设置iface的父设备为virtio_net_device
846         iface.set_dev_parent(Some(Arc::downgrade(&virtio_net_device) as Weak<dyn Device>));
847         // 在sysfs中注册iface
848         register_netdevice(iface.clone() as Arc<dyn NetDevice>)?;
849 
850         // 将网卡的接口信息注册到全局的网卡接口信息表中
851         NET_DEVICES
852             .write_irqsave()
853             .insert(iface.nic_id(), iface.clone());
854 
855         virtio_irq_manager()
856             .register_device(device.clone())
857             .expect("Register virtio net irq failed");
858 
859         return Ok(());
860     }
861 
862     fn virtio_id_table(&self) -> LinkedList<VirtioDeviceId> {
863         self.inner().virtio_driver_common.id_table.clone()
864     }
865 
866     fn add_virtio_id(&self, id: VirtioDeviceId) {
867         self.inner().virtio_driver_common.id_table.push_back(id);
868     }
869 }
870 
871 impl Driver for VirtIONetDriver {
872     fn id_table(&self) -> Option<IdTable> {
873         Some(IdTable::new(VIRTIO_NET_BASENAME.to_string(), None))
874     }
875 
876     fn add_device(&self, device: Arc<dyn Device>) {
877         let virtio_net_device = device
878             .arc_any()
879             .downcast::<VirtIONetDevice>()
880             .expect("VirtIONetDriver::add_device() failed: device is not a VirtioInterface");
881 
882         self.inner()
883             .driver_common
884             .devices
885             .push(virtio_net_device as Arc<dyn Device>);
886     }
887 
888     fn delete_device(&self, device: &Arc<dyn Device>) {
889         let _virtio_net_device = device
890             .clone()
891             .arc_any()
892             .downcast::<VirtIONetDevice>()
893             .expect("VirtIONetDriver::delete_device() failed: device is not a VirtioInterface");
894 
895         let mut guard = self.inner();
896         let index = guard
897             .driver_common
898             .devices
899             .iter()
900             .position(|dev| Arc::ptr_eq(device, dev))
901             .expect("VirtIONetDriver::delete_device() failed: device not found");
902 
903         guard.driver_common.devices.remove(index);
904     }
905 
906     fn devices(&self) -> Vec<Arc<dyn Device>> {
907         self.inner().driver_common.devices.clone()
908     }
909 
910     fn bus(&self) -> Option<Weak<dyn Bus>> {
911         Some(Arc::downgrade(&virtio_bus()) as Weak<dyn Bus>)
912     }
913 
914     fn set_bus(&self, _bus: Option<Weak<dyn Bus>>) {
915         // do nothing
916     }
917 }
918 
919 impl KObject for VirtIONetDriver {
920     fn as_any_ref(&self) -> &dyn Any {
921         self
922     }
923 
924     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
925         self.inner().kobj_common.kern_inode = inode;
926     }
927 
928     fn inode(&self) -> Option<Arc<KernFSInode>> {
929         self.inner().kobj_common.kern_inode.clone()
930     }
931 
932     fn parent(&self) -> Option<Weak<dyn KObject>> {
933         self.inner().kobj_common.parent.clone()
934     }
935 
936     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
937         self.inner().kobj_common.parent = parent;
938     }
939 
940     fn kset(&self) -> Option<Arc<KSet>> {
941         self.inner().kobj_common.kset.clone()
942     }
943 
944     fn set_kset(&self, kset: Option<Arc<KSet>>) {
945         self.inner().kobj_common.kset = kset;
946     }
947 
948     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
949         self.inner().kobj_common.kobj_type
950     }
951 
952     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
953         self.inner().kobj_common.kobj_type = ktype;
954     }
955 
956     fn name(&self) -> String {
957         VIRTIO_NET_BASENAME.to_string()
958     }
959 
960     fn set_name(&self, _name: String) {
961         // do nothing
962     }
963 
964     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
965         self.kobj_state.read()
966     }
967 
968     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
969         self.kobj_state.write()
970     }
971 
972     fn set_kobj_state(&self, state: KObjectState) {
973         *self.kobj_state.write() = state;
974     }
975 }
976