xref: /DragonOS/kernel/src/driver/net/virtio_net.rs (revision 28fe4ad2a0b0d8b5abf1f0cb402b1c3204b42242)
113776c11Slogin use core::{
2e32effb1SLoGin     any::Any,
313776c11Slogin     cell::UnsafeCell,
413776c11Slogin     fmt::Debug,
513776c11Slogin     ops::{Deref, DerefMut},
613776c11Slogin };
713776c11Slogin 
8c566df45SLoGin use alloc::{
9*28fe4ad2S黄铭涛     collections::LinkedList,
10e32effb1SLoGin     string::{String, ToString},
11c566df45SLoGin     sync::{Arc, Weak},
12e32effb1SLoGin     vec::Vec,
13c566df45SLoGin };
142eab6dd7S曾俊 use log::{debug, error};
15881ff6f9Syuyi2439 use smoltcp::{iface, phy, wire};
16e32effb1SLoGin use unified_init::macros::unified_init;
17e32effb1SLoGin use virtio_drivers::device::net::VirtIONet;
1813776c11Slogin 
19*28fe4ad2S黄铭涛 use super::{NetDeivceState, NetDevice, NetDeviceCommonData, Operstate};
2013776c11Slogin use crate::{
21881ff6f9Syuyi2439     arch::rand::rand,
22b087521eSChiichen     driver::{
2306d5e247SLoGin         base::{
24e32effb1SLoGin             class::Class,
25e32effb1SLoGin             device::{
26e32effb1SLoGin                 bus::Bus,
27e32effb1SLoGin                 driver::{Driver, DriverCommonData},
28e32effb1SLoGin                 Device, DeviceCommonData, DeviceId, DeviceType, IdTable,
2906d5e247SLoGin             },
30e32effb1SLoGin             kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
31e32effb1SLoGin             kset::KSet,
32e32effb1SLoGin         },
33*28fe4ad2S黄铭涛         net::register_netdevice,
34e32effb1SLoGin         virtio::{
35e32effb1SLoGin             sysfs::{virtio_bus, virtio_device_manager, virtio_driver_manager},
36e32effb1SLoGin             transport::VirtIOTransport,
37e32effb1SLoGin             virtio_impl::HalImpl,
38*28fe4ad2S黄铭涛             VirtIODevice, VirtIODeviceIndex, VirtIODriver, VirtIODriverCommonData, VirtioDeviceId,
39*28fe4ad2S黄铭涛             VIRTIO_VENDOR_ID,
40e32effb1SLoGin         },
41d470019bSLoGin     },
42e2841179SLoGin     exception::{irqdesc::IrqReturn, IrqNumber},
43e32effb1SLoGin     filesystem::kernfs::KernFSInode,
44e32effb1SLoGin     init::initcall::INITCALL_POSTCORE,
45e32effb1SLoGin     libs::{
46e32effb1SLoGin         rwlock::{RwLockReadGuard, RwLockWriteGuard},
47e32effb1SLoGin         spinlock::{SpinLock, SpinLockGuard},
48e32effb1SLoGin     },
49e32effb1SLoGin     net::{generate_iface_id, net_core::poll_ifaces_try_lock_onetime, NET_DEVICES},
5013776c11Slogin     time::Instant,
5113776c11Slogin };
5291e9d4abSLoGin use system_error::SystemError;
5313776c11Slogin 
54e32effb1SLoGin static mut VIRTIO_NET_DRIVER: Option<Arc<VirtIONetDriver>> = None;
55e32effb1SLoGin 
56*28fe4ad2S黄铭涛 const VIRTIO_NET_BASENAME: &str = "virtio_net";
57e32effb1SLoGin 
58e32effb1SLoGin #[inline(always)]
59*28fe4ad2S黄铭涛 #[allow(dead_code)]
virtio_net_driver() -> Arc<VirtIONetDriver>60e32effb1SLoGin fn virtio_net_driver() -> Arc<VirtIONetDriver> {
61e32effb1SLoGin     unsafe { VIRTIO_NET_DRIVER.as_ref().unwrap().clone() }
6213776c11Slogin }
6313776c11Slogin 
64*28fe4ad2S黄铭涛 /// virtio net device
65*28fe4ad2S黄铭涛 #[derive(Debug)]
66*28fe4ad2S黄铭涛 #[cast_to([sync] VirtIODevice)]
67*28fe4ad2S黄铭涛 #[cast_to([sync] Device)]
68*28fe4ad2S黄铭涛 pub struct VirtIONetDevice {
69*28fe4ad2S黄铭涛     dev_id: Arc<DeviceId>,
70*28fe4ad2S黄铭涛     inner: SpinLock<InnerVirtIONetDevice>,
71*28fe4ad2S黄铭涛     locked_kobj_state: LockedKObjectState,
72*28fe4ad2S黄铭涛 }
73*28fe4ad2S黄铭涛 
74*28fe4ad2S黄铭涛 unsafe impl Send for VirtIONetDevice {}
75*28fe4ad2S黄铭涛 unsafe impl Sync for VirtIONetDevice {}
76*28fe4ad2S黄铭涛 
77*28fe4ad2S黄铭涛 struct InnerVirtIONetDevice {
78*28fe4ad2S黄铭涛     device_inner: VirtIONicDeviceInner,
79*28fe4ad2S黄铭涛     name: Option<String>,
80*28fe4ad2S黄铭涛     virtio_index: Option<VirtIODeviceIndex>,
81*28fe4ad2S黄铭涛     kobj_common: KObjectCommonData,
82*28fe4ad2S黄铭涛     device_common: DeviceCommonData,
83*28fe4ad2S黄铭涛 }
84*28fe4ad2S黄铭涛 
85*28fe4ad2S黄铭涛 impl Debug for InnerVirtIONetDevice {
fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result86*28fe4ad2S黄铭涛     fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
87*28fe4ad2S黄铭涛         f.debug_struct("InnerVirtIOBlkDevice").finish()
88*28fe4ad2S黄铭涛     }
89*28fe4ad2S黄铭涛 }
90*28fe4ad2S黄铭涛 
91*28fe4ad2S黄铭涛 impl VirtIONetDevice {
new(transport: VirtIOTransport, dev_id: Arc<DeviceId>) -> Option<Arc<Self>>92*28fe4ad2S黄铭涛     pub fn new(transport: VirtIOTransport, dev_id: Arc<DeviceId>) -> Option<Arc<Self>> {
93*28fe4ad2S黄铭涛         let driver_net: VirtIONet<HalImpl, VirtIOTransport, 2> =
94*28fe4ad2S黄铭涛             match VirtIONet::<HalImpl, VirtIOTransport, 2>::new(transport, 4096) {
95*28fe4ad2S黄铭涛                 Ok(net) => net,
96*28fe4ad2S黄铭涛                 Err(_) => {
97*28fe4ad2S黄铭涛                     error!("VirtIONet init failed");
98*28fe4ad2S黄铭涛                     return None;
99*28fe4ad2S黄铭涛                 }
100*28fe4ad2S黄铭涛             };
101*28fe4ad2S黄铭涛         let mac = wire::EthernetAddress::from_bytes(&driver_net.mac_address());
102*28fe4ad2S黄铭涛         debug!("VirtIONetDevice mac: {:?}", mac);
103*28fe4ad2S黄铭涛         let device_inner = VirtIONicDeviceInner::new(driver_net);
104*28fe4ad2S黄铭涛 
105*28fe4ad2S黄铭涛         let dev = Arc::new(Self {
106*28fe4ad2S黄铭涛             dev_id,
107*28fe4ad2S黄铭涛             inner: SpinLock::new(InnerVirtIONetDevice {
108*28fe4ad2S黄铭涛                 device_inner,
109*28fe4ad2S黄铭涛                 name: None,
110*28fe4ad2S黄铭涛                 virtio_index: None,
111*28fe4ad2S黄铭涛                 kobj_common: KObjectCommonData::default(),
112*28fe4ad2S黄铭涛                 device_common: DeviceCommonData::default(),
113*28fe4ad2S黄铭涛             }),
114*28fe4ad2S黄铭涛             locked_kobj_state: LockedKObjectState::default(),
115*28fe4ad2S黄铭涛         });
116*28fe4ad2S黄铭涛 
117*28fe4ad2S黄铭涛         // dev.set_driver(Some(Arc::downgrade(&virtio_net_driver()) as Weak<dyn Driver>));
118*28fe4ad2S黄铭涛 
119*28fe4ad2S黄铭涛         return Some(dev);
120*28fe4ad2S黄铭涛     }
121*28fe4ad2S黄铭涛 
inner(&self) -> SpinLockGuard<InnerVirtIONetDevice>122*28fe4ad2S黄铭涛     fn inner(&self) -> SpinLockGuard<InnerVirtIONetDevice> {
123*28fe4ad2S黄铭涛         return self.inner.lock();
124*28fe4ad2S黄铭涛     }
125*28fe4ad2S黄铭涛 }
126*28fe4ad2S黄铭涛 
127*28fe4ad2S黄铭涛 impl KObject for VirtIONetDevice {
as_any_ref(&self) -> &dyn Any128*28fe4ad2S黄铭涛     fn as_any_ref(&self) -> &dyn Any {
129*28fe4ad2S黄铭涛         self
130*28fe4ad2S黄铭涛     }
131*28fe4ad2S黄铭涛 
set_inode(&self, inode: Option<Arc<KernFSInode>>)132*28fe4ad2S黄铭涛     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
133*28fe4ad2S黄铭涛         self.inner().kobj_common.kern_inode = inode;
134*28fe4ad2S黄铭涛     }
135*28fe4ad2S黄铭涛 
inode(&self) -> Option<Arc<KernFSInode>>136*28fe4ad2S黄铭涛     fn inode(&self) -> Option<Arc<KernFSInode>> {
137*28fe4ad2S黄铭涛         self.inner().kobj_common.kern_inode.clone()
138*28fe4ad2S黄铭涛     }
139*28fe4ad2S黄铭涛 
parent(&self) -> Option<Weak<dyn KObject>>140*28fe4ad2S黄铭涛     fn parent(&self) -> Option<Weak<dyn KObject>> {
141*28fe4ad2S黄铭涛         self.inner().kobj_common.parent.clone()
142*28fe4ad2S黄铭涛     }
143*28fe4ad2S黄铭涛 
set_parent(&self, parent: Option<Weak<dyn KObject>>)144*28fe4ad2S黄铭涛     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
145*28fe4ad2S黄铭涛         self.inner().kobj_common.parent = parent;
146*28fe4ad2S黄铭涛     }
147*28fe4ad2S黄铭涛 
kset(&self) -> Option<Arc<KSet>>148*28fe4ad2S黄铭涛     fn kset(&self) -> Option<Arc<KSet>> {
149*28fe4ad2S黄铭涛         self.inner().kobj_common.kset.clone()
150*28fe4ad2S黄铭涛     }
151*28fe4ad2S黄铭涛 
set_kset(&self, kset: Option<Arc<KSet>>)152*28fe4ad2S黄铭涛     fn set_kset(&self, kset: Option<Arc<KSet>>) {
153*28fe4ad2S黄铭涛         self.inner().kobj_common.kset = kset;
154*28fe4ad2S黄铭涛     }
155*28fe4ad2S黄铭涛 
kobj_type(&self) -> Option<&'static dyn KObjType>156*28fe4ad2S黄铭涛     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
157*28fe4ad2S黄铭涛         self.inner().kobj_common.kobj_type
158*28fe4ad2S黄铭涛     }
159*28fe4ad2S黄铭涛 
set_kobj_type(&self, ktype: Option<&'static dyn KObjType>)160*28fe4ad2S黄铭涛     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
161*28fe4ad2S黄铭涛         self.inner().kobj_common.kobj_type = ktype;
162*28fe4ad2S黄铭涛     }
163*28fe4ad2S黄铭涛 
name(&self) -> String164*28fe4ad2S黄铭涛     fn name(&self) -> String {
165*28fe4ad2S黄铭涛         self.device_name()
166*28fe4ad2S黄铭涛     }
167*28fe4ad2S黄铭涛 
set_name(&self, _name: String)168*28fe4ad2S黄铭涛     fn set_name(&self, _name: String) {
169*28fe4ad2S黄铭涛         // do nothing
170*28fe4ad2S黄铭涛     }
171*28fe4ad2S黄铭涛 
kobj_state(&self) -> RwLockReadGuard<KObjectState>172*28fe4ad2S黄铭涛     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
173*28fe4ad2S黄铭涛         self.locked_kobj_state.read()
174*28fe4ad2S黄铭涛     }
175*28fe4ad2S黄铭涛 
kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState>176*28fe4ad2S黄铭涛     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
177*28fe4ad2S黄铭涛         self.locked_kobj_state.write()
178*28fe4ad2S黄铭涛     }
179*28fe4ad2S黄铭涛 
set_kobj_state(&self, state: KObjectState)180*28fe4ad2S黄铭涛     fn set_kobj_state(&self, state: KObjectState) {
181*28fe4ad2S黄铭涛         *self.locked_kobj_state.write() = state;
182*28fe4ad2S黄铭涛     }
183*28fe4ad2S黄铭涛 }
184*28fe4ad2S黄铭涛 
185*28fe4ad2S黄铭涛 impl Device for VirtIONetDevice {
dev_type(&self) -> DeviceType186*28fe4ad2S黄铭涛     fn dev_type(&self) -> DeviceType {
187*28fe4ad2S黄铭涛         DeviceType::Net
188*28fe4ad2S黄铭涛     }
189*28fe4ad2S黄铭涛 
id_table(&self) -> IdTable190*28fe4ad2S黄铭涛     fn id_table(&self) -> IdTable {
191*28fe4ad2S黄铭涛         IdTable::new(VIRTIO_NET_BASENAME.to_string(), None)
192*28fe4ad2S黄铭涛     }
193*28fe4ad2S黄铭涛 
bus(&self) -> Option<Weak<dyn Bus>>194*28fe4ad2S黄铭涛     fn bus(&self) -> Option<Weak<dyn Bus>> {
195*28fe4ad2S黄铭涛         self.inner().device_common.bus.clone()
196*28fe4ad2S黄铭涛     }
197*28fe4ad2S黄铭涛 
set_bus(&self, bus: Option<Weak<dyn Bus>>)198*28fe4ad2S黄铭涛     fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
199*28fe4ad2S黄铭涛         self.inner().device_common.bus = bus;
200*28fe4ad2S黄铭涛     }
201*28fe4ad2S黄铭涛 
class(&self) -> Option<Arc<dyn Class>>202*28fe4ad2S黄铭涛     fn class(&self) -> Option<Arc<dyn Class>> {
203*28fe4ad2S黄铭涛         let mut guard = self.inner();
204*28fe4ad2S黄铭涛         let r = guard.device_common.class.clone()?.upgrade();
205*28fe4ad2S黄铭涛         if r.is_none() {
206*28fe4ad2S黄铭涛             guard.device_common.class = None;
207*28fe4ad2S黄铭涛         }
208*28fe4ad2S黄铭涛 
209*28fe4ad2S黄铭涛         return r;
210*28fe4ad2S黄铭涛     }
211*28fe4ad2S黄铭涛 
set_class(&self, class: Option<Weak<dyn Class>>)212*28fe4ad2S黄铭涛     fn set_class(&self, class: Option<Weak<dyn Class>>) {
213*28fe4ad2S黄铭涛         self.inner().device_common.class = class;
214*28fe4ad2S黄铭涛     }
215*28fe4ad2S黄铭涛 
driver(&self) -> Option<Arc<dyn Driver>>216*28fe4ad2S黄铭涛     fn driver(&self) -> Option<Arc<dyn Driver>> {
217*28fe4ad2S黄铭涛         let r = self.inner().device_common.driver.clone()?.upgrade();
218*28fe4ad2S黄铭涛         if r.is_none() {
219*28fe4ad2S黄铭涛             self.inner().device_common.driver = None;
220*28fe4ad2S黄铭涛         }
221*28fe4ad2S黄铭涛 
222*28fe4ad2S黄铭涛         return r;
223*28fe4ad2S黄铭涛     }
224*28fe4ad2S黄铭涛 
set_driver(&self, driver: Option<Weak<dyn Driver>>)225*28fe4ad2S黄铭涛     fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
226*28fe4ad2S黄铭涛         self.inner().device_common.driver = driver;
227*28fe4ad2S黄铭涛     }
228*28fe4ad2S黄铭涛 
is_dead(&self) -> bool229*28fe4ad2S黄铭涛     fn is_dead(&self) -> bool {
230*28fe4ad2S黄铭涛         false
231*28fe4ad2S黄铭涛     }
232*28fe4ad2S黄铭涛 
can_match(&self) -> bool233*28fe4ad2S黄铭涛     fn can_match(&self) -> bool {
234*28fe4ad2S黄铭涛         self.inner().device_common.can_match
235*28fe4ad2S黄铭涛     }
236*28fe4ad2S黄铭涛 
set_can_match(&self, can_match: bool)237*28fe4ad2S黄铭涛     fn set_can_match(&self, can_match: bool) {
238*28fe4ad2S黄铭涛         self.inner().device_common.can_match = can_match;
239*28fe4ad2S黄铭涛     }
state_synced(&self) -> bool240*28fe4ad2S黄铭涛     fn state_synced(&self) -> bool {
241*28fe4ad2S黄铭涛         true
242*28fe4ad2S黄铭涛     }
243*28fe4ad2S黄铭涛 
dev_parent(&self) -> Option<Weak<dyn Device>>244*28fe4ad2S黄铭涛     fn dev_parent(&self) -> Option<Weak<dyn Device>> {
245*28fe4ad2S黄铭涛         self.inner().device_common.get_parent_weak_or_clear()
246*28fe4ad2S黄铭涛     }
247*28fe4ad2S黄铭涛 
set_dev_parent(&self, parent: Option<Weak<dyn Device>>)248*28fe4ad2S黄铭涛     fn set_dev_parent(&self, parent: Option<Weak<dyn Device>>) {
249*28fe4ad2S黄铭涛         self.inner().device_common.parent = parent;
250*28fe4ad2S黄铭涛     }
251*28fe4ad2S黄铭涛 }
252*28fe4ad2S黄铭涛 
253*28fe4ad2S黄铭涛 impl VirtIODevice for VirtIONetDevice {
handle_irq(&self, _irq: IrqNumber) -> Result<IrqReturn, SystemError>254*28fe4ad2S黄铭涛     fn handle_irq(&self, _irq: IrqNumber) -> Result<IrqReturn, SystemError> {
255*28fe4ad2S黄铭涛         poll_ifaces_try_lock_onetime().ok();
256*28fe4ad2S黄铭涛         return Ok(IrqReturn::Handled);
257*28fe4ad2S黄铭涛     }
258*28fe4ad2S黄铭涛 
dev_id(&self) -> &Arc<DeviceId>259*28fe4ad2S黄铭涛     fn dev_id(&self) -> &Arc<DeviceId> {
260*28fe4ad2S黄铭涛         return &self.dev_id;
261*28fe4ad2S黄铭涛     }
262*28fe4ad2S黄铭涛 
set_device_name(&self, name: String)263*28fe4ad2S黄铭涛     fn set_device_name(&self, name: String) {
264*28fe4ad2S黄铭涛         self.inner().name = Some(name);
265*28fe4ad2S黄铭涛     }
266*28fe4ad2S黄铭涛 
device_name(&self) -> String267*28fe4ad2S黄铭涛     fn device_name(&self) -> String {
268*28fe4ad2S黄铭涛         self.inner()
269*28fe4ad2S黄铭涛             .name
270*28fe4ad2S黄铭涛             .clone()
271*28fe4ad2S黄铭涛             .unwrap_or_else(|| "virtio_net".to_string())
272*28fe4ad2S黄铭涛     }
273*28fe4ad2S黄铭涛 
set_virtio_device_index(&self, index: VirtIODeviceIndex)274*28fe4ad2S黄铭涛     fn set_virtio_device_index(&self, index: VirtIODeviceIndex) {
275*28fe4ad2S黄铭涛         self.inner().virtio_index = Some(index);
276*28fe4ad2S黄铭涛     }
277*28fe4ad2S黄铭涛 
virtio_device_index(&self) -> Option<VirtIODeviceIndex>278*28fe4ad2S黄铭涛     fn virtio_device_index(&self) -> Option<VirtIODeviceIndex> {
279*28fe4ad2S黄铭涛         return self.inner().virtio_index;
280*28fe4ad2S黄铭涛     }
281*28fe4ad2S黄铭涛 
device_type_id(&self) -> u32282*28fe4ad2S黄铭涛     fn device_type_id(&self) -> u32 {
283*28fe4ad2S黄铭涛         virtio_drivers::transport::DeviceType::Network as u32
284*28fe4ad2S黄铭涛     }
285*28fe4ad2S黄铭涛 
vendor(&self) -> u32286*28fe4ad2S黄铭涛     fn vendor(&self) -> u32 {
287*28fe4ad2S黄铭涛         VIRTIO_VENDOR_ID.into()
288*28fe4ad2S黄铭涛     }
289*28fe4ad2S黄铭涛 
irq(&self) -> Option<IrqNumber>290*28fe4ad2S黄铭涛     fn irq(&self) -> Option<IrqNumber> {
291*28fe4ad2S黄铭涛         None
292*28fe4ad2S黄铭涛     }
293*28fe4ad2S黄铭涛 }
294*28fe4ad2S黄铭涛 
295e32effb1SLoGin pub struct VirtIoNetImpl {
296e32effb1SLoGin     inner: VirtIONet<HalImpl, VirtIOTransport, 2>,
297e32effb1SLoGin }
298e32effb1SLoGin 
299e32effb1SLoGin impl VirtIoNetImpl {
new(inner: VirtIONet<HalImpl, VirtIOTransport, 2>) -> Self300e32effb1SLoGin     const fn new(inner: VirtIONet<HalImpl, VirtIOTransport, 2>) -> Self {
301e32effb1SLoGin         Self { inner }
30213776c11Slogin     }
30313776c11Slogin }
30413776c11Slogin 
305e32effb1SLoGin impl Deref for VirtIoNetImpl {
306e32effb1SLoGin     type Target = VirtIONet<HalImpl, VirtIOTransport, 2>;
deref(&self) -> &Self::Target307e32effb1SLoGin     fn deref(&self) -> &Self::Target {
308e32effb1SLoGin         &self.inner
309e32effb1SLoGin     }
310e32effb1SLoGin }
31113776c11Slogin 
312e32effb1SLoGin impl DerefMut for VirtIoNetImpl {
deref_mut(&mut self) -> &mut Self::Target313e32effb1SLoGin     fn deref_mut(&mut self) -> &mut Self::Target {
314e32effb1SLoGin         &mut self.inner
315e32effb1SLoGin     }
316e32effb1SLoGin }
317e32effb1SLoGin 
318e32effb1SLoGin unsafe impl Send for VirtIoNetImpl {}
319e32effb1SLoGin unsafe impl Sync for VirtIoNetImpl {}
320e32effb1SLoGin 
321e32effb1SLoGin #[derive(Debug)]
322e32effb1SLoGin struct VirtIONicDeviceInnerWrapper(UnsafeCell<VirtIONicDeviceInner>);
323e32effb1SLoGin unsafe impl Send for VirtIONicDeviceInnerWrapper {}
324e32effb1SLoGin unsafe impl Sync for VirtIONicDeviceInnerWrapper {}
325e32effb1SLoGin 
326e32effb1SLoGin impl Deref for VirtIONicDeviceInnerWrapper {
327e32effb1SLoGin     type Target = VirtIONicDeviceInner;
deref(&self) -> &Self::Target32813776c11Slogin     fn deref(&self) -> &Self::Target {
32913776c11Slogin         unsafe { &*self.0.get() }
33013776c11Slogin     }
33113776c11Slogin }
332e32effb1SLoGin impl DerefMut for VirtIONicDeviceInnerWrapper {
deref_mut(&mut self) -> &mut Self::Target33313776c11Slogin     fn deref_mut(&mut self) -> &mut Self::Target {
33413776c11Slogin         unsafe { &mut *self.0.get() }
33513776c11Slogin     }
33613776c11Slogin }
33713776c11Slogin 
338b5b571e0SLoGin #[allow(clippy::mut_from_ref)]
339e32effb1SLoGin impl VirtIONicDeviceInnerWrapper {
force_get_mut(&self) -> &mut <VirtIONicDeviceInnerWrapper as Deref>::Target340e32effb1SLoGin     fn force_get_mut(&self) -> &mut <VirtIONicDeviceInnerWrapper as Deref>::Target {
34113776c11Slogin         unsafe { &mut *self.0.get() }
34213776c11Slogin     }
34313776c11Slogin }
34413776c11Slogin 
345e32effb1SLoGin /// Virtio网络设备驱动(加锁)
346e32effb1SLoGin pub struct VirtIONicDeviceInner {
347e32effb1SLoGin     pub inner: Arc<SpinLock<VirtIoNetImpl>>,
348e32effb1SLoGin }
349e32effb1SLoGin 
350e32effb1SLoGin impl Clone for VirtIONicDeviceInner {
clone(&self) -> Self351e32effb1SLoGin     fn clone(&self) -> Self {
352e32effb1SLoGin         return VirtIONicDeviceInner {
353e32effb1SLoGin             inner: self.inner.clone(),
354e32effb1SLoGin         };
355e32effb1SLoGin     }
356e32effb1SLoGin }
357e32effb1SLoGin 
358e32effb1SLoGin impl Debug for VirtIONicDeviceInner {
fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result35913776c11Slogin     fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
360e32effb1SLoGin         f.debug_struct("VirtIONicDriver").finish()
36113776c11Slogin     }
36213776c11Slogin }
36313776c11Slogin 
364*28fe4ad2S黄铭涛 #[cast_to([sync] NetDevice)]
365731bc2b3SLoGin #[cast_to([sync] Device)]
366e32effb1SLoGin pub struct VirtioInterface {
367e32effb1SLoGin     device_inner: VirtIONicDeviceInnerWrapper,
36813776c11Slogin     iface_id: usize,
369e32effb1SLoGin     iface_name: String,
370e32effb1SLoGin     iface: SpinLock<iface::Interface>,
371e32effb1SLoGin     inner: SpinLock<InnerVirtIOInterface>,
372e32effb1SLoGin     locked_kobj_state: LockedKObjectState,
37313776c11Slogin }
37413776c11Slogin 
375e32effb1SLoGin #[derive(Debug)]
376e32effb1SLoGin struct InnerVirtIOInterface {
377e32effb1SLoGin     kobj_common: KObjectCommonData,
378*28fe4ad2S黄铭涛     device_common: DeviceCommonData,
379*28fe4ad2S黄铭涛     netdevice_common: NetDeviceCommonData,
380e32effb1SLoGin }
381e32effb1SLoGin 
382e32effb1SLoGin impl core::fmt::Debug for VirtioInterface {
fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result38313776c11Slogin     fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
38413776c11Slogin         f.debug_struct("VirtioInterface")
38513776c11Slogin             .field("iface_id", &self.iface_id)
386e32effb1SLoGin             .field("iface_name", &self.iface_name)
387e32effb1SLoGin             .field("inner", &self.inner)
388e32effb1SLoGin             .field("locked_kobj_state", &self.locked_kobj_state)
38913776c11Slogin             .finish()
39013776c11Slogin     }
39113776c11Slogin }
39213776c11Slogin 
393e32effb1SLoGin impl VirtioInterface {
new(mut device_inner: VirtIONicDeviceInner) -> Arc<Self>394*28fe4ad2S黄铭涛     pub fn new(mut device_inner: VirtIONicDeviceInner) -> Arc<Self> {
39513776c11Slogin         let iface_id = generate_iface_id();
396881ff6f9Syuyi2439         let mut iface_config = iface::Config::new(wire::HardwareAddress::Ethernet(
397e32effb1SLoGin             wire::EthernetAddress(device_inner.inner.lock().mac_address()),
39813776c11Slogin         ));
399881ff6f9Syuyi2439         iface_config.random_seed = rand() as u64;
400881ff6f9Syuyi2439 
401e32effb1SLoGin         let iface = iface::Interface::new(iface_config, &mut device_inner, Instant::now().into());
40213776c11Slogin 
40313776c11Slogin         let result = Arc::new(VirtioInterface {
404e32effb1SLoGin             device_inner: VirtIONicDeviceInnerWrapper(UnsafeCell::new(device_inner)),
40513776c11Slogin             iface_id,
406e32effb1SLoGin             locked_kobj_state: LockedKObjectState::default(),
40713776c11Slogin             iface: SpinLock::new(iface),
408e32effb1SLoGin             iface_name: format!("eth{}", iface_id),
409e32effb1SLoGin             inner: SpinLock::new(InnerVirtIOInterface {
410e32effb1SLoGin                 kobj_common: KObjectCommonData::default(),
411*28fe4ad2S黄铭涛                 device_common: DeviceCommonData::default(),
412*28fe4ad2S黄铭涛                 netdevice_common: NetDeviceCommonData::default(),
413e32effb1SLoGin             }),
41413776c11Slogin         });
41513776c11Slogin 
41613776c11Slogin         return result;
41713776c11Slogin     }
418e32effb1SLoGin 
inner(&self) -> SpinLockGuard<InnerVirtIOInterface>419e32effb1SLoGin     fn inner(&self) -> SpinLockGuard<InnerVirtIOInterface> {
420e32effb1SLoGin         return self.inner.lock();
42113776c11Slogin     }
42213776c11Slogin 
423e32effb1SLoGin     /// 获取网卡接口的名称
424e32effb1SLoGin     #[allow(dead_code)]
iface_name(&self) -> String425e32effb1SLoGin     pub fn iface_name(&self) -> String {
426e32effb1SLoGin         self.iface_name.clone()
427e32effb1SLoGin     }
428e32effb1SLoGin }
429e32effb1SLoGin 
430e32effb1SLoGin impl Drop for VirtioInterface {
drop(&mut self)431e2841179SLoGin     fn drop(&mut self) {
432e2841179SLoGin         // 从全局的网卡接口信息表中删除这个网卡的接口信息
433e32effb1SLoGin         NET_DEVICES.write_irqsave().remove(&self.iface_id);
434e2841179SLoGin     }
435e2841179SLoGin }
436e2841179SLoGin 
437e32effb1SLoGin impl Device for VirtioInterface {
dev_type(&self) -> DeviceType438e32effb1SLoGin     fn dev_type(&self) -> DeviceType {
439e32effb1SLoGin         DeviceType::Net
440e32effb1SLoGin     }
441e32effb1SLoGin 
id_table(&self) -> IdTable442e32effb1SLoGin     fn id_table(&self) -> IdTable {
443*28fe4ad2S黄铭涛         IdTable::new(VIRTIO_NET_BASENAME.to_string(), None)
444e32effb1SLoGin     }
445e32effb1SLoGin 
bus(&self) -> Option<Weak<dyn Bus>>446e32effb1SLoGin     fn bus(&self) -> Option<Weak<dyn Bus>> {
447e32effb1SLoGin         self.inner().device_common.bus.clone()
448e32effb1SLoGin     }
449e32effb1SLoGin 
set_bus(&self, bus: Option<Weak<dyn Bus>>)450e32effb1SLoGin     fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
451e32effb1SLoGin         self.inner().device_common.bus = bus;
452e32effb1SLoGin     }
453e32effb1SLoGin 
class(&self) -> Option<Arc<dyn Class>>454e32effb1SLoGin     fn class(&self) -> Option<Arc<dyn Class>> {
455e32effb1SLoGin         let mut guard = self.inner();
456e32effb1SLoGin         let r = guard.device_common.class.clone()?.upgrade();
457e32effb1SLoGin         if r.is_none() {
458e32effb1SLoGin             guard.device_common.class = None;
459e32effb1SLoGin         }
460e32effb1SLoGin 
461e32effb1SLoGin         return r;
462e32effb1SLoGin     }
463e32effb1SLoGin 
set_class(&self, class: Option<Weak<dyn Class>>)464e32effb1SLoGin     fn set_class(&self, class: Option<Weak<dyn Class>>) {
465e32effb1SLoGin         self.inner().device_common.class = class;
466e32effb1SLoGin     }
467e32effb1SLoGin 
driver(&self) -> Option<Arc<dyn Driver>>468e32effb1SLoGin     fn driver(&self) -> Option<Arc<dyn Driver>> {
469e32effb1SLoGin         let r = self.inner().device_common.driver.clone()?.upgrade();
470e32effb1SLoGin         if r.is_none() {
471e32effb1SLoGin             self.inner().device_common.driver = None;
472e32effb1SLoGin         }
473e32effb1SLoGin 
474e32effb1SLoGin         return r;
475e32effb1SLoGin     }
476e32effb1SLoGin 
set_driver(&self, driver: Option<Weak<dyn Driver>>)477e32effb1SLoGin     fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
478e32effb1SLoGin         self.inner().device_common.driver = driver;
479e32effb1SLoGin     }
480e32effb1SLoGin 
is_dead(&self) -> bool481e32effb1SLoGin     fn is_dead(&self) -> bool {
482e32effb1SLoGin         false
483e32effb1SLoGin     }
484e32effb1SLoGin 
can_match(&self) -> bool485e32effb1SLoGin     fn can_match(&self) -> bool {
486731bc2b3SLoGin         self.inner().device_common.can_match
487e32effb1SLoGin     }
488e32effb1SLoGin 
set_can_match(&self, can_match: bool)489e32effb1SLoGin     fn set_can_match(&self, can_match: bool) {
490e32effb1SLoGin         self.inner().device_common.can_match = can_match;
491e32effb1SLoGin     }
492e32effb1SLoGin 
state_synced(&self) -> bool493e32effb1SLoGin     fn state_synced(&self) -> bool {
494e32effb1SLoGin         true
495e32effb1SLoGin     }
496*28fe4ad2S黄铭涛 
dev_parent(&self) -> Option<Weak<dyn Device>>497*28fe4ad2S黄铭涛     fn dev_parent(&self) -> Option<Weak<dyn Device>> {
498*28fe4ad2S黄铭涛         self.inner().device_common.get_parent_weak_or_clear()
499*28fe4ad2S黄铭涛     }
500*28fe4ad2S黄铭涛 
set_dev_parent(&self, parent: Option<Weak<dyn Device>>)501*28fe4ad2S黄铭涛     fn set_dev_parent(&self, parent: Option<Weak<dyn Device>>) {
502*28fe4ad2S黄铭涛         self.inner().device_common.parent = parent;
503*28fe4ad2S黄铭涛     }
504e32effb1SLoGin }
505e32effb1SLoGin 
506e32effb1SLoGin impl VirtIONicDeviceInner {
new(driver_net: VirtIONet<HalImpl, VirtIOTransport, 2>) -> Self507e32effb1SLoGin     pub fn new(driver_net: VirtIONet<HalImpl, VirtIOTransport, 2>) -> Self {
508881ff6f9Syuyi2439         let mut iface_config = iface::Config::new(wire::HardwareAddress::Ethernet(
509881ff6f9Syuyi2439             wire::EthernetAddress(driver_net.mac_address()),
51013776c11Slogin         ));
51113776c11Slogin 
512881ff6f9Syuyi2439         iface_config.random_seed = rand() as u64;
513881ff6f9Syuyi2439 
514e32effb1SLoGin         let inner = Arc::new(SpinLock::new(VirtIoNetImpl::new(driver_net)));
515e32effb1SLoGin         let result = VirtIONicDeviceInner { inner };
51613776c11Slogin         return result;
51713776c11Slogin     }
51813776c11Slogin }
51913776c11Slogin 
520e32effb1SLoGin pub struct VirtioNetToken {
521e32effb1SLoGin     driver: VirtIONicDeviceInner,
52213776c11Slogin     rx_buffer: Option<virtio_drivers::device::net::RxBuffer>,
52313776c11Slogin }
52413776c11Slogin 
525e32effb1SLoGin impl VirtioNetToken {
new( driver: VirtIONicDeviceInner, rx_buffer: Option<virtio_drivers::device::net::RxBuffer>, ) -> Self52613776c11Slogin     pub fn new(
527e32effb1SLoGin         driver: VirtIONicDeviceInner,
52813776c11Slogin         rx_buffer: Option<virtio_drivers::device::net::RxBuffer>,
52913776c11Slogin     ) -> Self {
53013776c11Slogin         return Self { driver, rx_buffer };
53113776c11Slogin     }
53213776c11Slogin }
53313776c11Slogin 
534e32effb1SLoGin impl phy::Device for VirtIONicDeviceInner {
535e32effb1SLoGin     type RxToken<'a> = VirtioNetToken where Self: 'a;
536e32effb1SLoGin     type TxToken<'a> = VirtioNetToken where Self: 'a;
53713776c11Slogin 
receive( &mut self, _timestamp: smoltcp::time::Instant, ) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)>53813776c11Slogin     fn receive(
53913776c11Slogin         &mut self,
54013776c11Slogin         _timestamp: smoltcp::time::Instant,
54113776c11Slogin     ) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
54213776c11Slogin         match self.inner.lock().receive() {
54313776c11Slogin             Ok(buf) => Some((
54413776c11Slogin                 VirtioNetToken::new(self.clone(), Some(buf)),
54513776c11Slogin                 VirtioNetToken::new(self.clone(), None),
54613776c11Slogin             )),
54713776c11Slogin             Err(virtio_drivers::Error::NotReady) => None,
54813776c11Slogin             Err(err) => panic!("VirtIO receive failed: {}", err),
54913776c11Slogin         }
55013776c11Slogin     }
55113776c11Slogin 
transmit(&mut self, _timestamp: smoltcp::time::Instant) -> Option<Self::TxToken<'_>>55213776c11Slogin     fn transmit(&mut self, _timestamp: smoltcp::time::Instant) -> Option<Self::TxToken<'_>> {
5532eab6dd7S曾俊         // debug!("VirtioNet: transmit");
55440609970SGnoCiYeH         if self.inner.lock_irqsave().can_send() {
5552eab6dd7S曾俊             // debug!("VirtioNet: can send");
55613776c11Slogin             return Some(VirtioNetToken::new(self.clone(), None));
55713776c11Slogin         } else {
5582eab6dd7S曾俊             // debug!("VirtioNet: can not send");
55913776c11Slogin             return None;
56013776c11Slogin         }
56113776c11Slogin     }
56213776c11Slogin 
capabilities(&self) -> phy::DeviceCapabilities56313776c11Slogin     fn capabilities(&self) -> phy::DeviceCapabilities {
56413776c11Slogin         let mut caps = phy::DeviceCapabilities::default();
56513776c11Slogin         // 网卡的最大传输单元. 请与IP层的MTU进行区分。这个值应当是网卡的最大传输单元,而不是IP层的MTU。
56613776c11Slogin         caps.max_transmission_unit = 2000;
56713776c11Slogin         /*
56813776c11Slogin            Maximum burst size, in terms of MTU.
56913776c11Slogin            The network device is unable to send or receive bursts large than the value returned by this function.
57013776c11Slogin            If None, there is no fixed limit on burst size, e.g. if network buffers are dynamically allocated.
57113776c11Slogin         */
57213776c11Slogin         caps.max_burst_size = Some(1);
57313776c11Slogin         return caps;
57413776c11Slogin     }
57513776c11Slogin }
57613776c11Slogin 
577e32effb1SLoGin impl phy::TxToken for VirtioNetToken {
consume<R, F>(self, len: usize, f: F) -> R where F: FnOnce(&mut [u8]) -> R,57813776c11Slogin     fn consume<R, F>(self, len: usize, f: F) -> R
57913776c11Slogin     where
58013776c11Slogin         F: FnOnce(&mut [u8]) -> R,
58113776c11Slogin     {
58213776c11Slogin         // // 为了线程安全,这里需要对VirtioNet进行加【写锁】,以保证对设备的互斥访问。
58313776c11Slogin         let mut driver_net = self.driver.inner.lock();
58413776c11Slogin         let mut tx_buf = driver_net.new_tx_buffer(len);
58513776c11Slogin         let result = f(tx_buf.packet_mut());
58613776c11Slogin         driver_net.send(tx_buf).expect("virtio_net send failed");
58713776c11Slogin         return result;
58813776c11Slogin     }
58913776c11Slogin }
59013776c11Slogin 
591e32effb1SLoGin impl phy::RxToken for VirtioNetToken {
consume<R, F>(self, f: F) -> R where F: FnOnce(&mut [u8]) -> R,59213776c11Slogin     fn consume<R, F>(self, f: F) -> R
59313776c11Slogin     where
59413776c11Slogin         F: FnOnce(&mut [u8]) -> R,
59513776c11Slogin     {
59613776c11Slogin         // 为了线程安全,这里需要对VirtioNet进行加【写锁】,以保证对设备的互斥访问。
59713776c11Slogin         let mut rx_buf = self.rx_buffer.unwrap();
59813776c11Slogin         let result = f(rx_buf.packet_mut());
59913776c11Slogin         self.driver
60013776c11Slogin             .inner
60113776c11Slogin             .lock()
60213776c11Slogin             .recycle_rx_buffer(rx_buf)
60313776c11Slogin             .expect("virtio_net recv failed");
60413776c11Slogin         result
60513776c11Slogin     }
60613776c11Slogin }
60713776c11Slogin 
60813776c11Slogin /// @brief virtio-net 驱动的初始化与测试
virtio_net( transport: VirtIOTransport, dev_id: Arc<DeviceId>, dev_parent: Option<Arc<dyn Device>>, )609*28fe4ad2S黄铭涛 pub fn virtio_net(
610*28fe4ad2S黄铭涛     transport: VirtIOTransport,
611*28fe4ad2S黄铭涛     dev_id: Arc<DeviceId>,
612*28fe4ad2S黄铭涛     dev_parent: Option<Arc<dyn Device>>,
613*28fe4ad2S黄铭涛 ) {
614*28fe4ad2S黄铭涛     let virtio_net_deivce = VirtIONetDevice::new(transport, dev_id);
615*28fe4ad2S黄铭涛     if let Some(virtio_net_deivce) = virtio_net_deivce {
616*28fe4ad2S黄铭涛         debug!("VirtIONetDevice '{:?}' created", virtio_net_deivce.dev_id);
617*28fe4ad2S黄铭涛         if let Some(dev_parent) = dev_parent {
618*28fe4ad2S黄铭涛             virtio_net_deivce.set_dev_parent(Some(Arc::downgrade(&dev_parent)));
61913776c11Slogin         }
620e32effb1SLoGin         virtio_device_manager()
621*28fe4ad2S黄铭涛             .device_add(virtio_net_deivce.clone() as Arc<dyn VirtIODevice>)
622e32effb1SLoGin             .expect("Add virtio net failed");
62313776c11Slogin     }
624*28fe4ad2S黄铭涛 }
62513776c11Slogin 
626e32effb1SLoGin impl NetDevice for VirtioInterface {
mac(&self) -> wire::EthernetAddress627881ff6f9Syuyi2439     fn mac(&self) -> wire::EthernetAddress {
628e32effb1SLoGin         let mac: [u8; 6] = self.device_inner.inner.lock().mac_address();
629881ff6f9Syuyi2439         return wire::EthernetAddress::from_bytes(&mac);
63013776c11Slogin     }
63113776c11Slogin 
63213776c11Slogin     #[inline]
nic_id(&self) -> usize63313776c11Slogin     fn nic_id(&self) -> usize {
63413776c11Slogin         return self.iface_id;
63513776c11Slogin     }
63613776c11Slogin 
63713776c11Slogin     #[inline]
iface_name(&self) -> String638*28fe4ad2S黄铭涛     fn iface_name(&self) -> String {
639e32effb1SLoGin         return self.iface_name.clone();
64013776c11Slogin     }
64113776c11Slogin 
update_ip_addrs(&self, ip_addrs: &[wire::IpCidr]) -> Result<(), SystemError>64213776c11Slogin     fn update_ip_addrs(&self, ip_addrs: &[wire::IpCidr]) -> Result<(), SystemError> {
64313776c11Slogin         if ip_addrs.len() != 1 {
64413776c11Slogin             return Err(SystemError::EINVAL);
64513776c11Slogin         }
64613776c11Slogin 
64713776c11Slogin         self.iface.lock().update_ip_addrs(|addrs| {
64813776c11Slogin             let dest = addrs.iter_mut().next();
649b5b571e0SLoGin 
650b5b571e0SLoGin             if let Some(dest) = dest {
65113776c11Slogin                 *dest = ip_addrs[0];
652b5b571e0SLoGin             } else {
653881ff6f9Syuyi2439                 addrs
654881ff6f9Syuyi2439                     .push(ip_addrs[0])
655881ff6f9Syuyi2439                     .expect("Push wire::IpCidr failed: full");
65613776c11Slogin             }
65713776c11Slogin         });
65813776c11Slogin         return Ok(());
65913776c11Slogin     }
66013776c11Slogin 
poll(&self, sockets: &mut iface::SocketSet) -> Result<(), SystemError>661881ff6f9Syuyi2439     fn poll(&self, sockets: &mut iface::SocketSet) -> Result<(), SystemError> {
66213776c11Slogin         let timestamp: smoltcp::time::Instant = Instant::now().into();
66313776c11Slogin         let mut guard = self.iface.lock();
664e32effb1SLoGin         let poll_res = guard.poll(timestamp, self.device_inner.force_get_mut(), sockets);
66513776c11Slogin         // todo: notify!!!
6662eab6dd7S曾俊         // debug!("Virtio Interface poll:{poll_res}");
66713776c11Slogin         if poll_res {
66813776c11Slogin             return Ok(());
66913776c11Slogin         }
67079a452ceShoumkh         return Err(SystemError::EAGAIN_OR_EWOULDBLOCK);
67113776c11Slogin     }
67213776c11Slogin 
67313776c11Slogin     #[inline(always)]
inner_iface(&self) -> &SpinLock<iface::Interface>674881ff6f9Syuyi2439     fn inner_iface(&self) -> &SpinLock<iface::Interface> {
67513776c11Slogin         return &self.iface;
67613776c11Slogin     }
67713776c11Slogin     // fn as_any_ref(&'static self) -> &'static dyn core::any::Any {
67813776c11Slogin     //     return self;
67913776c11Slogin     // }
680*28fe4ad2S黄铭涛 
addr_assign_type(&self) -> u8681*28fe4ad2S黄铭涛     fn addr_assign_type(&self) -> u8 {
682*28fe4ad2S黄铭涛         return self.inner().netdevice_common.addr_assign_type;
683*28fe4ad2S黄铭涛     }
684*28fe4ad2S黄铭涛 
net_device_type(&self) -> u16685*28fe4ad2S黄铭涛     fn net_device_type(&self) -> u16 {
686*28fe4ad2S黄铭涛         self.inner().netdevice_common.net_device_type = 1; // 以太网设备
687*28fe4ad2S黄铭涛         return self.inner().netdevice_common.net_device_type;
688*28fe4ad2S黄铭涛     }
689*28fe4ad2S黄铭涛 
net_state(&self) -> NetDeivceState690*28fe4ad2S黄铭涛     fn net_state(&self) -> NetDeivceState {
691*28fe4ad2S黄铭涛         return self.inner().netdevice_common.state;
692*28fe4ad2S黄铭涛     }
693*28fe4ad2S黄铭涛 
set_net_state(&self, state: NetDeivceState)694*28fe4ad2S黄铭涛     fn set_net_state(&self, state: NetDeivceState) {
695*28fe4ad2S黄铭涛         self.inner().netdevice_common.state |= state;
696*28fe4ad2S黄铭涛     }
697*28fe4ad2S黄铭涛 
operstate(&self) -> Operstate698*28fe4ad2S黄铭涛     fn operstate(&self) -> Operstate {
699*28fe4ad2S黄铭涛         return self.inner().netdevice_common.operstate;
700*28fe4ad2S黄铭涛     }
701*28fe4ad2S黄铭涛 
set_operstate(&self, state: Operstate)702*28fe4ad2S黄铭涛     fn set_operstate(&self, state: Operstate) {
703*28fe4ad2S黄铭涛         self.inner().netdevice_common.operstate = state;
704*28fe4ad2S黄铭涛     }
70513776c11Slogin }
70613776c11Slogin 
707e32effb1SLoGin impl KObject for VirtioInterface {
as_any_ref(&self) -> &dyn core::any::Any70806d5e247SLoGin     fn as_any_ref(&self) -> &dyn core::any::Any {
70906d5e247SLoGin         self
71006d5e247SLoGin     }
71106d5e247SLoGin 
set_inode(&self, inode: Option<Arc<KernFSInode>>)712e32effb1SLoGin     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
713e32effb1SLoGin         self.inner().kobj_common.kern_inode = inode;
71406d5e247SLoGin     }
71506d5e247SLoGin 
inode(&self) -> Option<Arc<KernFSInode>>716e32effb1SLoGin     fn inode(&self) -> Option<Arc<KernFSInode>> {
717e32effb1SLoGin         self.inner().kobj_common.kern_inode.clone()
71806d5e247SLoGin     }
71906d5e247SLoGin 
parent(&self) -> Option<Weak<dyn KObject>>720e32effb1SLoGin     fn parent(&self) -> Option<Weak<dyn KObject>> {
721e32effb1SLoGin         self.inner().kobj_common.parent.clone()
72206d5e247SLoGin     }
72306d5e247SLoGin 
set_parent(&self, parent: Option<Weak<dyn KObject>>)724e32effb1SLoGin     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
725e32effb1SLoGin         self.inner().kobj_common.parent = parent;
72606d5e247SLoGin     }
72706d5e247SLoGin 
kset(&self) -> Option<Arc<KSet>>728e32effb1SLoGin     fn kset(&self) -> Option<Arc<KSet>> {
729e32effb1SLoGin         self.inner().kobj_common.kset.clone()
73006d5e247SLoGin     }
73106d5e247SLoGin 
set_kset(&self, kset: Option<Arc<KSet>>)732e32effb1SLoGin     fn set_kset(&self, kset: Option<Arc<KSet>>) {
733e32effb1SLoGin         self.inner().kobj_common.kset = kset;
73406d5e247SLoGin     }
73506d5e247SLoGin 
kobj_type(&self) -> Option<&'static dyn KObjType>736e32effb1SLoGin     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
737e32effb1SLoGin         self.inner().kobj_common.kobj_type
73806d5e247SLoGin     }
73906d5e247SLoGin 
name(&self) -> String74006d5e247SLoGin     fn name(&self) -> String {
741*28fe4ad2S黄铭涛         self.iface_name.clone()
74206d5e247SLoGin     }
74306d5e247SLoGin 
set_name(&self, _name: String)74406d5e247SLoGin     fn set_name(&self, _name: String) {
745e32effb1SLoGin         // do nothing
74606d5e247SLoGin     }
74706d5e247SLoGin 
kobj_state(&self) -> RwLockReadGuard<KObjectState>748e32effb1SLoGin     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
749e32effb1SLoGin         self.locked_kobj_state.read()
75006d5e247SLoGin     }
75106d5e247SLoGin 
kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState>752e32effb1SLoGin     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
753e32effb1SLoGin         self.locked_kobj_state.write()
75406d5e247SLoGin     }
75506d5e247SLoGin 
set_kobj_state(&self, state: KObjectState)756e32effb1SLoGin     fn set_kobj_state(&self, state: KObjectState) {
757e32effb1SLoGin         *self.locked_kobj_state.write() = state;
758a03c4f9dSLoGin     }
759a03c4f9dSLoGin 
set_kobj_type(&self, ktype: Option<&'static dyn KObjType>)760e32effb1SLoGin     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
761e32effb1SLoGin         self.inner().kobj_common.kobj_type = ktype;
76206d5e247SLoGin     }
76306d5e247SLoGin }
76406d5e247SLoGin 
765e32effb1SLoGin #[unified_init(INITCALL_POSTCORE)]
virtio_net_driver_init() -> Result<(), SystemError>766e32effb1SLoGin fn virtio_net_driver_init() -> Result<(), SystemError> {
767e32effb1SLoGin     let driver = VirtIONetDriver::new();
768e32effb1SLoGin     virtio_driver_manager()
769e32effb1SLoGin         .register(driver.clone() as Arc<dyn VirtIODriver>)
770e32effb1SLoGin         .expect("Add virtio net driver failed");
771e32effb1SLoGin     unsafe {
772e32effb1SLoGin         VIRTIO_NET_DRIVER = Some(driver);
773e32effb1SLoGin     }
774e32effb1SLoGin 
775e32effb1SLoGin     return Ok(());
776e32effb1SLoGin }
777731bc2b3SLoGin 
778e32effb1SLoGin #[derive(Debug)]
779e32effb1SLoGin #[cast_to([sync] VirtIODriver)]
780731bc2b3SLoGin #[cast_to([sync] Driver)]
781e32effb1SLoGin struct VirtIONetDriver {
782e32effb1SLoGin     inner: SpinLock<InnerVirtIODriver>,
783e32effb1SLoGin     kobj_state: LockedKObjectState,
784e32effb1SLoGin }
785e32effb1SLoGin 
786e32effb1SLoGin impl VirtIONetDriver {
new() -> Arc<Self>787e32effb1SLoGin     pub fn new() -> Arc<Self> {
788e32effb1SLoGin         let inner = InnerVirtIODriver {
789*28fe4ad2S黄铭涛             virtio_driver_common: VirtIODriverCommonData::default(),
790e32effb1SLoGin             driver_common: DriverCommonData::default(),
791e32effb1SLoGin             kobj_common: KObjectCommonData::default(),
792e32effb1SLoGin         };
793*28fe4ad2S黄铭涛 
794*28fe4ad2S黄铭涛         let id_table = VirtioDeviceId::new(
795*28fe4ad2S黄铭涛             virtio_drivers::transport::DeviceType::Network as u32,
796*28fe4ad2S黄铭涛             VIRTIO_VENDOR_ID.into(),
797*28fe4ad2S黄铭涛         );
798*28fe4ad2S黄铭涛         let result = VirtIONetDriver {
799e32effb1SLoGin             inner: SpinLock::new(inner),
800e32effb1SLoGin             kobj_state: LockedKObjectState::default(),
801*28fe4ad2S黄铭涛         };
802*28fe4ad2S黄铭涛         result.add_virtio_id(id_table);
803*28fe4ad2S黄铭涛 
804*28fe4ad2S黄铭涛         return Arc::new(result);
805e32effb1SLoGin     }
806e32effb1SLoGin 
inner(&self) -> SpinLockGuard<InnerVirtIODriver>807e32effb1SLoGin     fn inner(&self) -> SpinLockGuard<InnerVirtIODriver> {
808e32effb1SLoGin         return self.inner.lock();
809e32effb1SLoGin     }
810e32effb1SLoGin }
811e32effb1SLoGin 
812e32effb1SLoGin #[derive(Debug)]
813e32effb1SLoGin struct InnerVirtIODriver {
814*28fe4ad2S黄铭涛     virtio_driver_common: VirtIODriverCommonData,
815e32effb1SLoGin     driver_common: DriverCommonData,
816e32effb1SLoGin     kobj_common: KObjectCommonData,
817e32effb1SLoGin }
818e32effb1SLoGin 
819e32effb1SLoGin impl VirtIODriver for VirtIONetDriver {
probe(&self, device: &Arc<dyn VirtIODevice>) -> Result<(), SystemError>820e32effb1SLoGin     fn probe(&self, device: &Arc<dyn VirtIODevice>) -> Result<(), SystemError> {
821*28fe4ad2S黄铭涛         log::debug!("VirtIONetDriver::probe()");
822*28fe4ad2S黄铭涛         let virtio_net_device = device
823e32effb1SLoGin             .clone()
824e32effb1SLoGin             .arc_any()
825*28fe4ad2S黄铭涛             .downcast::<VirtIONetDevice>()
826e32effb1SLoGin             .map_err(|_| {
8272eab6dd7S曾俊                 error!(
828*28fe4ad2S黄铭涛                     "VirtIONetDriver::probe() failed: device is not a VirtIODevice. Device: '{:?}'",
829e32effb1SLoGin                     device.name()
830e32effb1SLoGin                 );
831e32effb1SLoGin                 SystemError::EINVAL
832e32effb1SLoGin             })?;
833e32effb1SLoGin 
834*28fe4ad2S黄铭涛         let iface: Arc<VirtioInterface> =
835*28fe4ad2S黄铭涛             VirtioInterface::new(virtio_net_device.inner().device_inner.clone());
836*28fe4ad2S黄铭涛         // 标识网络设备已经启动
837*28fe4ad2S黄铭涛         iface.set_net_state(NetDeivceState::__LINK_STATE_START);
838*28fe4ad2S黄铭涛         // 设置iface的父设备为virtio_net_device
839*28fe4ad2S黄铭涛         iface.set_dev_parent(Some(Arc::downgrade(&virtio_net_device) as Weak<dyn Device>));
840*28fe4ad2S黄铭涛         // 在sysfs中注册iface
841*28fe4ad2S黄铭涛         register_netdevice(iface.clone() as Arc<dyn NetDevice>)?;
842*28fe4ad2S黄铭涛 
843e32effb1SLoGin         // 将网卡的接口信息注册到全局的网卡接口信息表中
844e32effb1SLoGin         NET_DEVICES
845e32effb1SLoGin             .write_irqsave()
846e32effb1SLoGin             .insert(iface.nic_id(), iface.clone());
847e32effb1SLoGin 
848e32effb1SLoGin         return Ok(());
849e32effb1SLoGin     }
850*28fe4ad2S黄铭涛 
virtio_id_table(&self) -> LinkedList<VirtioDeviceId>851*28fe4ad2S黄铭涛     fn virtio_id_table(&self) -> LinkedList<VirtioDeviceId> {
852*28fe4ad2S黄铭涛         self.inner().virtio_driver_common.id_table.clone()
853*28fe4ad2S黄铭涛     }
854*28fe4ad2S黄铭涛 
add_virtio_id(&self, id: VirtioDeviceId)855*28fe4ad2S黄铭涛     fn add_virtio_id(&self, id: VirtioDeviceId) {
856*28fe4ad2S黄铭涛         self.inner().virtio_driver_common.id_table.push_back(id);
857*28fe4ad2S黄铭涛     }
858e32effb1SLoGin }
859e32effb1SLoGin 
860e32effb1SLoGin impl Driver for VirtIONetDriver {
id_table(&self) -> Option<IdTable>861e32effb1SLoGin     fn id_table(&self) -> Option<IdTable> {
862*28fe4ad2S黄铭涛         Some(IdTable::new(VIRTIO_NET_BASENAME.to_string(), None))
863e32effb1SLoGin     }
864e32effb1SLoGin 
add_device(&self, device: Arc<dyn Device>)865e32effb1SLoGin     fn add_device(&self, device: Arc<dyn Device>) {
866*28fe4ad2S黄铭涛         let virtio_net_device = device
867e32effb1SLoGin             .arc_any()
868*28fe4ad2S黄铭涛             .downcast::<VirtIONetDevice>()
869e32effb1SLoGin             .expect("VirtIONetDriver::add_device() failed: device is not a VirtioInterface");
870e32effb1SLoGin 
871e32effb1SLoGin         self.inner()
872e32effb1SLoGin             .driver_common
873e32effb1SLoGin             .devices
874*28fe4ad2S黄铭涛             .push(virtio_net_device as Arc<dyn Device>);
875e32effb1SLoGin     }
876e32effb1SLoGin 
delete_device(&self, device: &Arc<dyn Device>)877e32effb1SLoGin     fn delete_device(&self, device: &Arc<dyn Device>) {
878*28fe4ad2S黄铭涛         let _virtio_net_device = device
879e32effb1SLoGin             .clone()
880e32effb1SLoGin             .arc_any()
881*28fe4ad2S黄铭涛             .downcast::<VirtIONetDevice>()
882e32effb1SLoGin             .expect("VirtIONetDriver::delete_device() failed: device is not a VirtioInterface");
883e32effb1SLoGin 
884e32effb1SLoGin         let mut guard = self.inner();
885e32effb1SLoGin         let index = guard
886e32effb1SLoGin             .driver_common
887e32effb1SLoGin             .devices
888e32effb1SLoGin             .iter()
889e32effb1SLoGin             .position(|dev| Arc::ptr_eq(device, dev))
890e32effb1SLoGin             .expect("VirtIONetDriver::delete_device() failed: device not found");
891e32effb1SLoGin 
892e32effb1SLoGin         guard.driver_common.devices.remove(index);
893e32effb1SLoGin     }
894e32effb1SLoGin 
devices(&self) -> Vec<Arc<dyn Device>>895e32effb1SLoGin     fn devices(&self) -> Vec<Arc<dyn Device>> {
896e32effb1SLoGin         self.inner().driver_common.devices.clone()
897e32effb1SLoGin     }
898e32effb1SLoGin 
bus(&self) -> Option<Weak<dyn Bus>>899e32effb1SLoGin     fn bus(&self) -> Option<Weak<dyn Bus>> {
900e32effb1SLoGin         Some(Arc::downgrade(&virtio_bus()) as Weak<dyn Bus>)
901e32effb1SLoGin     }
902e32effb1SLoGin 
set_bus(&self, _bus: Option<Weak<dyn Bus>>)903e32effb1SLoGin     fn set_bus(&self, _bus: Option<Weak<dyn Bus>>) {
904e32effb1SLoGin         // do nothing
905e32effb1SLoGin     }
906e32effb1SLoGin }
907e32effb1SLoGin 
908e32effb1SLoGin impl KObject for VirtIONetDriver {
as_any_ref(&self) -> &dyn Any909e32effb1SLoGin     fn as_any_ref(&self) -> &dyn Any {
910e32effb1SLoGin         self
911e32effb1SLoGin     }
912e32effb1SLoGin 
set_inode(&self, inode: Option<Arc<KernFSInode>>)913e32effb1SLoGin     fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
914e32effb1SLoGin         self.inner().kobj_common.kern_inode = inode;
915e32effb1SLoGin     }
916e32effb1SLoGin 
inode(&self) -> Option<Arc<KernFSInode>>917e32effb1SLoGin     fn inode(&self) -> Option<Arc<KernFSInode>> {
918e32effb1SLoGin         self.inner().kobj_common.kern_inode.clone()
919e32effb1SLoGin     }
920e32effb1SLoGin 
parent(&self) -> Option<Weak<dyn KObject>>921e32effb1SLoGin     fn parent(&self) -> Option<Weak<dyn KObject>> {
922e32effb1SLoGin         self.inner().kobj_common.parent.clone()
923e32effb1SLoGin     }
924e32effb1SLoGin 
set_parent(&self, parent: Option<Weak<dyn KObject>>)925e32effb1SLoGin     fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
926e32effb1SLoGin         self.inner().kobj_common.parent = parent;
927e32effb1SLoGin     }
928e32effb1SLoGin 
kset(&self) -> Option<Arc<KSet>>929e32effb1SLoGin     fn kset(&self) -> Option<Arc<KSet>> {
930e32effb1SLoGin         self.inner().kobj_common.kset.clone()
931e32effb1SLoGin     }
932e32effb1SLoGin 
set_kset(&self, kset: Option<Arc<KSet>>)933e32effb1SLoGin     fn set_kset(&self, kset: Option<Arc<KSet>>) {
934e32effb1SLoGin         self.inner().kobj_common.kset = kset;
935e32effb1SLoGin     }
936e32effb1SLoGin 
kobj_type(&self) -> Option<&'static dyn KObjType>937e32effb1SLoGin     fn kobj_type(&self) -> Option<&'static dyn KObjType> {
938e32effb1SLoGin         self.inner().kobj_common.kobj_type
939e32effb1SLoGin     }
940e32effb1SLoGin 
set_kobj_type(&self, ktype: Option<&'static dyn KObjType>)941e32effb1SLoGin     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
942e32effb1SLoGin         self.inner().kobj_common.kobj_type = ktype;
943e32effb1SLoGin     }
944e32effb1SLoGin 
name(&self) -> String945e32effb1SLoGin     fn name(&self) -> String {
946*28fe4ad2S黄铭涛         VIRTIO_NET_BASENAME.to_string()
947e32effb1SLoGin     }
948e32effb1SLoGin 
set_name(&self, _name: String)949e32effb1SLoGin     fn set_name(&self, _name: String) {
950e32effb1SLoGin         // do nothing
951e32effb1SLoGin     }
952e32effb1SLoGin 
kobj_state(&self) -> RwLockReadGuard<KObjectState>953e32effb1SLoGin     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
954e32effb1SLoGin         self.kobj_state.read()
955e32effb1SLoGin     }
956e32effb1SLoGin 
kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState>957e32effb1SLoGin     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
958e32effb1SLoGin         self.kobj_state.write()
959e32effb1SLoGin     }
960e32effb1SLoGin 
set_kobj_state(&self, state: KObjectState)961e32effb1SLoGin     fn set_kobj_state(&self, state: KObjectState) {
962e32effb1SLoGin         *self.kobj_state.write() = state;
963e32effb1SLoGin     }
964e32effb1SLoGin }
965