From 15cedf30850dad79a6b8a91bc5e8de4a99f73580 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E9=93=AD=E6=B6=9B?= <1037827920@qq.com> Date: Thu, 17 Oct 2024 16:15:40 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E5=8E=BB=E9=99=A4virtio=5Fblk,=20virtio=5F?= =?UTF-8?q?net=20expect=E9=94=99=E8=AF=AF=E5=A4=84=E7=90=86=EF=BC=8C?= =?UTF-8?q?=E7=9B=B4=E6=8E=A5=E8=BF=94=E5=9B=9E=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- kernel/src/driver/block/virtio_blk.rs | 4 +--- kernel/src/driver/net/virtio_net.rs | 4 +--- 2 files changed, 2 insertions(+), 6 deletions(-) diff --git a/kernel/src/driver/block/virtio_blk.rs b/kernel/src/driver/block/virtio_blk.rs index e00d9f82..c6644232 100644 --- a/kernel/src/driver/block/virtio_blk.rs +++ b/kernel/src/driver/block/virtio_blk.rs @@ -470,9 +470,7 @@ impl KObject for VirtIOBlkDevice { #[unified_init(INITCALL_POSTCORE)] fn virtio_blk_driver_init() -> Result<(), SystemError> { let driver = VirtIOBlkDriver::new(); - virtio_driver_manager() - .register(driver.clone() as Arc) - .expect("Add virtio block driver failed"); + virtio_driver_manager().register(driver.clone() as Arc)?; unsafe { VIRTIO_BLK_DRIVER = Some(driver); } diff --git a/kernel/src/driver/net/virtio_net.rs b/kernel/src/driver/net/virtio_net.rs index 477dc1cf..b69fa094 100644 --- a/kernel/src/driver/net/virtio_net.rs +++ b/kernel/src/driver/net/virtio_net.rs @@ -727,9 +727,7 @@ impl KObject for VirtioInterface { #[unified_init(INITCALL_POSTCORE)] fn virtio_net_driver_init() -> Result<(), SystemError> { let driver = VirtIONetDriver::new(); - virtio_driver_manager() - .register(driver.clone() as Arc) - .expect("Add virtio net driver failed"); + virtio_driver_manager().register(driver.clone() as Arc)?; unsafe { VIRTIO_NET_DRIVER = Some(driver); } From acfceaa42ee4072c539c002982fdb5e8074649f9 Mon Sep 17 00:00:00 2001 From: Cai Junyuan <121806694+smallcjy@users.noreply.github.com> Date: Sun, 20 Oct 2024 20:29:24 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=BD=91=E5=8D=A1?= =?UTF-8?q?=E9=A1=BA=E5=BA=8F=E7=9A=84bug=20(#996)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 修复网卡顺序的bug * make fmt * feat: 添加默认网卡字段 * make fmt * 删掉奇怪加入的文件 --- kernel/src/driver/net/e1000e/e1000e_driver.rs | 2 +- kernel/src/driver/net/loopback.rs | 11 ++++----- kernel/src/driver/net/mod.rs | 11 ++++++++- kernel/src/driver/net/virtio_net.rs | 2 +- kernel/src/init/initial_kthread.rs | 6 +---- kernel/src/net/net_core.rs | 4 ++-- kernel/src/net/socket/inet/common/mod.rs | 24 +++++++++++++++---- 7 files changed, 40 insertions(+), 20 deletions(-) diff --git a/kernel/src/driver/net/e1000e/e1000e_driver.rs b/kernel/src/driver/net/e1000e/e1000e_driver.rs index 572dcda5..ed2a4346 100644 --- a/kernel/src/driver/net/e1000e/e1000e_driver.rs +++ b/kernel/src/driver/net/e1000e/e1000e_driver.rs @@ -202,7 +202,7 @@ impl E1000EInterface { let result = Arc::new(E1000EInterface { driver: E1000EDriverWrapper(UnsafeCell::new(driver)), - common: IfaceCommon::new(iface_id, iface), + common: IfaceCommon::new(iface_id, false, iface), name: format!("eth{}", iface_id), inner: SpinLock::new(InnerE1000EInterface { netdevice_common: NetDeviceCommonData::default(), diff --git a/kernel/src/driver/net/loopback.rs b/kernel/src/driver/net/loopback.rs index ee32a823..9bbc92d0 100644 --- a/kernel/src/driver/net/loopback.rs +++ b/kernel/src/driver/net/loopback.rs @@ -8,7 +8,7 @@ use crate::driver::base::kobject::{ }; use crate::driver::base::kset::KSet; use crate::filesystem::kernfs::KernFSInode; -// use crate::init::initcall::INITCALL_DEVICE; +use crate::init::initcall::INITCALL_DEVICE; use crate::libs::rwlock::{RwLockReadGuard, RwLockWriteGuard}; use crate::libs::spinlock::{SpinLock, SpinLockGuard}; use crate::net::{generate_iface_id, NET_DEVICES}; @@ -26,7 +26,7 @@ use smoltcp::{ wire::{IpAddress, IpCidr}, }; use system_error::SystemError; -// use unified_init::macros::unified_init; +use unified_init::macros::unified_init; use super::{register_netdevice, NetDeivceState, NetDeviceCommonData, Operstate}; @@ -278,7 +278,7 @@ impl LoopbackInterface { pub fn new(mut driver: LoopbackDriver) -> Arc { let iface_id = generate_iface_id(); let mut iface_config = smoltcp::iface::Config::new(HardwareAddress::Ethernet( - smoltcp::wire::EthernetAddress([0x02, 0x00, 0x00, 0x00, 0x00, 0x01]), + smoltcp::wire::EthernetAddress([0x00, 0x00, 0x00, 0x00, 0x00, 0x00]), )); iface_config.random_seed = rand() as u64; @@ -293,7 +293,7 @@ impl LoopbackInterface { Arc::new(LoopbackInterface { driver: LoopbackDriverWapper(UnsafeCell::new(driver)), - common: IfaceCommon::new(iface_id, iface), + common: IfaceCommon::new(iface_id, false, iface), inner: SpinLock::new(InnerLoopbackInterface { netdevice_common: NetDeviceCommonData::default(), device_common: DeviceCommonData::default(), @@ -500,8 +500,7 @@ pub fn loopback_driver_init() { } /// ## lo网卡设备的注册函数 -//TODO: 现在先不用初始化宏进行注册,使virtonet排在网卡列表头,待网络子系统重构后再使用初始化宏并修复该bug -// #[unified_init(INITCALL_DEVICE)] +#[unified_init(INITCALL_DEVICE)] pub fn loopback_init() -> Result<(), SystemError> { loopback_probe(); log::debug!("Successfully init loopback device"); diff --git a/kernel/src/driver/net/mod.rs b/kernel/src/driver/net/mod.rs index b55ee586..457b33f5 100644 --- a/kernel/src/driver/net/mod.rs +++ b/kernel/src/driver/net/mod.rs @@ -170,6 +170,9 @@ pub struct IfaceCommon { port_manager: PortManager, /// 下次轮询的时间 poll_at_ms: core::sync::atomic::AtomicU64, + /// 默认网卡标识 + /// TODO: 此字段设置目的是解决对bind unspecified地址的分包问题,需要在inet实现多网卡监听或路由子系统实现后移除 + default_iface: bool, } impl fmt::Debug for IfaceCommon { @@ -185,7 +188,7 @@ impl fmt::Debug for IfaceCommon { } impl IfaceCommon { - pub fn new(iface_id: usize, iface: smoltcp::iface::Interface) -> Self { + pub fn new(iface_id: usize, default_iface: bool, iface: smoltcp::iface::Interface) -> Self { IfaceCommon { iface_id, smol_iface: SpinLock::new(iface), @@ -193,6 +196,7 @@ impl IfaceCommon { bounds: RwLock::new(Vec::new()), port_manager: PortManager::new(), poll_at_ms: core::sync::atomic::AtomicU64::new(0), + default_iface, } } @@ -278,4 +282,9 @@ impl IfaceCommon { pub fn bind_socket(&self, socket: Arc) { self.bounds.write().push(socket); } + + // TODO: 需要在inet实现多网卡监听或路由子系统实现后移除 + pub fn is_default_iface(&self) -> bool { + self.default_iface + } } diff --git a/kernel/src/driver/net/virtio_net.rs b/kernel/src/driver/net/virtio_net.rs index b69fa094..a8b3b058 100644 --- a/kernel/src/driver/net/virtio_net.rs +++ b/kernel/src/driver/net/virtio_net.rs @@ -399,7 +399,7 @@ impl 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, iface), + iface_common: super::IfaceCommon::new(iface_id, true, iface), inner: SpinLock::new(InnerVirtIOInterface { kobj_common: KObjectCommonData::default(), device_common: DeviceCommonData::default(), diff --git a/kernel/src/init/initial_kthread.rs b/kernel/src/init/initial_kthread.rs index a6670f16..0d71c8d4 100644 --- a/kernel/src/init/initial_kthread.rs +++ b/kernel/src/init/initial_kthread.rs @@ -8,10 +8,7 @@ use system_error::SystemError; use crate::{ arch::{interrupt::TrapFrame, process::arch_switch_to_user}, - driver::{ - net::{e1000e::e1000e::e1000e_init, loopback::loopback_init}, - virtio::virtio::virtio_probe, - }, + driver::{net::e1000e::e1000e::e1000e_init, virtio::virtio::virtio_probe}, filesystem::vfs::core::mount_root_fs, net::net_core::net_init, process::{ @@ -48,7 +45,6 @@ fn kernel_init() -> Result<(), SystemError> { net_init().unwrap_or_else(|err| { error!("Failed to initialize network: {:?}", err); }); - loopback_init()?; debug!("initial kernel thread done."); diff --git a/kernel/src/net/net_core.rs b/kernel/src/net/net_core.rs index 85de7cba..da1507e6 100644 --- a/kernel/src/net/net_core.rs +++ b/kernel/src/net/net_core.rs @@ -40,8 +40,8 @@ fn dhcp_query() -> Result<(), SystemError> { let binding = NET_DEVICES.write_irqsave(); log::debug!("binding: {:?}", *binding); //由于现在os未实现在用户态为网卡动态分配内存,而lo网卡的id最先分配且ip固定不能被分配 - //所以特判取用id为0的网卡(也就是virto_net) - let net_face = binding.get(&0).ok_or(SystemError::ENODEV)?.clone(); + //所以特判取用id为1的网卡(也就是virtio_net) + let net_face = binding.get(&1).ok_or(SystemError::ENODEV)?.clone(); drop(binding); diff --git a/kernel/src/net/socket/inet/common/mod.rs b/kernel/src/net/socket/inet/common/mod.rs index 5c706ce7..983b2316 100644 --- a/kernel/src/net/socket/inet/common/mod.rs +++ b/kernel/src/net/socket/inet/common/mod.rs @@ -1,5 +1,6 @@ use crate::net::{Iface, NET_DEVICES}; use alloc::sync::Arc; +use alloc::vec::Vec; use system_error::SystemError::{self, *}; pub mod port; @@ -47,11 +48,26 @@ impl BoundInner { // } // 强绑VirtualIO // log::debug!("Not bind to any iface, bind to virtIO"); - let iface = NET_DEVICES + + let ifaces: Vec> = NET_DEVICES .read_irqsave() - .get(&0) - .expect("??bind without virtIO, serious?") - .clone(); + .iter() + .filter_map(|(_, v)| { + if v.common().is_default_iface() { + Some(v.clone()) + } else { + None + } + }) + .collect(); + + // let iface = NET_DEVICES + // .read_irqsave() + // .get(&0) + // .expect("??bind without virtIO, serious?") + // .clone(); + + let iface = ifaces[0].clone(); let handle = iface.sockets().lock_no_preempt().add(socket); return Ok(Self { handle, iface }); } else {