asterinas/kernel/comps/network/src/driver.rs

72 lines
1.7 KiB
Rust
Raw Normal View History

2024-01-03 03:22:36 +00:00
// SPDX-License-Identifier: MPL-2.0
2023-05-30 08:34:28 +00:00
use alloc::vec;
2024-12-17 02:24:07 +00:00
use aster_bigtcp::{
device::{self, NotifyDevice},
time::Instant,
};
2024-06-19 08:18:39 +00:00
use ostd::mm::VmWriter;
2023-05-30 08:34:28 +00:00
2024-03-12 11:01:50 +00:00
use crate::{buffer::RxBuffer, AnyNetworkDevice};
2023-05-30 08:34:28 +00:00
2024-09-19 04:16:35 +00:00
impl device::Device for dyn AnyNetworkDevice {
2023-05-30 08:34:28 +00:00
type RxToken<'a> = RxToken;
type TxToken<'a> = TxToken<'a>;
2023-08-28 07:03:28 +00:00
fn receive(&mut self, _timestamp: Instant) -> Option<(Self::RxToken<'_>, Self::TxToken<'_>)> {
if self.can_receive() && self.can_send() {
2023-08-28 07:03:28 +00:00
let rx_buffer = self.receive().unwrap();
Some((RxToken(rx_buffer), TxToken(self)))
2023-05-30 08:34:28 +00:00
} else {
None
}
}
2023-08-28 07:03:28 +00:00
fn transmit(&mut self, _timestamp: Instant) -> Option<Self::TxToken<'_>> {
2023-05-30 08:34:28 +00:00
if self.can_send() {
2023-08-28 07:03:28 +00:00
Some(TxToken(self))
2023-05-30 08:34:28 +00:00
} else {
None
}
}
2024-09-19 04:16:35 +00:00
fn capabilities(&self) -> device::DeviceCapabilities {
2023-08-28 07:03:28 +00:00
self.capabilities()
2023-05-30 08:34:28 +00:00
}
}
2024-12-17 02:24:07 +00:00
impl NotifyDevice for dyn AnyNetworkDevice {
fn notify_poll_end(&mut self) {
self.notify_poll_end();
}
}
2023-05-30 08:34:28 +00:00
pub struct RxToken(RxBuffer);
2024-09-19 04:16:35 +00:00
impl device::RxToken for RxToken {
2024-03-12 11:01:50 +00:00
fn consume<R, F>(self, f: F) -> R
2023-05-30 08:34:28 +00:00
where
2024-08-22 06:34:41 +00:00
F: FnOnce(&[u8]) -> R,
2023-05-30 08:34:28 +00:00
{
2024-03-12 11:01:50 +00:00
let mut packet = self.0.packet();
let mut buffer = vec![0u8; packet.remain()];
packet.read(&mut VmWriter::from(&mut buffer as &mut [u8]));
2024-08-22 06:34:41 +00:00
f(&buffer)
2023-05-30 08:34:28 +00:00
}
}
2023-11-20 12:37:51 +00:00
pub struct TxToken<'a>(&'a mut dyn AnyNetworkDevice);
2023-05-30 08:34:28 +00:00
impl device::TxToken for TxToken<'_> {
2023-05-30 08:34:28 +00:00
fn consume<R, F>(self, len: usize, f: F) -> R
where
F: FnOnce(&mut [u8]) -> R,
{
let mut buffer = vec![0u8; len];
let res = f(&mut buffer);
2024-03-12 11:01:50 +00:00
self.0.send(&buffer).expect("Send packet failed");
2023-05-30 08:34:28 +00:00
res
}
}