1 //这个文件的绝大部分内容是copy virtio_net.rs的,考虑到所有的驱动都要用操作系统提供的协议栈,我觉得可以把这些内容抽象出来 2 3 use crate::{ 4 arch::rand::rand, 5 driver::{ 6 base::{ 7 class::Class, 8 device::{bus::Bus, driver::Driver, Device, DeviceCommonData, DeviceType, IdTable}, 9 kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState}, 10 }, 11 net::{register_netdevice, NetDeivceState, NetDevice, NetDeviceCommonData, Operstate}, 12 }, 13 libs::{ 14 rwlock::{RwLockReadGuard, RwLockWriteGuard}, 15 spinlock::{SpinLock, SpinLockGuard}, 16 }, 17 net::{generate_iface_id, NET_DEVICES}, 18 time::Instant, 19 }; 20 use alloc::{ 21 string::{String, ToString}, 22 sync::{Arc, Weak}, 23 }; 24 use core::{ 25 cell::UnsafeCell, 26 fmt::Debug, 27 ops::{Deref, DerefMut}, 28 }; 29 use log::info; 30 use smoltcp::{ 31 phy, 32 wire::{self, HardwareAddress}, 33 }; 34 use system_error::SystemError; 35 36 use super::e1000e::{E1000EBuffer, E1000EDevice}; 37 38 const DEVICE_NAME: &str = "e1000e"; 39 40 pub struct E1000ERxToken(E1000EBuffer); 41 pub struct E1000ETxToken { 42 driver: E1000EDriver, 43 } 44 pub struct E1000EDriver { 45 pub inner: Arc<SpinLock<E1000EDevice>>, 46 } 47 unsafe impl Send for E1000EDriver {} 48 unsafe impl Sync for E1000EDriver {} 49 50 /// @brief 网卡驱动的包裹器,这是为了获取网卡驱动的可变引用而设计的。 51 /// 参阅virtio_net.rs 52 struct E1000EDriverWrapper(UnsafeCell<E1000EDriver>); 53 unsafe impl Send for E1000EDriverWrapper {} 54 unsafe impl Sync for E1000EDriverWrapper {} 55 56 impl Deref for E1000EDriverWrapper { 57 type Target = E1000EDriver; 58 fn deref(&self) -> &Self::Target { 59 unsafe { &*self.0.get() } 60 } 61 } 62 impl DerefMut for E1000EDriverWrapper { 63 fn deref_mut(&mut self) -> &mut Self::Target { 64 unsafe { &mut *self.0.get() } 65 } 66 } 67 68 impl E1000EDriverWrapper { 69 #[allow(clippy::mut_from_ref)] 70 fn force_get_mut(&self) -> &mut E1000EDriver { 71 unsafe { &mut *self.0.get() } 72 } 73 } 74 75 impl Debug for E1000EDriverWrapper { 76 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { 77 f.debug_struct("E1000ENICDriver").finish() 78 } 79 } 80 81 #[cast_to([sync] NetDevice)] 82 #[cast_to([sync] Device)] 83 pub struct E1000EInterface { 84 driver: E1000EDriverWrapper, 85 iface_id: usize, 86 iface: SpinLock<smoltcp::iface::Interface>, 87 name: String, 88 inner: SpinLock<InnerE1000EInterface>, 89 locked_kobj_state: LockedKObjectState, 90 } 91 92 #[derive(Debug)] 93 pub struct InnerE1000EInterface { 94 netdevice_common: NetDeviceCommonData, 95 device_common: DeviceCommonData, 96 kobj_common: KObjectCommonData, 97 } 98 99 impl phy::RxToken for E1000ERxToken { 100 fn consume<R, F>(mut self, f: F) -> R 101 where 102 F: FnOnce(&mut [u8]) -> R, 103 { 104 let result = f(self.0.as_mut_slice()); 105 self.0.free_buffer(); 106 return result; 107 } 108 } 109 110 impl phy::TxToken for E1000ETxToken { 111 fn consume<R, F>(self, _len: usize, f: F) -> R 112 where 113 F: FnOnce(&mut [u8]) -> R, 114 { 115 let mut buffer = E1000EBuffer::new(4096); 116 let result = f(buffer.as_mut_slice()); 117 let mut device = self.driver.inner.lock(); 118 device.e1000e_transmit(buffer); 119 buffer.free_buffer(); 120 return result; 121 } 122 } 123 124 impl E1000EDriver { 125 #[allow(clippy::arc_with_non_send_sync)] 126 pub fn new(device: E1000EDevice) -> Self { 127 let mut iface_config = smoltcp::iface::Config::new(HardwareAddress::Ethernet( 128 smoltcp::wire::EthernetAddress(device.mac_address()), 129 )); 130 131 iface_config.random_seed = rand() as u64; 132 133 let inner: Arc<SpinLock<E1000EDevice>> = Arc::new(SpinLock::new(device)); 134 let result = E1000EDriver { inner }; 135 return result; 136 } 137 } 138 139 impl Clone for E1000EDriver { 140 fn clone(&self) -> Self { 141 return E1000EDriver { 142 inner: self.inner.clone(), 143 }; 144 } 145 } 146 147 impl phy::Device for E1000EDriver { 148 type RxToken<'a> = E1000ERxToken; 149 type TxToken<'a> = E1000ETxToken; 150 151 fn receive( 152 &mut self, 153 _timestamp: smoltcp::time::Instant, 154 ) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> { 155 match self.inner.lock().e1000e_receive() { 156 Some(buffer) => Some(( 157 E1000ERxToken(buffer), 158 E1000ETxToken { 159 driver: self.clone(), 160 }, 161 )), 162 None => { 163 return None; 164 } 165 } 166 } 167 168 fn transmit(&mut self, _timestamp: smoltcp::time::Instant) -> Option<Self::TxToken<'_>> { 169 match self.inner.lock().e1000e_can_transmit() { 170 true => Some(E1000ETxToken { 171 driver: self.clone(), 172 }), 173 false => None, 174 } 175 } 176 177 fn capabilities(&self) -> smoltcp::phy::DeviceCapabilities { 178 let mut caps = smoltcp::phy::DeviceCapabilities::default(); 179 // 网卡的最大传输单元. 请与IP层的MTU进行区分。这个值应当是网卡的最大传输单元,而不是IP层的MTU。 180 // 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. 181 // 82574l manual pp205 182 caps.max_transmission_unit = 1536; 183 /* 184 Maximum burst size, in terms of MTU. 185 The network device is unable to send or receive bursts large than the value returned by this function. 186 If None, there is no fixed limit on burst size, e.g. if network buffers are dynamically allocated. 187 */ 188 caps.max_burst_size = Some(1); 189 return caps; 190 } 191 } 192 193 impl E1000EInterface { 194 pub fn new(mut driver: E1000EDriver) -> Arc<Self> { 195 let iface_id = generate_iface_id(); 196 let mut iface_config = smoltcp::iface::Config::new(HardwareAddress::Ethernet( 197 smoltcp::wire::EthernetAddress(driver.inner.lock().mac_address()), 198 )); 199 iface_config.random_seed = rand() as u64; 200 201 let iface = 202 smoltcp::iface::Interface::new(iface_config, &mut driver, Instant::now().into()); 203 204 let driver: E1000EDriverWrapper = E1000EDriverWrapper(UnsafeCell::new(driver)); 205 let result = Arc::new(E1000EInterface { 206 driver, 207 iface_id, 208 iface: SpinLock::new(iface), 209 name: format!("eth{}", iface_id), 210 inner: SpinLock::new(InnerE1000EInterface { 211 netdevice_common: NetDeviceCommonData::default(), 212 device_common: DeviceCommonData::default(), 213 kobj_common: KObjectCommonData::default(), 214 }), 215 locked_kobj_state: LockedKObjectState::default(), 216 }); 217 218 return result; 219 } 220 221 pub fn inner(&self) -> SpinLockGuard<InnerE1000EInterface> { 222 return self.inner.lock(); 223 } 224 } 225 226 impl Debug for E1000EInterface { 227 fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { 228 f.debug_struct("E1000EInterface") 229 .field("iface_id", &self.iface_id) 230 .field("iface", &"smoltcp::iface::Interface") 231 .field("name", &self.name) 232 .finish() 233 } 234 } 235 236 impl Device for E1000EInterface { 237 fn dev_type(&self) -> DeviceType { 238 DeviceType::Net 239 } 240 241 fn id_table(&self) -> IdTable { 242 IdTable::new(DEVICE_NAME.to_string(), None) 243 } 244 245 fn bus(&self) -> Option<Weak<dyn Bus>> { 246 self.inner().device_common.bus.clone() 247 } 248 249 fn set_bus(&self, bus: Option<Weak<dyn Bus>>) { 250 self.inner().device_common.bus = bus; 251 } 252 253 fn class(&self) -> Option<Arc<dyn Class>> { 254 let mut guard = self.inner(); 255 let r = guard.device_common.class.clone()?.upgrade(); 256 if r.is_none() { 257 guard.device_common.class = None; 258 } 259 260 return r; 261 } 262 263 fn set_class(&self, class: Option<Weak<dyn Class>>) { 264 self.inner().device_common.class = class; 265 } 266 267 fn driver(&self) -> Option<Arc<dyn Driver>> { 268 let r = self.inner().device_common.driver.clone()?.upgrade(); 269 if r.is_none() { 270 self.inner().device_common.driver = None; 271 } 272 273 return r; 274 } 275 276 fn set_driver(&self, driver: Option<Weak<dyn Driver>>) { 277 self.inner().device_common.driver = driver; 278 } 279 280 fn is_dead(&self) -> bool { 281 false 282 } 283 284 fn can_match(&self) -> bool { 285 self.inner().device_common.can_match 286 } 287 288 fn set_can_match(&self, can_match: bool) { 289 self.inner().device_common.can_match = can_match; 290 } 291 292 fn state_synced(&self) -> bool { 293 true 294 } 295 296 fn dev_parent(&self) -> Option<Weak<dyn Device>> { 297 self.inner().device_common.get_parent_weak_or_clear() 298 } 299 300 fn set_dev_parent(&self, parent: Option<Weak<dyn Device>>) { 301 self.inner().device_common.parent = parent; 302 } 303 } 304 305 impl NetDevice for E1000EInterface { 306 fn mac(&self) -> smoltcp::wire::EthernetAddress { 307 let mac = self.driver.inner.lock().mac_address(); 308 return smoltcp::wire::EthernetAddress::from_bytes(&mac); 309 } 310 311 #[inline] 312 fn nic_id(&self) -> usize { 313 return self.iface_id; 314 } 315 316 #[inline] 317 fn iface_name(&self) -> String { 318 return self.name.clone(); 319 } 320 321 fn update_ip_addrs(&self, ip_addrs: &[wire::IpCidr]) -> Result<(), SystemError> { 322 if ip_addrs.len() != 1 { 323 return Err(SystemError::EINVAL); 324 } 325 326 self.iface.lock().update_ip_addrs(|addrs| { 327 let dest = addrs.iter_mut().next(); 328 329 if let Some(dest) = dest { 330 *dest = ip_addrs[0]; 331 } else { 332 addrs.push(ip_addrs[0]).expect("Push ipCidr failed: full"); 333 } 334 }); 335 return Ok(()); 336 } 337 338 fn poll(&self, sockets: &mut smoltcp::iface::SocketSet) -> Result<(), SystemError> { 339 let timestamp: smoltcp::time::Instant = Instant::now().into(); 340 let mut guard = self.iface.lock(); 341 let poll_res = guard.poll(timestamp, self.driver.force_get_mut(), sockets); 342 if poll_res { 343 return Ok(()); 344 } 345 return Err(SystemError::EAGAIN_OR_EWOULDBLOCK); 346 } 347 348 #[inline(always)] 349 fn inner_iface(&self) -> &SpinLock<smoltcp::iface::Interface> { 350 return &self.iface; 351 } 352 353 fn addr_assign_type(&self) -> u8 { 354 return self.inner().netdevice_common.addr_assign_type; 355 } 356 357 fn net_device_type(&self) -> u16 { 358 self.inner().netdevice_common.net_device_type = 1; // 以太网设备 359 return self.inner().netdevice_common.net_device_type; 360 } 361 362 fn net_state(&self) -> NetDeivceState { 363 return self.inner().netdevice_common.state; 364 } 365 366 fn set_net_state(&self, state: NetDeivceState) { 367 self.inner().netdevice_common.state |= state; 368 } 369 370 fn operstate(&self) -> Operstate { 371 return self.inner().netdevice_common.operstate; 372 } 373 374 fn set_operstate(&self, state: Operstate) { 375 self.inner().netdevice_common.operstate = state; 376 } 377 } 378 379 impl KObject for E1000EInterface { 380 fn as_any_ref(&self) -> &dyn core::any::Any { 381 self 382 } 383 384 fn set_inode(&self, inode: Option<Arc<crate::filesystem::kernfs::KernFSInode>>) { 385 self.inner().kobj_common.kern_inode = inode; 386 } 387 388 fn inode(&self) -> Option<Arc<crate::filesystem::kernfs::KernFSInode>> { 389 self.inner().kobj_common.kern_inode.clone() 390 } 391 392 fn parent(&self) -> Option<alloc::sync::Weak<dyn KObject>> { 393 self.inner().kobj_common.parent.clone() 394 } 395 396 fn set_parent(&self, parent: Option<alloc::sync::Weak<dyn KObject>>) { 397 self.inner().kobj_common.parent = parent; 398 } 399 400 fn kset(&self) -> Option<Arc<crate::driver::base::kset::KSet>> { 401 self.inner().kobj_common.kset.clone() 402 } 403 404 fn set_kset(&self, kset: Option<Arc<crate::driver::base::kset::KSet>>) { 405 self.inner().kobj_common.kset = kset; 406 } 407 408 fn kobj_type(&self) -> Option<&'static dyn crate::driver::base::kobject::KObjType> { 409 self.inner().kobj_common.kobj_type 410 } 411 412 fn name(&self) -> String { 413 self.name.clone() 414 } 415 416 fn set_name(&self, _name: String) { 417 // do nothing 418 } 419 420 fn kobj_state(&self) -> RwLockReadGuard<KObjectState> { 421 self.locked_kobj_state.read() 422 } 423 424 fn kobj_state_mut(&self) -> RwLockWriteGuard<KObjectState> { 425 self.locked_kobj_state.write() 426 } 427 428 fn set_kobj_state(&self, state: KObjectState) { 429 *self.locked_kobj_state.write() = state; 430 } 431 432 fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) { 433 self.inner().kobj_common.kobj_type = ktype; 434 } 435 } 436 437 pub fn e1000e_driver_init(device: E1000EDevice) { 438 let mac = smoltcp::wire::EthernetAddress::from_bytes(&device.mac_address()); 439 let driver = E1000EDriver::new(device); 440 let iface = E1000EInterface::new(driver); 441 // 标识网络设备已经启动 442 iface.set_net_state(NetDeivceState::__LINK_STATE_START); 443 444 // 将网卡的接口信息注册到全局的网卡接口信息表中 445 NET_DEVICES 446 .write_irqsave() 447 .insert(iface.nic_id(), iface.clone()); 448 info!("e1000e driver init successfully!\tMAC: [{}]", mac); 449 450 register_netdevice(iface.clone()).expect("register lo device failed"); 451 } 452