xref: /DragonOS/kernel/src/driver/net/e1000e/e1000e_driver.rs (revision 77799ccaaca276fe127448d169f0e035837cce44)
1*77799ccaSWu Mianzhi //这个文件的绝大部分内容是copy virtio_net.rs的,考虑到所有的驱动都要用操作系统提供的协议栈,我觉得可以把这些内容抽象出来
2*77799ccaSWu Mianzhi 
3*77799ccaSWu Mianzhi use crate::{
4*77799ccaSWu Mianzhi     driver::{
5*77799ccaSWu Mianzhi         base::{
6*77799ccaSWu Mianzhi             device::{
7*77799ccaSWu Mianzhi                 bus::Bus,
8*77799ccaSWu Mianzhi                 driver::{Driver, DriverError},
9*77799ccaSWu Mianzhi                 Device, DevicePrivateData, IdTable,
10*77799ccaSWu Mianzhi             },
11*77799ccaSWu Mianzhi             kobject::{KObjType, KObject, KObjectState},
12*77799ccaSWu Mianzhi         },
13*77799ccaSWu Mianzhi         net::NetDriver,
14*77799ccaSWu Mianzhi     },
15*77799ccaSWu Mianzhi     kdebug, kinfo,
16*77799ccaSWu Mianzhi     libs::spinlock::SpinLock,
17*77799ccaSWu Mianzhi     net::{generate_iface_id, NET_DRIVERS},
18*77799ccaSWu Mianzhi     syscall::SystemError,
19*77799ccaSWu Mianzhi     time::Instant,
20*77799ccaSWu Mianzhi };
21*77799ccaSWu Mianzhi use alloc::{string::String, sync::Arc};
22*77799ccaSWu Mianzhi use core::{
23*77799ccaSWu Mianzhi     cell::UnsafeCell,
24*77799ccaSWu Mianzhi     fmt::Debug,
25*77799ccaSWu Mianzhi     ops::{Deref, DerefMut},
26*77799ccaSWu Mianzhi };
27*77799ccaSWu Mianzhi use smoltcp::{phy, wire};
28*77799ccaSWu Mianzhi 
29*77799ccaSWu Mianzhi use super::e1000e::{E1000EBuffer, E1000EDevice};
30*77799ccaSWu Mianzhi 
31*77799ccaSWu Mianzhi pub struct E1000ERxToken(E1000EBuffer);
32*77799ccaSWu Mianzhi pub struct E1000ETxToken {
33*77799ccaSWu Mianzhi     driver: E1000EDriver,
34*77799ccaSWu Mianzhi }
35*77799ccaSWu Mianzhi pub struct E1000EDriver {
36*77799ccaSWu Mianzhi     pub inner: Arc<SpinLock<E1000EDevice>>,
37*77799ccaSWu Mianzhi }
38*77799ccaSWu Mianzhi 
39*77799ccaSWu Mianzhi /// @brief 网卡驱动的包裹器,这是为了获取网卡驱动的可变引用而设计的。
40*77799ccaSWu Mianzhi /// 参阅virtio_net.rs
41*77799ccaSWu Mianzhi struct E1000EDriverWrapper(UnsafeCell<E1000EDriver>);
42*77799ccaSWu Mianzhi unsafe impl Send for E1000EDriverWrapper {}
43*77799ccaSWu Mianzhi unsafe impl Sync for E1000EDriverWrapper {}
44*77799ccaSWu Mianzhi 
45*77799ccaSWu Mianzhi impl Deref for E1000EDriverWrapper {
46*77799ccaSWu Mianzhi     type Target = E1000EDriver;
47*77799ccaSWu Mianzhi     fn deref(&self) -> &Self::Target {
48*77799ccaSWu Mianzhi         unsafe { &*self.0.get() }
49*77799ccaSWu Mianzhi     }
50*77799ccaSWu Mianzhi }
51*77799ccaSWu Mianzhi impl DerefMut for E1000EDriverWrapper {
52*77799ccaSWu Mianzhi     fn deref_mut(&mut self) -> &mut Self::Target {
53*77799ccaSWu Mianzhi         unsafe { &mut *self.0.get() }
54*77799ccaSWu Mianzhi     }
55*77799ccaSWu Mianzhi }
56*77799ccaSWu Mianzhi 
57*77799ccaSWu Mianzhi impl E1000EDriverWrapper {
58*77799ccaSWu Mianzhi     fn force_get_mut(&self) -> &mut E1000EDriver {
59*77799ccaSWu Mianzhi         unsafe { &mut *self.0.get() }
60*77799ccaSWu Mianzhi     }
61*77799ccaSWu Mianzhi }
62*77799ccaSWu Mianzhi 
63*77799ccaSWu Mianzhi impl Debug for E1000EDriverWrapper {
64*77799ccaSWu Mianzhi     fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
65*77799ccaSWu Mianzhi         f.debug_struct("E1000ENICDriver").finish()
66*77799ccaSWu Mianzhi     }
67*77799ccaSWu Mianzhi }
68*77799ccaSWu Mianzhi 
69*77799ccaSWu Mianzhi pub struct E1000EInterface {
70*77799ccaSWu Mianzhi     driver: E1000EDriverWrapper,
71*77799ccaSWu Mianzhi     iface_id: usize,
72*77799ccaSWu Mianzhi     iface: SpinLock<smoltcp::iface::Interface>,
73*77799ccaSWu Mianzhi     name: String,
74*77799ccaSWu Mianzhi }
75*77799ccaSWu Mianzhi impl phy::RxToken for E1000ERxToken {
76*77799ccaSWu Mianzhi     fn consume<R, F>(mut self, f: F) -> R
77*77799ccaSWu Mianzhi     where
78*77799ccaSWu Mianzhi         F: FnOnce(&mut [u8]) -> R,
79*77799ccaSWu Mianzhi     {
80*77799ccaSWu Mianzhi         let result = f(&mut self.0.as_mut_slice());
81*77799ccaSWu Mianzhi         self.0.free_buffer();
82*77799ccaSWu Mianzhi         return result;
83*77799ccaSWu Mianzhi     }
84*77799ccaSWu Mianzhi }
85*77799ccaSWu Mianzhi 
86*77799ccaSWu Mianzhi impl phy::TxToken for E1000ETxToken {
87*77799ccaSWu Mianzhi     fn consume<R, F>(self, len: usize, f: F) -> R
88*77799ccaSWu Mianzhi     where
89*77799ccaSWu Mianzhi         F: FnOnce(&mut [u8]) -> R,
90*77799ccaSWu Mianzhi     {
91*77799ccaSWu Mianzhi         let mut buffer = E1000EBuffer::new(4096);
92*77799ccaSWu Mianzhi         let result = f(buffer.as_mut_slice());
93*77799ccaSWu Mianzhi         let mut device = self.driver.inner.lock();
94*77799ccaSWu Mianzhi         device.e1000e_transmit(buffer);
95*77799ccaSWu Mianzhi         return result;
96*77799ccaSWu Mianzhi     }
97*77799ccaSWu Mianzhi }
98*77799ccaSWu Mianzhi 
99*77799ccaSWu Mianzhi impl E1000EDriver {
100*77799ccaSWu Mianzhi     pub fn new(device: E1000EDevice) -> Self {
101*77799ccaSWu Mianzhi         let mut iface_config = smoltcp::iface::Config::new();
102*77799ccaSWu Mianzhi 
103*77799ccaSWu Mianzhi         // todo: 随机设定这个值。
104*77799ccaSWu Mianzhi         // 参见 https://docs.rs/smoltcp/latest/smoltcp/iface/struct.Config.html#structfield.random_seed
105*77799ccaSWu Mianzhi         iface_config.random_seed = 12345;
106*77799ccaSWu Mianzhi 
107*77799ccaSWu Mianzhi         iface_config.hardware_addr = Some(wire::HardwareAddress::Ethernet(
108*77799ccaSWu Mianzhi             smoltcp::wire::EthernetAddress(device.mac_address()),
109*77799ccaSWu Mianzhi         ));
110*77799ccaSWu Mianzhi 
111*77799ccaSWu Mianzhi         let inner: Arc<SpinLock<E1000EDevice>> = Arc::new(SpinLock::new(device));
112*77799ccaSWu Mianzhi         let result = E1000EDriver { inner };
113*77799ccaSWu Mianzhi         return result;
114*77799ccaSWu Mianzhi     }
115*77799ccaSWu Mianzhi }
116*77799ccaSWu Mianzhi 
117*77799ccaSWu Mianzhi impl Clone for E1000EDriver {
118*77799ccaSWu Mianzhi     fn clone(&self) -> Self {
119*77799ccaSWu Mianzhi         return E1000EDriver {
120*77799ccaSWu Mianzhi             inner: self.inner.clone(),
121*77799ccaSWu Mianzhi         };
122*77799ccaSWu Mianzhi     }
123*77799ccaSWu Mianzhi }
124*77799ccaSWu Mianzhi 
125*77799ccaSWu Mianzhi impl phy::Device for E1000EDriver {
126*77799ccaSWu Mianzhi     type RxToken<'a> = E1000ERxToken;
127*77799ccaSWu Mianzhi     type TxToken<'a> = E1000ETxToken;
128*77799ccaSWu Mianzhi 
129*77799ccaSWu Mianzhi     fn receive(
130*77799ccaSWu Mianzhi         &mut self,
131*77799ccaSWu Mianzhi         _timestamp: smoltcp::time::Instant,
132*77799ccaSWu Mianzhi     ) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
133*77799ccaSWu Mianzhi         match self.inner.lock().e1000e_receive() {
134*77799ccaSWu Mianzhi             Some(buffer) => Some((
135*77799ccaSWu Mianzhi                 E1000ERxToken(buffer),
136*77799ccaSWu Mianzhi                 E1000ETxToken {
137*77799ccaSWu Mianzhi                     driver: self.clone(),
138*77799ccaSWu Mianzhi                 },
139*77799ccaSWu Mianzhi             )),
140*77799ccaSWu Mianzhi             None => {
141*77799ccaSWu Mianzhi                 return None;
142*77799ccaSWu Mianzhi             }
143*77799ccaSWu Mianzhi         }
144*77799ccaSWu Mianzhi     }
145*77799ccaSWu Mianzhi 
146*77799ccaSWu Mianzhi     fn transmit(&mut self, _timestamp: smoltcp::time::Instant) -> Option<Self::TxToken<'_>> {
147*77799ccaSWu Mianzhi         match self.inner.lock().e1000e_can_transmit() {
148*77799ccaSWu Mianzhi             true => Some(E1000ETxToken {
149*77799ccaSWu Mianzhi                 driver: self.clone(),
150*77799ccaSWu Mianzhi             }),
151*77799ccaSWu Mianzhi             false => None,
152*77799ccaSWu Mianzhi         }
153*77799ccaSWu Mianzhi     }
154*77799ccaSWu Mianzhi 
155*77799ccaSWu Mianzhi     fn capabilities(&self) -> smoltcp::phy::DeviceCapabilities {
156*77799ccaSWu Mianzhi         let mut caps = smoltcp::phy::DeviceCapabilities::default();
157*77799ccaSWu Mianzhi         // 网卡的最大传输单元. 请与IP层的MTU进行区分。这个值应当是网卡的最大传输单元,而不是IP层的MTU。
158*77799ccaSWu 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.
159*77799ccaSWu Mianzhi         // 82574l manual pp205
160*77799ccaSWu Mianzhi         caps.max_transmission_unit = 1536;
161*77799ccaSWu Mianzhi         /*
162*77799ccaSWu Mianzhi            Maximum burst size, in terms of MTU.
163*77799ccaSWu Mianzhi            The network device is unable to send or receive bursts large than the value returned by this function.
164*77799ccaSWu Mianzhi            If None, there is no fixed limit on burst size, e.g. if network buffers are dynamically allocated.
165*77799ccaSWu Mianzhi         */
166*77799ccaSWu Mianzhi         caps.max_burst_size = Some(1);
167*77799ccaSWu Mianzhi         return caps;
168*77799ccaSWu Mianzhi     }
169*77799ccaSWu Mianzhi }
170*77799ccaSWu Mianzhi 
171*77799ccaSWu Mianzhi impl E1000EInterface {
172*77799ccaSWu Mianzhi     pub fn new(mut driver: E1000EDriver) -> Arc<Self> {
173*77799ccaSWu Mianzhi         let iface_id = generate_iface_id();
174*77799ccaSWu Mianzhi         let mut iface_config = smoltcp::iface::Config::new();
175*77799ccaSWu Mianzhi 
176*77799ccaSWu Mianzhi         // todo: 随机设定这个值。
177*77799ccaSWu Mianzhi         // 参见 https://docs.rs/smoltcp/latest/smoltcp/iface/struct.Config.html#structfield.random_seed
178*77799ccaSWu Mianzhi         iface_config.random_seed = 12345;
179*77799ccaSWu Mianzhi 
180*77799ccaSWu Mianzhi         iface_config.hardware_addr = Some(wire::HardwareAddress::Ethernet(
181*77799ccaSWu Mianzhi             smoltcp::wire::EthernetAddress(driver.inner.lock().mac_address()),
182*77799ccaSWu Mianzhi         ));
183*77799ccaSWu Mianzhi         let iface = smoltcp::iface::Interface::new(iface_config, &mut driver);
184*77799ccaSWu Mianzhi 
185*77799ccaSWu Mianzhi         let driver: E1000EDriverWrapper = E1000EDriverWrapper(UnsafeCell::new(driver));
186*77799ccaSWu Mianzhi         let result = Arc::new(E1000EInterface {
187*77799ccaSWu Mianzhi             driver,
188*77799ccaSWu Mianzhi             iface_id,
189*77799ccaSWu Mianzhi             iface: SpinLock::new(iface),
190*77799ccaSWu Mianzhi             name: format!("eth{}", iface_id),
191*77799ccaSWu Mianzhi         });
192*77799ccaSWu Mianzhi 
193*77799ccaSWu Mianzhi         return result;
194*77799ccaSWu Mianzhi     }
195*77799ccaSWu Mianzhi }
196*77799ccaSWu Mianzhi 
197*77799ccaSWu Mianzhi impl Debug for E1000EInterface {
198*77799ccaSWu Mianzhi     fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
199*77799ccaSWu Mianzhi         f.debug_struct("E1000EInterface")
200*77799ccaSWu Mianzhi             .field("iface_id", &self.iface_id)
201*77799ccaSWu Mianzhi             .field("iface", &"smoltcp::iface::Interface")
202*77799ccaSWu Mianzhi             .field("name", &self.name)
203*77799ccaSWu Mianzhi             .finish()
204*77799ccaSWu Mianzhi     }
205*77799ccaSWu Mianzhi }
206*77799ccaSWu Mianzhi 
207*77799ccaSWu Mianzhi impl Driver for E1000EInterface {
208*77799ccaSWu Mianzhi     fn id_table(&self) -> Option<IdTable> {
209*77799ccaSWu Mianzhi         todo!()
210*77799ccaSWu Mianzhi     }
211*77799ccaSWu Mianzhi 
212*77799ccaSWu Mianzhi     fn add_device(&self, _device: Arc<dyn Device>) {
213*77799ccaSWu Mianzhi         todo!()
214*77799ccaSWu Mianzhi     }
215*77799ccaSWu Mianzhi 
216*77799ccaSWu Mianzhi     fn delete_device(&self, _device: &Arc<dyn Device>) {
217*77799ccaSWu Mianzhi         todo!()
218*77799ccaSWu Mianzhi     }
219*77799ccaSWu Mianzhi 
220*77799ccaSWu Mianzhi     fn devices(&self) -> alloc::vec::Vec<Arc<dyn Device>> {
221*77799ccaSWu Mianzhi         todo!()
222*77799ccaSWu Mianzhi     }
223*77799ccaSWu Mianzhi 
224*77799ccaSWu Mianzhi     fn bus(&self) -> Option<Arc<dyn Bus>> {
225*77799ccaSWu Mianzhi         todo!()
226*77799ccaSWu Mianzhi     }
227*77799ccaSWu Mianzhi 
228*77799ccaSWu Mianzhi     fn set_bus(&self, _bus: Option<Arc<dyn Bus>>) {
229*77799ccaSWu Mianzhi         todo!()
230*77799ccaSWu Mianzhi     }
231*77799ccaSWu Mianzhi }
232*77799ccaSWu Mianzhi 
233*77799ccaSWu Mianzhi impl NetDriver for E1000EInterface {
234*77799ccaSWu Mianzhi     fn mac(&self) -> smoltcp::wire::EthernetAddress {
235*77799ccaSWu Mianzhi         let mac = self.driver.inner.lock().mac_address();
236*77799ccaSWu Mianzhi         return smoltcp::wire::EthernetAddress::from_bytes(&mac);
237*77799ccaSWu Mianzhi     }
238*77799ccaSWu Mianzhi 
239*77799ccaSWu Mianzhi     #[inline]
240*77799ccaSWu Mianzhi     fn nic_id(&self) -> usize {
241*77799ccaSWu Mianzhi         return self.iface_id;
242*77799ccaSWu Mianzhi     }
243*77799ccaSWu Mianzhi 
244*77799ccaSWu Mianzhi     #[inline]
245*77799ccaSWu Mianzhi     fn name(&self) -> String {
246*77799ccaSWu Mianzhi         return self.name.clone();
247*77799ccaSWu Mianzhi     }
248*77799ccaSWu Mianzhi 
249*77799ccaSWu Mianzhi     fn update_ip_addrs(&self, ip_addrs: &[wire::IpCidr]) -> Result<(), SystemError> {
250*77799ccaSWu Mianzhi         if ip_addrs.len() != 1 {
251*77799ccaSWu Mianzhi             return Err(SystemError::EINVAL);
252*77799ccaSWu Mianzhi         }
253*77799ccaSWu Mianzhi 
254*77799ccaSWu Mianzhi         self.iface.lock().update_ip_addrs(|addrs| {
255*77799ccaSWu Mianzhi             let dest = addrs.iter_mut().next();
256*77799ccaSWu Mianzhi             if let None = dest {
257*77799ccaSWu Mianzhi                 addrs.push(ip_addrs[0]).expect("Push ipCidr failed: full");
258*77799ccaSWu Mianzhi             } else {
259*77799ccaSWu Mianzhi                 let dest = dest.unwrap();
260*77799ccaSWu Mianzhi                 *dest = ip_addrs[0];
261*77799ccaSWu Mianzhi             }
262*77799ccaSWu Mianzhi         });
263*77799ccaSWu Mianzhi         return Ok(());
264*77799ccaSWu Mianzhi     }
265*77799ccaSWu Mianzhi 
266*77799ccaSWu Mianzhi     fn poll(
267*77799ccaSWu Mianzhi         &self,
268*77799ccaSWu Mianzhi         sockets: &mut smoltcp::iface::SocketSet,
269*77799ccaSWu Mianzhi     ) -> Result<(), crate::syscall::SystemError> {
270*77799ccaSWu Mianzhi         let timestamp: smoltcp::time::Instant = Instant::now().into();
271*77799ccaSWu Mianzhi         let mut guard = self.iface.lock();
272*77799ccaSWu Mianzhi         let poll_res = guard.poll(timestamp, self.driver.force_get_mut(), sockets);
273*77799ccaSWu Mianzhi         if poll_res {
274*77799ccaSWu Mianzhi             return Ok(());
275*77799ccaSWu Mianzhi         }
276*77799ccaSWu Mianzhi         return Err(SystemError::EAGAIN_OR_EWOULDBLOCK);
277*77799ccaSWu Mianzhi     }
278*77799ccaSWu Mianzhi 
279*77799ccaSWu Mianzhi     #[inline(always)]
280*77799ccaSWu Mianzhi     fn inner_iface(&self) -> &SpinLock<smoltcp::iface::Interface> {
281*77799ccaSWu Mianzhi         return &self.iface;
282*77799ccaSWu Mianzhi     }
283*77799ccaSWu Mianzhi }
284*77799ccaSWu Mianzhi 
285*77799ccaSWu Mianzhi impl KObject for E1000EInterface {
286*77799ccaSWu Mianzhi     fn as_any_ref(&self) -> &dyn core::any::Any {
287*77799ccaSWu Mianzhi         self
288*77799ccaSWu Mianzhi     }
289*77799ccaSWu Mianzhi 
290*77799ccaSWu Mianzhi     fn set_inode(&self, _inode: Option<Arc<crate::filesystem::kernfs::KernFSInode>>) {
291*77799ccaSWu Mianzhi         todo!()
292*77799ccaSWu Mianzhi     }
293*77799ccaSWu Mianzhi 
294*77799ccaSWu Mianzhi     fn inode(&self) -> Option<Arc<crate::filesystem::kernfs::KernFSInode>> {
295*77799ccaSWu Mianzhi         todo!()
296*77799ccaSWu Mianzhi     }
297*77799ccaSWu Mianzhi 
298*77799ccaSWu Mianzhi     fn parent(&self) -> Option<alloc::sync::Weak<dyn KObject>> {
299*77799ccaSWu Mianzhi         todo!()
300*77799ccaSWu Mianzhi     }
301*77799ccaSWu Mianzhi 
302*77799ccaSWu Mianzhi     fn set_parent(&self, _parent: Option<alloc::sync::Weak<dyn KObject>>) {
303*77799ccaSWu Mianzhi         todo!()
304*77799ccaSWu Mianzhi     }
305*77799ccaSWu Mianzhi 
306*77799ccaSWu Mianzhi     fn kset(&self) -> Option<Arc<crate::driver::base::kset::KSet>> {
307*77799ccaSWu Mianzhi         todo!()
308*77799ccaSWu Mianzhi     }
309*77799ccaSWu Mianzhi 
310*77799ccaSWu Mianzhi     fn set_kset(&self, _kset: Option<Arc<crate::driver::base::kset::KSet>>) {
311*77799ccaSWu Mianzhi         todo!()
312*77799ccaSWu Mianzhi     }
313*77799ccaSWu Mianzhi 
314*77799ccaSWu Mianzhi     fn kobj_type(&self) -> Option<&'static dyn crate::driver::base::kobject::KObjType> {
315*77799ccaSWu Mianzhi         todo!()
316*77799ccaSWu Mianzhi     }
317*77799ccaSWu Mianzhi 
318*77799ccaSWu Mianzhi     fn name(&self) -> String {
319*77799ccaSWu Mianzhi         self.name.clone()
320*77799ccaSWu Mianzhi     }
321*77799ccaSWu Mianzhi 
322*77799ccaSWu Mianzhi     fn set_name(&self, _name: String) {
323*77799ccaSWu Mianzhi         todo!()
324*77799ccaSWu Mianzhi     }
325*77799ccaSWu Mianzhi 
326*77799ccaSWu Mianzhi     fn kobj_state(
327*77799ccaSWu Mianzhi         &self,
328*77799ccaSWu Mianzhi     ) -> crate::libs::rwlock::RwLockReadGuard<crate::driver::base::kobject::KObjectState> {
329*77799ccaSWu Mianzhi         todo!()
330*77799ccaSWu Mianzhi     }
331*77799ccaSWu Mianzhi 
332*77799ccaSWu Mianzhi     fn kobj_state_mut(
333*77799ccaSWu Mianzhi         &self,
334*77799ccaSWu Mianzhi     ) -> crate::libs::rwlock::RwLockWriteGuard<crate::driver::base::kobject::KObjectState> {
335*77799ccaSWu Mianzhi         todo!()
336*77799ccaSWu Mianzhi     }
337*77799ccaSWu Mianzhi 
338*77799ccaSWu Mianzhi     fn set_kobj_state(&self, _state: KObjectState) {
339*77799ccaSWu Mianzhi         todo!()
340*77799ccaSWu Mianzhi     }
341*77799ccaSWu Mianzhi 
342*77799ccaSWu Mianzhi     fn set_kobj_type(&self, _ktype: Option<&'static dyn KObjType>) {
343*77799ccaSWu Mianzhi         todo!()
344*77799ccaSWu Mianzhi     }
345*77799ccaSWu Mianzhi }
346*77799ccaSWu Mianzhi 
347*77799ccaSWu Mianzhi pub fn e1000e_driver_init(device: E1000EDevice) {
348*77799ccaSWu Mianzhi     let mac = smoltcp::wire::EthernetAddress::from_bytes(&device.mac_address());
349*77799ccaSWu Mianzhi     let driver = E1000EDriver::new(device);
350*77799ccaSWu Mianzhi     let iface = E1000EInterface::new(driver);
351*77799ccaSWu Mianzhi     // 将网卡的接口信息注册到全局的网卡接口信息表中
352*77799ccaSWu Mianzhi     NET_DRIVERS.write().insert(iface.nic_id(), iface.clone());
353*77799ccaSWu Mianzhi     kinfo!("e1000e driver init successfully!\tMAC: [{}]", mac);
354*77799ccaSWu Mianzhi }
355