Skip to content

Commit 93f9732

Browse files
committed
updates for openrc
1 parent 252f04e commit 93f9732

File tree

8 files changed

+188
-25
lines changed

8 files changed

+188
-25
lines changed

Cargo.lock

Lines changed: 14 additions & 14 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/arch/arm64/exceptions/syscall.rs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ use crate::{
8585
sched::{current::current_task, sys_sched_yield},
8686
socket::syscalls::{
8787
accept::sys_accept, bind::sys_bind, connect::sys_connect, listen::sys_listen,
88-
shutdown::sys_shutdown, socket::sys_socket,
88+
send::sys_sendto, shutdown::sys_shutdown, socket::sys_socket,
8989
},
9090
};
9191
use alloc::boxed::Box;
@@ -510,6 +510,17 @@ pub async fn handle_syscall() {
510510
0xc9 => sys_listen(arg1.into(), arg2 as _).await,
511511
0xca => sys_accept(arg1.into()).await,
512512
0xcb => sys_connect(arg1.into(), UA::from_value(arg2 as _), arg3 as _).await,
513+
0xce => {
514+
sys_sendto(
515+
arg1.into(),
516+
TUA::from_value(arg2 as _),
517+
arg3 as _,
518+
arg4 as _,
519+
UA::from_value(arg5 as _),
520+
arg6 as _,
521+
)
522+
.await
523+
}
513524
0xd2 => sys_shutdown(arg1.into(), arg2 as _).await,
514525
0xd6 => sys_brk(VA::from_value(arg1 as _))
515526
.await

src/socket/sops.rs

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,31 @@ use crate::fs::open_file::FileCtx;
33
use crate::socket::{ShutdownHow, SockAddr};
44
use alloc::boxed::Box;
55
use async_trait::async_trait;
6+
use bitflags::bitflags;
67
use libkernel::error::KernelError;
78
use libkernel::memory::address::UA;
89

10+
bitflags! {
11+
#[derive(Copy, Clone)]
12+
pub struct SendFlags: u32 {
13+
const MSG_CONFIRM = 0x800;
14+
const MSG_DONT_ROUTE = 0x4;
15+
const MSG_DONT_WAIT = 0x40;
16+
const MSG_EOR = 0x80;
17+
const MSG_MORE = 0x8000;
18+
const MSG_NO_SIGNAL = 0x4000;
19+
const MSG_OOB = 0x1;
20+
}
21+
}
22+
23+
bitflags! {
24+
#[derive(Copy, Clone)]
25+
pub struct RecvFlags: u32 {
26+
// TODO: rest of flags
27+
const MSG_DONTWAIT = 0x40;
28+
}
29+
}
30+
931
#[async_trait]
1032
pub trait SocketOps: Send + Sync {
1133
async fn bind(&self, _addr: SockAddr) -> libkernel::error::Result<()> {
@@ -24,17 +46,35 @@ pub trait SocketOps: Send + Sync {
2446
Err(KernelError::NotSupported)
2547
}
2648

27-
async fn read(
49+
async fn recv(
2850
&mut self,
2951
ctx: &mut FileCtx,
3052
buf: UA,
3153
count: usize,
54+
flags: RecvFlags,
3255
) -> libkernel::error::Result<usize>;
33-
async fn write(
56+
async fn recvfrom(
57+
&mut self,
58+
ctx: &mut FileCtx,
59+
buf: UA,
60+
count: usize,
61+
flags: RecvFlags,
62+
addr: Option<SockAddr>,
63+
) -> libkernel::error::Result<(usize, Option<SockAddr>)>;
64+
async fn send(
65+
&mut self,
66+
ctx: &mut FileCtx,
67+
buf: UA,
68+
count: usize,
69+
flags: SendFlags,
70+
) -> libkernel::error::Result<usize>;
71+
async fn sendto(
3472
&mut self,
3573
ctx: &mut FileCtx,
3674
buf: UA,
3775
count: usize,
76+
flags: SendFlags,
77+
addr: SockAddr,
3878
) -> libkernel::error::Result<usize>;
3979

4080
async fn shutdown(&self, _how: ShutdownHow) -> libkernel::error::Result<()> {
@@ -55,7 +95,7 @@ where
5595
buf: UA,
5696
count: usize,
5797
) -> libkernel::error::Result<usize> {
58-
self.read(ctx, buf, count).await
98+
self.recv(ctx, buf, count, RecvFlags::empty()).await
5999
}
60100

61101
async fn readat(
@@ -73,7 +113,7 @@ where
73113
buf: UA,
74114
count: usize,
75115
) -> libkernel::error::Result<usize> {
76-
self.write(ctx, buf, count).await
116+
self.send(ctx, buf, count, SendFlags::empty()).await
77117
}
78118

79119
async fn writeat(

src/socket/syscalls/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@ pub mod accept;
22
pub mod bind;
33
pub mod connect;
44
pub mod listen;
5+
pub mod send;
56
pub mod shutdown;
67
pub mod socket;

src/socket/syscalls/send.rs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
use crate::process::fd_table::Fd;
2+
use crate::socket::parse_sockaddr;
3+
use crate::socket::sops::SendFlags;
4+
use libkernel::error::Result;
5+
use libkernel::memory::address::UA;
6+
7+
// pub async fn sys_send(fd: Fd, buf: UA, len: usize, flags: i32) -> Result<usize> {
8+
// let file = crate::sched::current::current_task()
9+
// .fd_table
10+
// .lock_save_irq()
11+
// .get(fd)
12+
// .ok_or(libkernel::error::KernelError::BadFd)?;
13+
// if flags != 0 {
14+
// log::warn!("sys_send: flags parameter is not supported yet: {}", flags);
15+
// }
16+
//
17+
// let (ops, ctx) = &mut *file.lock().await;
18+
// let socket = ops
19+
// .as_socket()
20+
// .ok_or(libkernel::error::KernelError::NotASocket)?;
21+
// let flags = SendFlags::from_bits(flags as u32).unwrap_or(SendFlags::empty());
22+
// socket.send(ctx, buf, len, flags).await
23+
// }
24+
25+
pub async fn sys_sendto(
26+
fd: Fd,
27+
buf: UA,
28+
len: usize,
29+
flags: i32,
30+
addr: UA,
31+
addrlen: usize,
32+
) -> Result<usize> {
33+
let file = crate::sched::current::current_task()
34+
.fd_table
35+
.lock_save_irq()
36+
.get(fd)
37+
.ok_or(libkernel::error::KernelError::BadFd)?;
38+
if flags != 0 {
39+
log::warn!("sys_sendto: flags parameter is not supported yet: {flags}");
40+
}
41+
42+
let (ops, ctx) = &mut *file.lock().await;
43+
let socket = ops
44+
.as_socket()
45+
.ok_or(libkernel::error::KernelError::NotASocket)?;
46+
let flags = SendFlags::from_bits(flags as u32).unwrap_or(SendFlags::empty());
47+
let addr = parse_sockaddr(addr, addrlen).await?;
48+
socket.sendto(ctx, buf, len, flags, addr).await
49+
}

src/socket/tcp.rs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::arch::ArchImpl;
22
use crate::fs::fops::FileOps;
33
use crate::fs::open_file::FileCtx;
4-
use crate::socket::sops::SocketOps;
4+
use crate::socket::sops::{RecvFlags, SendFlags, SocketOps};
55
use crate::socket::{ShutdownHow, SockAddr, process_packets, sockets};
66
use crate::sync::SpinLock;
77
use alloc::boxed::Box;
@@ -89,20 +89,44 @@ impl SocketOps for TcpSocket {
8989
self.refill_backlog_sockets(&mut backlogs)
9090
}
9191

92-
async fn read(
92+
async fn recv(
9393
&mut self,
9494
_ctx: &mut FileCtx,
9595
_buf: UA,
9696
_count: usize,
97+
_flags: RecvFlags,
9798
) -> libkernel::error::Result<usize> {
9899
todo!()
99100
}
100101

101-
async fn write(
102+
async fn recvfrom(
102103
&mut self,
103104
_ctx: &mut FileCtx,
104105
_buf: UA,
105106
_count: usize,
107+
_flags: RecvFlags,
108+
_addr: Option<SockAddr>,
109+
) -> libkernel::error::Result<(usize, Option<SockAddr>)> {
110+
todo!()
111+
}
112+
113+
async fn send(
114+
&mut self,
115+
_ctx: &mut FileCtx,
116+
_buf: UA,
117+
_count: usize,
118+
_flags: SendFlags,
119+
) -> libkernel::error::Result<usize> {
120+
todo!()
121+
}
122+
123+
async fn sendto(
124+
&mut self,
125+
_ctx: &mut FileCtx,
126+
_buf: UA,
127+
_count: usize,
128+
_flags: SendFlags,
129+
_addr: SockAddr,
106130
) -> libkernel::error::Result<usize> {
107131
todo!()
108132
}

src/socket/unix.rs

Lines changed: 40 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use crate::fs::open_file::FileCtx;
22
use crate::kernel::kpipe::KPipe;
3+
use crate::socket::sops::{RecvFlags, SendFlags};
34
use crate::socket::{SockAddr, SocketOps};
45
use crate::sync::OnceLock;
56
use crate::sync::SpinLock;
@@ -220,7 +221,13 @@ impl SocketOps for UnixSocket {
220221
Ok(Box::new(sock))
221222
}
222223

223-
async fn read(&mut self, _ctx: &mut FileCtx, buf: UA, count: usize) -> Result<usize> {
224+
async fn recv(
225+
&mut self,
226+
_ctx: &mut FileCtx,
227+
buf: UA,
228+
count: usize,
229+
_flags: RecvFlags,
230+
) -> Result<usize> {
224231
if count == 0 {
225232
return Ok(0);
226233
}
@@ -230,7 +237,26 @@ impl SocketOps for UnixSocket {
230237
self.inbox.copy_to_user(buf, count).await
231238
}
232239

233-
async fn write(&mut self, _ctx: &mut FileCtx, buf: UA, count: usize) -> Result<usize> {
240+
async fn recvfrom(
241+
&mut self,
242+
_ctx: &mut FileCtx,
243+
_buf: UA,
244+
_count: usize,
245+
_flags: RecvFlags,
246+
_addr: Option<SockAddr>,
247+
) -> Result<(usize, Option<SockAddr>)> {
248+
todo!();
249+
// let n = self.recv(ctx, buf, count, flags).await?;
250+
// Ok((n, None))
251+
}
252+
253+
async fn send(
254+
&mut self,
255+
_ctx: &mut FileCtx,
256+
buf: UA,
257+
count: usize,
258+
_flags: SendFlags,
259+
) -> Result<usize> {
234260
if count == 0 {
235261
return Ok(0);
236262
}
@@ -251,6 +277,18 @@ impl SocketOps for UnixSocket {
251277
peer.copy_from_user(buf, count).await
252278
}
253279

280+
async fn sendto(
281+
&mut self,
282+
_ctx: &mut FileCtx,
283+
_buf: UA,
284+
_count: usize,
285+
_flags: SendFlags,
286+
_addr: SockAddr,
287+
) -> Result<usize> {
288+
todo!();
289+
// self.send(ctx, buf, count, flags).await
290+
}
291+
254292
async fn shutdown(&self, how: crate::socket::ShutdownHow) -> Result<()> {
255293
match how {
256294
crate::socket::ShutdownHow::Read => {

usertest/src/socket.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1+
use crate::register_test;
12
use libc::{AF_INET, AF_UNIX, SOCK_DGRAM, SOCK_STREAM};
23
use libc::{accept, bind, connect, listen, shutdown, socket};
3-
use crate::register_test;
44

55
pub fn test_tcp_socket_creation() {
66
unsafe {

0 commit comments

Comments
 (0)