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