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