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