virtio_net.rs 32 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099
  1. use core::{
  2. any::Any,
  3. cell::UnsafeCell,
  4. fmt::{Debug, Formatter},
  5. ops::{Deref, DerefMut},
  6. };
  7. use alloc::{
  8. string::{String, ToString},
  9. sync::{Arc, Weak},
  10. vec::Vec,
  11. };
  12. use log::{debug, error};
  13. use smoltcp::{iface, phy, wire};
  14. use unified_init::macros::unified_init;
  15. use virtio_drivers::device::net::VirtIONet;
  16. use super::{Iface, NetDeivceState, NetDeviceCommonData, Operstate};
  17. use crate::{
  18. arch::rand::rand,
  19. driver::{
  20. base::{
  21. class::Class,
  22. device::{
  23. bus::Bus,
  24. driver::{Driver, DriverCommonData},
  25. Device, DeviceCommonData, DeviceId, DeviceType, IdTable,
  26. },
  27. kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
  28. kset::KSet,
  29. },
  30. net::{
  31. napi::{napi_schedule, NapiStruct},
  32. register_netdevice,
  33. types::InterfaceFlags,
  34. },
  35. virtio::{
  36. irq::virtio_irq_manager,
  37. sysfs::{virtio_bus, virtio_device_manager, virtio_driver_manager},
  38. transport::VirtIOTransport,
  39. virtio_impl::HalImpl,
  40. VirtIODevice, VirtIODeviceIndex, VirtIODriver, VirtIODriverCommonData, VirtioDeviceId,
  41. VIRTIO_VENDOR_ID,
  42. },
  43. },
  44. exception::{irqdesc::IrqReturn, IrqNumber},
  45. filesystem::{kernfs::KernFSInode, sysfs::AttributeGroup},
  46. init::initcall::INITCALL_POSTCORE,
  47. libs::{
  48. rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard},
  49. spinlock::{SpinLock, SpinLockGuard},
  50. },
  51. net::generate_iface_id,
  52. process::namespace::net_namespace::INIT_NET_NAMESPACE,
  53. time::Instant,
  54. };
  55. use system_error::SystemError;
  56. static mut VIRTIO_NET_DRIVER: Option<Arc<VirtIONetDriver>> = None;
  57. const VIRTIO_NET_BASENAME: &str = "virtio_net";
  58. #[inline(always)]
  59. #[allow(dead_code)]
  60. fn virtio_net_driver() -> Arc<VirtIONetDriver> {
  61. unsafe { VIRTIO_NET_DRIVER.as_ref().unwrap().clone() }
  62. }
  63. /// virtio net device
  64. #[cast_to([sync] VirtIODevice)]
  65. #[cast_to([sync] Device)]
  66. pub struct VirtIONetDevice {
  67. dev_id: Arc<DeviceId>,
  68. inner: SpinLock<InnerVirtIONetDevice>,
  69. locked_kobj_state: LockedKObjectState,
  70. // 指向对应的interface
  71. iface_ref: RwLock<Weak<VirtioInterface>>,
  72. }
  73. impl Debug for VirtIONetDevice {
  74. fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
  75. f.debug_struct("VirtIONetDevice")
  76. .field("dev_id", &self.dev_id.id())
  77. .finish()
  78. }
  79. }
  80. unsafe impl Send for VirtIONetDevice {}
  81. unsafe impl Sync for VirtIONetDevice {}
  82. struct InnerVirtIONetDevice {
  83. device_inner: VirtIONicDeviceInner,
  84. name: Option<String>,
  85. virtio_index: Option<VirtIODeviceIndex>,
  86. kobj_common: KObjectCommonData,
  87. device_common: DeviceCommonData,
  88. }
  89. impl Debug for InnerVirtIONetDevice {
  90. fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
  91. f.debug_struct("InnerVirtIONetDevice").finish()
  92. }
  93. }
  94. impl VirtIONetDevice {
  95. pub fn new(transport: VirtIOTransport, dev_id: Arc<DeviceId>) -> Option<Arc<Self>> {
  96. // 设置中断
  97. if let Err(err) = transport.setup_irq(dev_id.clone()) {
  98. error!("VirtIONetDevice '{dev_id:?}' setup_irq failed: {:?}", err);
  99. return None;
  100. }
  101. let driver_net: VirtIONet<HalImpl, VirtIOTransport, 2> =
  102. match VirtIONet::<HalImpl, VirtIOTransport, 2>::new(transport, 4096) {
  103. Ok(net) => net,
  104. Err(_) => {
  105. error!("VirtIONet init failed");
  106. return None;
  107. }
  108. };
  109. let mac = wire::EthernetAddress::from_bytes(&driver_net.mac_address());
  110. debug!("VirtIONetDevice mac: {:?}", mac);
  111. let device_inner = VirtIONicDeviceInner::new(driver_net);
  112. device_inner.inner.lock_irqsave().enable_interrupts();
  113. let dev = Arc::new(Self {
  114. dev_id,
  115. inner: SpinLock::new(InnerVirtIONetDevice {
  116. device_inner,
  117. name: None,
  118. virtio_index: None,
  119. kobj_common: KObjectCommonData::default(),
  120. device_common: DeviceCommonData::default(),
  121. }),
  122. locked_kobj_state: LockedKObjectState::default(),
  123. iface_ref: RwLock::new(Weak::new()),
  124. });
  125. // dev.set_driver(Some(Arc::downgrade(&virtio_net_driver()) as Weak<dyn Driver>));
  126. return Some(dev);
  127. }
  128. fn inner(&self) -> SpinLockGuard<'_, InnerVirtIONetDevice> {
  129. return self.inner.lock();
  130. }
  131. pub fn set_iface(&self, iface: &Arc<VirtioInterface>) {
  132. *self.iface_ref.write() = Arc::downgrade(iface);
  133. }
  134. pub fn iface(&self) -> Option<Arc<VirtioInterface>> {
  135. self.iface_ref.read().upgrade()
  136. }
  137. }
  138. impl KObject for VirtIONetDevice {
  139. fn as_any_ref(&self) -> &dyn Any {
  140. self
  141. }
  142. fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
  143. self.inner().kobj_common.kern_inode = inode;
  144. }
  145. fn inode(&self) -> Option<Arc<KernFSInode>> {
  146. self.inner().kobj_common.kern_inode.clone()
  147. }
  148. fn parent(&self) -> Option<Weak<dyn KObject>> {
  149. self.inner().kobj_common.parent.clone()
  150. }
  151. fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
  152. self.inner().kobj_common.parent = parent;
  153. }
  154. fn kset(&self) -> Option<Arc<KSet>> {
  155. self.inner().kobj_common.kset.clone()
  156. }
  157. fn set_kset(&self, kset: Option<Arc<KSet>>) {
  158. self.inner().kobj_common.kset = kset;
  159. }
  160. fn kobj_type(&self) -> Option<&'static dyn KObjType> {
  161. self.inner().kobj_common.kobj_type
  162. }
  163. fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
  164. self.inner().kobj_common.kobj_type = ktype;
  165. }
  166. fn name(&self) -> String {
  167. self.device_name()
  168. }
  169. fn set_name(&self, _name: String) {
  170. // do nothing
  171. }
  172. fn kobj_state(&self) -> RwLockReadGuard<'_, KObjectState> {
  173. self.locked_kobj_state.read()
  174. }
  175. fn kobj_state_mut(&self) -> RwLockWriteGuard<'_, KObjectState> {
  176. self.locked_kobj_state.write()
  177. }
  178. fn set_kobj_state(&self, state: KObjectState) {
  179. *self.locked_kobj_state.write() = state;
  180. }
  181. }
  182. impl Device for VirtIONetDevice {
  183. fn dev_type(&self) -> DeviceType {
  184. DeviceType::Net
  185. }
  186. fn id_table(&self) -> IdTable {
  187. IdTable::new(VIRTIO_NET_BASENAME.to_string(), None)
  188. }
  189. fn bus(&self) -> Option<Weak<dyn Bus>> {
  190. self.inner().device_common.bus.clone()
  191. }
  192. fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
  193. self.inner().device_common.bus = bus;
  194. }
  195. fn class(&self) -> Option<Arc<dyn Class>> {
  196. let mut guard = self.inner();
  197. let r = guard.device_common.class.clone()?.upgrade();
  198. if r.is_none() {
  199. guard.device_common.class = None;
  200. }
  201. return r;
  202. }
  203. fn set_class(&self, class: Option<Weak<dyn Class>>) {
  204. self.inner().device_common.class = class;
  205. }
  206. fn driver(&self) -> Option<Arc<dyn Driver>> {
  207. let r = self.inner().device_common.driver.clone()?.upgrade();
  208. if r.is_none() {
  209. self.inner().device_common.driver = None;
  210. }
  211. return r;
  212. }
  213. fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
  214. self.inner().device_common.driver = driver;
  215. }
  216. fn is_dead(&self) -> bool {
  217. false
  218. }
  219. fn can_match(&self) -> bool {
  220. self.inner().device_common.can_match
  221. }
  222. fn set_can_match(&self, can_match: bool) {
  223. self.inner().device_common.can_match = can_match;
  224. }
  225. fn state_synced(&self) -> bool {
  226. true
  227. }
  228. fn dev_parent(&self) -> Option<Weak<dyn Device>> {
  229. self.inner().device_common.get_parent_weak_or_clear()
  230. }
  231. fn set_dev_parent(&self, parent: Option<Weak<dyn Device>>) {
  232. self.inner().device_common.parent = parent;
  233. }
  234. fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> {
  235. None
  236. }
  237. }
  238. impl VirtIODevice for VirtIONetDevice {
  239. fn handle_irq(&self, _irq: IrqNumber) -> Result<IrqReturn, SystemError> {
  240. let Some(iface) = self.iface() else {
  241. error!(
  242. "VirtIONetDevice '{:?}' has no associated iface to handle irq",
  243. self.dev_id.id()
  244. );
  245. return Ok(IrqReturn::NotHandled);
  246. };
  247. let Some(napi) = iface.napi_struct() else {
  248. log::error!("Virtio net device {} has no napi_struct", iface.name());
  249. return Ok(IrqReturn::NotHandled);
  250. };
  251. napi_schedule(napi);
  252. // self.netns.wakeup_poll_thread();
  253. return Ok(IrqReturn::Handled);
  254. }
  255. fn dev_id(&self) -> &Arc<DeviceId> {
  256. return &self.dev_id;
  257. }
  258. fn set_device_name(&self, name: String) {
  259. self.inner().name = Some(name);
  260. }
  261. fn device_name(&self) -> String {
  262. self.inner()
  263. .name
  264. .clone()
  265. .unwrap_or_else(|| "virtio_net".to_string())
  266. }
  267. fn set_virtio_device_index(&self, index: VirtIODeviceIndex) {
  268. self.inner().virtio_index = Some(index);
  269. }
  270. fn virtio_device_index(&self) -> Option<VirtIODeviceIndex> {
  271. return self.inner().virtio_index;
  272. }
  273. fn device_type_id(&self) -> u32 {
  274. virtio_drivers::transport::DeviceType::Network as u32
  275. }
  276. fn vendor(&self) -> u32 {
  277. VIRTIO_VENDOR_ID.into()
  278. }
  279. fn irq(&self) -> Option<IrqNumber> {
  280. None
  281. }
  282. }
  283. pub struct VirtIoNetImpl {
  284. inner: VirtIONet<HalImpl, VirtIOTransport, 2>,
  285. }
  286. impl VirtIoNetImpl {
  287. const fn new(inner: VirtIONet<HalImpl, VirtIOTransport, 2>) -> Self {
  288. Self { inner }
  289. }
  290. }
  291. impl Deref for VirtIoNetImpl {
  292. type Target = VirtIONet<HalImpl, VirtIOTransport, 2>;
  293. fn deref(&self) -> &Self::Target {
  294. &self.inner
  295. }
  296. }
  297. impl DerefMut for VirtIoNetImpl {
  298. fn deref_mut(&mut self) -> &mut Self::Target {
  299. &mut self.inner
  300. }
  301. }
  302. unsafe impl Send for VirtIoNetImpl {}
  303. unsafe impl Sync for VirtIoNetImpl {}
  304. #[derive(Debug)]
  305. struct VirtIONicDeviceInnerWrapper(UnsafeCell<VirtIONicDeviceInner>);
  306. unsafe impl Send for VirtIONicDeviceInnerWrapper {}
  307. unsafe impl Sync for VirtIONicDeviceInnerWrapper {}
  308. impl Deref for VirtIONicDeviceInnerWrapper {
  309. type Target = VirtIONicDeviceInner;
  310. fn deref(&self) -> &Self::Target {
  311. unsafe { &*self.0.get() }
  312. }
  313. }
  314. impl DerefMut for VirtIONicDeviceInnerWrapper {
  315. fn deref_mut(&mut self) -> &mut Self::Target {
  316. unsafe { &mut *self.0.get() }
  317. }
  318. }
  319. #[allow(clippy::mut_from_ref)]
  320. impl VirtIONicDeviceInnerWrapper {
  321. fn force_get_mut(&self) -> &mut <VirtIONicDeviceInnerWrapper as Deref>::Target {
  322. unsafe { &mut *self.0.get() }
  323. }
  324. }
  325. /// Virtio网络设备驱动(加锁)
  326. pub struct VirtIONicDeviceInner {
  327. pub inner: Arc<SpinLock<VirtIoNetImpl>>,
  328. }
  329. impl Clone for VirtIONicDeviceInner {
  330. fn clone(&self) -> Self {
  331. return VirtIONicDeviceInner {
  332. inner: self.inner.clone(),
  333. };
  334. }
  335. }
  336. impl Debug for VirtIONicDeviceInner {
  337. fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
  338. f.debug_struct("VirtIONicDriver").finish()
  339. }
  340. }
  341. #[cast_to([sync] Iface)]
  342. #[cast_to([sync] Device)]
  343. #[derive(Debug)]
  344. pub struct VirtioInterface {
  345. device_inner: VirtIONicDeviceInnerWrapper,
  346. iface_name: String,
  347. iface_common: super::IfaceCommon,
  348. inner: SpinLock<InnerVirtIOInterface>,
  349. locked_kobj_state: LockedKObjectState,
  350. }
  351. // // 先手糊为virtio实现这些,后面系统要是有了其他类型网卡,这些实现就得实现成一个单独的trait
  352. // impl VirtioInterface {
  353. // /// 消耗token然后主动发送一个 arp 数据包
  354. // pub fn emit_arp(arp_repr: &ArpRepr, tx_token: VirtioNetToken) {
  355. // let ether_repr = match arp_repr {
  356. // ArpRepr::EthernetIpv4 {
  357. // source_hardware_addr,
  358. // target_hardware_addr,
  359. // ..
  360. // } => EthernetRepr {
  361. // src_addr: *source_hardware_addr,
  362. // dst_addr: *target_hardware_addr,
  363. // ethertype: EthernetProtocol::Arp,
  364. // },
  365. // _ => return,
  366. // };
  367. // tx_token.consume(ether_repr.buffer_len() + arp_repr.buffer_len(), |buffer| {
  368. // let mut frame = EthernetFrame::new_unchecked(buffer);
  369. // ether_repr.emit(&mut frame);
  370. // let mut pkt = ArpPacket::new_unchecked(frame.payload_mut());
  371. // arp_repr.emit(&mut pkt);
  372. // });
  373. // }
  374. // /// 解析 arp 包并处理
  375. // pub fn process_arp(&self, arp_repr: &ArpRepr) -> Option<ArpRepr> {
  376. // match arp_repr {
  377. // ArpRepr::EthernetIpv4 {
  378. // operation: ArpOperation::Reply,
  379. // source_hardware_addr,
  380. // source_protocol_addr,
  381. // ..
  382. // } => {
  383. // if !source_hardware_addr.is_unicast()
  384. // || !self
  385. // .common()
  386. // .smol_iface
  387. // .lock()
  388. // .context()
  389. // .in_same_network(&IpAddress::Ipv4(*source_protocol_addr))
  390. // {
  391. // return None;
  392. // }
  393. // self.common().router_common_data.arp_table.write().insert(
  394. // IpAddress::Ipv4(*source_protocol_addr),
  395. // *source_hardware_addr,
  396. // );
  397. // None
  398. // }
  399. // ArpRepr::EthernetIpv4 {
  400. // operation: ArpOperation::Request,
  401. // source_hardware_addr,
  402. // source_protocol_addr,
  403. // target_protocol_addr,
  404. // ..
  405. // } => {
  406. // if !source_hardware_addr.is_unicast() || !source_protocol_addr.x_is_unicast() {
  407. // return None;
  408. // }
  409. // if self
  410. // .common()
  411. // .smol_iface
  412. // .lock()
  413. // .context()
  414. // .ipv4_addr()
  415. // .is_none_or(|addr| addr != *target_protocol_addr)
  416. // {
  417. // return None;
  418. // }
  419. // Some(ArpRepr::EthernetIpv4 {
  420. // operation: ArpOperation::Reply,
  421. // source_hardware_addr: self.mac(),
  422. // source_protocol_addr: *target_protocol_addr,
  423. // target_hardware_addr: *source_hardware_addr,
  424. // target_protocol_addr: *source_protocol_addr,
  425. // })
  426. // }
  427. // _ => None,
  428. // }
  429. // }
  430. // }
  431. #[derive(Debug)]
  432. struct InnerVirtIOInterface {
  433. kobj_common: KObjectCommonData,
  434. device_common: DeviceCommonData,
  435. netdevice_common: NetDeviceCommonData,
  436. }
  437. impl VirtioInterface {
  438. pub fn new(mut device_inner: VirtIONicDeviceInner) -> Arc<Self> {
  439. let iface_id = generate_iface_id();
  440. let mut iface_config = iface::Config::new(wire::HardwareAddress::Ethernet(
  441. wire::EthernetAddress(device_inner.inner.lock().mac_address()),
  442. ));
  443. iface_config.random_seed = rand() as u64;
  444. let iface = iface::Interface::new(iface_config, &mut device_inner, Instant::now().into());
  445. let flags = InterfaceFlags::UP
  446. | InterfaceFlags::BROADCAST
  447. | InterfaceFlags::RUNNING
  448. | InterfaceFlags::MULTICAST
  449. | InterfaceFlags::LOWER_UP;
  450. let iface = Arc::new(VirtioInterface {
  451. device_inner: VirtIONicDeviceInnerWrapper(UnsafeCell::new(device_inner)),
  452. locked_kobj_state: LockedKObjectState::default(),
  453. iface_name: format!("eth{}", iface_id),
  454. iface_common: super::IfaceCommon::new(
  455. iface_id,
  456. crate::driver::net::types::InterfaceType::EETHER,
  457. flags,
  458. iface,
  459. ),
  460. inner: SpinLock::new(InnerVirtIOInterface {
  461. kobj_common: KObjectCommonData::default(),
  462. device_common: DeviceCommonData::default(),
  463. netdevice_common: NetDeviceCommonData::default(),
  464. }),
  465. });
  466. // 设置napi struct
  467. let napi_struct = NapiStruct::new(iface.clone(), 10);
  468. *iface.common().napi_struct.write() = Some(napi_struct);
  469. iface
  470. }
  471. fn inner(&self) -> SpinLockGuard<'_, InnerVirtIOInterface> {
  472. return self.inner.lock();
  473. }
  474. /// 获取网卡接口的名称
  475. #[allow(dead_code)]
  476. pub fn iface_name(&self) -> String {
  477. self.iface_name.clone()
  478. }
  479. }
  480. impl Drop for VirtioInterface {
  481. fn drop(&mut self) {
  482. // 从全局的网卡接口信息表中删除这个网卡的接口信息
  483. // NET_DEVICES.write_irqsave().remove(&self.nic_id());
  484. if let Some(ns) = self.net_namespace() {
  485. ns.remove_device(&self.nic_id());
  486. }
  487. }
  488. }
  489. impl Device for VirtioInterface {
  490. fn dev_type(&self) -> DeviceType {
  491. DeviceType::Net
  492. }
  493. fn id_table(&self) -> IdTable {
  494. IdTable::new(VIRTIO_NET_BASENAME.to_string(), None)
  495. }
  496. fn bus(&self) -> Option<Weak<dyn Bus>> {
  497. self.inner().device_common.bus.clone()
  498. }
  499. fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
  500. self.inner().device_common.bus = bus;
  501. }
  502. fn class(&self) -> Option<Arc<dyn Class>> {
  503. let mut guard = self.inner();
  504. let r = guard.device_common.class.clone()?.upgrade();
  505. if r.is_none() {
  506. guard.device_common.class = None;
  507. }
  508. return r;
  509. }
  510. fn set_class(&self, class: Option<Weak<dyn Class>>) {
  511. self.inner().device_common.class = class;
  512. }
  513. fn driver(&self) -> Option<Arc<dyn Driver>> {
  514. let r = self.inner().device_common.driver.clone()?.upgrade();
  515. if r.is_none() {
  516. self.inner().device_common.driver = None;
  517. }
  518. return r;
  519. }
  520. fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
  521. self.inner().device_common.driver = driver;
  522. }
  523. fn is_dead(&self) -> bool {
  524. false
  525. }
  526. fn can_match(&self) -> bool {
  527. self.inner().device_common.can_match
  528. }
  529. fn set_can_match(&self, can_match: bool) {
  530. self.inner().device_common.can_match = can_match;
  531. }
  532. fn state_synced(&self) -> bool {
  533. true
  534. }
  535. fn dev_parent(&self) -> Option<Weak<dyn Device>> {
  536. self.inner().device_common.get_parent_weak_or_clear()
  537. }
  538. fn set_dev_parent(&self, parent: Option<Weak<dyn Device>>) {
  539. self.inner().device_common.parent = parent;
  540. }
  541. }
  542. impl VirtIONicDeviceInner {
  543. pub fn new(driver_net: VirtIONet<HalImpl, VirtIOTransport, 2>) -> Self {
  544. let mut iface_config = iface::Config::new(wire::HardwareAddress::Ethernet(
  545. wire::EthernetAddress(driver_net.mac_address()),
  546. ));
  547. iface_config.random_seed = rand() as u64;
  548. let inner = Arc::new(SpinLock::new(VirtIoNetImpl::new(driver_net)));
  549. let result = VirtIONicDeviceInner { inner };
  550. return result;
  551. }
  552. }
  553. pub struct VirtioNetToken {
  554. driver: VirtIONicDeviceInner,
  555. rx_buffer: Option<virtio_drivers::device::net::RxBuffer>,
  556. }
  557. impl VirtioNetToken {
  558. pub fn new(
  559. driver: VirtIONicDeviceInner,
  560. rx_buffer: Option<virtio_drivers::device::net::RxBuffer>,
  561. ) -> Self {
  562. return Self { driver, rx_buffer };
  563. }
  564. }
  565. impl phy::Device for VirtIONicDeviceInner {
  566. type RxToken<'a>
  567. = VirtioNetToken
  568. where
  569. Self: 'a;
  570. type TxToken<'a>
  571. = VirtioNetToken
  572. where
  573. Self: 'a;
  574. fn receive(
  575. &mut self,
  576. _timestamp: smoltcp::time::Instant,
  577. ) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
  578. match self.inner.lock().receive() {
  579. Ok(buf) => Some((
  580. VirtioNetToken::new(self.clone(), Some(buf)),
  581. VirtioNetToken::new(self.clone(), None),
  582. )),
  583. Err(virtio_drivers::Error::NotReady) => None,
  584. Err(err) => panic!("VirtIO receive failed: {}", err),
  585. }
  586. }
  587. fn transmit(&mut self, _timestamp: smoltcp::time::Instant) -> Option<Self::TxToken<'_>> {
  588. // debug!("VirtioNet: transmit");
  589. if self.inner.lock_irqsave().can_send() {
  590. // debug!("VirtioNet: can send");
  591. return Some(VirtioNetToken::new(self.clone(), None));
  592. } else {
  593. // debug!("VirtioNet: can not send");
  594. return None;
  595. }
  596. }
  597. fn capabilities(&self) -> phy::DeviceCapabilities {
  598. let mut caps = phy::DeviceCapabilities::default();
  599. // 网卡的最大传输单元. 请与IP层的MTU进行区分。这个值应当是网卡的最大传输单元,而不是IP层的MTU。
  600. caps.max_transmission_unit = 2000;
  601. /*
  602. Maximum burst size, in terms of MTU.
  603. The network device is unable to send or receive bursts large than the value returned by this function.
  604. If None, there is no fixed limit on burst size, e.g. if network buffers are dynamically allocated.
  605. */
  606. caps.max_burst_size = Some(1);
  607. return caps;
  608. }
  609. }
  610. impl phy::TxToken for VirtioNetToken {
  611. fn consume<R, F>(self, len: usize, f: F) -> R
  612. where
  613. F: FnOnce(&mut [u8]) -> R,
  614. {
  615. // // 为了线程安全,这里需要对VirtioNet进行加【写锁】,以保证对设备的互斥访问。
  616. let mut driver_net = self.driver.inner.lock();
  617. let mut tx_buf = driver_net.new_tx_buffer(len);
  618. let result = f(tx_buf.packet_mut());
  619. driver_net.send(tx_buf).expect("virtio_net send failed");
  620. return result;
  621. }
  622. }
  623. impl phy::RxToken for VirtioNetToken {
  624. fn consume<R, F>(self, f: F) -> R
  625. where
  626. F: FnOnce(&[u8]) -> R,
  627. {
  628. // 为了线程安全,这里需要对VirtioNet进行加【写锁】,以保证对设备的互斥访问。
  629. let rx_buf = self.rx_buffer.unwrap();
  630. let result = f(rx_buf.packet());
  631. self.driver
  632. .inner
  633. .lock()
  634. .recycle_rx_buffer(rx_buf)
  635. .expect("virtio_net recv failed");
  636. result
  637. }
  638. }
  639. /// @brief virtio-net 驱动的初始化与测试
  640. pub fn virtio_net(
  641. transport: VirtIOTransport,
  642. dev_id: Arc<DeviceId>,
  643. dev_parent: Option<Arc<dyn Device>>,
  644. ) {
  645. let virtio_net_deivce = VirtIONetDevice::new(transport, dev_id);
  646. if let Some(virtio_net_deivce) = virtio_net_deivce {
  647. debug!("VirtIONetDevice '{:?}' created", virtio_net_deivce.dev_id);
  648. if let Some(dev_parent) = dev_parent {
  649. virtio_net_deivce.set_dev_parent(Some(Arc::downgrade(&dev_parent)));
  650. }
  651. virtio_device_manager()
  652. .device_add(virtio_net_deivce.clone() as Arc<dyn VirtIODevice>)
  653. .expect("Add virtio net failed");
  654. }
  655. }
  656. impl Iface for VirtioInterface {
  657. fn common(&self) -> &super::IfaceCommon {
  658. &self.iface_common
  659. }
  660. fn mac(&self) -> wire::EthernetAddress {
  661. let mac: [u8; 6] = self.device_inner.inner.lock().mac_address();
  662. return wire::EthernetAddress::from_bytes(&mac);
  663. }
  664. #[inline]
  665. fn iface_name(&self) -> String {
  666. return self.iface_name.clone();
  667. }
  668. fn poll(&self) -> bool {
  669. // log::debug!("VirtioInterface: poll");
  670. self.iface_common.poll(self.device_inner.force_get_mut())
  671. }
  672. // fn as_any_ref(&'static self) -> &'static dyn core::any::Any {
  673. // return self;
  674. // }
  675. fn addr_assign_type(&self) -> u8 {
  676. return self.inner().netdevice_common.addr_assign_type;
  677. }
  678. fn net_device_type(&self) -> u16 {
  679. self.inner().netdevice_common.net_device_type = 1; // 以太网设备
  680. return self.inner().netdevice_common.net_device_type;
  681. }
  682. fn net_state(&self) -> NetDeivceState {
  683. return self.inner().netdevice_common.state;
  684. }
  685. fn set_net_state(&self, state: NetDeivceState) {
  686. self.inner().netdevice_common.state |= state;
  687. }
  688. fn operstate(&self) -> Operstate {
  689. return self.inner().netdevice_common.operstate;
  690. }
  691. fn set_operstate(&self, state: Operstate) {
  692. self.inner().netdevice_common.operstate = state;
  693. }
  694. fn mtu(&self) -> usize {
  695. use smoltcp::phy::Device;
  696. self.device_inner
  697. .force_get_mut()
  698. .capabilities()
  699. .max_transmission_unit
  700. }
  701. }
  702. impl KObject for VirtioInterface {
  703. fn as_any_ref(&self) -> &dyn core::any::Any {
  704. self
  705. }
  706. fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
  707. self.inner().kobj_common.kern_inode = inode;
  708. }
  709. fn inode(&self) -> Option<Arc<KernFSInode>> {
  710. self.inner().kobj_common.kern_inode.clone()
  711. }
  712. fn parent(&self) -> Option<Weak<dyn KObject>> {
  713. self.inner().kobj_common.parent.clone()
  714. }
  715. fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
  716. self.inner().kobj_common.parent = parent;
  717. }
  718. fn kset(&self) -> Option<Arc<KSet>> {
  719. self.inner().kobj_common.kset.clone()
  720. }
  721. fn set_kset(&self, kset: Option<Arc<KSet>>) {
  722. self.inner().kobj_common.kset = kset;
  723. }
  724. fn kobj_type(&self) -> Option<&'static dyn KObjType> {
  725. self.inner().kobj_common.kobj_type
  726. }
  727. fn name(&self) -> String {
  728. self.iface_name.clone()
  729. }
  730. fn set_name(&self, _name: String) {
  731. // do nothing
  732. }
  733. fn kobj_state(&self) -> RwLockReadGuard<'_, KObjectState> {
  734. self.locked_kobj_state.read()
  735. }
  736. fn kobj_state_mut(&self) -> RwLockWriteGuard<'_, KObjectState> {
  737. self.locked_kobj_state.write()
  738. }
  739. fn set_kobj_state(&self, state: KObjectState) {
  740. *self.locked_kobj_state.write() = state;
  741. }
  742. fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
  743. self.inner().kobj_common.kobj_type = ktype;
  744. }
  745. }
  746. #[unified_init(INITCALL_POSTCORE)]
  747. fn virtio_net_driver_init() -> Result<(), SystemError> {
  748. let driver = VirtIONetDriver::new();
  749. virtio_driver_manager().register(driver.clone() as Arc<dyn VirtIODriver>)?;
  750. unsafe {
  751. VIRTIO_NET_DRIVER = Some(driver);
  752. }
  753. return Ok(());
  754. }
  755. #[derive(Debug)]
  756. #[cast_to([sync] VirtIODriver)]
  757. #[cast_to([sync] Driver)]
  758. struct VirtIONetDriver {
  759. inner: SpinLock<InnerVirtIODriver>,
  760. kobj_state: LockedKObjectState,
  761. }
  762. impl VirtIONetDriver {
  763. pub fn new() -> Arc<Self> {
  764. let inner = InnerVirtIODriver {
  765. virtio_driver_common: VirtIODriverCommonData::default(),
  766. driver_common: DriverCommonData::default(),
  767. kobj_common: KObjectCommonData::default(),
  768. };
  769. let id_table = VirtioDeviceId::new(
  770. virtio_drivers::transport::DeviceType::Network as u32,
  771. VIRTIO_VENDOR_ID.into(),
  772. );
  773. let result = VirtIONetDriver {
  774. inner: SpinLock::new(inner),
  775. kobj_state: LockedKObjectState::default(),
  776. };
  777. result.add_virtio_id(id_table);
  778. return Arc::new(result);
  779. }
  780. fn inner(&self) -> SpinLockGuard<'_, InnerVirtIODriver> {
  781. return self.inner.lock();
  782. }
  783. }
  784. #[derive(Debug)]
  785. struct InnerVirtIODriver {
  786. virtio_driver_common: VirtIODriverCommonData,
  787. driver_common: DriverCommonData,
  788. kobj_common: KObjectCommonData,
  789. }
  790. impl VirtIODriver for VirtIONetDriver {
  791. fn probe(&self, device: &Arc<dyn VirtIODevice>) -> Result<(), SystemError> {
  792. log::debug!("VirtIONetDriver::probe()");
  793. let virtio_net_device = device
  794. .clone()
  795. .arc_any()
  796. .downcast::<VirtIONetDevice>()
  797. .map_err(|_| {
  798. error!(
  799. "VirtIONetDriver::probe() failed: device is not a VirtIODevice. Device: '{:?}'",
  800. device.name()
  801. );
  802. SystemError::EINVAL
  803. })?;
  804. let iface: Arc<VirtioInterface> =
  805. VirtioInterface::new(virtio_net_device.inner().device_inner.clone());
  806. // 标识网络设备已经启动
  807. iface.set_net_state(NetDeivceState::__LINK_STATE_START);
  808. // 设置iface的父设备为virtio_net_device
  809. iface.set_dev_parent(Some(Arc::downgrade(&virtio_net_device) as Weak<dyn Device>));
  810. // 在sysfs中注册iface
  811. register_netdevice(iface.clone() as Arc<dyn Iface>)?;
  812. // 将virtio_net_device和iface关联起来
  813. virtio_net_device.set_iface(&iface);
  814. // 将网卡的接口信息注册到全局的网卡接口信息表中
  815. // NET_DEVICES
  816. // .write_irqsave()
  817. // .insert(iface.nic_id(), iface.clone());
  818. INIT_NET_NAMESPACE.add_device(iface.clone());
  819. iface
  820. .iface_common
  821. .set_net_namespace(INIT_NET_NAMESPACE.clone());
  822. INIT_NET_NAMESPACE.set_default_iface(iface.clone());
  823. virtio_irq_manager()
  824. .register_device(device.clone())
  825. .expect("Register virtio net irq failed");
  826. return Ok(());
  827. }
  828. fn virtio_id_table(&self) -> Vec<VirtioDeviceId> {
  829. self.inner().virtio_driver_common.id_table.clone()
  830. }
  831. fn add_virtio_id(&self, id: VirtioDeviceId) {
  832. self.inner().virtio_driver_common.id_table.push(id);
  833. }
  834. }
  835. impl Driver for VirtIONetDriver {
  836. fn id_table(&self) -> Option<IdTable> {
  837. Some(IdTable::new(VIRTIO_NET_BASENAME.to_string(), None))
  838. }
  839. fn add_device(&self, device: Arc<dyn Device>) {
  840. let virtio_net_device = device
  841. .arc_any()
  842. .downcast::<VirtIONetDevice>()
  843. .expect("VirtIONetDriver::add_device() failed: device is not a VirtioInterface");
  844. self.inner()
  845. .driver_common
  846. .devices
  847. .push(virtio_net_device as Arc<dyn Device>);
  848. }
  849. fn delete_device(&self, device: &Arc<dyn Device>) {
  850. let _virtio_net_device = device
  851. .clone()
  852. .arc_any()
  853. .downcast::<VirtIONetDevice>()
  854. .expect("VirtIONetDriver::delete_device() failed: device is not a VirtioInterface");
  855. let mut guard = self.inner();
  856. let index = guard
  857. .driver_common
  858. .devices
  859. .iter()
  860. .position(|dev| Arc::ptr_eq(device, dev))
  861. .expect("VirtIONetDriver::delete_device() failed: device not found");
  862. guard.driver_common.devices.remove(index);
  863. }
  864. fn devices(&self) -> Vec<Arc<dyn Device>> {
  865. self.inner().driver_common.devices.clone()
  866. }
  867. fn bus(&self) -> Option<Weak<dyn Bus>> {
  868. Some(Arc::downgrade(&virtio_bus()) as Weak<dyn Bus>)
  869. }
  870. fn set_bus(&self, _bus: Option<Weak<dyn Bus>>) {
  871. // do nothing
  872. }
  873. }
  874. impl KObject for VirtIONetDriver {
  875. fn as_any_ref(&self) -> &dyn Any {
  876. self
  877. }
  878. fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
  879. self.inner().kobj_common.kern_inode = inode;
  880. }
  881. fn inode(&self) -> Option<Arc<KernFSInode>> {
  882. self.inner().kobj_common.kern_inode.clone()
  883. }
  884. fn parent(&self) -> Option<Weak<dyn KObject>> {
  885. self.inner().kobj_common.parent.clone()
  886. }
  887. fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
  888. self.inner().kobj_common.parent = parent;
  889. }
  890. fn kset(&self) -> Option<Arc<KSet>> {
  891. self.inner().kobj_common.kset.clone()
  892. }
  893. fn set_kset(&self, kset: Option<Arc<KSet>>) {
  894. self.inner().kobj_common.kset = kset;
  895. }
  896. fn kobj_type(&self) -> Option<&'static dyn KObjType> {
  897. self.inner().kobj_common.kobj_type
  898. }
  899. fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
  900. self.inner().kobj_common.kobj_type = ktype;
  901. }
  902. fn name(&self) -> String {
  903. VIRTIO_NET_BASENAME.to_string()
  904. }
  905. fn set_name(&self, _name: String) {
  906. // do nothing
  907. }
  908. fn kobj_state(&self) -> RwLockReadGuard<'_, KObjectState> {
  909. self.kobj_state.read()
  910. }
  911. fn kobj_state_mut(&self) -> RwLockWriteGuard<'_, KObjectState> {
  912. self.kobj_state.write()
  913. }
  914. fn set_kobj_state(&self, state: KObjectState) {
  915. *self.kobj_state.write() = state;
  916. }
  917. }