xref: /DragonOS/kernel/src/driver/net/e1000e/e1000e_driver.rs (revision 2eab6dd743e94a86a685f1f3c01e599adf86610a)
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,
8e32effb1SLoGin             device::{bus::Bus, driver::Driver, Device, DeviceType, IdTable},
977799ccaSWu Mianzhi             kobject::{KObjType, KObject, KObjectState},
1077799ccaSWu Mianzhi         },
11e32effb1SLoGin         net::NetDevice,
1277799ccaSWu Mianzhi     },
1377799ccaSWu Mianzhi     libs::spinlock::SpinLock,
14e32effb1SLoGin     net::{generate_iface_id, NET_DEVICES},
1577799ccaSWu Mianzhi     time::Instant,
1677799ccaSWu Mianzhi };
17c566df45SLoGin use alloc::{
18c566df45SLoGin     string::String,
19c566df45SLoGin     sync::{Arc, Weak},
20c566df45SLoGin };
2177799ccaSWu Mianzhi use core::{
2277799ccaSWu Mianzhi     cell::UnsafeCell,
2377799ccaSWu Mianzhi     fmt::Debug,
2477799ccaSWu Mianzhi     ops::{Deref, DerefMut},
2577799ccaSWu Mianzhi };
26*2eab6dd7S曾俊 use log::info;
27881ff6f9Syuyi2439 use smoltcp::{
28881ff6f9Syuyi2439     phy,
29881ff6f9Syuyi2439     wire::{self, HardwareAddress},
30881ff6f9Syuyi2439 };
3191e9d4abSLoGin use system_error::SystemError;
3277799ccaSWu Mianzhi 
3377799ccaSWu Mianzhi use super::e1000e::{E1000EBuffer, E1000EDevice};
3477799ccaSWu Mianzhi 
3577799ccaSWu Mianzhi pub struct E1000ERxToken(E1000EBuffer);
3677799ccaSWu Mianzhi pub struct E1000ETxToken {
3777799ccaSWu Mianzhi     driver: E1000EDriver,
3877799ccaSWu Mianzhi }
3977799ccaSWu Mianzhi pub struct E1000EDriver {
4077799ccaSWu Mianzhi     pub inner: Arc<SpinLock<E1000EDevice>>,
4177799ccaSWu Mianzhi }
42b5b571e0SLoGin unsafe impl Send for E1000EDriver {}
43b5b571e0SLoGin unsafe impl Sync for E1000EDriver {}
4477799ccaSWu Mianzhi 
4577799ccaSWu Mianzhi /// @brief 网卡驱动的包裹器,这是为了获取网卡驱动的可变引用而设计的。
4677799ccaSWu Mianzhi /// 参阅virtio_net.rs
4777799ccaSWu Mianzhi struct E1000EDriverWrapper(UnsafeCell<E1000EDriver>);
4877799ccaSWu Mianzhi unsafe impl Send for E1000EDriverWrapper {}
4977799ccaSWu Mianzhi unsafe impl Sync for E1000EDriverWrapper {}
5077799ccaSWu Mianzhi 
5177799ccaSWu Mianzhi impl Deref for E1000EDriverWrapper {
5277799ccaSWu Mianzhi     type Target = E1000EDriver;
5377799ccaSWu Mianzhi     fn deref(&self) -> &Self::Target {
5477799ccaSWu Mianzhi         unsafe { &*self.0.get() }
5577799ccaSWu Mianzhi     }
5677799ccaSWu Mianzhi }
5777799ccaSWu Mianzhi impl DerefMut for E1000EDriverWrapper {
5877799ccaSWu Mianzhi     fn deref_mut(&mut self) -> &mut Self::Target {
5977799ccaSWu Mianzhi         unsafe { &mut *self.0.get() }
6077799ccaSWu Mianzhi     }
6177799ccaSWu Mianzhi }
6277799ccaSWu Mianzhi 
6377799ccaSWu Mianzhi impl E1000EDriverWrapper {
64b5b571e0SLoGin     #[allow(clippy::mut_from_ref)]
6577799ccaSWu Mianzhi     fn force_get_mut(&self) -> &mut E1000EDriver {
6677799ccaSWu Mianzhi         unsafe { &mut *self.0.get() }
6777799ccaSWu Mianzhi     }
6877799ccaSWu Mianzhi }
6977799ccaSWu Mianzhi 
7077799ccaSWu Mianzhi impl Debug for E1000EDriverWrapper {
7177799ccaSWu Mianzhi     fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
7277799ccaSWu Mianzhi         f.debug_struct("E1000ENICDriver").finish()
7377799ccaSWu Mianzhi     }
7477799ccaSWu Mianzhi }
7577799ccaSWu Mianzhi 
7677799ccaSWu Mianzhi pub struct E1000EInterface {
7777799ccaSWu Mianzhi     driver: E1000EDriverWrapper,
7877799ccaSWu Mianzhi     iface_id: usize,
7977799ccaSWu Mianzhi     iface: SpinLock<smoltcp::iface::Interface>,
8077799ccaSWu Mianzhi     name: String,
8177799ccaSWu Mianzhi }
8277799ccaSWu Mianzhi impl phy::RxToken for E1000ERxToken {
8377799ccaSWu Mianzhi     fn consume<R, F>(mut self, f: F) -> R
8477799ccaSWu Mianzhi     where
8577799ccaSWu Mianzhi         F: FnOnce(&mut [u8]) -> R,
8677799ccaSWu Mianzhi     {
87b5b571e0SLoGin         let result = f(self.0.as_mut_slice());
8877799ccaSWu Mianzhi         self.0.free_buffer();
8977799ccaSWu Mianzhi         return result;
9077799ccaSWu Mianzhi     }
9177799ccaSWu Mianzhi }
9277799ccaSWu Mianzhi 
9377799ccaSWu Mianzhi impl phy::TxToken for E1000ETxToken {
94971462beSGnoCiYeH     fn consume<R, F>(self, _len: usize, f: F) -> R
9577799ccaSWu Mianzhi     where
9677799ccaSWu Mianzhi         F: FnOnce(&mut [u8]) -> R,
9777799ccaSWu Mianzhi     {
9877799ccaSWu Mianzhi         let mut buffer = E1000EBuffer::new(4096);
9977799ccaSWu Mianzhi         let result = f(buffer.as_mut_slice());
10077799ccaSWu Mianzhi         let mut device = self.driver.inner.lock();
10177799ccaSWu Mianzhi         device.e1000e_transmit(buffer);
1022f6f547aSGnoCiYeH         buffer.free_buffer();
10377799ccaSWu Mianzhi         return result;
10477799ccaSWu Mianzhi     }
10577799ccaSWu Mianzhi }
10677799ccaSWu Mianzhi 
10777799ccaSWu Mianzhi impl E1000EDriver {
108b5b571e0SLoGin     #[allow(clippy::arc_with_non_send_sync)]
10977799ccaSWu Mianzhi     pub fn new(device: E1000EDevice) -> Self {
110881ff6f9Syuyi2439         let mut iface_config = smoltcp::iface::Config::new(HardwareAddress::Ethernet(
11177799ccaSWu Mianzhi             smoltcp::wire::EthernetAddress(device.mac_address()),
11277799ccaSWu Mianzhi         ));
11377799ccaSWu Mianzhi 
114881ff6f9Syuyi2439         iface_config.random_seed = rand() as u64;
115881ff6f9Syuyi2439 
11677799ccaSWu Mianzhi         let inner: Arc<SpinLock<E1000EDevice>> = Arc::new(SpinLock::new(device));
11777799ccaSWu Mianzhi         let result = E1000EDriver { inner };
11877799ccaSWu Mianzhi         return result;
11977799ccaSWu Mianzhi     }
12077799ccaSWu Mianzhi }
12177799ccaSWu Mianzhi 
12277799ccaSWu Mianzhi impl Clone for E1000EDriver {
12377799ccaSWu Mianzhi     fn clone(&self) -> Self {
12477799ccaSWu Mianzhi         return E1000EDriver {
12577799ccaSWu Mianzhi             inner: self.inner.clone(),
12677799ccaSWu Mianzhi         };
12777799ccaSWu Mianzhi     }
12877799ccaSWu Mianzhi }
12977799ccaSWu Mianzhi 
13077799ccaSWu Mianzhi impl phy::Device for E1000EDriver {
13177799ccaSWu Mianzhi     type RxToken<'a> = E1000ERxToken;
13277799ccaSWu Mianzhi     type TxToken<'a> = E1000ETxToken;
13377799ccaSWu Mianzhi 
13477799ccaSWu Mianzhi     fn receive(
13577799ccaSWu Mianzhi         &mut self,
13677799ccaSWu Mianzhi         _timestamp: smoltcp::time::Instant,
13777799ccaSWu Mianzhi     ) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
13877799ccaSWu Mianzhi         match self.inner.lock().e1000e_receive() {
13977799ccaSWu Mianzhi             Some(buffer) => Some((
14077799ccaSWu Mianzhi                 E1000ERxToken(buffer),
14177799ccaSWu Mianzhi                 E1000ETxToken {
14277799ccaSWu Mianzhi                     driver: self.clone(),
14377799ccaSWu Mianzhi                 },
14477799ccaSWu Mianzhi             )),
14577799ccaSWu Mianzhi             None => {
14677799ccaSWu Mianzhi                 return None;
14777799ccaSWu Mianzhi             }
14877799ccaSWu Mianzhi         }
14977799ccaSWu Mianzhi     }
15077799ccaSWu Mianzhi 
15177799ccaSWu Mianzhi     fn transmit(&mut self, _timestamp: smoltcp::time::Instant) -> Option<Self::TxToken<'_>> {
15277799ccaSWu Mianzhi         match self.inner.lock().e1000e_can_transmit() {
15377799ccaSWu Mianzhi             true => Some(E1000ETxToken {
15477799ccaSWu Mianzhi                 driver: self.clone(),
15577799ccaSWu Mianzhi             }),
15677799ccaSWu Mianzhi             false => None,
15777799ccaSWu Mianzhi         }
15877799ccaSWu Mianzhi     }
15977799ccaSWu Mianzhi 
16077799ccaSWu Mianzhi     fn capabilities(&self) -> smoltcp::phy::DeviceCapabilities {
16177799ccaSWu Mianzhi         let mut caps = smoltcp::phy::DeviceCapabilities::default();
16277799ccaSWu Mianzhi         // 网卡的最大传输单元. 请与IP层的MTU进行区分。这个值应当是网卡的最大传输单元,而不是IP层的MTU。
16377799ccaSWu 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.
16477799ccaSWu Mianzhi         // 82574l manual pp205
16577799ccaSWu Mianzhi         caps.max_transmission_unit = 1536;
16677799ccaSWu Mianzhi         /*
16777799ccaSWu Mianzhi            Maximum burst size, in terms of MTU.
16877799ccaSWu Mianzhi            The network device is unable to send or receive bursts large than the value returned by this function.
16977799ccaSWu Mianzhi            If None, there is no fixed limit on burst size, e.g. if network buffers are dynamically allocated.
17077799ccaSWu Mianzhi         */
17177799ccaSWu Mianzhi         caps.max_burst_size = Some(1);
17277799ccaSWu Mianzhi         return caps;
17377799ccaSWu Mianzhi     }
17477799ccaSWu Mianzhi }
17577799ccaSWu Mianzhi 
17677799ccaSWu Mianzhi impl E1000EInterface {
17777799ccaSWu Mianzhi     pub fn new(mut driver: E1000EDriver) -> Arc<Self> {
17877799ccaSWu Mianzhi         let iface_id = generate_iface_id();
179881ff6f9Syuyi2439         let mut iface_config = smoltcp::iface::Config::new(HardwareAddress::Ethernet(
18077799ccaSWu Mianzhi             smoltcp::wire::EthernetAddress(driver.inner.lock().mac_address()),
18177799ccaSWu Mianzhi         ));
182881ff6f9Syuyi2439         iface_config.random_seed = rand() as u64;
183881ff6f9Syuyi2439 
184881ff6f9Syuyi2439         let iface =
185881ff6f9Syuyi2439             smoltcp::iface::Interface::new(iface_config, &mut driver, Instant::now().into());
18677799ccaSWu Mianzhi 
18777799ccaSWu Mianzhi         let driver: E1000EDriverWrapper = E1000EDriverWrapper(UnsafeCell::new(driver));
18877799ccaSWu Mianzhi         let result = Arc::new(E1000EInterface {
18977799ccaSWu Mianzhi             driver,
19077799ccaSWu Mianzhi             iface_id,
19177799ccaSWu Mianzhi             iface: SpinLock::new(iface),
19277799ccaSWu Mianzhi             name: format!("eth{}", iface_id),
19377799ccaSWu Mianzhi         });
19477799ccaSWu Mianzhi 
19577799ccaSWu Mianzhi         return result;
19677799ccaSWu Mianzhi     }
19777799ccaSWu Mianzhi }
19877799ccaSWu Mianzhi 
19977799ccaSWu Mianzhi impl Debug for E1000EInterface {
20077799ccaSWu Mianzhi     fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
20177799ccaSWu Mianzhi         f.debug_struct("E1000EInterface")
20277799ccaSWu Mianzhi             .field("iface_id", &self.iface_id)
20377799ccaSWu Mianzhi             .field("iface", &"smoltcp::iface::Interface")
20477799ccaSWu Mianzhi             .field("name", &self.name)
20577799ccaSWu Mianzhi             .finish()
20677799ccaSWu Mianzhi     }
20777799ccaSWu Mianzhi }
20877799ccaSWu Mianzhi 
209e32effb1SLoGin impl Device for E1000EInterface {
210e32effb1SLoGin     fn dev_type(&self) -> DeviceType {
21177799ccaSWu Mianzhi         todo!()
21277799ccaSWu Mianzhi     }
21377799ccaSWu Mianzhi 
214e32effb1SLoGin     fn id_table(&self) -> IdTable {
21577799ccaSWu Mianzhi         todo!()
21677799ccaSWu Mianzhi     }
21777799ccaSWu Mianzhi 
218c566df45SLoGin     fn set_bus(&self, _bus: Option<Weak<dyn Bus>>) {
21977799ccaSWu Mianzhi         todo!()
22077799ccaSWu Mianzhi     }
221e32effb1SLoGin 
222e32effb1SLoGin     fn set_class(&self, _class: Option<Weak<dyn Class>>) {
223e32effb1SLoGin         todo!()
22477799ccaSWu Mianzhi     }
22577799ccaSWu Mianzhi 
226e32effb1SLoGin     fn driver(&self) -> Option<Arc<dyn Driver>> {
227e32effb1SLoGin         todo!()
228e32effb1SLoGin     }
229e32effb1SLoGin 
230e32effb1SLoGin     fn set_driver(&self, _driver: Option<Weak<dyn Driver>>) {
231e32effb1SLoGin         todo!()
232e32effb1SLoGin     }
233e32effb1SLoGin 
234e32effb1SLoGin     fn is_dead(&self) -> bool {
235e32effb1SLoGin         todo!()
236e32effb1SLoGin     }
237e32effb1SLoGin 
238e32effb1SLoGin     fn can_match(&self) -> bool {
239e32effb1SLoGin         todo!()
240e32effb1SLoGin     }
241e32effb1SLoGin 
242e32effb1SLoGin     fn set_can_match(&self, _can_match: bool) {
243e32effb1SLoGin         todo!()
244e32effb1SLoGin     }
245e32effb1SLoGin 
246e32effb1SLoGin     fn state_synced(&self) -> bool {
247e32effb1SLoGin         todo!()
248e32effb1SLoGin     }
249e32effb1SLoGin }
250e32effb1SLoGin 
251e32effb1SLoGin impl NetDevice for E1000EInterface {
25277799ccaSWu Mianzhi     fn mac(&self) -> smoltcp::wire::EthernetAddress {
25377799ccaSWu Mianzhi         let mac = self.driver.inner.lock().mac_address();
25477799ccaSWu Mianzhi         return smoltcp::wire::EthernetAddress::from_bytes(&mac);
25577799ccaSWu Mianzhi     }
25677799ccaSWu Mianzhi 
25777799ccaSWu Mianzhi     #[inline]
25877799ccaSWu Mianzhi     fn nic_id(&self) -> usize {
25977799ccaSWu Mianzhi         return self.iface_id;
26077799ccaSWu Mianzhi     }
26177799ccaSWu Mianzhi 
26277799ccaSWu Mianzhi     #[inline]
26377799ccaSWu Mianzhi     fn name(&self) -> String {
26477799ccaSWu Mianzhi         return self.name.clone();
26577799ccaSWu Mianzhi     }
26677799ccaSWu Mianzhi 
26777799ccaSWu Mianzhi     fn update_ip_addrs(&self, ip_addrs: &[wire::IpCidr]) -> Result<(), SystemError> {
26877799ccaSWu Mianzhi         if ip_addrs.len() != 1 {
26977799ccaSWu Mianzhi             return Err(SystemError::EINVAL);
27077799ccaSWu Mianzhi         }
27177799ccaSWu Mianzhi 
27277799ccaSWu Mianzhi         self.iface.lock().update_ip_addrs(|addrs| {
27377799ccaSWu Mianzhi             let dest = addrs.iter_mut().next();
274b5b571e0SLoGin 
275b5b571e0SLoGin             if let Some(dest) = dest {
27677799ccaSWu Mianzhi                 *dest = ip_addrs[0];
277b5b571e0SLoGin             } else {
278b5b571e0SLoGin                 addrs.push(ip_addrs[0]).expect("Push ipCidr failed: full");
27977799ccaSWu Mianzhi             }
28077799ccaSWu Mianzhi         });
28177799ccaSWu Mianzhi         return Ok(());
28277799ccaSWu Mianzhi     }
28377799ccaSWu Mianzhi 
28491e9d4abSLoGin     fn poll(&self, sockets: &mut smoltcp::iface::SocketSet) -> Result<(), SystemError> {
28577799ccaSWu Mianzhi         let timestamp: smoltcp::time::Instant = Instant::now().into();
28677799ccaSWu Mianzhi         let mut guard = self.iface.lock();
28777799ccaSWu Mianzhi         let poll_res = guard.poll(timestamp, self.driver.force_get_mut(), sockets);
28877799ccaSWu Mianzhi         if poll_res {
28977799ccaSWu Mianzhi             return Ok(());
29077799ccaSWu Mianzhi         }
29177799ccaSWu Mianzhi         return Err(SystemError::EAGAIN_OR_EWOULDBLOCK);
29277799ccaSWu Mianzhi     }
29377799ccaSWu Mianzhi 
29477799ccaSWu Mianzhi     #[inline(always)]
29577799ccaSWu Mianzhi     fn inner_iface(&self) -> &SpinLock<smoltcp::iface::Interface> {
29677799ccaSWu Mianzhi         return &self.iface;
29777799ccaSWu Mianzhi     }
29877799ccaSWu Mianzhi }
29977799ccaSWu Mianzhi 
30077799ccaSWu Mianzhi impl KObject for E1000EInterface {
30177799ccaSWu Mianzhi     fn as_any_ref(&self) -> &dyn core::any::Any {
30277799ccaSWu Mianzhi         self
30377799ccaSWu Mianzhi     }
30477799ccaSWu Mianzhi 
30577799ccaSWu Mianzhi     fn set_inode(&self, _inode: Option<Arc<crate::filesystem::kernfs::KernFSInode>>) {
30677799ccaSWu Mianzhi         todo!()
30777799ccaSWu Mianzhi     }
30877799ccaSWu Mianzhi 
30977799ccaSWu Mianzhi     fn inode(&self) -> Option<Arc<crate::filesystem::kernfs::KernFSInode>> {
31077799ccaSWu Mianzhi         todo!()
31177799ccaSWu Mianzhi     }
31277799ccaSWu Mianzhi 
31377799ccaSWu Mianzhi     fn parent(&self) -> Option<alloc::sync::Weak<dyn KObject>> {
31477799ccaSWu Mianzhi         todo!()
31577799ccaSWu Mianzhi     }
31677799ccaSWu Mianzhi 
31777799ccaSWu Mianzhi     fn set_parent(&self, _parent: Option<alloc::sync::Weak<dyn KObject>>) {
31877799ccaSWu Mianzhi         todo!()
31977799ccaSWu Mianzhi     }
32077799ccaSWu Mianzhi 
32177799ccaSWu Mianzhi     fn kset(&self) -> Option<Arc<crate::driver::base::kset::KSet>> {
32277799ccaSWu Mianzhi         todo!()
32377799ccaSWu Mianzhi     }
32477799ccaSWu Mianzhi 
32577799ccaSWu Mianzhi     fn set_kset(&self, _kset: Option<Arc<crate::driver::base::kset::KSet>>) {
32677799ccaSWu Mianzhi         todo!()
32777799ccaSWu Mianzhi     }
32877799ccaSWu Mianzhi 
32977799ccaSWu Mianzhi     fn kobj_type(&self) -> Option<&'static dyn crate::driver::base::kobject::KObjType> {
33077799ccaSWu Mianzhi         todo!()
33177799ccaSWu Mianzhi     }
33277799ccaSWu Mianzhi 
33377799ccaSWu Mianzhi     fn name(&self) -> String {
33477799ccaSWu Mianzhi         self.name.clone()
33577799ccaSWu Mianzhi     }
33677799ccaSWu Mianzhi 
33777799ccaSWu Mianzhi     fn set_name(&self, _name: String) {
33877799ccaSWu Mianzhi         todo!()
33977799ccaSWu Mianzhi     }
34077799ccaSWu Mianzhi 
34177799ccaSWu Mianzhi     fn kobj_state(
34277799ccaSWu Mianzhi         &self,
34377799ccaSWu Mianzhi     ) -> crate::libs::rwlock::RwLockReadGuard<crate::driver::base::kobject::KObjectState> {
34477799ccaSWu Mianzhi         todo!()
34577799ccaSWu Mianzhi     }
34677799ccaSWu Mianzhi 
34777799ccaSWu Mianzhi     fn kobj_state_mut(
34877799ccaSWu Mianzhi         &self,
34977799ccaSWu Mianzhi     ) -> crate::libs::rwlock::RwLockWriteGuard<crate::driver::base::kobject::KObjectState> {
35077799ccaSWu Mianzhi         todo!()
35177799ccaSWu Mianzhi     }
35277799ccaSWu Mianzhi 
35377799ccaSWu Mianzhi     fn set_kobj_state(&self, _state: KObjectState) {
35477799ccaSWu Mianzhi         todo!()
35577799ccaSWu Mianzhi     }
35677799ccaSWu Mianzhi 
35777799ccaSWu Mianzhi     fn set_kobj_type(&self, _ktype: Option<&'static dyn KObjType>) {
35877799ccaSWu Mianzhi         todo!()
35977799ccaSWu Mianzhi     }
36077799ccaSWu Mianzhi }
36177799ccaSWu Mianzhi 
36277799ccaSWu Mianzhi pub fn e1000e_driver_init(device: E1000EDevice) {
36377799ccaSWu Mianzhi     let mac = smoltcp::wire::EthernetAddress::from_bytes(&device.mac_address());
36477799ccaSWu Mianzhi     let driver = E1000EDriver::new(device);
36577799ccaSWu Mianzhi     let iface = E1000EInterface::new(driver);
36677799ccaSWu Mianzhi     // 将网卡的接口信息注册到全局的网卡接口信息表中
367e32effb1SLoGin     NET_DEVICES
3680d6cf65aSLoGin         .write_irqsave()
3690d6cf65aSLoGin         .insert(iface.nic_id(), iface.clone());
370*2eab6dd7S曾俊     info!("e1000e driver init successfully!\tMAC: [{}]", mac);
37177799ccaSWu Mianzhi }
372