diff --git a/.gitignore b/.gitignore index 4d811009..2ceb0449 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,6 @@ /.cargo /.crates* /mnt +*.swp +*.swo + diff --git a/Cargo.lock b/Cargo.lock index da7fe57b..5ec01656 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -279,6 +279,7 @@ dependencies = [ "axdriver_net", "axdriver_pci", "axdriver_virtio", + "axdriver_vsock", "axhal", "cfg-if", "crate_interface", @@ -289,12 +290,12 @@ dependencies = [ [[package]] name = "axdriver_base" version = "0.1.2" -source = "git+https://github.com/Starry-OS/axdriver_crates.git?rev=a887828#a887828dbf5c7b5ffb7688dd0afc64259e1b4f4a" +source = "git+https://github.com/Starry-OS/axdriver_crates.git?rev=a263470#a2634709194f2fd595a52b660d7d43df7c32570e" [[package]] name = "axdriver_block" version = "0.1.2" -source = "git+https://github.com/Starry-OS/axdriver_crates.git?rev=a887828#a887828dbf5c7b5ffb7688dd0afc64259e1b4f4a" +source = "git+https://github.com/Starry-OS/axdriver_crates.git?rev=a263470#a2634709194f2fd595a52b660d7d43df7c32570e" dependencies = [ "axdriver_base", "gpt_disk_io", @@ -305,7 +306,7 @@ dependencies = [ [[package]] name = "axdriver_display" version = "0.1.2" -source = "git+https://github.com/Starry-OS/axdriver_crates.git?rev=a887828#a887828dbf5c7b5ffb7688dd0afc64259e1b4f4a" +source = "git+https://github.com/Starry-OS/axdriver_crates.git?rev=a263470#a2634709194f2fd595a52b660d7d43df7c32570e" dependencies = [ "axdriver_base", ] @@ -313,7 +314,7 @@ dependencies = [ [[package]] name = "axdriver_input" version = "0.1.2" -source = "git+https://github.com/Starry-OS/axdriver_crates.git?rev=a887828#a887828dbf5c7b5ffb7688dd0afc64259e1b4f4a" +source = "git+https://github.com/Starry-OS/axdriver_crates.git?rev=a263470#a2634709194f2fd595a52b660d7d43df7c32570e" dependencies = [ "axdriver_base", "strum", @@ -322,7 +323,7 @@ dependencies = [ [[package]] name = "axdriver_net" version = "0.1.2" -source = "git+https://github.com/Starry-OS/axdriver_crates.git?rev=a887828#a887828dbf5c7b5ffb7688dd0afc64259e1b4f4a" +source = "git+https://github.com/Starry-OS/axdriver_crates.git?rev=a263470#a2634709194f2fd595a52b660d7d43df7c32570e" dependencies = [ "axdriver_base", "log", @@ -332,7 +333,7 @@ dependencies = [ [[package]] name = "axdriver_pci" version = "0.1.2" -source = "git+https://github.com/Starry-OS/axdriver_crates.git?rev=a887828#a887828dbf5c7b5ffb7688dd0afc64259e1b4f4a" +source = "git+https://github.com/Starry-OS/axdriver_crates.git?rev=a263470#a2634709194f2fd595a52b660d7d43df7c32570e" dependencies = [ "virtio-drivers", ] @@ -340,17 +341,27 @@ dependencies = [ [[package]] name = "axdriver_virtio" version = "0.1.2" -source = "git+https://github.com/Starry-OS/axdriver_crates.git?rev=a887828#a887828dbf5c7b5ffb7688dd0afc64259e1b4f4a" +source = "git+https://github.com/Starry-OS/axdriver_crates.git?rev=a263470#a2634709194f2fd595a52b660d7d43df7c32570e" dependencies = [ "axdriver_base", "axdriver_block", "axdriver_display", "axdriver_input", "axdriver_net", + "axdriver_vsock", "log", "virtio-drivers", ] +[[package]] +name = "axdriver_vsock" +version = "0.1.2" +source = "git+https://github.com/Starry-OS/axdriver_crates.git?rev=a263470#a2634709194f2fd595a52b660d7d43df7c32570e" +dependencies = [ + "axdriver_base", + "log", +] + [[package]] name = "axerrno" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 6c2b1cfc..e0fc2de3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -26,6 +26,7 @@ axfeat = { path = "arceos/api/axfeat", features = [ "rtc", # "sched-fifo", "sched-rr", + "vsock", ] } axalloc = { path = "arceos/modules/axalloc" } @@ -87,6 +88,7 @@ default = [] qemu = [ "axfeat/driver-virtio-blk", "axfeat/driver-virtio-net", + "axfeat/driver-virtio-socket", "axfeat/driver-virtio-gpu", "axfeat/display", @@ -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"] diff --git a/Makefile b/Makefile index d8ebe812..5d295be5 100644 --- a/Makefile +++ b/Makefile @@ -7,6 +7,7 @@ export MEMTRACK := n # QEMU Options export BLK := y export NET := y +export VSOCK := n export MEM := 1G export ICOUNT := n diff --git a/api/src/socket.rs b/api/src/socket.rs index 7dfb911e..42999377 100644 --- a/api/src/socket.rs +++ b/api/src/socket.rs @@ -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}; @@ -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, addrlen: socklen_t) -> AxResult { + if addrlen != size_of::() as socklen_t { + return Err(AxError::InvalidInput); + } + + let addr_vsock = addr.cast::().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, 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, addrlen: socklen_t) -> AxResult { 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)), } } @@ -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), } } diff --git a/api/src/syscall/net/socket.rs b/api/src/syscall/net/socket.rs index 3ac5af43..c2678efa 100644 --- a/api/src/syscall/net/socket.rs +++ b/api/src/syscall/net/socket.rs @@ -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; @@ -44,7 +45,10 @@ pub fn sys_socket(domain: u32, raw_ty: u32, proto: u32) -> AxResult { } (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)); } diff --git a/arceos b/arceos index 12d6a1e9..80e5a0a7 160000 --- a/arceos +++ b/arceos @@ -1 +1 @@ -Subproject commit 12d6a1e973004806dd378f4424058c8da5783d41 +Subproject commit 80e5a0a7c1c43404d3e8c01d16c18c4d968ef61d