Skip to content

Commit 5becb38

Browse files
Merge pull request #253 from arihant2math/socket-fixups
2 parents ce156c1 + 4a12208 commit 5becb38

File tree

21 files changed

+295
-97
lines changed

21 files changed

+295
-97
lines changed

etc/syscalls_linux_aarch64.md

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -198,19 +198,19 @@
198198
| 0xc3 (195) | shmctl | (int shmid, int cmd, struct shmid_ds *buf) | __arm64_sys_shmctl | false |
199199
| 0xc4 (196) | shmat | (int shmid, char *shmaddr, int shmflg) | __arm64_sys_shmat | false |
200200
| 0xc5 (197) | shmdt | (char *shmaddr) | __arm64_sys_shmdt | false |
201-
| 0xc6 (198) | socket | (int family, int type, int protocol) | __arm64_sys_socket | dummy |
201+
| 0xc6 (198) | socket | (int family, int type, int protocol) | __arm64_sys_socket | partially |
202202
| 0xc7 (199) | socketpair | (int family, int type, int protocol, int *usockvec) | __arm64_sys_socketpair | false |
203-
| 0xc8 (200) | bind | (int fd, struct sockaddr *umyaddr, int addrlen) | __arm64_sys_bind | false |
204-
| 0xc9 (201) | listen | (int fd, int backlog) | __arm64_sys_listen | false |
205-
| 0xca (202) | accept | (int fd, struct sockaddr *upeer_sockaddr, int *upeer_addrlen) | __arm64_sys_accept | false |
206-
| 0xcb (203) | connect | (int fd, struct sockaddr *uservaddr, int addrlen) | __arm64_sys_connect | false |
203+
| 0xc8 (200) | bind | (int fd, struct sockaddr *umyaddr, int addrlen) | __arm64_sys_bind | partially |
204+
| 0xc9 (201) | listen | (int fd, int backlog) | __arm64_sys_listen | partially |
205+
| 0xca (202) | accept | (int fd, struct sockaddr *upeer_sockaddr, int *upeer_addrlen) | __arm64_sys_accept | partially |
206+
| 0xcb (203) | connect | (int fd, struct sockaddr *uservaddr, int addrlen) | __arm64_sys_connect | partially |
207207
| 0xcc (204) | getsockname | (int fd, struct sockaddr *usockaddr, int *usockaddr_len) | __arm64_sys_getsockname | false |
208208
| 0xcd (205) | getpeername | (int fd, struct sockaddr *usockaddr, int *usockaddr_len) | __arm64_sys_getpeername | false |
209-
| 0xce (206) | sendto | (int fd, void *buff, size_t len, unsigned int flags, struct sockaddr *addr, int addr_len) | __arm64_sys_sendto | false |
210-
| 0xcf (207) | recvfrom | (int fd, void *ubuf, size_t size, unsigned int flags, struct sockaddr *addr, int *addr_len) | __arm64_sys_recvfrom | false |
209+
| 0xce (206) | sendto | (int fd, void *buff, size_t len, unsigned int flags, struct sockaddr *addr, int addr_len) | __arm64_sys_sendto | partially |
210+
| 0xcf (207) | recvfrom | (int fd, void *ubuf, size_t size, unsigned int flags, struct sockaddr *addr, int *addr_len) | __arm64_sys_recvfrom | partially |
211211
| 0xd0 (208) | setsockopt | (int fd, int level, int optname, char *optval, int optlen) | __arm64_sys_setsockopt | false |
212212
| 0xd1 (209) | getsockopt | (int fd, int level, int optname, char *optval, int *optlen) | __arm64_sys_getsockopt | false |
213-
| 0xd2 (210) | shutdown | (int fd, int how) | __arm64_sys_shutdown | false |
213+
| 0xd2 (210) | shutdown | (int fd, int how) | __arm64_sys_shutdown | true |
214214
| 0xd3 (211) | sendmsg | (int fd, struct user_msghdr *msg, unsigned int flags) | __arm64_sys_sendmsg | false |
215215
| 0xd4 (212) | recvmsg | (int fd, struct user_msghdr *msg, unsigned int flags) | __arm64_sys_recvmsg | false |
216216
| 0xd5 (213) | readahead | (int fd, loff_t offset, size_t count) | __arm64_sys_readahead | false |
@@ -242,7 +242,7 @@
242242
| 0xef (239) | move_pages | (pid_t pid, unsigned long nr_pages, const void **pages, const int *nodes, int *status, int flags) | __arm64_sys_move_pages | false |
243243
| 0xf0 (240) | rt_tgsigqueueinfo | (pid_t tgid, pid_t pid, int sig, siginfo_t *uinfo) | __arm64_sys_rt_tgsigqueueinfo | false |
244244
| 0xf1 (241) | perf_event_open | (struct perf_event_attr *attr_uptr, pid_t pid, int cpu, int group_fd, unsigned long flags) | __arm64_sys_perf_event_open | false |
245-
| 0xf2 (242) | accept4 | (int fd, struct sockaddr *upeer_sockaddr, int *upeer_addrlen, int flags) | __arm64_sys_accept4 | false |
245+
| 0xf2 (242) | accept4 | (int fd, struct sockaddr *upeer_sockaddr, int *upeer_addrlen, int flags) | __arm64_sys_accept4 | partially |
246246
| 0xf3 (243) | recvmmsg | (int fd, struct mmsghdr *mmsg, unsigned int vlen, unsigned int flags, struct __kernel_timespec *timeout) | __arm64_sys_recvmmsg | false |
247247
| 0x104 (260) | wait4 | (pid_t upid, int *stat_addr, int options, struct rusage *ru) | __arm64_sys_wait4 | true |
248248
| 0x105 (261) | prlimit64 | (pid_t pid, unsigned int resource, const struct rlimit64 *new_rlim, struct rlimit64 *old_rlim) | __arm64_sys_prlimit64 | true |

