mirror of
https://github.com/DragonOS-Community/DragonOS.git
synced 2025-06-22 19:33:26 +00:00
regulate naming to posix
This commit is contained in:
@ -60,7 +60,7 @@ pub trait Socket: Sync + Send + Debug + Any {
|
|||||||
/// 对应于 Posix `getsockopt` ,获取socket选项
|
/// 对应于 Posix `getsockopt` ,获取socket选项
|
||||||
fn get_option(
|
fn get_option(
|
||||||
&self,
|
&self,
|
||||||
level: OptionLevel,
|
level: PSOL,
|
||||||
name: usize,
|
name: usize,
|
||||||
value: &mut [u8],
|
value: &mut [u8],
|
||||||
) -> Result<usize, SystemError> {
|
) -> Result<usize, SystemError> {
|
||||||
@ -76,40 +76,40 @@ pub trait Socket: Sync + Send + Debug + Any {
|
|||||||
// pselect
|
// pselect
|
||||||
/// # `read`
|
/// # `read`
|
||||||
fn read(&self, buffer: &mut [u8]) -> Result<usize, SystemError> {
|
fn read(&self, buffer: &mut [u8]) -> Result<usize, SystemError> {
|
||||||
self.recv(buffer, MessageFlag::empty())
|
self.recv(buffer, PMSG::empty())
|
||||||
}
|
}
|
||||||
/// # `recv`
|
/// # `recv`
|
||||||
/// 接收数据,`read` = `recv` with flags = 0
|
/// 接收数据,`read` = `recv` with flags = 0
|
||||||
fn recv(&self, buffer: &mut [u8], flags: MessageFlag) -> Result<usize, SystemError> {
|
fn recv(&self, buffer: &mut [u8], flags: PMSG) -> Result<usize, SystemError> {
|
||||||
Err(ENOSYS)
|
Err(ENOSYS)
|
||||||
}
|
}
|
||||||
/// # `recv_from`
|
/// # `recv_from`
|
||||||
fn recv_from(
|
fn recv_from(
|
||||||
&self,
|
&self,
|
||||||
buffer: &mut [u8],
|
buffer: &mut [u8],
|
||||||
flags: MessageFlag,
|
flags: PMSG,
|
||||||
address: Option<Endpoint>,
|
address: Option<Endpoint>,
|
||||||
) -> Result<(usize, Endpoint), SystemError> {
|
) -> Result<(usize, Endpoint), SystemError> {
|
||||||
Err(ENOSYS)
|
Err(ENOSYS)
|
||||||
}
|
}
|
||||||
/// # `recv_msg`
|
/// # `recv_msg`
|
||||||
fn recv_msg(&self, msg: &mut MsgHdr, flags: MessageFlag) -> Result<usize, SystemError> {
|
fn recv_msg(&self, msg: &mut MsgHdr, flags: PMSG) -> Result<usize, SystemError> {
|
||||||
Err(ENOSYS)
|
Err(ENOSYS)
|
||||||
}
|
}
|
||||||
// select
|
// select
|
||||||
/// # `send`
|
/// # `send`
|
||||||
fn send(&self, buffer: &[u8], flags: MessageFlag) -> Result<usize, SystemError> {
|
fn send(&self, buffer: &[u8], flags: PMSG) -> Result<usize, SystemError> {
|
||||||
Err(ENOSYS)
|
Err(ENOSYS)
|
||||||
}
|
}
|
||||||
/// # `send_msg`
|
/// # `send_msg`
|
||||||
fn send_msg(&self, msg: &MsgHdr, flags: MessageFlag) -> Result<usize, SystemError> {
|
fn send_msg(&self, msg: &MsgHdr, flags: PMSG) -> Result<usize, SystemError> {
|
||||||
Err(ENOSYS)
|
Err(ENOSYS)
|
||||||
}
|
}
|
||||||
/// # `send_to`
|
/// # `send_to`
|
||||||
fn send_to(
|
fn send_to(
|
||||||
&self,
|
&self,
|
||||||
buffer: &[u8],
|
buffer: &[u8],
|
||||||
flags: MessageFlag,
|
flags: PMSG,
|
||||||
address: Endpoint,
|
address: Endpoint,
|
||||||
) -> Result<usize, SystemError> {
|
) -> Result<usize, SystemError> {
|
||||||
Err(ENOSYS)
|
Err(ENOSYS)
|
||||||
@ -122,7 +122,7 @@ pub trait Socket: Sync + Send + Debug + Any {
|
|||||||
/// - value 选项的值
|
/// - value 选项的值
|
||||||
/// ## Reference
|
/// ## Reference
|
||||||
/// https://code.dragonos.org.cn/s?refs=sk_setsockopt&project=linux-6.6.21
|
/// https://code.dragonos.org.cn/s?refs=sk_setsockopt&project=linux-6.6.21
|
||||||
fn set_option(&self, level: OptionLevel, name: usize, val: &[u8]) -> Result<(), SystemError> {
|
fn set_option(&self, level: PSOL, name: usize, val: &[u8]) -> Result<(), SystemError> {
|
||||||
log::warn!("setsockopt is not implemented");
|
log::warn!("setsockopt is not implemented");
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
@ -135,7 +135,7 @@ pub trait Socket: Sync + Send + Debug + Any {
|
|||||||
// socketpair
|
// socketpair
|
||||||
/// # `write`
|
/// # `write`
|
||||||
fn write(&self, buffer: &[u8]) -> Result<usize, SystemError> {
|
fn write(&self, buffer: &[u8]) -> Result<usize, SystemError> {
|
||||||
self.send(buffer, MessageFlag::empty())
|
self.send(buffer, PMSG::empty())
|
||||||
}
|
}
|
||||||
// fn write_buffer(&self, _buf: &[u8]) -> Result<usize, SystemError> {
|
// fn write_buffer(&self, _buf: &[u8]) -> Result<usize, SystemError> {
|
||||||
// todo!()
|
// todo!()
|
||||||
|
@ -1,10 +0,0 @@
|
|||||||
// socket definitions
|
|
||||||
mod msg_flag;
|
|
||||||
mod option;
|
|
||||||
mod option_level;
|
|
||||||
mod types;
|
|
||||||
|
|
||||||
pub use msg_flag::MessageFlag; // Socket message flags MSG_*
|
|
||||||
pub use option::Options; // Socket options SO_*
|
|
||||||
pub use option_level::OptionLevel; // Socket options level SOL_*
|
|
||||||
pub use types::Type; // Socket types SOCK_*
|
|
@ -117,5 +117,5 @@ use crate::net::socket;
|
|||||||
use alloc::sync::Arc;
|
use alloc::sync::Arc;
|
||||||
|
|
||||||
pub trait Family {
|
pub trait Family {
|
||||||
fn socket(stype: socket::Type, protocol: u32) -> Result<Arc<socket::Inode>, SystemError>;
|
fn socket(stype: socket::PSOCK, protocol: u32) -> Result<Arc<socket::Inode>, SystemError>;
|
||||||
}
|
}
|
||||||
|
@ -207,8 +207,8 @@ impl Socket for UdpSocket {
|
|||||||
return Err(EAFNOSUPPORT);
|
return Err(EAFNOSUPPORT);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send(&self, buffer: &[u8], flags: MessageFlag) -> Result<usize, SystemError> {
|
fn send(&self, buffer: &[u8], flags: PMSG) -> Result<usize, SystemError> {
|
||||||
if flags.contains(MessageFlag::DONTWAIT) {
|
if flags.contains(PMSG::DONTWAIT) {
|
||||||
log::warn!("Nonblock send is not implemented yet");
|
log::warn!("Nonblock send is not implemented yet");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -218,10 +218,10 @@ impl Socket for UdpSocket {
|
|||||||
fn send_to(
|
fn send_to(
|
||||||
&self,
|
&self,
|
||||||
buffer: &[u8],
|
buffer: &[u8],
|
||||||
flags: MessageFlag,
|
flags: PMSG,
|
||||||
address: Endpoint,
|
address: Endpoint,
|
||||||
) -> Result<usize, SystemError> {
|
) -> Result<usize, SystemError> {
|
||||||
if flags.contains(MessageFlag::DONTWAIT) {
|
if flags.contains(PMSG::DONTWAIT) {
|
||||||
log::warn!("Nonblock send is not implemented yet");
|
log::warn!("Nonblock send is not implemented yet");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -232,10 +232,10 @@ impl Socket for UdpSocket {
|
|||||||
return Err(EINVAL);
|
return Err(EINVAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn recv(&self, buffer: &mut [u8], flags: MessageFlag) -> Result<usize, SystemError> {
|
fn recv(&self, buffer: &mut [u8], flags: PMSG) -> Result<usize, SystemError> {
|
||||||
use crate::sched::SchedMode;
|
use crate::sched::SchedMode;
|
||||||
|
|
||||||
return if self.is_nonblock() || flags.contains(MessageFlag::DONTWAIT) {
|
return if self.is_nonblock() || flags.contains(PMSG::DONTWAIT) {
|
||||||
self.try_recv(buffer)
|
self.try_recv(buffer)
|
||||||
} else {
|
} else {
|
||||||
loop {
|
loop {
|
||||||
@ -253,7 +253,7 @@ impl Socket for UdpSocket {
|
|||||||
fn recv_from(
|
fn recv_from(
|
||||||
&self,
|
&self,
|
||||||
buffer: &mut [u8],
|
buffer: &mut [u8],
|
||||||
flags: MessageFlag,
|
flags: PMSG,
|
||||||
address: Option<Endpoint>,
|
address: Option<Endpoint>,
|
||||||
) -> Result<(usize, Endpoint), SystemError> {
|
) -> Result<(usize, Endpoint), SystemError> {
|
||||||
use crate::sched::SchedMode;
|
use crate::sched::SchedMode;
|
||||||
@ -262,7 +262,7 @@ impl Socket for UdpSocket {
|
|||||||
self.connect(endpoint)?;
|
self.connect(endpoint)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
return if self.is_nonblock() || flags.contains(MessageFlag::DONTWAIT) {
|
return if self.is_nonblock() || flags.contains(PMSG::DONTWAIT) {
|
||||||
self.try_recv(buffer)
|
self.try_recv(buffer)
|
||||||
} else {
|
} else {
|
||||||
loop {
|
loop {
|
||||||
|
@ -278,11 +278,11 @@ impl Socket for TcpSocket {
|
|||||||
.map(|(inner, endpoint)| (Inode::new(inner), Endpoint::Ip(endpoint)))
|
.map(|(inner, endpoint)| (Inode::new(inner), Endpoint::Ip(endpoint)))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn recv(&self, buffer: &mut [u8], _flags: MessageFlag) -> Result<usize, SystemError> {
|
fn recv(&self, buffer: &mut [u8], _flags: PMSG) -> Result<usize, SystemError> {
|
||||||
self.try_recv(buffer)
|
self.try_recv(buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send(&self, buffer: &[u8], _flags: MessageFlag) -> Result<usize, SystemError> {
|
fn send(&self, buffer: &[u8], _flags: PMSG) -> Result<usize, SystemError> {
|
||||||
self.try_send(buffer)
|
self.try_send(buffer)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -8,14 +8,13 @@ use inet::{TcpSocket, UdpSocket};
|
|||||||
use crate::net::socket::*;
|
use crate::net::socket::*;
|
||||||
|
|
||||||
fn create_inet_socket(
|
fn create_inet_socket(
|
||||||
socket_type: Type,
|
socket_type: PSOCK,
|
||||||
protocol: smoltcp::wire::IpProtocol,
|
protocol: smoltcp::wire::IpProtocol,
|
||||||
) -> Result<Arc<dyn Socket>, SystemError> {
|
) -> Result<Arc<dyn Socket>, SystemError> {
|
||||||
// log::debug!("type: {:?}, protocol: {:?}", socket_type, protocol);
|
// log::debug!("type: {:?}, protocol: {:?}", socket_type, protocol);
|
||||||
use smoltcp::wire::IpProtocol::*;
|
use smoltcp::wire::IpProtocol::*;
|
||||||
use Type::*;
|
|
||||||
match socket_type {
|
match socket_type {
|
||||||
Datagram => {
|
PSOCK::Datagram => {
|
||||||
match protocol {
|
match protocol {
|
||||||
HopByHop | Udp => {
|
HopByHop | Udp => {
|
||||||
return Ok(UdpSocket::new(false));
|
return Ok(UdpSocket::new(false));
|
||||||
@ -29,7 +28,7 @@ fn create_inet_socket(
|
|||||||
// }
|
// }
|
||||||
// return Ok(UdpSocket::new(false));
|
// return Ok(UdpSocket::new(false));
|
||||||
}
|
}
|
||||||
Stream => match protocol {
|
PSOCK::Stream => match protocol {
|
||||||
HopByHop | Tcp => {
|
HopByHop | Tcp => {
|
||||||
return Ok(TcpSocket::new(false));
|
return Ok(TcpSocket::new(false));
|
||||||
}
|
}
|
||||||
@ -37,7 +36,7 @@ fn create_inet_socket(
|
|||||||
return Err(EPROTONOSUPPORT);
|
return Err(EPROTONOSUPPORT);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
Raw => {
|
PSOCK::Raw => {
|
||||||
todo!("raw")
|
todo!("raw")
|
||||||
}
|
}
|
||||||
_ => {
|
_ => {
|
||||||
@ -48,7 +47,7 @@ fn create_inet_socket(
|
|||||||
|
|
||||||
pub struct Inet;
|
pub struct Inet;
|
||||||
impl family::Family for Inet {
|
impl family::Family for Inet {
|
||||||
fn socket(stype: Type, protocol: u32) -> Result<Arc<Inode>, SystemError> {
|
fn socket(stype: PSOCK, protocol: u32) -> Result<Arc<Inode>, SystemError> {
|
||||||
let socket = create_inet_socket(stype, smoltcp::wire::IpProtocol::from(protocol as u8))?;
|
let socket = create_inet_socket(stype, smoltcp::wire::IpProtocol::from(protocol as u8))?;
|
||||||
Ok(Inode::new(socket))
|
Ok(Inode::new(socket))
|
||||||
}
|
}
|
||||||
|
@ -101,7 +101,7 @@ impl Inode {
|
|||||||
|
|
||||||
pub fn set_option(
|
pub fn set_option(
|
||||||
&self,
|
&self,
|
||||||
level: OptionLevel,
|
level: PSOL,
|
||||||
name: usize,
|
name: usize,
|
||||||
value: &[u8],
|
value: &[u8],
|
||||||
) -> Result<(), SystemError> {
|
) -> Result<(), SystemError> {
|
||||||
@ -110,7 +110,7 @@ impl Inode {
|
|||||||
|
|
||||||
pub fn get_option(
|
pub fn get_option(
|
||||||
&self,
|
&self,
|
||||||
level: OptionLevel,
|
level: PSOL,
|
||||||
name: usize,
|
name: usize,
|
||||||
value: &mut [u8],
|
value: &mut [u8],
|
||||||
) -> Result<usize, SystemError> {
|
) -> Result<usize, SystemError> {
|
||||||
@ -125,16 +125,16 @@ impl Inode {
|
|||||||
&self,
|
&self,
|
||||||
buffer: &[u8],
|
buffer: &[u8],
|
||||||
address: Endpoint,
|
address: Endpoint,
|
||||||
flags: MessageFlag,
|
flags: PMSG,
|
||||||
) -> Result<usize, SystemError> {
|
) -> Result<usize, SystemError> {
|
||||||
self.inner.send_to(buffer, flags, address)
|
self.inner.send_to(buffer, flags, address)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn send(&self, buffer: &[u8], flags: MessageFlag) -> Result<usize, SystemError> {
|
pub fn send(&self, buffer: &[u8], flags: PMSG) -> Result<usize, SystemError> {
|
||||||
self.inner.send(buffer, flags)
|
self.inner.send(buffer, flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn recv(&self, buffer: &mut [u8], flags: MessageFlag) -> Result<usize, SystemError> {
|
pub fn recv(&self, buffer: &mut [u8], flags: PMSG) -> Result<usize, SystemError> {
|
||||||
self.inner.recv(buffer, flags)
|
self.inner.recv(buffer, flags)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -142,7 +142,7 @@ impl Inode {
|
|||||||
pub fn recv_from(
|
pub fn recv_from(
|
||||||
&self,
|
&self,
|
||||||
buffer: &mut [u8],
|
buffer: &mut [u8],
|
||||||
flags: MessageFlag,
|
flags: PMSG,
|
||||||
address: Option<Endpoint>,
|
address: Option<Endpoint>,
|
||||||
) -> Result<(usize, Endpoint), SystemError> {
|
) -> Result<(usize, Endpoint), SystemError> {
|
||||||
self.inner.recv_from(buffer, flags, address)
|
self.inner.recv_from(buffer, flags, address)
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
mod base;
|
mod base;
|
||||||
mod buffer;
|
mod buffer;
|
||||||
mod common;
|
mod common;
|
||||||
mod definition;
|
mod posix;
|
||||||
mod endpoint;
|
mod endpoint;
|
||||||
mod family;
|
mod family;
|
||||||
pub mod inet;
|
pub mod inet;
|
||||||
@ -17,7 +17,7 @@ pub use common::{
|
|||||||
// poll_unit::{EPollItems, WaitQueue},
|
// poll_unit::{EPollItems, WaitQueue},
|
||||||
EPollItems,
|
EPollItems,
|
||||||
};
|
};
|
||||||
pub use definition::*;
|
pub use posix::*;
|
||||||
pub use endpoint::*;
|
pub use endpoint::*;
|
||||||
pub use family::{AddressFamily, Family};
|
pub use family::{AddressFamily, Family};
|
||||||
pub use inode::Inode;
|
pub use inode::Inode;
|
||||||
|
12
kernel/src/net/socket/posix/mod.rs
Normal file
12
kernel/src/net/socket/posix/mod.rs
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// posix socket and arguments definitions
|
||||||
|
// now all posix definitions are with P front like MSG -> PMSG,
|
||||||
|
// for better understanding and avoiding conflicts with other definitions
|
||||||
|
mod msg_flag;
|
||||||
|
mod option;
|
||||||
|
mod option_level;
|
||||||
|
mod types;
|
||||||
|
|
||||||
|
pub use msg_flag::MessageFlag as PMSG; // Socket message flags MSG_*
|
||||||
|
pub use option::Options as PSO; // Socket options SO_*
|
||||||
|
pub use option_level::OptionLevel as PSOL; // Socket options level SOL_*
|
||||||
|
pub use types::Type as PSOCK; // Socket types SOCK_*
|
@ -9,10 +9,10 @@ pub enum Type {
|
|||||||
Packet = 10,
|
Packet = 10,
|
||||||
}
|
}
|
||||||
|
|
||||||
use crate::net::syscall_util::SysArgSocketType;
|
use crate::net::syscall_util::PosixArgsSocketType;
|
||||||
impl TryFrom<SysArgSocketType> for Type {
|
impl TryFrom<PosixArgsSocketType> for Type {
|
||||||
type Error = system_error::SystemError;
|
type Error = system_error::SystemError;
|
||||||
fn try_from(x: SysArgSocketType) -> Result<Self, Self::Error> {
|
fn try_from(x: PosixArgsSocketType) -> Result<Self, Self::Error> {
|
||||||
use num_traits::FromPrimitive;
|
use num_traits::FromPrimitive;
|
||||||
return <Self as FromPrimitive>::from_u32(x.types().bits())
|
return <Self as FromPrimitive>::from_u32(x.types().bits())
|
||||||
.ok_or(system_error::SystemError::EINVAL);
|
.ok_or(system_error::SystemError::EINVAL);
|
@ -10,27 +10,27 @@ lazy_static! {
|
|||||||
pub static ref INODE_MAP: RwLock<HashMap<InodeId, Endpoint>> = RwLock::new(HashMap::new());
|
pub static ref INODE_MAP: RwLock<HashMap<InodeId, Endpoint>> = RwLock::new(HashMap::new());
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_unix_socket(sock_type: Type) -> Result<Arc<Inode>, SystemError> {
|
fn create_unix_socket(sock_type: PSOCK) -> Result<Arc<Inode>, SystemError> {
|
||||||
match sock_type {
|
match sock_type {
|
||||||
Type::Stream | Type::Datagram => stream::StreamSocket::new_inode(),
|
PSOCK::Stream | PSOCK::Datagram => stream::StreamSocket::new_inode(),
|
||||||
Type::SeqPacket => seqpacket::SeqpacketSocket::new_inode(false),
|
PSOCK::SeqPacket => seqpacket::SeqpacketSocket::new_inode(false),
|
||||||
_ => Err(EPROTONOSUPPORT),
|
_ => Err(EPROTONOSUPPORT),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl family::Family for Unix {
|
impl family::Family for Unix {
|
||||||
fn socket(stype: Type, _protocol: u32) -> Result<Arc<Inode>, SystemError> {
|
fn socket(stype: PSOCK, _protocol: u32) -> Result<Arc<Inode>, SystemError> {
|
||||||
let socket = create_unix_socket(stype)?;
|
let socket = create_unix_socket(stype)?;
|
||||||
Ok(socket)
|
Ok(socket)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Unix {
|
impl Unix {
|
||||||
pub fn new_pairs(socket_type: Type) -> Result<(Arc<Inode>, Arc<Inode>), SystemError> {
|
pub fn new_pairs(socket_type: PSOCK) -> Result<(Arc<Inode>, Arc<Inode>), SystemError> {
|
||||||
// log::debug!("socket_type {:?}", socket_type);
|
// log::debug!("socket_type {:?}", socket_type);
|
||||||
match socket_type {
|
match socket_type {
|
||||||
Type::SeqPacket => seqpacket::SeqpacketSocket::new_pairs(),
|
PSOCK::SeqPacket => seqpacket::SeqpacketSocket::new_pairs(),
|
||||||
Type::Stream | Type::Datagram => stream::StreamSocket::new_pairs(),
|
PSOCK::Stream | PSOCK::Datagram => stream::StreamSocket::new_pairs(),
|
||||||
_ => todo!(),
|
_ => todo!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -244,7 +244,7 @@ impl Socket for SeqpacketSocket {
|
|||||||
|
|
||||||
fn set_option(
|
fn set_option(
|
||||||
&self,
|
&self,
|
||||||
_level: crate::net::socket::OptionLevel,
|
_level: crate::net::socket::PSOL,
|
||||||
_optname: usize,
|
_optname: usize,
|
||||||
_optval: &[u8],
|
_optval: &[u8],
|
||||||
) -> Result<(), SystemError> {
|
) -> Result<(), SystemError> {
|
||||||
@ -294,7 +294,7 @@ impl Socket for SeqpacketSocket {
|
|||||||
|
|
||||||
fn get_option(
|
fn get_option(
|
||||||
&self,
|
&self,
|
||||||
_level: crate::net::socket::OptionLevel,
|
_level: crate::net::socket::PSOL,
|
||||||
_name: usize,
|
_name: usize,
|
||||||
_value: &mut [u8],
|
_value: &mut [u8],
|
||||||
) -> Result<usize, SystemError> {
|
) -> Result<usize, SystemError> {
|
||||||
@ -303,18 +303,18 @@ impl Socket for SeqpacketSocket {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn read(&self, buffer: &mut [u8]) -> Result<usize, SystemError> {
|
fn read(&self, buffer: &mut [u8]) -> Result<usize, SystemError> {
|
||||||
self.recv(buffer, crate::net::socket::MessageFlag::empty())
|
self.recv(buffer, crate::net::socket::PMSG::empty())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn recv(
|
fn recv(
|
||||||
&self,
|
&self,
|
||||||
buffer: &mut [u8],
|
buffer: &mut [u8],
|
||||||
flags: crate::net::socket::MessageFlag,
|
flags: crate::net::socket::PMSG,
|
||||||
) -> Result<usize, SystemError> {
|
) -> Result<usize, SystemError> {
|
||||||
if flags.contains(MessageFlag::OOB) {
|
if flags.contains(PMSG::OOB) {
|
||||||
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
|
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
|
||||||
}
|
}
|
||||||
if !flags.contains(MessageFlag::DONTWAIT) {
|
if !flags.contains(PMSG::DONTWAIT) {
|
||||||
loop {
|
loop {
|
||||||
wq_wait_event_interruptible!(
|
wq_wait_event_interruptible!(
|
||||||
self.wait_queue,
|
self.wait_queue,
|
||||||
@ -344,7 +344,7 @@ impl Socket for SeqpacketSocket {
|
|||||||
fn recv_msg(
|
fn recv_msg(
|
||||||
&self,
|
&self,
|
||||||
_msg: &mut crate::net::syscall::MsgHdr,
|
_msg: &mut crate::net::syscall::MsgHdr,
|
||||||
_flags: crate::net::socket::MessageFlag,
|
_flags: crate::net::socket::PMSG,
|
||||||
) -> Result<usize, SystemError> {
|
) -> Result<usize, SystemError> {
|
||||||
Err(SystemError::ENOSYS)
|
Err(SystemError::ENOSYS)
|
||||||
}
|
}
|
||||||
@ -352,15 +352,15 @@ impl Socket for SeqpacketSocket {
|
|||||||
fn send(
|
fn send(
|
||||||
&self,
|
&self,
|
||||||
buffer: &[u8],
|
buffer: &[u8],
|
||||||
flags: crate::net::socket::MessageFlag,
|
flags: crate::net::socket::PMSG,
|
||||||
) -> Result<usize, SystemError> {
|
) -> Result<usize, SystemError> {
|
||||||
if flags.contains(MessageFlag::OOB) {
|
if flags.contains(PMSG::OOB) {
|
||||||
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
|
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
|
||||||
}
|
}
|
||||||
if self.is_peer_shutdown()? {
|
if self.is_peer_shutdown()? {
|
||||||
return Err(SystemError::EPIPE);
|
return Err(SystemError::EPIPE);
|
||||||
}
|
}
|
||||||
if !flags.contains(MessageFlag::DONTWAIT) {
|
if !flags.contains(PMSG::DONTWAIT) {
|
||||||
loop {
|
loop {
|
||||||
match &*self.inner.write() {
|
match &*self.inner.write() {
|
||||||
Inner::Connected(connected) => match connected.try_write(buffer) {
|
Inner::Connected(connected) => match connected.try_write(buffer) {
|
||||||
@ -384,26 +384,26 @@ impl Socket for SeqpacketSocket {
|
|||||||
fn send_msg(
|
fn send_msg(
|
||||||
&self,
|
&self,
|
||||||
_msg: &crate::net::syscall::MsgHdr,
|
_msg: &crate::net::syscall::MsgHdr,
|
||||||
_flags: crate::net::socket::MessageFlag,
|
_flags: crate::net::socket::PMSG,
|
||||||
) -> Result<usize, SystemError> {
|
) -> Result<usize, SystemError> {
|
||||||
Err(SystemError::ENOSYS)
|
Err(SystemError::ENOSYS)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write(&self, buffer: &[u8]) -> Result<usize, SystemError> {
|
fn write(&self, buffer: &[u8]) -> Result<usize, SystemError> {
|
||||||
self.send(buffer, crate::net::socket::MessageFlag::empty())
|
self.send(buffer, crate::net::socket::PMSG::empty())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn recv_from(
|
fn recv_from(
|
||||||
&self,
|
&self,
|
||||||
buffer: &mut [u8],
|
buffer: &mut [u8],
|
||||||
flags: MessageFlag,
|
flags: PMSG,
|
||||||
_address: Option<Endpoint>,
|
_address: Option<Endpoint>,
|
||||||
) -> Result<(usize, Endpoint), SystemError> {
|
) -> Result<(usize, Endpoint), SystemError> {
|
||||||
// log::debug!("recvfrom flags {:?}", flags);
|
// log::debug!("recvfrom flags {:?}", flags);
|
||||||
if flags.contains(MessageFlag::OOB) {
|
if flags.contains(PMSG::OOB) {
|
||||||
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
|
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
|
||||||
}
|
}
|
||||||
if !flags.contains(MessageFlag::DONTWAIT) {
|
if !flags.contains(PMSG::DONTWAIT) {
|
||||||
loop {
|
loop {
|
||||||
wq_wait_event_interruptible!(
|
wq_wait_event_interruptible!(
|
||||||
self.wait_queue,
|
self.wait_queue,
|
||||||
|
@ -243,7 +243,7 @@ impl Socket for StreamSocket {
|
|||||||
|
|
||||||
fn set_option(
|
fn set_option(
|
||||||
&self,
|
&self,
|
||||||
_level: OptionLevel,
|
_level: PSOL,
|
||||||
_optname: usize,
|
_optname: usize,
|
||||||
_optval: &[u8],
|
_optval: &[u8],
|
||||||
) -> Result<(), SystemError> {
|
) -> Result<(), SystemError> {
|
||||||
@ -329,7 +329,7 @@ impl Socket for StreamSocket {
|
|||||||
|
|
||||||
fn get_option(
|
fn get_option(
|
||||||
&self,
|
&self,
|
||||||
_level: OptionLevel,
|
_level: PSOL,
|
||||||
_name: usize,
|
_name: usize,
|
||||||
_value: &mut [u8],
|
_value: &mut [u8],
|
||||||
) -> Result<usize, SystemError> {
|
) -> Result<usize, SystemError> {
|
||||||
@ -338,11 +338,11 @@ impl Socket for StreamSocket {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn read(&self, buffer: &mut [u8]) -> Result<usize, SystemError> {
|
fn read(&self, buffer: &mut [u8]) -> Result<usize, SystemError> {
|
||||||
self.recv(buffer, socket::MessageFlag::empty())
|
self.recv(buffer, socket::PMSG::empty())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn recv(&self, buffer: &mut [u8], flags: socket::MessageFlag) -> Result<usize, SystemError> {
|
fn recv(&self, buffer: &mut [u8], flags: socket::PMSG) -> Result<usize, SystemError> {
|
||||||
if !flags.contains(MessageFlag::DONTWAIT) {
|
if !flags.contains(PMSG::DONTWAIT) {
|
||||||
loop {
|
loop {
|
||||||
log::debug!("socket try recv");
|
log::debug!("socket try recv");
|
||||||
wq_wait_event_interruptible!(
|
wq_wait_event_interruptible!(
|
||||||
@ -373,13 +373,13 @@ impl Socket for StreamSocket {
|
|||||||
fn recv_from(
|
fn recv_from(
|
||||||
&self,
|
&self,
|
||||||
buffer: &mut [u8],
|
buffer: &mut [u8],
|
||||||
flags: socket::MessageFlag,
|
flags: socket::PMSG,
|
||||||
_address: Option<Endpoint>,
|
_address: Option<Endpoint>,
|
||||||
) -> Result<(usize, Endpoint), SystemError> {
|
) -> Result<(usize, Endpoint), SystemError> {
|
||||||
if flags.contains(MessageFlag::OOB) {
|
if flags.contains(PMSG::OOB) {
|
||||||
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
|
return Err(SystemError::EOPNOTSUPP_OR_ENOTSUP);
|
||||||
}
|
}
|
||||||
if !flags.contains(MessageFlag::DONTWAIT) {
|
if !flags.contains(PMSG::DONTWAIT) {
|
||||||
loop {
|
loop {
|
||||||
log::debug!("socket try recv from");
|
log::debug!("socket try recv from");
|
||||||
|
|
||||||
@ -413,16 +413,16 @@ impl Socket for StreamSocket {
|
|||||||
fn recv_msg(
|
fn recv_msg(
|
||||||
&self,
|
&self,
|
||||||
_msg: &mut crate::net::syscall::MsgHdr,
|
_msg: &mut crate::net::syscall::MsgHdr,
|
||||||
_flags: socket::MessageFlag,
|
_flags: socket::PMSG,
|
||||||
) -> Result<usize, SystemError> {
|
) -> Result<usize, SystemError> {
|
||||||
Err(SystemError::ENOSYS)
|
Err(SystemError::ENOSYS)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send(&self, buffer: &[u8], flags: socket::MessageFlag) -> Result<usize, SystemError> {
|
fn send(&self, buffer: &[u8], flags: socket::PMSG) -> Result<usize, SystemError> {
|
||||||
if self.is_peer_shutdown()? {
|
if self.is_peer_shutdown()? {
|
||||||
return Err(SystemError::EPIPE);
|
return Err(SystemError::EPIPE);
|
||||||
}
|
}
|
||||||
if !flags.contains(MessageFlag::DONTWAIT) {
|
if !flags.contains(PMSG::DONTWAIT) {
|
||||||
loop {
|
loop {
|
||||||
match &*self.inner.write() {
|
match &*self.inner.write() {
|
||||||
Inner::Connected(connected) => match connected.try_send(buffer) {
|
Inner::Connected(connected) => match connected.try_send(buffer) {
|
||||||
@ -446,7 +446,7 @@ impl Socket for StreamSocket {
|
|||||||
fn send_msg(
|
fn send_msg(
|
||||||
&self,
|
&self,
|
||||||
_msg: &crate::net::syscall::MsgHdr,
|
_msg: &crate::net::syscall::MsgHdr,
|
||||||
_flags: socket::MessageFlag,
|
_flags: socket::PMSG,
|
||||||
) -> Result<usize, SystemError> {
|
) -> Result<usize, SystemError> {
|
||||||
todo!()
|
todo!()
|
||||||
}
|
}
|
||||||
@ -454,14 +454,14 @@ impl Socket for StreamSocket {
|
|||||||
fn send_to(
|
fn send_to(
|
||||||
&self,
|
&self,
|
||||||
_buffer: &[u8],
|
_buffer: &[u8],
|
||||||
_flags: socket::MessageFlag,
|
_flags: socket::PMSG,
|
||||||
_address: Endpoint,
|
_address: Endpoint,
|
||||||
) -> Result<usize, SystemError> {
|
) -> Result<usize, SystemError> {
|
||||||
Err(SystemError::ENOSYS)
|
Err(SystemError::ENOSYS)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write(&self, buffer: &[u8]) -> Result<usize, SystemError> {
|
fn write(&self, buffer: &[u8]) -> Result<usize, SystemError> {
|
||||||
self.send(buffer, socket::MessageFlag::empty())
|
self.send(buffer, socket::PMSG::empty())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn send_buffer_size(&self) -> usize {
|
fn send_buffer_size(&self) -> usize {
|
||||||
|
@ -5,7 +5,7 @@ use system_error::SystemError;
|
|||||||
|
|
||||||
pub fn create_socket(
|
pub fn create_socket(
|
||||||
family: socket::AddressFamily,
|
family: socket::AddressFamily,
|
||||||
socket_type: socket::Type,
|
socket_type: socket::PSOCK,
|
||||||
protocol: u32,
|
protocol: u32,
|
||||||
is_nonblock: bool,
|
is_nonblock: bool,
|
||||||
is_close_on_exec: bool,
|
is_close_on_exec: bool,
|
||||||
|
@ -35,10 +35,10 @@ impl Syscall {
|
|||||||
// protocol
|
// protocol
|
||||||
// );
|
// );
|
||||||
let address_family = socket::AddressFamily::try_from(address_family as u16)?;
|
let address_family = socket::AddressFamily::try_from(address_family as u16)?;
|
||||||
let type_arg = SysArgSocketType::from_bits_truncate(socket_type as u32);
|
let type_arg = PosixArgsSocketType::from_bits_truncate(socket_type as u32);
|
||||||
let is_nonblock = type_arg.is_nonblock();
|
let is_nonblock = type_arg.is_nonblock();
|
||||||
let is_close_on_exec = type_arg.is_cloexec();
|
let is_close_on_exec = type_arg.is_cloexec();
|
||||||
let stype = socket::Type::try_from(type_arg)?;
|
let stype = socket::PSOCK::try_from(type_arg)?;
|
||||||
// log::debug!("type_arg {:?} stype {:?}", type_arg, stype);
|
// log::debug!("type_arg {:?} stype {:?}", type_arg, stype);
|
||||||
|
|
||||||
let inode = socket::create_socket(
|
let inode = socket::create_socket(
|
||||||
@ -73,8 +73,8 @@ impl Syscall {
|
|||||||
fds: &mut [i32],
|
fds: &mut [i32],
|
||||||
) -> Result<usize, SystemError> {
|
) -> Result<usize, SystemError> {
|
||||||
let address_family = AF::try_from(address_family as u16)?;
|
let address_family = AF::try_from(address_family as u16)?;
|
||||||
let socket_type = SysArgSocketType::from_bits_truncate(socket_type as u32);
|
let socket_type = PosixArgsSocketType::from_bits_truncate(socket_type as u32);
|
||||||
let stype = socket::Type::try_from(socket_type)?;
|
let stype = socket::PSOCK::try_from(socket_type)?;
|
||||||
|
|
||||||
let binding = ProcessManager::current_pcb().fd_table();
|
let binding = ProcessManager::current_pcb().fd_table();
|
||||||
let mut fd_table_guard = binding.write();
|
let mut fd_table_guard = binding.write();
|
||||||
@ -112,7 +112,7 @@ impl Syscall {
|
|||||||
optname: usize,
|
optname: usize,
|
||||||
optval: &[u8],
|
optval: &[u8],
|
||||||
) -> Result<usize, SystemError> {
|
) -> Result<usize, SystemError> {
|
||||||
let sol = socket::OptionLevel::try_from(level as u32)?;
|
let sol = socket::PSOL::try_from(level as u32)?;
|
||||||
let socket: Arc<socket::Inode> = ProcessManager::current_pcb()
|
let socket: Arc<socket::Inode> = ProcessManager::current_pcb()
|
||||||
.get_socket(fd as i32)
|
.get_socket(fd as i32)
|
||||||
.ok_or(SystemError::EBADF)?;
|
.ok_or(SystemError::EBADF)?;
|
||||||
@ -142,14 +142,14 @@ impl Syscall {
|
|||||||
.get_socket(fd as i32)
|
.get_socket(fd as i32)
|
||||||
.ok_or(EBADF)?;
|
.ok_or(EBADF)?;
|
||||||
|
|
||||||
let level = socket::OptionLevel::try_from(level as u32)?;
|
use socket::{PSOL, PSO};
|
||||||
|
|
||||||
use socket::OptionLevel as SOL;
|
let level = PSOL::try_from(level as u32)?;
|
||||||
use socket::Options as SO;
|
|
||||||
if matches!(level, SOL::SOCKET) {
|
if matches!(level, PSOL::SOCKET) {
|
||||||
let optname = SO::try_from(optname as u32).map_err(|_| ENOPROTOOPT)?;
|
let optname = PSO::try_from(optname as u32).map_err(|_| ENOPROTOOPT)?;
|
||||||
match optname {
|
match optname {
|
||||||
SO::SNDBUF => {
|
PSO::SNDBUF => {
|
||||||
// 返回发送缓冲区大小
|
// 返回发送缓冲区大小
|
||||||
unsafe {
|
unsafe {
|
||||||
*optval = socket.send_buffer_size() as u32;
|
*optval = socket.send_buffer_size() as u32;
|
||||||
@ -157,7 +157,7 @@ impl Syscall {
|
|||||||
}
|
}
|
||||||
return Ok(0);
|
return Ok(0);
|
||||||
}
|
}
|
||||||
SO::RCVBUF => {
|
PSO::RCVBUF => {
|
||||||
// 返回默认的接收缓冲区大小
|
// 返回默认的接收缓冲区大小
|
||||||
unsafe {
|
unsafe {
|
||||||
*optval = socket.recv_buffer_size() as u32;
|
*optval = socket.recv_buffer_size() as u32;
|
||||||
@ -178,7 +178,7 @@ impl Syscall {
|
|||||||
// to be interpreted by the TCP protocol, level should be set to the
|
// to be interpreted by the TCP protocol, level should be set to the
|
||||||
// protocol number of TCP.
|
// protocol number of TCP.
|
||||||
|
|
||||||
if matches!(level, SOL::TCP) {
|
if matches!(level, PSOL::TCP) {
|
||||||
use socket::inet::stream::TcpOption;
|
use socket::inet::stream::TcpOption;
|
||||||
let optname = TcpOption::try_from(optname as i32).map_err(|_| ENOPROTOOPT)?;
|
let optname = TcpOption::try_from(optname as i32).map_err(|_| ENOPROTOOPT)?;
|
||||||
match optname {
|
match optname {
|
||||||
@ -253,7 +253,7 @@ impl Syscall {
|
|||||||
Some(SockAddr::to_endpoint(addr, addrlen)?)
|
Some(SockAddr::to_endpoint(addr, addrlen)?)
|
||||||
};
|
};
|
||||||
|
|
||||||
let flags = socket::MessageFlag::from_bits_truncate(flags);
|
let flags = socket::PMSG::from_bits_truncate(flags);
|
||||||
|
|
||||||
let socket: Arc<socket::Inode> = ProcessManager::current_pcb()
|
let socket: Arc<socket::Inode> = ProcessManager::current_pcb()
|
||||||
.get_socket(fd as i32)
|
.get_socket(fd as i32)
|
||||||
@ -285,7 +285,7 @@ impl Syscall {
|
|||||||
let socket: Arc<socket::Inode> = ProcessManager::current_pcb()
|
let socket: Arc<socket::Inode> = ProcessManager::current_pcb()
|
||||||
.get_socket(fd as i32)
|
.get_socket(fd as i32)
|
||||||
.ok_or(SystemError::EBADF)?;
|
.ok_or(SystemError::EBADF)?;
|
||||||
let flags = socket::MessageFlag::from_bits_truncate(flags);
|
let flags = socket::PMSG::from_bits_truncate(flags);
|
||||||
|
|
||||||
if addr.is_null() {
|
if addr.is_null() {
|
||||||
let (n, _) = socket.recv_from(buf, flags, None)?;
|
let (n, _) = socket.recv_from(buf, flags, None)?;
|
||||||
@ -327,7 +327,7 @@ impl Syscall {
|
|||||||
// .get_socket(fd as i32)
|
// .get_socket(fd as i32)
|
||||||
// .ok_or(SystemError::EBADF)?;
|
// .ok_or(SystemError::EBADF)?;
|
||||||
|
|
||||||
// let flags = socket::MessageFlag::from_bits_truncate(flags as u32);
|
// let flags = socket::PMSG::from_bits_truncate(flags as u32);
|
||||||
|
|
||||||
// let mut buf = iovs.new_buf(true);
|
// let mut buf = iovs.new_buf(true);
|
||||||
// // 从socket中读取数据
|
// // 从socket中读取数据
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
bitflags::bitflags! {
|
bitflags::bitflags! {
|
||||||
// #[derive(PartialEq, Eq, Debug, Clone, Copy)]
|
// #[derive(PartialEq, Eq, Debug, Clone, Copy)]
|
||||||
pub struct SysArgSocketType: u32 {
|
pub struct PosixArgsSocketType: u32 {
|
||||||
const DGRAM = 1; // 0b0000_0001
|
const DGRAM = 1; // 0b0000_0001
|
||||||
const STREAM = 2; // 0b0000_0010
|
const STREAM = 2; // 0b0000_0010
|
||||||
const RAW = 3; // 0b0000_0011
|
const RAW = 3; // 0b0000_0011
|
||||||
@ -14,20 +14,20 @@ bitflags::bitflags! {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SysArgSocketType {
|
impl PosixArgsSocketType {
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn types(&self) -> SysArgSocketType {
|
pub fn types(&self) -> PosixArgsSocketType {
|
||||||
SysArgSocketType::from_bits(self.bits() & 0b_1111).unwrap()
|
PosixArgsSocketType::from_bits(self.bits() & 0b_1111).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn is_nonblock(&self) -> bool {
|
pub fn is_nonblock(&self) -> bool {
|
||||||
self.contains(SysArgSocketType::NONBLOCK)
|
self.contains(PosixArgsSocketType::NONBLOCK)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn is_cloexec(&self) -> bool {
|
pub fn is_cloexec(&self) -> bool {
|
||||||
self.contains(SysArgSocketType::CLOEXEC)
|
self.contains(PosixArgsSocketType::CLOEXEC)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user