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 buffer.free_buffer(); 92 return result; 93 } 94 } 95 96 impl E1000EDriver { 97 pub fn new(device: E1000EDevice) -> Self { 98 let mut iface_config = smoltcp::iface::Config::new(); 99 100 // todo: 随机设定这个值。 101 // 参见 https://docs.rs/smoltcp/latest/smoltcp/iface/struct.Config.html#structfield.random_seed 102 iface_config.random_seed = 12345; 103 104 iface_config.hardware_addr = Some(wire::HardwareAddress::Ethernet( 105 smoltcp::wire::EthernetAddress(device.mac_address()), 106 )); 107 108 let inner: Arc<SpinLock<E1000EDevice>> = Arc::new(SpinLock::new(device)); 109 let result = E1000EDriver { inner }; 110 return result; 111 } 112 } 113 114 impl Clone for E1000EDriver { 115 fn clone(&self) -> Self { 116 return E1000EDriver { 117 inner: self.inner.clone(), 118 }; 119 } 120 } 121 122 impl phy::Device for E1000EDriver { 123 type RxToken<'a> = E1000ERxToken; 124 type TxToken<'a> = E1000ETxToken; 125 126 fn receive( 127 &mut self, 128 _timestamp: smoltcp::time::Instant, 129 ) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> { 130 match self.inner.lock().e1000e_receive() { 131 Some(buffer) => Some(( 132 E1000ERxToken(buffer), 133 E1000ETxToken { 134 driver: self.clone(), 135 }, 136 )), 137 None => { 138 return None; 139 } 140 } 141 } 142 143 fn transmit(&mut self, _timestamp: smoltcp::time::Instant) -> Option<Self::TxToken<'_>> { 144 match self.inner.lock().e1000e_can_transmit() { 145 true => Some(E1000ETxToken { 146 driver: self.clone(), 147 }), 148 false => None, 149 } 150 } 151 152 fn capabilities(&self) -> smoltcp::phy::DeviceCapabilities { 153 let mut caps = smoltcp::phy::DeviceCapabilities::default(); 154 // 网卡的最大传输单元. 请与IP层的MTU进行区分。这个值应当是网卡的最大传输单元,而不是IP层的MTU。 155 // 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. 156 // 82574l manual pp205 157 caps.max_transmission_unit = 1536; 158 /* 159 Maximum burst size, in terms of MTU. 160 The network device is unable to send or receive bursts large than the value returned by this function. 161 If None, there is no fixed limit on burst size, e.g. if network buffers are dynamically allocated. 162 */ 163 caps.max_burst_size = Some(1); 164 return caps; 165 } 166 } 167 168 impl E1000EInterface { 169 pub fn new(mut driver: E1000EDriver) -> Arc<Self> { 170 let iface_id = generate_iface_id(); 171 let mut iface_config = smoltcp::iface::Config::new(); 172 173 // todo: 随机设定这个值。 174 // 参见 https://docs.rs/smoltcp/latest/smoltcp/iface/struct.Config.html#structfield.random_seed 175 iface_config.random_seed = 12345; 176 177 iface_config.hardware_addr = Some(wire::HardwareAddress::Ethernet( 178 smoltcp::wire::EthernetAddress(driver.inner.lock().mac_address()), 179 )); 180 let iface = smoltcp::iface::Interface::new(iface_config, &mut driver); 181 182 let driver: E1000EDriverWrapper = E1000EDriverWrapper(UnsafeCell::new(driver)); 183 let result = Arc::new(E1000EInterface { 184 driver, 185 iface_id, 186 iface: SpinLock::new(iface), 187 name: format!("eth{}", iface_id), 188 }); 189 190 return result; 191 } 192 } 193 194 impl Debug for E1000EInterface { 195 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { 196 f.debug_struct("E1000EInterface") 197 .field("iface_id", &self.iface_id) 198 .field("iface", &"smoltcp::iface::Interface") 199 .field("name", &self.name) 200 .finish() 201 } 202 } 203 204 impl Driver for E1000EInterface { 205 fn id_table(&self) -> Option<IdTable> { 206 todo!() 207 } 208 209 fn add_device(&self, _device: Arc<dyn Device>) { 210 todo!() 211 } 212 213 fn delete_device(&self, _device: &Arc<dyn Device>) { 214 todo!() 215 } 216 217 fn devices(&self) -> alloc::vec::Vec<Arc<dyn Device>> { 218 todo!() 219 } 220 221 fn bus(&self) -> Option<Arc<dyn Bus>> { 222 todo!() 223 } 224 225 fn set_bus(&self, _bus: Option<Arc<dyn Bus>>) { 226 todo!() 227 } 228 } 229 230 impl NetDriver for E1000EInterface { 231 fn mac(&self) -> smoltcp::wire::EthernetAddress { 232 let mac = self.driver.inner.lock().mac_address(); 233 return smoltcp::wire::EthernetAddress::from_bytes(&mac); 234 } 235 236 #[inline] 237 fn nic_id(&self) -> usize { 238 return self.iface_id; 239 } 240 241 #[inline] 242 fn name(&self) -> String { 243 return self.name.clone(); 244 } 245 246 fn update_ip_addrs(&self, ip_addrs: &[wire::IpCidr]) -> Result<(), SystemError> { 247 if ip_addrs.len() != 1 { 248 return Err(SystemError::EINVAL); 249 } 250 251 self.iface.lock().update_ip_addrs(|addrs| { 252 let dest = addrs.iter_mut().next(); 253 if let None = dest { 254 addrs.push(ip_addrs[0]).expect("Push ipCidr failed: full"); 255 } else { 256 let dest = dest.unwrap(); 257 *dest = ip_addrs[0]; 258 } 259 }); 260 return Ok(()); 261 } 262 263 fn poll( 264 &self, 265 sockets: &mut smoltcp::iface::SocketSet, 266 ) -> Result<(), crate::syscall::SystemError> { 267 let timestamp: smoltcp::time::Instant = Instant::now().into(); 268 let mut guard = self.iface.lock(); 269 let poll_res = guard.poll(timestamp, self.driver.force_get_mut(), sockets); 270 if poll_res { 271 return Ok(()); 272 } 273 return Err(SystemError::EAGAIN_OR_EWOULDBLOCK); 274 } 275 276 #[inline(always)] 277 fn inner_iface(&self) -> &SpinLock<smoltcp::iface::Interface> { 278 return &self.iface; 279 } 280 } 281 282 impl KObject for E1000EInterface { 283 fn as_any_ref(&self) -> &dyn core::any::Any { 284 self 285 } 286 287 fn set_inode(&self, _inode: Option<Arc<crate::filesystem::kernfs::KernFSInode>>) { 288 todo!() 289 } 290 291 fn inode(&self) -> Option<Arc<crate::filesystem::kernfs::KernFSInode>> { 292 todo!() 293 } 294 295 fn parent(&self) -> Option<alloc::sync::Weak<dyn KObject>> { 296 todo!() 297 } 298 299 fn set_parent(&self, _parent: Option<alloc::sync::Weak<dyn KObject>>) { 300 todo!() 301 } 302 303 fn kset(&self) -> Option<Arc<crate::driver::base::kset::KSet>> { 304 todo!() 305 } 306 307 fn set_kset(&self, _kset: Option<Arc<crate::driver::base::kset::KSet>>) { 308 todo!() 309 } 310 311 fn kobj_type(&self) -> Option<&'static dyn crate::driver::base::kobject::KObjType> { 312 todo!() 313 } 314 315 fn name(&self) -> String { 316 self.name.clone() 317 } 318 319 fn set_name(&self, _name: String) { 320 todo!() 321 } 322 323 fn kobj_state( 324 &self, 325 ) -> crate::libs::rwlock::RwLockReadGuard<crate::driver::base::kobject::KObjectState> { 326 todo!() 327 } 328 329 fn kobj_state_mut( 330 &self, 331 ) -> crate::libs::rwlock::RwLockWriteGuard<crate::driver::base::kobject::KObjectState> { 332 todo!() 333 } 334 335 fn set_kobj_state(&self, _state: KObjectState) { 336 todo!() 337 } 338 339 fn set_kobj_type(&self, _ktype: Option<&'static dyn KObjType>) { 340 todo!() 341 } 342 } 343 344 pub fn e1000e_driver_init(device: E1000EDevice) { 345 let mac = smoltcp::wire::EthernetAddress::from_bytes(&device.mac_address()); 346 let driver = E1000EDriver::new(device); 347 let iface = E1000EInterface::new(driver); 348 // 将网卡的接口信息注册到全局的网卡接口信息表中 349 NET_DRIVERS.write().insert(iface.nic_id(), iface.clone()); 350 kinfo!("e1000e driver init successfully!\tMAC: [{}]", mac); 351 } 352