Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,6 @@
/.cargo
/.crates*
/mnt
*.swp
*.swo

25 changes: 18 additions & 7 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 3 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ axfeat = { path = "arceos/api/axfeat", features = [
"rtc",
# "sched-fifo",
"sched-rr",
"vsock",
] }

axalloc = { path = "arceos/modules/axalloc" }
Expand Down Expand Up @@ -87,6 +88,7 @@ default = []
qemu = [
"axfeat/driver-virtio-blk",
"axfeat/driver-virtio-net",
"axfeat/driver-virtio-socket",

"axfeat/driver-virtio-gpu",
"axfeat/display",
Expand All @@ -102,6 +104,7 @@ qemu = [
"axfeat/fs-times",
"starry-api/dev-log",
]

vf2 = ["dep:axplat-riscv64-visionfive2", "axfeat/driver-sdmmc-gpt"]
2k1000la = ["dep:axplat-loongarch64-2k1000la", "axfeat/driver-ahci-gpt"]

Expand Down
1 change: 1 addition & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export MEMTRACK := n
# QEMU Options
export BLK := y
export NET := y
export VSOCK := n
export MEM := 1G
export ICOUNT := n

Expand Down
53 changes: 50 additions & 3 deletions api/src/socket.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ use core::{
};

use axerrno::{AxError, AxResult, LinuxError};
use axnet::{SocketAddrEx, unix::UnixSocketAddr};
use axnet::{SocketAddrEx, unix::UnixSocketAddr, vsock::VsockAddr};
use linux_raw_sys::net::{
__kernel_sa_family_t, AF_INET, AF_INET6, AF_UNIX, in_addr, in6_addr, sockaddr, sockaddr_in,
sockaddr_in6, socklen_t,
__kernel_sa_family_t, AF_INET, AF_INET6, AF_UNIX, AF_VSOCK, in_addr, in6_addr, sockaddr,
sockaddr_in, sockaddr_in6, socklen_t,
};

use crate::mm::{UserConstPtr, UserPtr};
Expand Down Expand Up @@ -195,11 +195,57 @@ impl SocketAddrExt for UnixSocketAddr {
}
}

// This type should be provided by linux_raw_sys but it's missing.
// See https://github.com/sunfishcode/linux-raw-sys/issues/169
#[allow(non_camel_case_types)]
#[repr(C)]
#[derive(Copy, Clone)]
pub struct sockaddr_vm {
pub svm_family: __kernel_sa_family_t,
pub svm_reserved1: u16,
pub svm_port: u32,
pub svm_cid: u32,
pub svm_zero: [u8; 4],
}

impl SocketAddrExt for VsockAddr {
fn read_from_user(addr: UserConstPtr<sockaddr>, addrlen: socklen_t) -> AxResult<Self> {
if addrlen != size_of::<sockaddr_vm>() as socklen_t {
return Err(AxError::InvalidInput);
}

let addr_vsock = addr.cast::<sockaddr_vm>().get_as_ref()?;
if addr_vsock.svm_family as u32 != AF_VSOCK {
return Err(AxError::Other(LinuxError::EAFNOSUPPORT));
}
Ok(VsockAddr {
cid: addr_vsock.svm_cid,
port: addr_vsock.svm_port,
})
}

fn write_to_user(&self, addr: UserPtr<sockaddr>, addrlen: &mut socklen_t) -> AxResult<()> {
let sockvm_addr = sockaddr_vm {
svm_family: AF_VSOCK as _,
svm_reserved1: 0,
svm_port: self.port,
svm_cid: self.cid,
svm_zero: [0_u8; 4],
};
fill_addr(addr, addrlen, unsafe { cast_to_slice(&sockvm_addr) })
}

fn family(&self) -> u16 {
AF_VSOCK as u16
}
}

impl SocketAddrExt for SocketAddrEx {
fn read_from_user(addr: UserConstPtr<sockaddr>, addrlen: socklen_t) -> AxResult<Self> {
match read_family(addr, addrlen)? as u32 {
AF_INET | AF_INET6 => SocketAddr::read_from_user(addr, addrlen).map(Self::Ip),
AF_UNIX => UnixSocketAddr::read_from_user(addr, addrlen).map(Self::Unix),
AF_VSOCK => VsockAddr::read_from_user(addr, addrlen).map(Self::Vsock),
_ => Err(AxError::Other(LinuxError::EAFNOSUPPORT)),
}
}
Expand All @@ -208,6 +254,7 @@ impl SocketAddrExt for SocketAddrEx {
match self {
SocketAddrEx::Ip(ip_addr) => ip_addr.write_to_user(addr, addrlen),
SocketAddrEx::Unix(unix_addr) => unix_addr.write_to_user(addr, addrlen),
SocketAddrEx::Vsock(vsock_addr) => vsock_addr.write_to_user(addr, addrlen),
}
}

Expand Down
10 changes: 7 additions & 3 deletions api/src/syscall/net/socket.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,14 @@ use axnet::{
tcp::TcpSocket,
udp::UdpSocket,
unix::{DgramTransport, StreamTransport, UnixSocket},
vsock::{VsockSocket, VsockStreamTransport},
};
use axtask::current;
use linux_raw_sys::{
general::{O_CLOEXEC, O_NONBLOCK},
net::{
AF_INET, AF_UNIX, IPPROTO_TCP, IPPROTO_UDP, SHUT_RD, SHUT_RDWR, SHUT_WR, SOCK_DGRAM,
SOCK_SEQPACKET, SOCK_STREAM, sockaddr, socklen_t,
AF_INET, AF_UNIX, AF_VSOCK, IPPROTO_TCP, IPPROTO_UDP, SHUT_RD, SHUT_RDWR, SHUT_WR,
SOCK_DGRAM, SOCK_SEQPACKET, SOCK_STREAM, sockaddr, socklen_t,
},
};
use starry_core::task::AsThread;
Expand Down Expand Up @@ -44,7 +45,10 @@ pub fn sys_socket(domain: u32, raw_ty: u32, proto: u32) -> AxResult<isize> {
}
(AF_UNIX, SOCK_STREAM) => axnet::Socket::Unix(UnixSocket::new(StreamTransport::new(pid))),
(AF_UNIX, SOCK_DGRAM) => axnet::Socket::Unix(UnixSocket::new(DgramTransport::new(pid))),
(AF_INET, _) | (AF_UNIX, _) => {
(AF_VSOCK, SOCK_STREAM) => {
axnet::Socket::Vsock(VsockSocket::new(VsockStreamTransport::new()))
}
(AF_INET, _) | (AF_UNIX, _) | (AF_VSOCK, _) => {
warn!("Unsupported socket type: domain: {}, ty: {}", domain, ty);
return Err(AxError::Other(LinuxError::ESOCKTNOSUPPORT));
}
Expand Down
Loading