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