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