diff --git a/kernel/src/driver/block/virtio_blk.rs b/kernel/src/driver/block/virtio_blk.rs index 74e1fbf6..e00d9f82 100644 --- a/kernel/src/driver/block/virtio_blk.rs +++ b/kernel/src/driver/block/virtio_blk.rs @@ -38,7 +38,7 @@ use crate::{ }, }, exception::{irqdesc::IrqReturn, IrqNumber}, - filesystem::{kernfs::KernFSInode, mbr::MbrDiskPartionTable, sysfs::AttributeGroup}, + filesystem::{kernfs::KernFSInode, mbr::MbrDiskPartionTable}, init::initcall::INITCALL_POSTCORE, libs::{ rwlock::{RwLockReadGuard, RwLockWriteGuard}, @@ -407,10 +407,6 @@ impl Device for VirtIOBlkDevice { fn set_dev_parent(&self, parent: Option>) { self.inner().device_common.parent = parent; } - - fn attribute_groups(&self) -> Option<&'static [&'static dyn AttributeGroup]> { - None - } } impl KObject for VirtIOBlkDevice { diff --git a/kernel/src/driver/net/irq_handle.rs b/kernel/src/driver/net/irq_handle.rs index 5436a349..bdc3942d 100644 --- a/kernel/src/driver/net/irq_handle.rs +++ b/kernel/src/driver/net/irq_handle.rs @@ -23,7 +23,6 @@ impl IrqHandler for DefaultNetIrqHandler { _dynamic_data: Option>, ) -> Result { // poll_ifaces_try_lock_onetime().ok(); - log::warn!("DefaultNetIrqHandler: poll_ifaces_try_lock_onetime -> poll_ifaces"); poll_ifaces(); Ok(IrqReturn::Handled) } diff --git a/kernel/src/driver/net/loopback.rs b/kernel/src/driver/net/loopback.rs index ffb81962..ee32a823 100644 --- a/kernel/src/driver/net/loopback.rs +++ b/kernel/src/driver/net/loopback.rs @@ -286,17 +286,11 @@ impl LoopbackInterface { smoltcp::iface::Interface::new(iface_config, &mut driver, Instant::now().into()); //设置网卡地址为127.0.0.1 iface.update_ip_addrs(|ip_addrs| { - for i in 1..=2 { - ip_addrs - .push(IpCidr::new(IpAddress::v4(127, 0, 0, i), 8)) - .expect("Push ipCidr failed: full"); - } + ip_addrs + .push(IpCidr::new(IpAddress::v4(127, 0, 0, 1), 8)) + .expect("Push ipCidr failed: full"); }); - // iface.routes_mut().update(|routes_map| { - // routes_map[0]. - // }); - Arc::new(LoopbackInterface { driver: LoopbackDriverWapper(UnsafeCell::new(driver)), common: IfaceCommon::new(iface_id, iface), diff --git a/kernel/src/driver/net/mod.rs b/kernel/src/driver/net/mod.rs index 85067e3a..b55ee586 100644 --- a/kernel/src/driver/net/mod.rs +++ b/kernel/src/driver/net/mod.rs @@ -230,6 +230,7 @@ impl IfaceCommon { let new_instant = instant.total_millis() as u64; self.poll_at_ms.store(new_instant, Ordering::Relaxed); + // TODO: poll at // if old_instant == 0 || new_instant < old_instant { // self.polling_wait_queue.wake_all(); // } @@ -237,12 +238,8 @@ impl IfaceCommon { self.poll_at_ms.store(0, Ordering::Relaxed); } - // if has_events { - - // log::debug!("IfaceCommon::poll: has_events"); - // We never try to hold the write lock in the IRQ context, and we disable IRQ when - // holding the write lock. So we don't need to disable IRQ when holding the read lock. self.bounds.read().iter().for_each(|bound_socket| { + // incase our inet socket missed the event, we manually notify it each time we poll bound_socket.on_iface_events(); if has_events { bound_socket @@ -251,13 +248,13 @@ impl IfaceCommon { } }); + // TODO: remove closed sockets // let closed_sockets = self // .closing_sockets // .lock_irq_disabled() // .extract_if(|closing_socket| closing_socket.is_closed()) // .collect::>(); // drop(closed_sockets); - // } } pub fn update_ip_addrs(&self, ip_addrs: &[smoltcp::wire::IpCidr]) -> Result<(), SystemError> { diff --git a/kernel/src/net/mod.rs b/kernel/src/net/mod.rs index ce1993bf..83a52c74 100644 --- a/kernel/src/net/mod.rs +++ b/kernel/src/net/mod.rs @@ -10,9 +10,9 @@ use crate::{driver::net::Iface, libs::rwlock::RwLock}; pub mod event_poll; pub mod net_core; +pub mod posix; pub mod socket; pub mod syscall; -pub mod syscall_util; lazy_static! { /// # 所有网络接口的列表 diff --git a/kernel/src/net/syscall_util.rs b/kernel/src/net/posix.rs similarity index 99% rename from kernel/src/net/syscall_util.rs rename to kernel/src/net/posix.rs index 76e6dc9a..693e2214 100644 --- a/kernel/src/net/syscall_util.rs +++ b/kernel/src/net/posix.rs @@ -1,3 +1,7 @@ +// +// posix.rs 记录了系统调用时用到的结构 +// + bitflags::bitflags! { // #[derive(PartialEq, Eq, Debug, Clone, Copy)] pub struct PosixArgsSocketType: u32 { diff --git a/kernel/src/net/socket/base.rs b/kernel/src/net/socket/base.rs index 946ef185..6b38f181 100644 --- a/kernel/src/net/socket/base.rs +++ b/kernel/src/net/socket/base.rs @@ -1,7 +1,7 @@ #![allow(unused_variables)] +use crate::net::posix::MsgHdr; use crate::net::socket::*; -use crate::net::syscall_util::MsgHdr; use alloc::sync::Arc; use core::any::Any; use core::fmt::Debug; diff --git a/kernel/src/net/socket/inet/datagram/mod.rs b/kernel/src/net/socket/inet/datagram/mod.rs index 0a130eba..f6b3b406 100644 --- a/kernel/src/net/socket/inet/datagram/mod.rs +++ b/kernel/src/net/socket/inet/datagram/mod.rs @@ -307,129 +307,3 @@ bitflags! { const ESPINTCP = 7; // Yikes, this is really xfrm encap types. } } - -// fn sock_set_option( -// &self, -// _socket: &mut udp::Socket, -// _level: SocketOptionsLevel, -// optname: PosixSocketOption, -// _optval: &[u8], -// ) -> Result<(), SystemError> { -// use PosixSocketOption::*; -// use SystemError::*; - -// if optname == SO_BINDTODEVICE { -// todo!("SO_BINDTODEVICE"); -// } - -// match optname { -// SO_TYPE => {} -// SO_PROTOCOL => {} -// SO_DOMAIN => {} -// SO_ERROR => { -// return Err(ENOPROTOOPT); -// } -// SO_TIMESTAMP_OLD => {} -// SO_TIMESTAMP_NEW => {} -// SO_TIMESTAMPNS_OLD => {} - -// SO_TIMESTAMPING_OLD => {} - -// SO_RCVTIMEO_OLD => {} - -// SO_SNDTIMEO_OLD => {} - -// // if define CONFIG_NET_RX_BUSY_POLL -// SO_BUSY_POLL | SO_PREFER_BUSY_POLL | SO_BUSY_POLL_BUDGET => { -// debug!("Unsupported socket option: {:?}", optname); -// return Err(ENOPROTOOPT); -// } -// // end if -// optname => { -// debug!("Unsupported socket option: {:?}", optname); -// return Err(ENOPROTOOPT); -// } -// } -// return Ok(()); -// } - -// fn udp_set_option( -// &self, -// level: SocketOptionsLevel, -// optname: usize, -// optval: &[u8], -// ) -> Result<(), SystemError> { -// use PosixSocketOption::*; - -// let so_opt_name = -// PosixSocketOption::try_from(optname as i32) -// .map_err(|_| SystemError::ENOPROTOOPT)?; - -// if level == SocketOptionsLevel::SOL_SOCKET { -// self.with_mut_socket(f) -// self.sock_set_option(self., level, so_opt_name, optval)?; -// if so_opt_name == SO_RCVBUF || so_opt_name == SO_RCVBUFFORCE { -// todo!("SO_RCVBUF"); -// } -// } - -// match UdpSocketOptions::from_bits_truncate(optname as u32) { -// UdpSocketOptions::UDP_CORK => { -// todo!("UDP_CORK"); -// } -// UdpSocketOptions::UDP_ENCAP => { -// match UdpEncapTypes::from_bits_truncate(optval[0]) { -// UdpEncapTypes::ESPINUDP_NON_IKE => { -// todo!("ESPINUDP_NON_IKE"); -// } -// UdpEncapTypes::ESPINUDP => { -// todo!("ESPINUDP"); -// } -// UdpEncapTypes::L2TPINUDP => { -// todo!("L2TPINUDP"); -// } -// UdpEncapTypes::GTP0 => { -// todo!("GTP0"); -// } -// UdpEncapTypes::GTP1U => { -// todo!("GTP1U"); -// } -// UdpEncapTypes::RXRPC => { -// todo!("RXRPC"); -// } -// UdpEncapTypes::ESPINTCP => { -// todo!("ESPINTCP"); -// } -// UdpEncapTypes::ZERO => {} -// _ => { -// return Err(SystemError::ENOPROTOOPT); -// } -// } -// } -// UdpSocketOptions::UDP_NO_CHECK6_TX => { -// todo!("UDP_NO_CHECK6_TX"); -// } -// UdpSocketOptions::UDP_NO_CHECK6_RX => { -// todo!("UDP_NO_CHECK6_RX"); -// } -// UdpSocketOptions::UDP_SEGMENT => { -// todo!("UDP_SEGMENT"); -// } -// UdpSocketOptions::UDP_GRO => { -// todo!("UDP_GRO"); -// } - -// UdpSocketOptions::UDPLITE_RECV_CSCOV => { -// todo!("UDPLITE_RECV_CSCOV"); -// } -// UdpSocketOptions::UDPLITE_SEND_CSCOV => { -// todo!("UDPLITE_SEND_CSCOV"); -// } - -// UdpSocketOptions::ZERO => {} -// _ => { -// return Err(SystemError::ENOPROTOOPT); -// } -// } -// return Ok(()); -// } diff --git a/kernel/src/net/socket/inet/mod.rs b/kernel/src/net/socket/inet/mod.rs index f28a9b35..074208ca 100644 --- a/kernel/src/net/socket/inet/mod.rs +++ b/kernel/src/net/socket/inet/mod.rs @@ -30,54 +30,3 @@ pub trait InetSocket: Socket { /// 通知socket发生的事件 fn on_iface_events(&self); } - -// #[derive(Debug)] -// pub enum InetSocket { -// // Raw(RawSocket), -// Udp(UdpSocket), -// Tcp(TcpSocket), -// } - -// impl InetSocket { -// /// # `on_iface_events` -// /// 通知socket发生了事件 -// pub fn on_iface_events(&self) { -// todo!() -// } -// } - -// impl IndexNode for InetSocket { - -// } - -// impl Socket for InetSocket { -// fn epoll_items(&self) -> &super::common::poll_unit::EPollItems { -// match self { -// InetSocket::Udp(udp) => udp.epoll_items(), -// InetSocket::Tcp(tcp) => tcp.epoll_items(), -// } -// } - -// fn bind(&self, endpoint: crate::net::Endpoint) -> Result<(), SystemError> { -// if let crate::net::Endpoint::Ip(ip) = endpoint { -// match self { -// InetSocket::Udp(udp) => { -// udp.do_bind(ip)?; -// }, -// InetSocket::Tcp(tcp) => { -// tcp.do_bind(ip)?; -// }, -// } -// return Ok(()); -// } -// return Err(EINVAL); -// } - -// fn wait_queue(&self) -> &super::common::poll_unit::WaitQueue { -// todo!() -// } - -// fn on_iface_events(&self) { -// todo!() -// } -// } diff --git a/kernel/src/net/socket/inet/syscall.rs b/kernel/src/net/socket/inet/syscall.rs index 3aaf6fc4..a89ce13e 100644 --- a/kernel/src/net/socket/inet/syscall.rs +++ b/kernel/src/net/socket/inet/syscall.rs @@ -14,20 +14,14 @@ fn create_inet_socket( // log::debug!("type: {:?}, protocol: {:?}", socket_type, protocol); use smoltcp::wire::IpProtocol::*; match socket_type { - PSOCK::Datagram => { - match protocol { - HopByHop | Udp => { - return Ok(UdpSocket::new(false)); - } - _ => { - return Err(EPROTONOSUPPORT); - } + PSOCK::Datagram => match protocol { + HopByHop | Udp => { + return Ok(UdpSocket::new(false)); } - // if !matches!(protocol, Udp) { - // return Err(EPROTONOSUPPORT); - // } - // return Ok(UdpSocket::new(false)); - } + _ => { + return Err(EPROTONOSUPPORT); + } + }, PSOCK::Stream => match protocol { HopByHop | Tcp => { return Ok(TcpSocket::new(false)); diff --git a/kernel/src/net/socket/posix/types.rs b/kernel/src/net/socket/posix/types.rs index f415cf44..c27552d7 100644 --- a/kernel/src/net/socket/posix/types.rs +++ b/kernel/src/net/socket/posix/types.rs @@ -9,7 +9,7 @@ pub enum Type { Packet = 10, } -use crate::net::syscall_util::PosixArgsSocketType; +use crate::net::posix::PosixArgsSocketType; impl TryFrom for Type { type Error = system_error::SystemError; fn try_from(x: PosixArgsSocketType) -> Result { diff --git a/kernel/src/net/syscall.rs b/kernel/src/net/syscall.rs index 31ffcaeb..8d2cf8aa 100644 --- a/kernel/src/net/syscall.rs +++ b/kernel/src/net/syscall.rs @@ -10,7 +10,7 @@ use crate::{ use super::socket::{self, unix::Unix, AddressFamily as AF, Endpoint}; -pub use super::syscall_util::*; +pub use super::posix::*; /// Flags for socket, socketpair, accept4 const SOCK_CLOEXEC: FileMode = FileMode::O_CLOEXEC;