xref: /DragonOS/kernel/src/driver/net/e1000e/e1000e_driver.rs (revision 28fe4ad2a0b0d8b5abf1f0cb402b1c3204b42242)
177799ccaSWu Mianzhi //这个文件的绝大部分内容是copy virtio_net.rs的,考虑到所有的驱动都要用操作系统提供的协议栈,我觉得可以把这些内容抽象出来
277799ccaSWu Mianzhi 
377799ccaSWu Mianzhi use crate::{
4881ff6f9Syuyi2439     arch::rand::rand,
577799ccaSWu Mianzhi     driver::{
677799ccaSWu Mianzhi         base::{
7e32effb1SLoGin             class::Class,
8*28fe4ad2S黄铭涛             device::{bus::Bus, driver::Driver, Device, DeviceCommonData, DeviceType, IdTable},
9*28fe4ad2S黄铭涛             kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
1077799ccaSWu Mianzhi         },
11*28fe4ad2S黄铭涛         net::{register_netdevice, NetDeivceState, NetDevice, NetDeviceCommonData, Operstate},
1277799ccaSWu Mianzhi     },
13*28fe4ad2S黄铭涛     libs::{
14*28fe4ad2S黄铭涛         rwlock::{RwLockReadGuard, RwLockWriteGuard},
15*28fe4ad2S黄铭涛         spinlock::{SpinLock, SpinLockGuard},
16*28fe4ad2S黄铭涛     },
17e32effb1SLoGin     net::{generate_iface_id, NET_DEVICES},
1877799ccaSWu Mianzhi     time::Instant,
1977799ccaSWu Mianzhi };
20c566df45SLoGin use alloc::{
21*28fe4ad2S黄铭涛     string::{String, ToString},
22c566df45SLoGin     sync::{Arc, Weak},
23c566df45SLoGin };
2477799ccaSWu Mianzhi use core::{
2577799ccaSWu Mianzhi     cell::UnsafeCell,
2677799ccaSWu Mianzhi     fmt::Debug,
2777799ccaSWu Mianzhi     ops::{Deref, DerefMut},
2877799ccaSWu Mianzhi };
292eab6dd7S曾俊 use log::info;
30881ff6f9Syuyi2439 use smoltcp::{
31881ff6f9Syuyi2439     phy,
32881ff6f9Syuyi2439     wire::{self, HardwareAddress},
33881ff6f9Syuyi2439 };
3491e9d4abSLoGin use system_error::SystemError;
3577799ccaSWu Mianzhi 
3677799ccaSWu Mianzhi use super::e1000e::{E1000EBuffer, E1000EDevice};
3777799ccaSWu Mianzhi 
38*28fe4ad2S黄铭涛 const DEVICE_NAME: &str = "e1000e";
39*28fe4ad2S黄铭涛 
4077799ccaSWu Mianzhi pub struct E1000ERxToken(E1000EBuffer);
4177799ccaSWu Mianzhi pub struct E1000ETxToken {
4277799ccaSWu Mianzhi     driver: E1000EDriver,
4377799ccaSWu Mianzhi }
4477799ccaSWu Mianzhi pub struct E1000EDriver {
4577799ccaSWu Mianzhi     pub inner: Arc<SpinLock<E1000EDevice>>,
4677799ccaSWu Mianzhi }
47b5b571e0SLoGin unsafe impl Send for E1000EDriver {}
48b5b571e0SLoGin unsafe impl Sync for E1000EDriver {}
4977799ccaSWu Mianzhi 
5077799ccaSWu Mianzhi /// @brief 网卡驱动的包裹器,这是为了获取网卡驱动的可变引用而设计的。
5177799ccaSWu Mianzhi /// 参阅virtio_net.rs
5277799ccaSWu Mianzhi struct E1000EDriverWrapper(UnsafeCell<E1000EDriver>);
5377799ccaSWu Mianzhi unsafe impl Send for E1000EDriverWrapper {}
5477799ccaSWu Mianzhi unsafe impl Sync for E1000EDriverWrapper {}
5577799ccaSWu Mianzhi 
5677799ccaSWu Mianzhi impl Deref for E1000EDriverWrapper {
5777799ccaSWu Mianzhi     type Target = E1000EDriver;
deref(&self) -> &Self::Target5877799ccaSWu Mianzhi     fn deref(&self) -> &Self::Target {
5977799ccaSWu Mianzhi         unsafe { &*self.0.get() }
6077799ccaSWu Mianzhi     }
6177799ccaSWu Mianzhi }
6277799ccaSWu Mianzhi impl DerefMut for E1000EDriverWrapper {
deref_mut(&mut self) -> &mut Self::Target6377799ccaSWu Mianzhi     fn deref_mut(&mut self) -> &mut Self::Target {
6477799ccaSWu Mianzhi         unsafe { &mut *self.0.get() }
6577799ccaSWu Mianzhi     }
6677799ccaSWu Mianzhi }
6777799ccaSWu Mianzhi 
6877799ccaSWu Mianzhi impl E1000EDriverWrapper {
69b5b571e0SLoGin     #[allow(clippy::mut_from_ref)]
force_get_mut(&self) -> &mut E1000EDriver7077799ccaSWu Mianzhi     fn force_get_mut(&self) -> &mut E1000EDriver {
7177799ccaSWu Mianzhi         unsafe { &mut *self.0.get() }
7277799ccaSWu Mianzhi     }
7377799ccaSWu Mianzhi }
7477799ccaSWu Mianzhi 
7577799ccaSWu Mianzhi impl Debug for E1000EDriverWrapper {
fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result7677799ccaSWu Mianzhi     fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
7777799ccaSWu Mianzhi         f.debug_struct("E1000ENICDriver").finish()
7877799ccaSWu Mianzhi     }
7977799ccaSWu Mianzhi }
8077799ccaSWu Mianzhi 
81*28fe4ad2S黄铭涛 #[cast_to([sync] NetDevice)]
82*28fe4ad2S黄铭涛 #[cast_to([sync] Device)]
8377799ccaSWu Mianzhi pub struct E1000EInterface {
8477799ccaSWu Mianzhi     driver: E1000EDriverWrapper,
8577799ccaSWu Mianzhi     iface_id: usize,
8677799ccaSWu Mianzhi     iface: SpinLock<smoltcp::iface::Interface>,
8777799ccaSWu Mianzhi     name: String,
88*28fe4ad2S黄铭涛     inner: SpinLock<InnerE1000EInterface>,
89*28fe4ad2S黄铭涛     locked_kobj_state: LockedKObjectState,
9077799ccaSWu Mianzhi }
91*28fe4ad2S黄铭涛 
92*28fe4ad2S黄铭涛 #[derive(Debug)]
93*28fe4ad2S黄铭涛 pub struct InnerE1000EInterface {
94*28fe4ad2S黄铭涛     netdevice_common: NetDeviceCommonData,
95*28fe4ad2S黄铭涛     device_common: DeviceCommonData,
96*28fe4ad2S黄铭涛     kobj_common: KObjectCommonData,
97*28fe4ad2S黄铭涛 }
98*28fe4ad2S黄铭涛 
9977799ccaSWu Mianzhi impl phy::RxToken for E1000ERxToken {
consume<R, F>(mut self, f: F) -> R where F: FnOnce(&mut [u8]) -> R,10077799ccaSWu Mianzhi     fn consume<R, F>(mut self, f: F) -> R
10177799ccaSWu Mianzhi     where
10277799ccaSWu Mianzhi         F: FnOnce(&mut [u8]) -> R,
10377799ccaSWu Mianzhi     {
104b5b571e0SLoGin         let result = f(self.0.as_mut_slice());
10577799ccaSWu Mianzhi         self.0.free_buffer();
10677799ccaSWu Mianzhi         return result;
10777799ccaSWu Mianzhi     }
10877799ccaSWu Mianzhi }
10977799ccaSWu Mianzhi 
11077799ccaSWu Mianzhi impl phy::TxToken for E1000ETxToken {
consume<R, F>(self, _len: usize, f: F) -> R where F: FnOnce(&mut [u8]) -> R,111971462beSGnoCiYeH     fn consume<R, F>(self, _len: usize, f: F) -> R
11277799ccaSWu Mianzhi     where
11377799ccaSWu Mianzhi         F: FnOnce(&mut [u8]) -> R,
11477799ccaSWu Mianzhi     {
11577799ccaSWu Mianzhi         let mut buffer = E1000EBuffer::new(4096);
11677799ccaSWu Mianzhi         let result = f(buffer.as_mut_slice());
11777799ccaSWu Mianzhi         let mut device = self.driver.inner.lock();
11877799ccaSWu Mianzhi         device.e1000e_transmit(buffer);
1192f6f547aSGnoCiYeH         buffer.free_buffer();
12077799ccaSWu Mianzhi         return result;
12177799ccaSWu Mianzhi     }
12277799ccaSWu Mianzhi }
12377799ccaSWu Mianzhi 
12477799ccaSWu Mianzhi impl E1000EDriver {
125b5b571e0SLoGin     #[allow(clippy::arc_with_non_send_sync)]
new(device: E1000EDevice) -> Self12677799ccaSWu Mianzhi     pub fn new(device: E1000EDevice) -> Self {
127881ff6f9Syuyi2439         let mut iface_config = smoltcp::iface::Config::new(HardwareAddress::Ethernet(
12877799ccaSWu Mianzhi             smoltcp::wire::EthernetAddress(device.mac_address()),
12977799ccaSWu Mianzhi         ));
13077799ccaSWu Mianzhi 
131881ff6f9Syuyi2439         iface_config.random_seed = rand() as u64;
132881ff6f9Syuyi2439 
13377799ccaSWu Mianzhi         let inner: Arc<SpinLock<E1000EDevice>> = Arc::new(SpinLock::new(device));
13477799ccaSWu Mianzhi         let result = E1000EDriver { inner };
13577799ccaSWu Mianzhi         return result;
13677799ccaSWu Mianzhi     }
13777799ccaSWu Mianzhi }
13877799ccaSWu Mianzhi 
13977799ccaSWu Mianzhi impl Clone for E1000EDriver {
clone(&self) -> Self14077799ccaSWu Mianzhi     fn clone(&self) -> Self {
14177799ccaSWu Mianzhi         return E1000EDriver {
14277799ccaSWu Mianzhi             inner: self.inner.clone(),
14377799ccaSWu Mianzhi         };
14477799ccaSWu Mianzhi     }
14577799ccaSWu Mianzhi }
14677799ccaSWu Mianzhi 
14777799ccaSWu Mianzhi impl phy::Device for E1000EDriver {
14877799ccaSWu Mianzhi     type RxToken<'a> = E1000ERxToken;
14977799ccaSWu Mianzhi     type TxToken<'a> = E1000ETxToken;
15077799ccaSWu Mianzhi 
receive( &mut self, _timestamp: smoltcp::time::Instant, ) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)>15177799ccaSWu Mianzhi     fn receive(
15277799ccaSWu Mianzhi         &mut self,
15377799ccaSWu Mianzhi         _timestamp: smoltcp::time::Instant,
15477799ccaSWu Mianzhi     ) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
15577799ccaSWu Mianzhi         match self.inner.lock().e1000e_receive() {
15677799ccaSWu Mianzhi             Some(buffer) => Some((
15777799ccaSWu Mianzhi                 E1000ERxToken(buffer),
15877799ccaSWu Mianzhi                 E1000ETxToken {
15977799ccaSWu Mianzhi                     driver: self.clone(),
16077799ccaSWu Mianzhi                 },
16177799ccaSWu Mianzhi             )),
16277799ccaSWu Mianzhi             None => {
16377799ccaSWu Mianzhi                 return None;
16477799ccaSWu Mianzhi             }
16577799ccaSWu Mianzhi         }
16677799ccaSWu Mianzhi     }
16777799ccaSWu Mianzhi 
transmit(&mut self, _timestamp: smoltcp::time::Instant) -> Option<Self::TxToken<'_>>16877799ccaSWu Mianzhi     fn transmit(&mut self, _timestamp: smoltcp::time::Instant) -> Option<Self::TxToken<'_>> {
16977799ccaSWu Mianzhi         match self.inner.lock().e1000e_can_transmit() {
17077799ccaSWu Mianzhi             true => Some(E1000ETxToken {
17177799ccaSWu Mianzhi                 driver: self.clone(),
17277799ccaSWu Mianzhi             }),
17377799ccaSWu Mianzhi             false => None,
17477799ccaSWu Mianzhi         }
17577799ccaSWu Mianzhi     }
17677799ccaSWu Mianzhi 
capabilities(&self) -> smoltcp::phy::DeviceCapabilities17777799ccaSWu Mianzhi     fn capabilities(&self) -> smoltcp::phy::DeviceCapabilities {
17877799ccaSWu Mianzhi         let mut caps = smoltcp::phy::DeviceCapabilities::default();
17977799ccaSWu Mianzhi         // 网卡的最大传输单元. 请与IP层的MTU进行区分。这个值应当是网卡的最大传输单元,而不是IP层的MTU。
18077799ccaSWu Mianzhi         // The maximum size of the received packet is limited by the 82574 hardware to 1536 bytes. Packets larger then 1536 bytes are silently discarded. Any packet smaller than 1536 bytes is processed by the 82574.
18177799ccaSWu Mianzhi         // 82574l manual pp205
18277799ccaSWu Mianzhi         caps.max_transmission_unit = 1536;
18377799ccaSWu Mianzhi         /*
18477799ccaSWu Mianzhi            Maximum burst size, in terms of MTU.
18577799ccaSWu Mianzhi            The network device is unable to send or receive bursts large than the value returned by this function.
18677799ccaSWu Mianzhi            If None, there is no fixed limit on burst size, e.g. if network buffers are dynamically allocated.
18777799ccaSWu Mianzhi         */
18877799ccaSWu Mianzhi         caps.max_burst_size = Some(1);
18977799ccaSWu Mianzhi         return caps;
19077799ccaSWu Mianzhi     }
19177799ccaSWu Mianzhi }
19277799ccaSWu Mianzhi 
19377799ccaSWu Mianzhi impl E1000EInterface {
new(mut driver: E1000EDriver) -> Arc<Self>19477799ccaSWu Mianzhi     pub fn new(mut driver: E1000EDriver) -> Arc<Self> {
19577799ccaSWu Mianzhi         let iface_id = generate_iface_id();
196881ff6f9Syuyi2439         let mut iface_config = smoltcp::iface::Config::new(HardwareAddress::Ethernet(
19777799ccaSWu Mianzhi             smoltcp::wire::EthernetAddress(driver.inner.lock().mac_address()),
19877799ccaSWu Mianzhi         ));
199881ff6f9Syuyi2439         iface_config.random_seed = rand() as u64;
200881ff6f9Syuyi2439 
201881ff6f9Syuyi2439         let iface =
202881ff6f9Syuyi2439             smoltcp::iface::Interface::new(iface_config, &mut driver, Instant::now().into());
20377799ccaSWu Mianzhi 
20477799ccaSWu Mianzhi         let driver: E1000EDriverWrapper = E1000EDriverWrapper(UnsafeCell::new(driver));
20577799ccaSWu Mianzhi         let result = Arc::new(E1000EInterface {
20677799ccaSWu Mianzhi             driver,
20777799ccaSWu Mianzhi             iface_id,
20877799ccaSWu Mianzhi             iface: SpinLock::new(iface),
20977799ccaSWu Mianzhi             name: format!("eth{}", iface_id),
210*28fe4ad2S黄铭涛             inner: SpinLock::new(InnerE1000EInterface {
211*28fe4ad2S黄铭涛                 netdevice_common: NetDeviceCommonData::default(),
212*28fe4ad2S黄铭涛                 device_common: DeviceCommonData::default(),
213*28fe4ad2S黄铭涛                 kobj_common: KObjectCommonData::default(),
214*28fe4ad2S黄铭涛             }),
215*28fe4ad2S黄铭涛             locked_kobj_state: LockedKObjectState::default(),
21677799ccaSWu Mianzhi         });
21777799ccaSWu Mianzhi 
21877799ccaSWu Mianzhi         return result;
21977799ccaSWu Mianzhi     }
220*28fe4ad2S黄铭涛 
inner(&self) -> SpinLockGuard<InnerE1000EInterface>221*28fe4ad2S黄铭涛     pub fn inner(&self) -> SpinLockGuard<InnerE1000EInterface> {
222*28fe4ad2S黄铭涛         return self.inner.lock();
223*28fe4ad2S黄铭涛     }
22477799ccaSWu Mianzhi }
22577799ccaSWu Mianzhi 
22677799ccaSWu Mianzhi impl Debug for E1000EInterface {
fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result22777799ccaSWu Mianzhi     fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
22877799ccaSWu Mianzhi         f.debug_struct("E1000EInterface")
22977799ccaSWu Mianzhi             .field("iface_id", &self.iface_id)
23077799ccaSWu Mianzhi             .field("iface", &"smoltcp::iface::Interface")
23177799ccaSWu Mianzhi             .field("name", &self.name)
23277799ccaSWu Mianzhi             .finish()
23377799ccaSWu Mianzhi     }
23477799ccaSWu Mianzhi }
23577799ccaSWu Mianzhi 
236e32effb1SLoGin impl Device for E1000EInterface {
dev_type(&self) -> DeviceType237e32effb1SLoGin     fn dev_type(&self) -> DeviceType {
238*28fe4ad2S黄铭涛         DeviceType::Net
23977799ccaSWu Mianzhi     }
24077799ccaSWu Mianzhi 
id_table(&self) -> IdTable241e32effb1SLoGin     fn id_table(&self) -> IdTable {
242*28fe4ad2S黄铭涛         IdTable::new(DEVICE_NAME.to_string(), None)
24377799ccaSWu Mianzhi     }
24477799ccaSWu Mianzhi 
bus(&self) -> Option<Weak<dyn Bus>>245*28fe4ad2S黄铭涛     fn bus(&self) -> Option<Weak<dyn Bus>> {
246*28fe4ad2S黄铭涛         self.inner().device_common.bus.clone()
24777799ccaSWu Mianzhi     }
248e32effb1SLoGin 
set_bus(&self, bus: Option<Weak<dyn Bus>>)249*28fe4ad2S黄铭涛     fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
250*28fe4ad2S黄铭涛         self.inner().device_common.bus = bus;
251*28fe4ad2S黄铭涛     }
252*28fe4ad2S黄铭涛 
class(&self) -> Option<Arc<dyn Class>>253*28fe4ad2S黄铭涛     fn class(&self) -> Option<Arc<dyn Class>> {
254*28fe4ad2S黄铭涛         let mut guard = self.inner();
255*28fe4ad2S黄铭涛         let r = guard.device_common.class.clone()?.upgrade();
256*28fe4ad2S黄铭涛         if r.is_none() {
257*28fe4ad2S黄铭涛             guard.device_common.class = None;
258*28fe4ad2S黄铭涛         }
259*28fe4ad2S黄铭涛 
260*28fe4ad2S黄铭涛         return r;
261*28fe4ad2S黄铭涛     }
262*28fe4ad2S黄铭涛 
set_class(&self, class: Option<Weak<dyn Class>>)263*28fe4ad2S黄铭涛     fn set_class(&self, class: Option<Weak<dyn Class>>) {
264*28fe4ad2S黄铭涛         self.inner().device_common.class = class;
26577799ccaSWu Mianzhi     }
26677799ccaSWu Mianzhi 
driver(&self) -> Option<Arc<dyn Driver>>267e32effb1SLoGin     fn driver(&self) -> Option<Arc<dyn Driver>> {
268*28fe4ad2S黄铭涛         let r = self.inner().device_common.driver.clone()?.upgrade();
269*28fe4ad2S黄铭涛         if r.is_none() {
270*28fe4ad2S黄铭涛             self.inner().device_common.driver = None;
271e32effb1SLoGin         }
272e32effb1SLoGin 
273*28fe4ad2S黄铭涛         return r;
274*28fe4ad2S黄铭涛     }
275*28fe4ad2S黄铭涛 
set_driver(&self, driver: Option<Weak<dyn Driver>>)276*28fe4ad2S黄铭涛     fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
277*28fe4ad2S黄铭涛         self.inner().device_common.driver = driver;
278e32effb1SLoGin     }
279e32effb1SLoGin 
is_dead(&self) -> bool280e32effb1SLoGin     fn is_dead(&self) -> bool {
281*28fe4ad2S黄铭涛         false
282e32effb1SLoGin     }
283e32effb1SLoGin 
can_match(&self) -> bool284e32effb1SLoGin     fn can_match(&self) -> bool {
285*28fe4ad2S黄铭涛         self.inner().device_common.can_match
286e32effb1SLoGin     }
287e32effb1SLoGin 
set_can_match(&self, can_match: bool)288*28fe4ad2S黄铭涛     fn set_can_match(&self, can_match: bool) {
289*28fe4ad2S黄铭涛         self.inner().device_common.can_match = can_match;
290e32effb1SLoGin     }
291e32effb1SLoGin 
state_synced(&self) -> bool292e32effb1SLoGin     fn state_synced(&self) -> bool {
293*28fe4ad2S黄铭涛         true
294*28fe4ad2S黄铭涛     }
295*28fe4ad2S黄铭涛 
dev_parent(&self) -> Option<Weak<dyn Device>>296*28fe4ad2S黄铭涛     fn dev_parent(&self) -> Option<Weak<dyn Device>> {
297*28fe4ad2S黄铭涛         self.inner().device_common.get_parent_weak_or_clear()
298*28fe4ad2S黄铭涛     }
299*28fe4ad2S黄铭涛 
set_dev_parent(&self, parent: Option<Weak<dyn Device>>)300*28fe4ad2S黄铭涛     fn set_dev_parent(&self, parent: Option<Weak<dyn Device>>) {
301*28fe4ad2S黄铭涛         self.inner().device_common.parent = parent;
302e32effb1SLoGin     }
303e32effb1SLoGin }
304e32effb1SLoGin 
305e32effb1SLoGin impl NetDevice for E1000EInterface {
mac(&self) -> smoltcp::wire::EthernetAddress30677799ccaSWu Mianzhi     fn mac(&self) -> smoltcp::wire::EthernetAddress {
30777799ccaSWu Mianzhi         let mac = self.driver.inner.lock().mac_address();
30877799ccaSWu Mianzhi         return smoltcp::wire::EthernetAddress::from_bytes(&mac);
30977799ccaSWu Mianzhi     }
31077799ccaSWu Mianzhi 
31177799ccaSWu Mianzhi     #[inline]
nic_id(&self) -> usize31277799ccaSWu Mianzhi     fn nic_id(&self) -> usize {
31377799ccaSWu Mianzhi         return self.iface_id;
31477799ccaSWu Mianzhi     }
31577799ccaSWu Mianzhi 
31677799ccaSWu Mianzhi     #[inline]
iface_name(&self) -> String317*28fe4ad2S黄铭涛     fn iface_name(&self) -> String {
31877799ccaSWu Mianzhi         return self.name.clone();
31977799ccaSWu Mianzhi     }
32077799ccaSWu Mianzhi 
update_ip_addrs(&self, ip_addrs: &[wire::IpCidr]) -> Result<(), SystemError>32177799ccaSWu Mianzhi     fn update_ip_addrs(&self, ip_addrs: &[wire::IpCidr]) -> Result<(), SystemError> {
32277799ccaSWu Mianzhi         if ip_addrs.len() != 1 {
32377799ccaSWu Mianzhi             return Err(SystemError::EINVAL);
32477799ccaSWu Mianzhi         }
32577799ccaSWu Mianzhi 
32677799ccaSWu Mianzhi         self.iface.lock().update_ip_addrs(|addrs| {
32777799ccaSWu Mianzhi             let dest = addrs.iter_mut().next();
328b5b571e0SLoGin 
329b5b571e0SLoGin             if let Some(dest) = dest {
33077799ccaSWu Mianzhi                 *dest = ip_addrs[0];
331b5b571e0SLoGin             } else {
332b5b571e0SLoGin                 addrs.push(ip_addrs[0]).expect("Push ipCidr failed: full");
33377799ccaSWu Mianzhi             }
33477799ccaSWu Mianzhi         });
33577799ccaSWu Mianzhi         return Ok(());
33677799ccaSWu Mianzhi     }
33777799ccaSWu Mianzhi 
poll(&self, sockets: &mut smoltcp::iface::SocketSet) -> Result<(), SystemError>33891e9d4abSLoGin     fn poll(&self, sockets: &mut smoltcp::iface::SocketSet) -> Result<(), SystemError> {
33977799ccaSWu Mianzhi         let timestamp: smoltcp::time::Instant = Instant::now().into();
34077799ccaSWu Mianzhi         let mut guard = self.iface.lock();
34177799ccaSWu Mianzhi         let poll_res = guard.poll(timestamp, self.driver.force_get_mut(), sockets);
34277799ccaSWu Mianzhi         if poll_res {
34377799ccaSWu Mianzhi             return Ok(());
34477799ccaSWu Mianzhi         }
34577799ccaSWu Mianzhi         return Err(SystemError::EAGAIN_OR_EWOULDBLOCK);
34677799ccaSWu Mianzhi     }
34777799ccaSWu Mianzhi 
34877799ccaSWu Mianzhi     #[inline(always)]
inner_iface(&self) -> &SpinLock<smoltcp::iface::Interface>34977799ccaSWu Mianzhi     fn inner_iface(&self) -> &SpinLock<smoltcp::iface::Interface> {
35077799ccaSWu Mianzhi         return &self.iface;
35177799ccaSWu Mianzhi     }
352*28fe4ad2S黄铭涛 
addr_assign_type(&self) -> u8353*28fe4ad2S黄铭涛     fn addr_assign_type(&self) -> u8 {
354*28fe4ad2S黄铭涛         return self.inner().netdevice_common.addr_assign_type;
355*28fe4ad2S黄铭涛     }
356*28fe4ad2S黄铭涛 
net_device_type(&self) -> u16357*28fe4ad2S黄铭涛     fn net_device_type(&self) -> u16 {
358*28fe4ad2S黄铭涛         self.inner().netdevice_common.net_device_type = 1; // 以太网设备
359*28fe4ad2S黄铭涛         return self.inner().netdevice_common.net_device_type;
360*28fe4ad2S黄铭涛     }
361*28fe4ad2S黄铭涛 
net_state(&self) -> NetDeivceState362*28fe4ad2S黄铭涛     fn net_state(&self) -> NetDeivceState {
363*28fe4ad2S黄铭涛         return self.inner().netdevice_common.state;
364*28fe4ad2S黄铭涛     }
365*28fe4ad2S黄铭涛 
set_net_state(&self, state: NetDeivceState)366*28fe4ad2S黄铭涛     fn set_net_state(&self, state: NetDeivceState) {
367*28fe4ad2S黄铭涛         self.inner().netdevice_common.state |= state;
368*28fe4ad2S黄铭涛     }
369*28fe4ad2S黄铭涛 
operstate(&self) -> Operstate370*28fe4ad2S黄铭涛     fn operstate(&self) -> Operstate {
371*28fe4ad2S黄铭涛         return self.inner().netdevice_common.operstate;
372*28fe4ad2S黄铭涛     }
373*28fe4ad2S黄铭涛 
set_operstate(&self, state: Operstate)374*28fe4ad2S黄铭涛     fn set_operstate(&self, state: Operstate) {
375*28fe4ad2S黄铭涛         self.inner().netdevice_common.operstate = state;
376*28fe4ad2S黄铭涛     }
37777799ccaSWu Mianzhi }
37877799ccaSWu Mianzhi 
37977799ccaSWu Mianzhi impl KObject for E1000EInterface {
as_any_ref(&self) -> &dyn core::any::Any38077799ccaSWu Mianzhi     fn as_any_ref(&self) -> &dyn core::any::Any {
38177799ccaSWu Mianzhi         self
38277799ccaSWu Mianzhi     }
38377799ccaSWu Mianzhi 
set_inode(&self, inode: Option<Arc<crate::filesystem::kernfs::KernFSInode>>)384*28fe4ad2S黄铭涛     fn set_inode(&self, inode: Option<Arc<crate::filesystem::kernfs::KernFSInode>>) {
385*28fe4ad2S黄铭涛         self.inner().kobj_common.kern_inode = inode;
38677799ccaSWu Mianzhi     }
38777799ccaSWu Mianzhi 
inode(&self) -> Option<Arc<crate::filesystem::kernfs::KernFSInode>>38877799ccaSWu Mianzhi     fn inode(&self) -> Option<Arc<crate::filesystem::kernfs::KernFSInode>> {
389*28fe4ad2S黄铭涛         self.inner().kobj_common.kern_inode.clone()
39077799ccaSWu Mianzhi     }
39177799ccaSWu Mianzhi 
parent(&self) -> Option<alloc::sync::Weak<dyn KObject>>39277799ccaSWu Mianzhi     fn parent(&self) -> Option<alloc::sync::Weak<dyn KObject>> {
393*28fe4ad2S黄铭涛         self.inner().kobj_common.parent.clone()
39477799ccaSWu Mianzhi     }
39577799ccaSWu Mianzhi 
set_parent(&self, parent: Option<alloc::sync::Weak<dyn KObject>>)396*28fe4ad2S黄铭涛     fn set_parent(&self, parent: Option<alloc::sync::Weak<dyn KObject>>) {
397*28fe4ad2S黄铭涛         self.inner().kobj_common.parent = parent;
39877799ccaSWu Mianzhi     }
39977799ccaSWu Mianzhi 
kset(&self) -> Option<Arc<crate::driver::base::kset::KSet>>40077799ccaSWu Mianzhi     fn kset(&self) -> Option<Arc<crate::driver::base::kset::KSet>> {
401*28fe4ad2S黄铭涛         self.inner().kobj_common.kset.clone()
40277799ccaSWu Mianzhi     }
40377799ccaSWu Mianzhi 
set_kset(&self, kset: Option<Arc<crate::driver::base::kset::KSet>>)404*28fe4ad2S黄铭涛     fn set_kset(&self, kset: Option<Arc<crate::driver::base::kset::KSet>>) {
405*28fe4ad2S黄铭涛         self.inner().kobj_common.kset = kset;
40677799ccaSWu Mianzhi     }
40777799ccaSWu Mianzhi 
kobj_type(&self) -> Option<&'static dyn crate::driver::base::kobject::KObjType>40877799ccaSWu Mianzhi     fn kobj_type(&self) -> Option<&'static dyn crate::driver::base::kobject::KObjType> {
409*28fe4ad2S黄铭涛         self.inner().kobj_common.kobj_type
41077799ccaSWu Mianzhi     }
41177799ccaSWu Mianzhi 
name(&self) -> String41277799ccaSWu Mianzhi     fn name(&self) -> String {
41377799ccaSWu Mianzhi         self.name.clone()
41477799ccaSWu Mianzhi     }
41577799ccaSWu Mianzhi 
set_name(&self, _name: String)41677799ccaSWu Mianzhi     fn set_name(&self, _name: String) {
417*28fe4ad2S黄铭涛         // do nothing
41877799ccaSWu Mianzhi     }
41977799ccaSWu Mianzhi 
kobj_state(&self) -> RwLockReadGuard<KObjectState>420*28fe4ad2S黄铭涛     fn kobj_state(&self) -> RwLockReadGuard<KObjectState> {
421*28fe4ad2S黄铭涛         self.locked_kobj_state.read()
42277799ccaSWu Mianzhi     }
42377799ccaSWu Mianzhi 
kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState>424*28fe4ad2S黄铭涛     fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> {
425*28fe4ad2S黄铭涛         self.locked_kobj_state.write()
42677799ccaSWu Mianzhi     }
42777799ccaSWu Mianzhi 
set_kobj_state(&self, state: KObjectState)428*28fe4ad2S黄铭涛     fn set_kobj_state(&self, state: KObjectState) {
429*28fe4ad2S黄铭涛         *self.locked_kobj_state.write() = state;
43077799ccaSWu Mianzhi     }
43177799ccaSWu Mianzhi 
set_kobj_type(&self, ktype: Option<&'static dyn KObjType>)432*28fe4ad2S黄铭涛     fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
433*28fe4ad2S黄铭涛         self.inner().kobj_common.kobj_type = ktype;
43477799ccaSWu Mianzhi     }
43577799ccaSWu Mianzhi }
43677799ccaSWu Mianzhi 
e1000e_driver_init(device: E1000EDevice)43777799ccaSWu Mianzhi pub fn e1000e_driver_init(device: E1000EDevice) {
43877799ccaSWu Mianzhi     let mac = smoltcp::wire::EthernetAddress::from_bytes(&device.mac_address());
43977799ccaSWu Mianzhi     let driver = E1000EDriver::new(device);
44077799ccaSWu Mianzhi     let iface = E1000EInterface::new(driver);
441*28fe4ad2S黄铭涛     // 标识网络设备已经启动
442*28fe4ad2S黄铭涛     iface.set_net_state(NetDeivceState::__LINK_STATE_START);
443*28fe4ad2S黄铭涛 
44477799ccaSWu Mianzhi     // 将网卡的接口信息注册到全局的网卡接口信息表中
445e32effb1SLoGin     NET_DEVICES
4460d6cf65aSLoGin         .write_irqsave()
4470d6cf65aSLoGin         .insert(iface.nic_id(), iface.clone());
4482eab6dd7S曾俊     info!("e1000e driver init successfully!\tMAC: [{}]", mac);
449*28fe4ad2S黄铭涛 
450*28fe4ad2S黄铭涛     register_netdevice(iface.clone()).expect("register lo device failed");
45177799ccaSWu Mianzhi }
452