os/device/net/
virtio_net.rs1use 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 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 match VirtioNetDevice::new(transport, device_id) {
33 Ok(virtio_device) => {
34 pr_info!("[Device] VirtioNetDevice created with ID: {}", device_id);
35
36 let interface_name = format!("eth{}", device_id);
38 let network_interface =
39 Arc::new(NetworkInterface::new(interface_name, virtio_device.clone()));
40
41 add_network_device(virtio_device.clone());
43
44 crate::net::interface::NETWORK_INTERFACE_MANAGER
46 .lock()
47 .add_interface(network_interface.clone());
48
49 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}