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