| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099 |
- use core::{
- any::Any,
- cell::UnsafeCell,
- fmt::{Debug, Formatter},
- ops::{Deref, DerefMut},
- };
- use alloc::{
- string::{String, ToString},
- sync::{Arc, Weak},
- vec::Vec,
- };
- use log::{debug, error};
- use smoltcp::{iface, phy, wire};
- use unified_init::macros::unified_init;
- use virtio_drivers::device::net::VirtIONet;
- use super::{Iface, NetDeivceState, NetDeviceCommonData, Operstate};
- use crate::{
- arch::rand::rand,
- driver::{
- base::{
- class::Class,
- device::{
- bus::Bus,
- driver::{Driver, DriverCommonData},
- Device, DeviceCommonData, DeviceId, DeviceType, IdTable,
- },
- kobject::{KObjType, KObject, KObjectCommonData, KObjectState, LockedKObjectState},
- kset::KSet,
- },
- net::{
- napi::{napi_schedule, NapiStruct},
- register_netdevice,
- types::InterfaceFlags,
- },
- virtio::{
- irq::virtio_irq_manager,
- sysfs::{virtio_bus, virtio_device_manager, virtio_driver_manager},
- transport::VirtIOTransport,
- virtio_impl::HalImpl,
- VirtIODevice, VirtIODeviceIndex, VirtIODriver, VirtIODriverCommonData, VirtioDeviceId,
- VIRTIO_VENDOR_ID,
- },
- },
- exception::{irqdesc::IrqReturn, IrqNumber},
- filesystem::{kernfs::KernFSInode, sysfs::AttributeGroup},
- init::initcall::INITCALL_POSTCORE,
- libs::{
- rwlock::{RwLock, RwLockReadGuard, RwLockWriteGuard},
- spinlock::{SpinLock, SpinLockGuard},
- },
- net::generate_iface_id,
- process::namespace::net_namespace::INIT_NET_NAMESPACE,
- time::Instant,
- };
- use system_error::SystemError;
- static mut VIRTIO_NET_DRIVER: Option<Arc<VirtIONetDriver>> = None;
- const VIRTIO_NET_BASENAME: &str = "virtio_net";
- #[inline(always)]
- #[allow(dead_code)]
- fn virtio_net_driver() -> Arc<VirtIONetDriver> {
- unsafe { VIRTIO_NET_DRIVER.as_ref().unwrap().clone() }
- }
- /// virtio net device
- #[cast_to([sync] VirtIODevice)]
- #[cast_to([sync] Device)]
- pub struct VirtIONetDevice {
- dev_id: Arc<DeviceId>,
- inner: SpinLock<InnerVirtIONetDevice>,
- locked_kobj_state: LockedKObjectState,
- // 指向对应的interface
- iface_ref: RwLock<Weak<VirtioInterface>>,
- }
- impl Debug for VirtIONetDevice {
- fn fmt(&self, f: &mut Formatter<'_>) -> core::fmt::Result {
- f.debug_struct("VirtIONetDevice")
- .field("dev_id", &self.dev_id.id())
- .finish()
- }
- }
- unsafe impl Send for VirtIONetDevice {}
- unsafe impl Sync for VirtIONetDevice {}
- struct InnerVirtIONetDevice {
- device_inner: VirtIONicDeviceInner,
- name: Option<String>,
- virtio_index: Option<VirtIODeviceIndex>,
- kobj_common: KObjectCommonData,
- device_common: DeviceCommonData,
- }
- impl Debug for InnerVirtIONetDevice {
- fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
- f.debug_struct("InnerVirtIONetDevice").finish()
- }
- }
- impl VirtIONetDevice {
- pub fn new(transport: VirtIOTransport, dev_id: Arc<DeviceId>) -> Option<Arc<Self>> {
- // 设置中断
- if let Err(err) = transport.setup_irq(dev_id.clone()) {
- error!("VirtIONetDevice '{dev_id:?}' setup_irq failed: {:?}", err);
- return None;
- }
- let driver_net: VirtIONet<HalImpl, VirtIOTransport, 2> =
- match VirtIONet::<HalImpl, VirtIOTransport, 2>::new(transport, 4096) {
- Ok(net) => net,
- Err(_) => {
- error!("VirtIONet init failed");
- return None;
- }
- };
- let mac = wire::EthernetAddress::from_bytes(&driver_net.mac_address());
- debug!("VirtIONetDevice mac: {:?}", mac);
- let device_inner = VirtIONicDeviceInner::new(driver_net);
- device_inner.inner.lock_irqsave().enable_interrupts();
- let dev = Arc::new(Self {
- dev_id,
- inner: SpinLock::new(InnerVirtIONetDevice {
- device_inner,
- name: None,
- virtio_index: None,
- kobj_common: KObjectCommonData::default(),
- device_common: DeviceCommonData::default(),
- }),
- locked_kobj_state: LockedKObjectState::default(),
- iface_ref: RwLock::new(Weak::new()),
- });
- // dev.set_driver(Some(Arc::downgrade(&virtio_net_driver()) as Weak<dyn Driver>));
- return Some(dev);
- }
- fn inner(&self) -> SpinLockGuard<'_, InnerVirtIONetDevice> {
- return self.inner.lock();
- }
- pub fn set_iface(&self, iface: &Arc<VirtioInterface>) {
- *self.iface_ref.write() = Arc::downgrade(iface);
- }
- pub fn iface(&self) -> Option<Arc<VirtioInterface>> {
- self.iface_ref.read().upgrade()
- }
- }
- impl KObject for VirtIONetDevice {
- fn as_any_ref(&self) -> &dyn Any {
- self
- }
- fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
- self.inner().kobj_common.kern_inode = inode;
- }
- fn inode(&self) -> Option<Arc<KernFSInode>> {
- self.inner().kobj_common.kern_inode.clone()
- }
- fn parent(&self) -> Option<Weak<dyn KObject>> {
- self.inner().kobj_common.parent.clone()
- }
- fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
- self.inner().kobj_common.parent = parent;
- }
- fn kset(&self) -> Option<Arc<KSet>> {
- self.inner().kobj_common.kset.clone()
- }
- fn set_kset(&self, kset: Option<Arc<KSet>>) {
- self.inner().kobj_common.kset = kset;
- }
- fn kobj_type(&self) -> Option<&'static dyn KObjType> {
- self.inner().kobj_common.kobj_type
- }
- fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
- self.inner().kobj_common.kobj_type = ktype;
- }
- fn name(&self) -> String {
- self.device_name()
- }
- fn set_name(&self, _name: String) {
- // do nothing
- }
- fn kobj_state(&self) -> RwLockReadGuard<'_, KObjectState> {
- self.locked_kobj_state.read()
- }
- fn kobj_state_mut(&self) -> RwLockWriteGuard<'_, KObjectState> {
- self.locked_kobj_state.write()
- }
- fn set_kobj_state(&self, state: KObjectState) {
- *self.locked_kobj_state.write() = state;
- }
- }
- impl Device for VirtIONetDevice {
- fn dev_type(&self) -> DeviceType {
- DeviceType::Net
- }
- fn id_table(&self) -> IdTable {
- IdTable::new(VIRTIO_NET_BASENAME.to_string(), None)
- }
- fn bus(&self) -> Option<Weak<dyn Bus>> {
- self.inner().device_common.bus.clone()
- }
- fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
- self.inner().device_common.bus = bus;
- }
- fn class(&self) -> Option<Arc<dyn Class>> {
- let mut guard = self.inner();
- let r = guard.device_common.class.clone()?.upgrade();
- if r.is_none() {
- guard.device_common.class = None;
- }
- return r;
- }
- fn set_class(&self, class: Option<Weak<dyn Class>>) {
- self.inner().device_common.class = class;
- }
- fn driver(&self) -> Option<Arc<dyn Driver>> {
- let r = self.inner().device_common.driver.clone()?.upgrade();
- if r.is_none() {
- self.inner().device_common.driver = None;
- }
- return r;
- }
- fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
- self.inner().device_common.driver = driver;
- }
- fn is_dead(&self) -> bool {
- false
- }
- fn can_match(&self) -> bool {
- self.inner().device_common.can_match
- }
- fn set_can_match(&self, can_match: bool) {
- self.inner().device_common.can_match = can_match;
- }
- fn state_synced(&self) -> bool {
- true
- }
- fn dev_parent(&self) -> Option<Weak<dyn Device>> {
- self.inner().device_common.get_parent_weak_or_clear()
- }
- fn set_dev_parent(&self, parent: Option<Weak<dyn Device>>) {
- self.inner().device_common.parent = parent;
- }
- fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> {
- None
- }
- }
- impl VirtIODevice for VirtIONetDevice {
- fn handle_irq(&self, _irq: IrqNumber) -> Result<IrqReturn, SystemError> {
- let Some(iface) = self.iface() else {
- error!(
- "VirtIONetDevice '{:?}' has no associated iface to handle irq",
- self.dev_id.id()
- );
- return Ok(IrqReturn::NotHandled);
- };
- let Some(napi) = iface.napi_struct() else {
- log::error!("Virtio net device {} has no napi_struct", iface.name());
- return Ok(IrqReturn::NotHandled);
- };
- napi_schedule(napi);
- // self.netns.wakeup_poll_thread();
- return Ok(IrqReturn::Handled);
- }
- fn dev_id(&self) -> &Arc<DeviceId> {
- return &self.dev_id;
- }
- fn set_device_name(&self, name: String) {
- self.inner().name = Some(name);
- }
- fn device_name(&self) -> String {
- self.inner()
- .name
- .clone()
- .unwrap_or_else(|| "virtio_net".to_string())
- }
- fn set_virtio_device_index(&self, index: VirtIODeviceIndex) {
- self.inner().virtio_index = Some(index);
- }
- fn virtio_device_index(&self) -> Option<VirtIODeviceIndex> {
- return self.inner().virtio_index;
- }
- fn device_type_id(&self) -> u32 {
- virtio_drivers::transport::DeviceType::Network as u32
- }
- fn vendor(&self) -> u32 {
- VIRTIO_VENDOR_ID.into()
- }
- fn irq(&self) -> Option<IrqNumber> {
- None
- }
- }
- pub struct VirtIoNetImpl {
- inner: VirtIONet<HalImpl, VirtIOTransport, 2>,
- }
- impl VirtIoNetImpl {
- const fn new(inner: VirtIONet<HalImpl, VirtIOTransport, 2>) -> Self {
- Self { inner }
- }
- }
- impl Deref for VirtIoNetImpl {
- type Target = VirtIONet<HalImpl, VirtIOTransport, 2>;
- fn deref(&self) -> &Self::Target {
- &self.inner
- }
- }
- impl DerefMut for VirtIoNetImpl {
- fn deref_mut(&mut self) -> &mut Self::Target {
- &mut self.inner
- }
- }
- unsafe impl Send for VirtIoNetImpl {}
- unsafe impl Sync for VirtIoNetImpl {}
- #[derive(Debug)]
- struct VirtIONicDeviceInnerWrapper(UnsafeCell<VirtIONicDeviceInner>);
- unsafe impl Send for VirtIONicDeviceInnerWrapper {}
- unsafe impl Sync for VirtIONicDeviceInnerWrapper {}
- impl Deref for VirtIONicDeviceInnerWrapper {
- type Target = VirtIONicDeviceInner;
- fn deref(&self) -> &Self::Target {
- unsafe { &*self.0.get() }
- }
- }
- impl DerefMut for VirtIONicDeviceInnerWrapper {
- fn deref_mut(&mut self) -> &mut Self::Target {
- unsafe { &mut *self.0.get() }
- }
- }
- #[allow(clippy::mut_from_ref)]
- impl VirtIONicDeviceInnerWrapper {
- fn force_get_mut(&self) -> &mut <VirtIONicDeviceInnerWrapper as Deref>::Target {
- unsafe { &mut *self.0.get() }
- }
- }
- /// Virtio网络设备驱动(加锁)
- pub struct VirtIONicDeviceInner {
- pub inner: Arc<SpinLock<VirtIoNetImpl>>,
- }
- impl Clone for VirtIONicDeviceInner {
- fn clone(&self) -> Self {
- return VirtIONicDeviceInner {
- inner: self.inner.clone(),
- };
- }
- }
- impl Debug for VirtIONicDeviceInner {
- fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
- f.debug_struct("VirtIONicDriver").finish()
- }
- }
- #[cast_to([sync] Iface)]
- #[cast_to([sync] Device)]
- #[derive(Debug)]
- pub struct VirtioInterface {
- device_inner: VirtIONicDeviceInnerWrapper,
- iface_name: String,
- iface_common: super::IfaceCommon,
- inner: SpinLock<InnerVirtIOInterface>,
- locked_kobj_state: LockedKObjectState,
- }
- // // 先手糊为virtio实现这些,后面系统要是有了其他类型网卡,这些实现就得实现成一个单独的trait
- // impl VirtioInterface {
- // /// 消耗token然后主动发送一个 arp 数据包
- // pub fn emit_arp(arp_repr: &ArpRepr, tx_token: VirtioNetToken) {
- // let ether_repr = match arp_repr {
- // ArpRepr::EthernetIpv4 {
- // source_hardware_addr,
- // target_hardware_addr,
- // ..
- // } => EthernetRepr {
- // src_addr: *source_hardware_addr,
- // dst_addr: *target_hardware_addr,
- // ethertype: EthernetProtocol::Arp,
- // },
- // _ => return,
- // };
- // tx_token.consume(ether_repr.buffer_len() + arp_repr.buffer_len(), |buffer| {
- // let mut frame = EthernetFrame::new_unchecked(buffer);
- // ether_repr.emit(&mut frame);
- // let mut pkt = ArpPacket::new_unchecked(frame.payload_mut());
- // arp_repr.emit(&mut pkt);
- // });
- // }
- // /// 解析 arp 包并处理
- // pub fn process_arp(&self, arp_repr: &ArpRepr) -> Option<ArpRepr> {
- // match arp_repr {
- // ArpRepr::EthernetIpv4 {
- // operation: ArpOperation::Reply,
- // source_hardware_addr,
- // source_protocol_addr,
- // ..
- // } => {
- // if !source_hardware_addr.is_unicast()
- // || !self
- // .common()
- // .smol_iface
- // .lock()
- // .context()
- // .in_same_network(&IpAddress::Ipv4(*source_protocol_addr))
- // {
- // return None;
- // }
- // self.common().router_common_data.arp_table.write().insert(
- // IpAddress::Ipv4(*source_protocol_addr),
- // *source_hardware_addr,
- // );
- // None
- // }
- // ArpRepr::EthernetIpv4 {
- // operation: ArpOperation::Request,
- // source_hardware_addr,
- // source_protocol_addr,
- // target_protocol_addr,
- // ..
- // } => {
- // if !source_hardware_addr.is_unicast() || !source_protocol_addr.x_is_unicast() {
- // return None;
- // }
- // if self
- // .common()
- // .smol_iface
- // .lock()
- // .context()
- // .ipv4_addr()
- // .is_none_or(|addr| addr != *target_protocol_addr)
- // {
- // return None;
- // }
- // Some(ArpRepr::EthernetIpv4 {
- // operation: ArpOperation::Reply,
- // source_hardware_addr: self.mac(),
- // source_protocol_addr: *target_protocol_addr,
- // target_hardware_addr: *source_hardware_addr,
- // target_protocol_addr: *source_protocol_addr,
- // })
- // }
- // _ => None,
- // }
- // }
- // }
- #[derive(Debug)]
- struct InnerVirtIOInterface {
- kobj_common: KObjectCommonData,
- device_common: DeviceCommonData,
- netdevice_common: NetDeviceCommonData,
- }
- impl VirtioInterface {
- pub fn new(mut device_inner: VirtIONicDeviceInner) -> Arc<Self> {
- let iface_id = generate_iface_id();
- let mut iface_config = iface::Config::new(wire::HardwareAddress::Ethernet(
- wire::EthernetAddress(device_inner.inner.lock().mac_address()),
- ));
- iface_config.random_seed = rand() as u64;
- let iface = iface::Interface::new(iface_config, &mut device_inner, Instant::now().into());
- let flags = InterfaceFlags::UP
- | InterfaceFlags::BROADCAST
- | InterfaceFlags::RUNNING
- | InterfaceFlags::MULTICAST
- | InterfaceFlags::LOWER_UP;
- let iface = Arc::new(VirtioInterface {
- device_inner: VirtIONicDeviceInnerWrapper(UnsafeCell::new(device_inner)),
- locked_kobj_state: LockedKObjectState::default(),
- iface_name: format!("eth{}", iface_id),
- iface_common: super::IfaceCommon::new(
- iface_id,
- crate::driver::net::types::InterfaceType::EETHER,
- flags,
- iface,
- ),
- inner: SpinLock::new(InnerVirtIOInterface {
- kobj_common: KObjectCommonData::default(),
- device_common: DeviceCommonData::default(),
- netdevice_common: NetDeviceCommonData::default(),
- }),
- });
- // 设置napi struct
- let napi_struct = NapiStruct::new(iface.clone(), 10);
- *iface.common().napi_struct.write() = Some(napi_struct);
- iface
- }
- fn inner(&self) -> SpinLockGuard<'_, InnerVirtIOInterface> {
- return self.inner.lock();
- }
- /// 获取网卡接口的名称
- #[allow(dead_code)]
- pub fn iface_name(&self) -> String {
- self.iface_name.clone()
- }
- }
- impl Drop for VirtioInterface {
- fn drop(&mut self) {
- // 从全局的网卡接口信息表中删除这个网卡的接口信息
- // NET_DEVICES.write_irqsave().remove(&self.nic_id());
- if let Some(ns) = self.net_namespace() {
- ns.remove_device(&self.nic_id());
- }
- }
- }
- impl Device for VirtioInterface {
- fn dev_type(&self) -> DeviceType {
- DeviceType::Net
- }
- fn id_table(&self) -> IdTable {
- IdTable::new(VIRTIO_NET_BASENAME.to_string(), None)
- }
- fn bus(&self) -> Option<Weak<dyn Bus>> {
- self.inner().device_common.bus.clone()
- }
- fn set_bus(&self, bus: Option<Weak<dyn Bus>>) {
- self.inner().device_common.bus = bus;
- }
- fn class(&self) -> Option<Arc<dyn Class>> {
- let mut guard = self.inner();
- let r = guard.device_common.class.clone()?.upgrade();
- if r.is_none() {
- guard.device_common.class = None;
- }
- return r;
- }
- fn set_class(&self, class: Option<Weak<dyn Class>>) {
- self.inner().device_common.class = class;
- }
- fn driver(&self) -> Option<Arc<dyn Driver>> {
- let r = self.inner().device_common.driver.clone()?.upgrade();
- if r.is_none() {
- self.inner().device_common.driver = None;
- }
- return r;
- }
- fn set_driver(&self, driver: Option<Weak<dyn Driver>>) {
- self.inner().device_common.driver = driver;
- }
- fn is_dead(&self) -> bool {
- false
- }
- fn can_match(&self) -> bool {
- self.inner().device_common.can_match
- }
- fn set_can_match(&self, can_match: bool) {
- self.inner().device_common.can_match = can_match;
- }
- fn state_synced(&self) -> bool {
- true
- }
- fn dev_parent(&self) -> Option<Weak<dyn Device>> {
- self.inner().device_common.get_parent_weak_or_clear()
- }
- fn set_dev_parent(&self, parent: Option<Weak<dyn Device>>) {
- self.inner().device_common.parent = parent;
- }
- }
- impl VirtIONicDeviceInner {
- pub fn new(driver_net: VirtIONet<HalImpl, VirtIOTransport, 2>) -> Self {
- let mut iface_config = iface::Config::new(wire::HardwareAddress::Ethernet(
- wire::EthernetAddress(driver_net.mac_address()),
- ));
- iface_config.random_seed = rand() as u64;
- let inner = Arc::new(SpinLock::new(VirtIoNetImpl::new(driver_net)));
- let result = VirtIONicDeviceInner { inner };
- return result;
- }
- }
- pub struct VirtioNetToken {
- driver: VirtIONicDeviceInner,
- rx_buffer: Option<virtio_drivers::device::net::RxBuffer>,
- }
- impl VirtioNetToken {
- pub fn new(
- driver: VirtIONicDeviceInner,
- rx_buffer: Option<virtio_drivers::device::net::RxBuffer>,
- ) -> Self {
- return Self { driver, rx_buffer };
- }
- }
- impl phy::Device for VirtIONicDeviceInner {
- type RxToken<'a>
- = VirtioNetToken
- where
- Self: 'a;
- type TxToken<'a>
- = VirtioNetToken
- where
- Self: 'a;
- fn receive(
- &mut self,
- _timestamp: smoltcp::time::Instant,
- ) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
- match self.inner.lock().receive() {
- Ok(buf) => Some((
- VirtioNetToken::new(self.clone(), Some(buf)),
- VirtioNetToken::new(self.clone(), None),
- )),
- Err(virtio_drivers::Error::NotReady) => None,
- Err(err) => panic!("VirtIO receive failed: {}", err),
- }
- }
- fn transmit(&mut self, _timestamp: smoltcp::time::Instant) -> Option<Self::TxToken<'_>> {
- // debug!("VirtioNet: transmit");
- if self.inner.lock_irqsave().can_send() {
- // debug!("VirtioNet: can send");
- return Some(VirtioNetToken::new(self.clone(), None));
- } else {
- // debug!("VirtioNet: can not send");
- return None;
- }
- }
- fn capabilities(&self) -> phy::DeviceCapabilities {
- let mut caps = phy::DeviceCapabilities::default();
- // 网卡的最大传输单元. 请与IP层的MTU进行区分。这个值应当是网卡的最大传输单元,而不是IP层的MTU。
- caps.max_transmission_unit = 2000;
- /*
- Maximum burst size, in terms of MTU.
- The network device is unable to send or receive bursts large than the value returned by this function.
- If None, there is no fixed limit on burst size, e.g. if network buffers are dynamically allocated.
- */
- caps.max_burst_size = Some(1);
- return caps;
- }
- }
- impl phy::TxToken for VirtioNetToken {
- fn consume<R, F>(self, len: usize, f: F) -> R
- where
- F: FnOnce(&mut [u8]) -> R,
- {
- // // 为了线程安全,这里需要对VirtioNet进行加【写锁】,以保证对设备的互斥访问。
- let mut driver_net = self.driver.inner.lock();
- let mut tx_buf = driver_net.new_tx_buffer(len);
- let result = f(tx_buf.packet_mut());
- driver_net.send(tx_buf).expect("virtio_net send failed");
- return result;
- }
- }
- impl phy::RxToken for VirtioNetToken {
- fn consume<R, F>(self, f: F) -> R
- where
- F: FnOnce(&[u8]) -> R,
- {
- // 为了线程安全,这里需要对VirtioNet进行加【写锁】,以保证对设备的互斥访问。
- let rx_buf = self.rx_buffer.unwrap();
- let result = f(rx_buf.packet());
- self.driver
- .inner
- .lock()
- .recycle_rx_buffer(rx_buf)
- .expect("virtio_net recv failed");
- result
- }
- }
- /// @brief virtio-net 驱动的初始化与测试
- pub fn virtio_net(
- transport: VirtIOTransport,
- dev_id: Arc<DeviceId>,
- dev_parent: Option<Arc<dyn Device>>,
- ) {
- let virtio_net_deivce = VirtIONetDevice::new(transport, dev_id);
- if let Some(virtio_net_deivce) = virtio_net_deivce {
- debug!("VirtIONetDevice '{:?}' created", virtio_net_deivce.dev_id);
- if let Some(dev_parent) = dev_parent {
- virtio_net_deivce.set_dev_parent(Some(Arc::downgrade(&dev_parent)));
- }
- virtio_device_manager()
- .device_add(virtio_net_deivce.clone() as Arc<dyn VirtIODevice>)
- .expect("Add virtio net failed");
- }
- }
- impl Iface for VirtioInterface {
- fn common(&self) -> &super::IfaceCommon {
- &self.iface_common
- }
- fn mac(&self) -> wire::EthernetAddress {
- let mac: [u8; 6] = self.device_inner.inner.lock().mac_address();
- return wire::EthernetAddress::from_bytes(&mac);
- }
- #[inline]
- fn iface_name(&self) -> String {
- return self.iface_name.clone();
- }
- fn poll(&self) -> bool {
- // log::debug!("VirtioInterface: poll");
- self.iface_common.poll(self.device_inner.force_get_mut())
- }
- // fn as_any_ref(&'static self) -> &'static dyn core::any::Any {
- // return self;
- // }
- fn addr_assign_type(&self) -> u8 {
- return self.inner().netdevice_common.addr_assign_type;
- }
- fn net_device_type(&self) -> u16 {
- self.inner().netdevice_common.net_device_type = 1; // 以太网设备
- return self.inner().netdevice_common.net_device_type;
- }
- fn net_state(&self) -> NetDeivceState {
- return self.inner().netdevice_common.state;
- }
- fn set_net_state(&self, state: NetDeivceState) {
- self.inner().netdevice_common.state |= state;
- }
- fn operstate(&self) -> Operstate {
- return self.inner().netdevice_common.operstate;
- }
- fn set_operstate(&self, state: Operstate) {
- self.inner().netdevice_common.operstate = state;
- }
- fn mtu(&self) -> usize {
- use smoltcp::phy::Device;
- self.device_inner
- .force_get_mut()
- .capabilities()
- .max_transmission_unit
- }
- }
- impl KObject for VirtioInterface {
- fn as_any_ref(&self) -> &dyn core::any::Any {
- self
- }
- fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
- self.inner().kobj_common.kern_inode = inode;
- }
- fn inode(&self) -> Option<Arc<KernFSInode>> {
- self.inner().kobj_common.kern_inode.clone()
- }
- fn parent(&self) -> Option<Weak<dyn KObject>> {
- self.inner().kobj_common.parent.clone()
- }
- fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
- self.inner().kobj_common.parent = parent;
- }
- fn kset(&self) -> Option<Arc<KSet>> {
- self.inner().kobj_common.kset.clone()
- }
- fn set_kset(&self, kset: Option<Arc<KSet>>) {
- self.inner().kobj_common.kset = kset;
- }
- fn kobj_type(&self) -> Option<&'static dyn KObjType> {
- self.inner().kobj_common.kobj_type
- }
- fn name(&self) -> String {
- self.iface_name.clone()
- }
- fn set_name(&self, _name: String) {
- // do nothing
- }
- fn kobj_state(&self) -> RwLockReadGuard<'_, KObjectState> {
- self.locked_kobj_state.read()
- }
- fn kobj_state_mut(&self) -> RwLockWriteGuard<'_, KObjectState> {
- self.locked_kobj_state.write()
- }
- fn set_kobj_state(&self, state: KObjectState) {
- *self.locked_kobj_state.write() = state;
- }
- fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
- self.inner().kobj_common.kobj_type = ktype;
- }
- }
- #[unified_init(INITCALL_POSTCORE)]
- fn virtio_net_driver_init() -> Result<(), SystemError> {
- let driver = VirtIONetDriver::new();
- virtio_driver_manager().register(driver.clone() as Arc<dyn VirtIODriver>)?;
- unsafe {
- VIRTIO_NET_DRIVER = Some(driver);
- }
- return Ok(());
- }
- #[derive(Debug)]
- #[cast_to([sync] VirtIODriver)]
- #[cast_to([sync] Driver)]
- struct VirtIONetDriver {
- inner: SpinLock<InnerVirtIODriver>,
- kobj_state: LockedKObjectState,
- }
- impl VirtIONetDriver {
- pub fn new() -> Arc<Self> {
- let inner = InnerVirtIODriver {
- virtio_driver_common: VirtIODriverCommonData::default(),
- driver_common: DriverCommonData::default(),
- kobj_common: KObjectCommonData::default(),
- };
- let id_table = VirtioDeviceId::new(
- virtio_drivers::transport::DeviceType::Network as u32,
- VIRTIO_VENDOR_ID.into(),
- );
- let result = VirtIONetDriver {
- inner: SpinLock::new(inner),
- kobj_state: LockedKObjectState::default(),
- };
- result.add_virtio_id(id_table);
- return Arc::new(result);
- }
- fn inner(&self) -> SpinLockGuard<'_, InnerVirtIODriver> {
- return self.inner.lock();
- }
- }
- #[derive(Debug)]
- struct InnerVirtIODriver {
- virtio_driver_common: VirtIODriverCommonData,
- driver_common: DriverCommonData,
- kobj_common: KObjectCommonData,
- }
- impl VirtIODriver for VirtIONetDriver {
- fn probe(&self, device: &Arc<dyn VirtIODevice>) -> Result<(), SystemError> {
- log::debug!("VirtIONetDriver::probe()");
- let virtio_net_device = device
- .clone()
- .arc_any()
- .downcast::<VirtIONetDevice>()
- .map_err(|_| {
- error!(
- "VirtIONetDriver::probe() failed: device is not a VirtIODevice. Device: '{:?}'",
- device.name()
- );
- SystemError::EINVAL
- })?;
- let iface: Arc<VirtioInterface> =
- VirtioInterface::new(virtio_net_device.inner().device_inner.clone());
- // 标识网络设备已经启动
- iface.set_net_state(NetDeivceState::__LINK_STATE_START);
- // 设置iface的父设备为virtio_net_device
- iface.set_dev_parent(Some(Arc::downgrade(&virtio_net_device) as Weak<dyn Device>));
- // 在sysfs中注册iface
- register_netdevice(iface.clone() as Arc<dyn Iface>)?;
- // 将virtio_net_device和iface关联起来
- virtio_net_device.set_iface(&iface);
- // 将网卡的接口信息注册到全局的网卡接口信息表中
- // NET_DEVICES
- // .write_irqsave()
- // .insert(iface.nic_id(), iface.clone());
- INIT_NET_NAMESPACE.add_device(iface.clone());
- iface
- .iface_common
- .set_net_namespace(INIT_NET_NAMESPACE.clone());
- INIT_NET_NAMESPACE.set_default_iface(iface.clone());
- virtio_irq_manager()
- .register_device(device.clone())
- .expect("Register virtio net irq failed");
- return Ok(());
- }
- fn virtio_id_table(&self) -> Vec<VirtioDeviceId> {
- self.inner().virtio_driver_common.id_table.clone()
- }
- fn add_virtio_id(&self, id: VirtioDeviceId) {
- self.inner().virtio_driver_common.id_table.push(id);
- }
- }
- impl Driver for VirtIONetDriver {
- fn id_table(&self) -> Option<IdTable> {
- Some(IdTable::new(VIRTIO_NET_BASENAME.to_string(), None))
- }
- fn add_device(&self, device: Arc<dyn Device>) {
- let virtio_net_device = device
- .arc_any()
- .downcast::<VirtIONetDevice>()
- .expect("VirtIONetDriver::add_device() failed: device is not a VirtioInterface");
- self.inner()
- .driver_common
- .devices
- .push(virtio_net_device as Arc<dyn Device>);
- }
- fn delete_device(&self, device: &Arc<dyn Device>) {
- let _virtio_net_device = device
- .clone()
- .arc_any()
- .downcast::<VirtIONetDevice>()
- .expect("VirtIONetDriver::delete_device() failed: device is not a VirtioInterface");
- let mut guard = self.inner();
- let index = guard
- .driver_common
- .devices
- .iter()
- .position(|dev| Arc::ptr_eq(device, dev))
- .expect("VirtIONetDriver::delete_device() failed: device not found");
- guard.driver_common.devices.remove(index);
- }
- fn devices(&self) -> Vec<Arc<dyn Device>> {
- self.inner().driver_common.devices.clone()
- }
- fn bus(&self) -> Option<Weak<dyn Bus>> {
- Some(Arc::downgrade(&virtio_bus()) as Weak<dyn Bus>)
- }
- fn set_bus(&self, _bus: Option<Weak<dyn Bus>>) {
- // do nothing
- }
- }
- impl KObject for VirtIONetDriver {
- fn as_any_ref(&self) -> &dyn Any {
- self
- }
- fn set_inode(&self, inode: Option<Arc<KernFSInode>>) {
- self.inner().kobj_common.kern_inode = inode;
- }
- fn inode(&self) -> Option<Arc<KernFSInode>> {
- self.inner().kobj_common.kern_inode.clone()
- }
- fn parent(&self) -> Option<Weak<dyn KObject>> {
- self.inner().kobj_common.parent.clone()
- }
- fn set_parent(&self, parent: Option<Weak<dyn KObject>>) {
- self.inner().kobj_common.parent = parent;
- }
- fn kset(&self) -> Option<Arc<KSet>> {
- self.inner().kobj_common.kset.clone()
- }
- fn set_kset(&self, kset: Option<Arc<KSet>>) {
- self.inner().kobj_common.kset = kset;
- }
- fn kobj_type(&self) -> Option<&'static dyn KObjType> {
- self.inner().kobj_common.kobj_type
- }
- fn set_kobj_type(&self, ktype: Option<&'static dyn KObjType>) {
- self.inner().kobj_common.kobj_type = ktype;
- }
- fn name(&self) -> String {
- VIRTIO_NET_BASENAME.to_string()
- }
- fn set_name(&self, _name: String) {
- // do nothing
- }
- fn kobj_state(&self) -> RwLockReadGuard<'_, KObjectState> {
- self.kobj_state.read()
- }
- fn kobj_state_mut(&self) -> RwLockWriteGuard<'_, KObjectState> {
- self.kobj_state.write()
- }
- fn set_kobj_state(&self, state: KObjectState) {
- *self.kobj_state.write() = state;
- }
- }
|