Browse Source

fix: 修复网卡顺序的bug (#996)

* fix: 修复网卡顺序的bug

* make fmt

* feat: 添加默认网卡字段

* make fmt

* 删掉奇怪加入的文件
Cai Junyuan 5 months ago
parent
commit
acfceaa42e

+ 1 - 1
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(),

+ 5 - 6
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<Self> {
         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");

+ 10 - 1
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<dyn InetSocket>) {
         self.bounds.write().push(socket);
     }
+
+    // TODO: 需要在inet实现多网卡监听或路由子系统实现后移除
+    pub fn is_default_iface(&self) -> bool {
+        self.default_iface
+    }
 }

+ 1 - 1
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(),

+ 1 - 5
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.");
 

+ 2 - 2
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);
 

+ 20 - 4
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<Arc<dyn Iface>> = 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 {