asterinas/kernel/src/syscall/socket.rs

56 lines
2.2 KiB
Rust
Raw Normal View History

2024-01-03 03:22:36 +00:00
// SPDX-License-Identifier: MPL-2.0
use super::SyscallReturn;
use crate::{
fs::{file_handle::FileLike, file_table::FdFlags},
net::socket::{
ip::{DatagramSocket, StreamSocket},
unix::UnixStreamSocket,
2024-04-07 15:08:18 +00:00
vsock::VsockStreamSocket,
},
prelude::*,
util::net::{CSocketAddrFamily, Protocol, SockFlags, SockType, SOCK_TYPE_MASK},
};
2023-05-31 02:48:43 +00:00
pub fn sys_socket(domain: i32, type_: i32, protocol: i32, ctx: &Context) -> Result<SyscallReturn> {
2023-12-28 09:24:23 +00:00
let domain = CSocketAddrFamily::try_from(domain)?;
2023-05-31 02:48:43 +00:00
let sock_type = SockType::try_from(type_ & SOCK_TYPE_MASK)?;
let sock_flags = SockFlags::from_bits_truncate(type_ & !SOCK_TYPE_MASK);
let protocol = Protocol::try_from(protocol)?;
debug!(
"domain = {:?}, sock_type = {:?}, sock_flags = {:?}, protocol = {:?}",
domain, sock_type, sock_flags, protocol
);
2023-06-15 08:22:10 +00:00
let nonblocking = sock_flags.contains(SockFlags::SOCK_NONBLOCK);
2023-05-31 02:48:43 +00:00
let file_like = match (domain, sock_type, protocol) {
2024-07-26 03:03:04 +00:00
// FIXME: SOCK_SEQPACKET is added to run fcntl_test, not supported yet.
(CSocketAddrFamily::AF_UNIX, SockType::SOCK_STREAM | SockType::SOCK_SEQPACKET, _) => {
UnixStreamSocket::new(nonblocking) as Arc<dyn FileLike>
2024-04-21 17:08:21 +00:00
}
2023-05-31 02:48:43 +00:00
(
2023-12-28 09:24:23 +00:00
CSocketAddrFamily::AF_INET,
2023-05-31 02:48:43 +00:00
SockType::SOCK_STREAM,
Protocol::IPPROTO_IP | Protocol::IPPROTO_TCP,
2024-01-07 15:55:23 +00:00
) => StreamSocket::new(nonblocking) as Arc<dyn FileLike>,
2023-12-28 09:24:23 +00:00
(
CSocketAddrFamily::AF_INET,
SockType::SOCK_DGRAM,
Protocol::IPPROTO_IP | Protocol::IPPROTO_UDP,
2024-01-07 15:55:23 +00:00
) => DatagramSocket::new(nonblocking) as Arc<dyn FileLike>,
2024-04-07 15:08:18 +00:00
(CSocketAddrFamily::AF_VSOCK, SockType::SOCK_STREAM, _) => {
2024-04-21 17:08:21 +00:00
Arc::new(VsockStreamSocket::new(nonblocking)) as Arc<dyn FileLike>
2024-04-07 15:08:18 +00:00
}
2023-05-31 02:48:43 +00:00
_ => return_errno_with_message!(Errno::EAFNOSUPPORT, "unsupported domain"),
};
let fd = {
let mut file_table = ctx.process.file_table().lock();
let fd_flags = if sock_flags.contains(SockFlags::SOCK_CLOEXEC) {
FdFlags::CLOEXEC
} else {
FdFlags::empty()
};
file_table.insert(file_like, fd_flags)
2023-05-31 02:48:43 +00:00
};
Ok(SyscallReturn::Return(fd as _))
}