os/device/net/
virtio_net.rs

1use virtio_drivers::transport::mmio::MmioTransport;
2
3use crate::{
4    device::{
5        Driver,
6        net::{add_network_device, net_device::VirtioNetDevice},
7    },
8    net::interface::NetworkInterface,
9    pr_info, pr_warn, println,
10    sync::SpinLock,
11};
12use alloc::{format, sync::Arc};
13use lazy_static::lazy_static;
14
15lazy_static! {
16    static ref NET_DEVICE_COUNT: SpinLock<usize> = SpinLock::new(0);
17}
18
19pub fn init(transport: MmioTransport<'static>) {
20    pr_info!("[Device] Initializing network driver (virtio-net)");
21
22    // 获取设备ID
23    let device_id = {
24        let mut count = NET_DEVICE_COUNT.lock();
25        let id = *count;
26        *count += 1;
27        id
28    };
29    pr_info!("[Device] Find VirtioNetDevice with ID: {}", device_id);
30
31    // 创建VirtioNetDevice
32    match VirtioNetDevice::new(transport, device_id) {
33        Ok(virtio_device) => {
34            pr_info!("[Device] VirtioNetDevice created with ID: {}", device_id);
35
36            // 创建网络接口
37            let interface_name = format!("eth{}", device_id);
38            let network_interface =
39                Arc::new(NetworkInterface::new(interface_name, virtio_device.clone()));
40
41            // 将设备添加到全局设备列表
42            add_network_device(virtio_device.clone());
43
44            // 将接口添加到全局接口管理器
45            crate::net::interface::NETWORK_INTERFACE_MANAGER
46                .lock()
47                .add_interface(network_interface.clone());
48
49            // 注册设备驱动
50            crate::device::register_driver(network_interface.clone() as Arc<dyn Driver>);
51
52            pr_info!(
53                "[Device] Network interface {} initialized successfully",
54                network_interface.name()
55            );
56        }
57        Err(e) => {
58            pr_warn!("[Device] Failed to initialize VirtioNetDevice: {:?}", e);
59        }
60    }
61}