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