mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-08 18:26:48 +00:00
将smoltcp升级到0.11.0版本 (#740)
This commit is contained in:
parent
370472f728
commit
881ff6f95e
@ -44,7 +44,7 @@ linkme = "=0.2"
|
|||||||
num = { version = "=0.4.0", default-features = false }
|
num = { version = "=0.4.0", default-features = false }
|
||||||
num-derive = "=0.3"
|
num-derive = "=0.3"
|
||||||
num-traits = { git = "https://git.mirrors.dragonos.org.cn/DragonOS-Community/num-traits.git", rev="1597c1c", default-features = false }
|
num-traits = { git = "https://git.mirrors.dragonos.org.cn/DragonOS-Community/num-traits.git", rev="1597c1c", default-features = false }
|
||||||
smoltcp = { git = "https://git.mirrors.dragonos.org.cn/DragonOS-Community/smoltcp.git", rev = "9027825", default-features = false, features = ["log", "alloc", "socket-raw", "socket-udp", "socket-tcp", "socket-icmp", "socket-dhcpv4", "socket-dns", "proto-ipv4", "proto-ipv6"]}
|
smoltcp = { version = "=0.11.0", default-features = false, features = ["log", "alloc", "socket-raw", "socket-udp", "socket-tcp", "socket-icmp", "socket-dhcpv4", "socket-dns", "proto-ipv4", "proto-ipv6"]}
|
||||||
system_error = { path = "crates/system_error" }
|
system_error = { path = "crates/system_error" }
|
||||||
unified-init = { path = "crates/unified-init" }
|
unified-init = { path = "crates/unified-init" }
|
||||||
virtio-drivers = { git = "https://git.mirrors.dragonos.org.cn/DragonOS-Community/virtio-drivers.git", rev = "f1d1cbb" }
|
virtio-drivers = { git = "https://git.mirrors.dragonos.org.cn/DragonOS-Community/virtio-drivers.git", rev = "f1d1cbb" }
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
//这个文件的绝大部分内容是copy virtio_net.rs的,考虑到所有的驱动都要用操作系统提供的协议栈,我觉得可以把这些内容抽象出来
|
//这个文件的绝大部分内容是copy virtio_net.rs的,考虑到所有的驱动都要用操作系统提供的协议栈,我觉得可以把这些内容抽象出来
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
|
arch::rand::rand,
|
||||||
driver::{
|
driver::{
|
||||||
base::{
|
base::{
|
||||||
device::{bus::Bus, driver::Driver, Device, IdTable},
|
device::{bus::Bus, driver::Driver, Device, IdTable},
|
||||||
@ -22,7 +23,10 @@ use core::{
|
|||||||
fmt::Debug,
|
fmt::Debug,
|
||||||
ops::{Deref, DerefMut},
|
ops::{Deref, DerefMut},
|
||||||
};
|
};
|
||||||
use smoltcp::{phy, wire};
|
use smoltcp::{
|
||||||
|
phy,
|
||||||
|
wire::{self, HardwareAddress},
|
||||||
|
};
|
||||||
use system_error::SystemError;
|
use system_error::SystemError;
|
||||||
|
|
||||||
use super::e1000e::{E1000EBuffer, E1000EDevice};
|
use super::e1000e::{E1000EBuffer, E1000EDevice};
|
||||||
@ -102,16 +106,12 @@ impl phy::TxToken for E1000ETxToken {
|
|||||||
impl E1000EDriver {
|
impl E1000EDriver {
|
||||||
#[allow(clippy::arc_with_non_send_sync)]
|
#[allow(clippy::arc_with_non_send_sync)]
|
||||||
pub fn new(device: E1000EDevice) -> Self {
|
pub fn new(device: E1000EDevice) -> Self {
|
||||||
let mut iface_config = smoltcp::iface::Config::new();
|
let mut iface_config = smoltcp::iface::Config::new(HardwareAddress::Ethernet(
|
||||||
|
|
||||||
// todo: 随机设定这个值。
|
|
||||||
// 参见 https://docs.rs/smoltcp/latest/smoltcp/iface/struct.Config.html#structfield.random_seed
|
|
||||||
iface_config.random_seed = 12345;
|
|
||||||
|
|
||||||
iface_config.hardware_addr = Some(wire::HardwareAddress::Ethernet(
|
|
||||||
smoltcp::wire::EthernetAddress(device.mac_address()),
|
smoltcp::wire::EthernetAddress(device.mac_address()),
|
||||||
));
|
));
|
||||||
|
|
||||||
|
iface_config.random_seed = rand() as u64;
|
||||||
|
|
||||||
let inner: Arc<SpinLock<E1000EDevice>> = Arc::new(SpinLock::new(device));
|
let inner: Arc<SpinLock<E1000EDevice>> = Arc::new(SpinLock::new(device));
|
||||||
let result = E1000EDriver { inner };
|
let result = E1000EDriver { inner };
|
||||||
return result;
|
return result;
|
||||||
@ -175,16 +175,13 @@ impl phy::Device for E1000EDriver {
|
|||||||
impl E1000EInterface {
|
impl E1000EInterface {
|
||||||
pub fn new(mut driver: E1000EDriver) -> Arc<Self> {
|
pub fn new(mut driver: E1000EDriver) -> Arc<Self> {
|
||||||
let iface_id = generate_iface_id();
|
let iface_id = generate_iface_id();
|
||||||
let mut iface_config = smoltcp::iface::Config::new();
|
let mut iface_config = smoltcp::iface::Config::new(HardwareAddress::Ethernet(
|
||||||
|
|
||||||
// todo: 随机设定这个值。
|
|
||||||
// 参见 https://docs.rs/smoltcp/latest/smoltcp/iface/struct.Config.html#structfield.random_seed
|
|
||||||
iface_config.random_seed = 12345;
|
|
||||||
|
|
||||||
iface_config.hardware_addr = Some(wire::HardwareAddress::Ethernet(
|
|
||||||
smoltcp::wire::EthernetAddress(driver.inner.lock().mac_address()),
|
smoltcp::wire::EthernetAddress(driver.inner.lock().mac_address()),
|
||||||
));
|
));
|
||||||
let iface = smoltcp::iface::Interface::new(iface_config, &mut driver);
|
iface_config.random_seed = rand() as u64;
|
||||||
|
|
||||||
|
let iface =
|
||||||
|
smoltcp::iface::Interface::new(iface_config, &mut driver, Instant::now().into());
|
||||||
|
|
||||||
let driver: E1000EDriverWrapper = E1000EDriverWrapper(UnsafeCell::new(driver));
|
let driver: E1000EDriverWrapper = E1000EDriverWrapper(UnsafeCell::new(driver));
|
||||||
let result = Arc::new(E1000EInterface {
|
let result = Arc::new(E1000EInterface {
|
||||||
|
@ -8,11 +8,12 @@ use alloc::{
|
|||||||
string::String,
|
string::String,
|
||||||
sync::{Arc, Weak},
|
sync::{Arc, Weak},
|
||||||
};
|
};
|
||||||
use smoltcp::{phy, wire};
|
use smoltcp::{iface, phy, wire};
|
||||||
use virtio_drivers::{device::net::VirtIONet, transport::Transport};
|
use virtio_drivers::{device::net::VirtIONet, transport::Transport};
|
||||||
|
|
||||||
use super::NetDriver;
|
use super::NetDriver;
|
||||||
use crate::{
|
use crate::{
|
||||||
|
arch::rand::rand,
|
||||||
driver::{
|
driver::{
|
||||||
base::{
|
base::{
|
||||||
device::{bus::Bus, driver::Driver, Device, DeviceId, IdTable},
|
device::{bus::Bus, driver::Driver, Device, DeviceId, IdTable},
|
||||||
@ -77,7 +78,7 @@ impl<T: Transport> Debug for VirtioNICDriver<T> {
|
|||||||
pub struct VirtioInterface<T: Transport> {
|
pub struct VirtioInterface<T: Transport> {
|
||||||
driver: VirtioNICDriverWrapper<T>,
|
driver: VirtioNICDriverWrapper<T>,
|
||||||
iface_id: usize,
|
iface_id: usize,
|
||||||
iface: SpinLock<smoltcp::iface::Interface>,
|
iface: SpinLock<iface::Interface>,
|
||||||
name: String,
|
name: String,
|
||||||
dev_id: Arc<DeviceId>,
|
dev_id: Arc<DeviceId>,
|
||||||
}
|
}
|
||||||
@ -96,16 +97,12 @@ impl<T: Transport> Debug for VirtioInterface<T> {
|
|||||||
impl<T: Transport> VirtioInterface<T> {
|
impl<T: Transport> VirtioInterface<T> {
|
||||||
pub fn new(mut driver: VirtioNICDriver<T>, dev_id: Arc<DeviceId>) -> Arc<Self> {
|
pub fn new(mut driver: VirtioNICDriver<T>, dev_id: Arc<DeviceId>) -> Arc<Self> {
|
||||||
let iface_id = generate_iface_id();
|
let iface_id = generate_iface_id();
|
||||||
let mut iface_config = smoltcp::iface::Config::new();
|
let mut iface_config = iface::Config::new(wire::HardwareAddress::Ethernet(
|
||||||
|
wire::EthernetAddress(driver.inner.lock().mac_address()),
|
||||||
// todo: 随机设定这个值。
|
|
||||||
// 参见 https://docs.rs/smoltcp/latest/smoltcp/iface/struct.Config.html#structfield.random_seed
|
|
||||||
iface_config.random_seed = 12345;
|
|
||||||
|
|
||||||
iface_config.hardware_addr = Some(wire::HardwareAddress::Ethernet(
|
|
||||||
smoltcp::wire::EthernetAddress(driver.inner.lock().mac_address()),
|
|
||||||
));
|
));
|
||||||
let iface = smoltcp::iface::Interface::new(iface_config, &mut driver);
|
iface_config.random_seed = rand() as u64;
|
||||||
|
|
||||||
|
let iface = iface::Interface::new(iface_config, &mut driver, Instant::now().into());
|
||||||
|
|
||||||
let driver: VirtioNICDriverWrapper<T> = VirtioNICDriverWrapper(UnsafeCell::new(driver));
|
let driver: VirtioNICDriverWrapper<T> = VirtioNICDriverWrapper(UnsafeCell::new(driver));
|
||||||
let result = Arc::new(VirtioInterface {
|
let result = Arc::new(VirtioInterface {
|
||||||
@ -140,16 +137,12 @@ impl<T: Transport> Drop for VirtioInterface<T> {
|
|||||||
|
|
||||||
impl<T: 'static + Transport> VirtioNICDriver<T> {
|
impl<T: 'static + Transport> VirtioNICDriver<T> {
|
||||||
pub fn new(driver_net: VirtIONet<HalImpl, T, 2>) -> Self {
|
pub fn new(driver_net: VirtIONet<HalImpl, T, 2>) -> Self {
|
||||||
let mut iface_config = smoltcp::iface::Config::new();
|
let mut iface_config = iface::Config::new(wire::HardwareAddress::Ethernet(
|
||||||
|
wire::EthernetAddress(driver_net.mac_address()),
|
||||||
// todo: 随机设定这个值。
|
|
||||||
// 参见 https://docs.rs/smoltcp/latest/smoltcp/iface/struct.Config.html#structfield.random_seed
|
|
||||||
iface_config.random_seed = 12345;
|
|
||||||
|
|
||||||
iface_config.hardware_addr = Some(wire::HardwareAddress::Ethernet(
|
|
||||||
smoltcp::wire::EthernetAddress(driver_net.mac_address()),
|
|
||||||
));
|
));
|
||||||
|
|
||||||
|
iface_config.random_seed = rand() as u64;
|
||||||
|
|
||||||
let inner: Arc<SpinLock<VirtIONet<HalImpl, T, 2>>> = Arc::new(SpinLock::new(driver_net));
|
let inner: Arc<SpinLock<VirtIONet<HalImpl, T, 2>>> = Arc::new(SpinLock::new(driver_net));
|
||||||
let result = VirtioNICDriver { inner };
|
let result = VirtioNICDriver { inner };
|
||||||
return result;
|
return result;
|
||||||
@ -255,7 +248,7 @@ pub fn virtio_net<T: Transport + 'static>(transport: T, dev_id: Arc<DeviceId>) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let mac = smoltcp::wire::EthernetAddress::from_bytes(&driver_net.mac_address());
|
let mac = wire::EthernetAddress::from_bytes(&driver_net.mac_address());
|
||||||
let driver: VirtioNICDriver<T> = VirtioNICDriver::new(driver_net);
|
let driver: VirtioNICDriver<T> = VirtioNICDriver::new(driver_net);
|
||||||
let iface = VirtioInterface::new(driver, dev_id);
|
let iface = VirtioInterface::new(driver, dev_id);
|
||||||
let name = iface.name.clone();
|
let name = iface.name.clone();
|
||||||
@ -301,9 +294,9 @@ impl<T: Transport + 'static> Driver for VirtioInterface<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<T: Transport + 'static> NetDriver for VirtioInterface<T> {
|
impl<T: Transport + 'static> NetDriver for VirtioInterface<T> {
|
||||||
fn mac(&self) -> smoltcp::wire::EthernetAddress {
|
fn mac(&self) -> wire::EthernetAddress {
|
||||||
let mac: [u8; 6] = self.driver.inner.lock().mac_address();
|
let mac: [u8; 6] = self.driver.inner.lock().mac_address();
|
||||||
return smoltcp::wire::EthernetAddress::from_bytes(&mac);
|
return wire::EthernetAddress::from_bytes(&mac);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
@ -327,13 +320,15 @@ impl<T: Transport + 'static> NetDriver for VirtioInterface<T> {
|
|||||||
if let Some(dest) = dest {
|
if let Some(dest) = dest {
|
||||||
*dest = ip_addrs[0];
|
*dest = ip_addrs[0];
|
||||||
} else {
|
} else {
|
||||||
addrs.push(ip_addrs[0]).expect("Push ipCidr failed: full");
|
addrs
|
||||||
|
.push(ip_addrs[0])
|
||||||
|
.expect("Push wire::IpCidr failed: full");
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
|
|
||||||
fn poll(&self, sockets: &mut smoltcp::iface::SocketSet) -> Result<(), SystemError> {
|
fn poll(&self, sockets: &mut iface::SocketSet) -> Result<(), SystemError> {
|
||||||
let timestamp: smoltcp::time::Instant = Instant::now().into();
|
let timestamp: smoltcp::time::Instant = Instant::now().into();
|
||||||
let mut guard = self.iface.lock();
|
let mut guard = self.iface.lock();
|
||||||
let poll_res = guard.poll(timestamp, self.driver.force_get_mut(), sockets);
|
let poll_res = guard.poll(timestamp, self.driver.force_get_mut(), sockets);
|
||||||
@ -346,7 +341,7 @@ impl<T: Transport + 'static> NetDriver for VirtioInterface<T> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn inner_iface(&self) -> &SpinLock<smoltcp::iface::Interface> {
|
fn inner_iface(&self) -> &SpinLock<iface::Interface> {
|
||||||
return &self.iface;
|
return &self.iface;
|
||||||
}
|
}
|
||||||
// fn as_any_ref(&'static self) -> &'static dyn core::any::Any {
|
// fn as_any_ref(&'static self) -> &'static dyn core::any::Any {
|
||||||
|
@ -112,7 +112,7 @@ impl Socket for RawSocket {
|
|||||||
})),
|
})),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
Err(raw::RecvError::Exhausted) => {
|
Err(_) => {
|
||||||
if !self.metadata.options.contains(SocketOptions::BLOCK) {
|
if !self.metadata.options.contains(SocketOptions::BLOCK) {
|
||||||
// 如果是非阻塞的socket,就返回错误
|
// 如果是非阻塞的socket,就返回错误
|
||||||
return (Err(SystemError::EAGAIN_OR_EWOULDBLOCK), Endpoint::Ip(None));
|
return (Err(SystemError::EAGAIN_OR_EWOULDBLOCK), Endpoint::Ip(None));
|
||||||
@ -327,10 +327,10 @@ impl Socket for UdpSocket {
|
|||||||
// kdebug!("Wait to Read");
|
// kdebug!("Wait to Read");
|
||||||
|
|
||||||
if socket.can_recv() {
|
if socket.can_recv() {
|
||||||
if let Ok((size, remote_endpoint)) = socket.recv_slice(buf) {
|
if let Ok((size, metadata)) = socket.recv_slice(buf) {
|
||||||
drop(socket_set_guard);
|
drop(socket_set_guard);
|
||||||
poll_ifaces();
|
poll_ifaces();
|
||||||
return (Ok(size), Endpoint::Ip(Some(remote_endpoint)));
|
return (Ok(size), Endpoint::Ip(Some(metadata.endpoint)));
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// 如果socket没有连接,则忙等
|
// 如果socket没有连接,则忙等
|
||||||
@ -592,37 +592,33 @@ impl Socket for TcpSocket {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if socket.may_recv() {
|
if socket.may_recv() {
|
||||||
let recv_res = socket.recv_slice(buf);
|
match socket.recv_slice(buf) {
|
||||||
|
Ok(size) => {
|
||||||
|
if size > 0 {
|
||||||
|
let endpoint = if let Some(p) = socket.remote_endpoint() {
|
||||||
|
p
|
||||||
|
} else {
|
||||||
|
return (Err(SystemError::ENOTCONN), Endpoint::Ip(None));
|
||||||
|
};
|
||||||
|
|
||||||
if let Ok(size) = recv_res {
|
drop(socket_set_guard);
|
||||||
if size > 0 {
|
poll_ifaces();
|
||||||
let endpoint = if let Some(p) = socket.remote_endpoint() {
|
return (Ok(size), Endpoint::Ip(Some(endpoint)));
|
||||||
p
|
}
|
||||||
} else {
|
|
||||||
return (Err(SystemError::ENOTCONN), Endpoint::Ip(None));
|
|
||||||
};
|
|
||||||
|
|
||||||
drop(socket_set_guard);
|
|
||||||
poll_ifaces();
|
|
||||||
return (Ok(size), Endpoint::Ip(Some(endpoint)));
|
|
||||||
}
|
}
|
||||||
} else {
|
Err(tcp::RecvError::InvalidState) => {
|
||||||
let err = recv_res.unwrap_err();
|
kwarn!("Tcp Socket Read Error, InvalidState");
|
||||||
match err {
|
return (Err(SystemError::ENOTCONN), Endpoint::Ip(None));
|
||||||
tcp::RecvError::InvalidState => {
|
}
|
||||||
kwarn!("Tcp Socket Read Error, InvalidState");
|
Err(tcp::RecvError::Finished) => {
|
||||||
return (Err(SystemError::ENOTCONN), Endpoint::Ip(None));
|
// 对端写端已关闭,我们应该关闭读端
|
||||||
}
|
HANDLE_MAP
|
||||||
tcp::RecvError::Finished => {
|
.write_irqsave()
|
||||||
// 对端写端已关闭,我们应该关闭读端
|
.get_mut(&self.socket_handle())
|
||||||
HANDLE_MAP
|
.unwrap()
|
||||||
.write_irqsave()
|
.shutdown_type_writer()
|
||||||
.get_mut(&self.socket_handle())
|
.insert(ShutdownType::RCV_SHUTDOWN);
|
||||||
.unwrap()
|
return (Err(SystemError::ENOTCONN), Endpoint::Ip(None));
|
||||||
.shutdown_type_writer()
|
|
||||||
.insert(ShutdownType::RCV_SHUTDOWN);
|
|
||||||
return (Err(SystemError::ENOTCONN), Endpoint::Ip(None));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -6,7 +6,7 @@ use core::{
|
|||||||
|
|
||||||
use crate::arch::CurrentTimeArch;
|
use crate::arch::CurrentTimeArch;
|
||||||
|
|
||||||
use self::{timekeep::ktime_get_real_ns, timekeeping::getnstimeofday};
|
use self::timekeeping::getnstimeofday;
|
||||||
|
|
||||||
pub mod clocksource;
|
pub mod clocksource;
|
||||||
pub mod jiffies;
|
pub mod jiffies;
|
||||||
@ -225,7 +225,8 @@ impl Instant {
|
|||||||
|
|
||||||
/// Create a new `Instant` from the current time
|
/// Create a new `Instant` from the current time
|
||||||
pub fn now() -> Instant {
|
pub fn now() -> Instant {
|
||||||
Self::from_micros(ktime_get_real_ns() / 1000)
|
let tm = getnstimeofday();
|
||||||
|
Self::from_micros(tm.tv_sec * 1000000 + tm.tv_nsec / 1000)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// The fractional number of milliseconds that have passed
|
/// The fractional number of milliseconds that have passed
|
||||||
|
Loading…
x
Reference in New Issue
Block a user