libkernel/src/error/syscall_error.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ pub fn kern_err_to_syscall(err: KernelError) -> isize {
6262
KernelError::NoChildProcess => ECHILD,
6363
KernelError::OpNotSupported => EOPNOTSUPP,
6464
KernelError::Interrupted => EINTR,
65+
KernelError::NoProcess => ESRCH,
6566
e => todo!("{e}"),
6667
}
6768
}

src/arch/arm64/exceptions/syscall.rs

Lines changed: 38 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,16 @@ use crate::{
5555
mmap::{sys_mmap, sys_mprotect, sys_munmap},
5656
process_vm::sys_process_vm_readv,
5757
},
58+
net::syscalls::{
59+
accept::{sys_accept, sys_accept4},
60+
bind::sys_bind,
61+
connect::sys_connect,
62+
listen::sys_listen,
63+
recv::sys_recvfrom,
64+
send::sys_sendto,
65+
shutdown::sys_shutdown,
66+
socket::sys_socket,
67+
},
5868
process::{
5969
TaskState,
6070
caps::{sys_capget, sys_capset},
@@ -89,10 +99,6 @@ use crate::{
8999
threading::{futex::sys_futex, sys_set_robust_list, sys_set_tid_address},
90100
},
91101
sched::{current::current_task, sys_sched_yield},
92-
socket::syscalls::{
93-
accept::sys_accept, bind::sys_bind, connect::sys_connect, listen::sys_listen,
94-
send::sys_sendto, shutdown::sys_shutdown, socket::sys_socket,
95-
},
96102
};
97103
use alloc::boxed::Box;
98104
use libkernel::{
@@ -518,7 +524,14 @@ pub async fn handle_syscall() {
518524
0xc6 => sys_socket(arg1 as _, arg2 as _, arg3 as _).await,
519525
0xc8 => sys_bind(arg1.into(), UA::from_value(arg2 as _), arg3 as _).await,
520526
0xc9 => sys_listen(arg1.into(), arg2 as _).await,
521-
0xca => sys_accept(arg1.into()).await,
527+
0xca => {
528+
sys_accept(
529+
arg1.into(),
530+
UA::from_value(arg2 as _),
531+
TUA::from_value(arg3 as _),
532+
)
533+
.await
534+
}
522535
0xcb => sys_connect(arg1.into(), UA::from_value(arg2 as _), arg3 as _).await,
523536
0xce => {
524537
sys_sendto(
@@ -531,6 +544,17 @@ pub async fn handle_syscall() {
531544
)
532545
.await
533546
}
547+
0xcf => {
548+
sys_recvfrom(
549+
arg1.into(),
550+
UA::from_value(arg2 as _),
551+
arg3 as _,
552+
arg4 as _,
553+
UA::from_value(arg5 as _),
554+
TUA::from_value(arg6 as _),
555+
)
556+
.await
557+
}
534558
0xd2 => sys_shutdown(arg1.into(), arg2 as _).await,
535559
0xd6 => sys_brk(VA::from_value(arg1 as _))
536560
.await
@@ -559,6 +583,15 @@ pub async fn handle_syscall() {
559583
0xe2 => sys_mprotect(VA::from_value(arg1 as _), arg2 as _, arg3 as _),
560584
0xe8 => sys_mincore(arg1, arg2 as _, TUA::from_value(arg3 as _)).await,
561585
0xe9 => Ok(0), // sys_madvise is a no-op
586+
0xf2 => {
587+
sys_accept4(
588+
arg1.into(),
589+
UA::from_value(arg2 as _),
590+
TUA::from_value(arg3 as _),
591+
arg4 as _,
592+
)
593+
.await
594+
}
562595
0x104 => {
563596
sys_wait4(
564597
arg1.cast_signed() as _,

src/fs/fops.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ pub trait FileOps: Send + Sync {
138138
Err(KernelError::InvalidValue)
139139
}
140140

141-
fn as_socket(&mut self) -> Option<&mut dyn crate::socket::SocketOps> {
141+
fn as_socket(&mut self) -> Option<&mut dyn crate::net::SocketOps> {
142142
None
143143
}
144144
}

src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,9 @@ mod fs;
4848
mod interrupts;
4949
mod kernel;
5050
mod memory;
51+
mod net;
5152
mod process;
5253
mod sched;
53-
mod socket;
5454
mod sync;
5555
#[cfg(test)]
5656
pub mod testing;

src/socket/mod.rs renamed to src/net/mod.rs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use crate::memory::uaccess::{copy_from_user, copy_from_user_slice};
88
use crate::sync::OnceLock;
99
use crate::sync::SpinLock;
1010
use alloc::vec;
11+
use alloc::vec::Vec;
1112
use core::net::Ipv4Addr;
1213
use libkernel::error::KernelError;
1314
use libkernel::memory::address::UA;
@@ -39,6 +40,9 @@ pub const IPPROTO_TCP: i32 = 6;
3940
#[expect(dead_code)]
4041
pub const IPPROTO_UDP: i32 = 17;
4142

43+
// TODO: Needs to be u32
44+
pub type SocketLen = usize;
45+
4246
#[repr(i32)]
4347
pub enum ShutdownHow {
4448
Read = 0,
@@ -65,6 +69,34 @@ pub enum SockAddr {
6569
Un(SockAddrUn),
6670
}
6771

72+
impl SockAddr {
73+
pub fn len(&self) -> SocketLen {
74+
match self {
75+
SockAddr::In(_) => size_of::<SockAddrIn>(),
76+
SockAddr::Un(_) => size_of::<SockAddrUn>(),
77+
}
78+
}
79+
80+
pub fn to_bytes(&self) -> Vec<u8> {
81+
match self {
82+
SockAddr::In(sain) => unsafe {
83+
core::slice::from_raw_parts(
84+
(sain as *const SockAddrIn).cast::<u8>(),
85+
size_of::<SockAddrIn>(),
86+
)
87+
.to_vec()
88+
},
89+
SockAddr::Un(saun) => unsafe {
90+
core::slice::from_raw_parts(
91+
(saun as *const SockAddrUn).cast::<u8>(),
92+
size_of::<SockAddrUn>(),
93+
)
94+
.to_vec()
95+
},
96+
}
97+
}
98+
}
99+
68100
#[derive(Copy, Clone, Debug)]
69101
#[repr(C, packed)]
70102
pub struct SockAddrIn {
@@ -118,7 +150,7 @@ pub fn process_packets() {
118150
socket_wait_queue().lock_save_irq().wake_all();
119151
}
120152

121-
pub async fn parse_sockaddr(uaddr: UA, len: usize) -> Result<SockAddr, KernelError> {
153+
pub async fn parse_sockaddr(uaddr: UA, len: SocketLen) -> Result<SockAddr, KernelError> {
122154
use crate::memory::uaccess::try_copy_from_user;
123155
use libkernel::memory::address::TUA;
124156

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::fs::fops::FileOps;
22
use crate::fs::open_file::FileCtx;
3-
use crate::socket::{ShutdownHow, SockAddr};
3+
use crate::net::{ShutdownHow, SockAddr};
44
use alloc::boxed::Box;
55
use async_trait::async_trait;
66
use bitflags::bitflags;
@@ -42,7 +42,7 @@ pub trait SocketOps: Send + Sync {
4242
Err(KernelError::NotSupported)
4343
}
4444

45-
async fn accept(&self) -> libkernel::error::Result<Box<dyn SocketOps>> {
45+
async fn accept(&self) -> libkernel::error::Result<(Box<dyn SocketOps>, SockAddr)> {
4646
Err(KernelError::NotSupported)
4747
}
4848

src/net/syscalls/accept.rs

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
use crate::fs::open_file::OpenFile;
2+
use crate::memory::uaccess::{copy_from_user, copy_to_user, copy_to_user_slice};
3+
use crate::net::SocketLen;
4+
use crate::process::fd_table::Fd;
5+
use crate::sched::current::current_task_shared;
6+
use libkernel::error::KernelError;
7+
use libkernel::fs::OpenFlags;
8+
use libkernel::memory::address::{TUA, UA};
9+
10+
pub async fn sys_accept4(
11+
fd: Fd,
12+
addr: UA,
13+
addrlen: TUA<SocketLen>,
14+
_flags: i32,
15+
) -> libkernel::error::Result<usize> {
16+
let file = current_task_shared()
17+
.fd_table
18+
.lock_save_irq()
19+
.get(fd)
20+
.ok_or(KernelError::BadFd)?;
21+
22+
let (ops, _ctx) = &mut *file.lock().await;
23+
24+
let (new_socket, socket_addr) = ops
25+
.as_socket()
26+
.ok_or(KernelError::NotASocket)?
27+
.accept()
28+
.await?;
29+
let new_socket = new_socket.as_file();
30+
31+
let open_file = OpenFile::new(new_socket, OpenFlags::empty());
32+
let new_fd = current_task_shared()
33+
.fd_table
34+
.lock_save_irq()
35+
.insert(alloc::sync::Arc::new(open_file))?;
36+
if !addr.is_null() {
37+
if addrlen.is_null() {
38+
return Err(KernelError::InvalidValue);
39+
}
40+
let addrlen_val = copy_from_user(addrlen).await?;
41+
let bytes = socket_addr.to_bytes();
42+
let to_copy = bytes.len().min(addrlen_val);
43+
copy_to_user_slice(&bytes[..to_copy], addr).await?;
44+
copy_to_user(addrlen, bytes.len()).await?;
45+
}
46+
Ok(new_fd.as_raw() as usize)
47+
}
48+
49+
pub async fn sys_accept(
50+
fd: Fd,
51+
addr: UA,
52+
addrlen: TUA<SocketLen>,
53+
) -> libkernel::error::Result<usize> {
54+
sys_accept4(fd, addr, addrlen, 0).await
55+
}
Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
1+
use crate::net::{SocketLen, parse_sockaddr};
12
use crate::process::fd_table::Fd;
2-
use crate::socket::parse_sockaddr;
3+
use crate::sched::current::current_task;
34
use libkernel::memory::address::UA;
45

5-
pub async fn sys_bind(fd: Fd, addr: UA, addrlen: usize) -> libkernel::error::Result<usize> {
6-
let file = crate::sched::current::current_task()
6+
pub async fn sys_bind(fd: Fd, addr: UA, addrlen: SocketLen) -> libkernel::error::Result<usize> {
7+
let file = current_task()
78
.fd_table
89
.lock_save_irq()
910
.get(fd)
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1+
use crate::net::{SocketLen, parse_sockaddr};
12
use crate::process::fd_table::Fd;
2-
use crate::socket::parse_sockaddr;
33
use libkernel::memory::address::UA;
44

5-
pub async fn sys_connect(fd: Fd, addr: UA, addrlen: usize) -> libkernel::error::Result<usize> {
5+
pub async fn sys_connect(fd: Fd, addr: UA, addrlen: SocketLen) -> libkernel::error::Result<usize> {
66
let file = crate::sched::current::current_task()
77
.fd_table
88
.lock_save_irq()

0 commit comments

Comments
 (0)