add net support
This commit is contained in:
parent
680f7fed26
commit
9355acf903
12 changed files with 354 additions and 0 deletions
|
@ -3,6 +3,7 @@ pub mod bus;
|
|||
pub mod chardev;
|
||||
pub mod gpu;
|
||||
pub mod input;
|
||||
pub mod net;
|
||||
pub mod plic;
|
||||
|
||||
pub use block::BLOCK_DEVICE;
|
||||
|
@ -10,3 +11,4 @@ pub use bus::*;
|
|||
pub use chardev::UART;
|
||||
pub use gpu::*;
|
||||
pub use input::*;
|
||||
pub use net::*;
|
41
os/src/drivers/net/mod.rs
Normal file
41
os/src/drivers/net/mod.rs
Normal file
|
@ -0,0 +1,41 @@
|
|||
use core::any::Any;
|
||||
|
||||
use alloc::sync::Arc;
|
||||
use lazy_static::*;
|
||||
use virtio_drivers::{VirtIONet, VirtIOHeader};
|
||||
use crate::drivers::virtio::VirtioHal;
|
||||
use crate::sync::UPIntrFreeCell;
|
||||
|
||||
const VIRTIO8: usize = 0x10004000;
|
||||
|
||||
lazy_static! {
|
||||
pub static ref NET_DEVICE: Arc<dyn NetDevice> = Arc::new(VirtIONetWrapper::new());
|
||||
}
|
||||
|
||||
pub trait NetDevice: Send + Sync + Any {
|
||||
fn transmit(&self, data: &[u8]);
|
||||
fn receive(&self, data: &mut [u8]) -> usize;
|
||||
}
|
||||
|
||||
pub struct VirtIONetWrapper(UPIntrFreeCell<VirtIONet<'static, VirtioHal>>);
|
||||
|
||||
impl NetDevice for VirtIONetWrapper {
|
||||
fn transmit(&self, data: &[u8]) {
|
||||
self.0.exclusive_access().send(data).expect("can't send data")
|
||||
}
|
||||
|
||||
fn receive(&self, data: &mut [u8]) -> usize {
|
||||
self.0.exclusive_access().recv(data).expect("can't receive data")
|
||||
}
|
||||
}
|
||||
|
||||
impl VirtIONetWrapper {
|
||||
pub fn new() -> Self {
|
||||
unsafe {
|
||||
let virtio =
|
||||
VirtIONet::<VirtioHal>::new(&mut *(VIRTIO8 as *mut VirtIOHeader))
|
||||
.expect("can't create net device by virtio");
|
||||
VirtIONetWrapper(UPIntrFreeCell::new(virtio))
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue