Skip to content

Commit c44e785

Browse files
committed
starry: support AF_VSOCK Stream mode
Signed-off-by: Weikang Guo <guoweikang@kylinos.cn>
1 parent 7a2d82d commit c44e785

File tree

4 files changed

+61
-5
lines changed

4 files changed

+61
-5
lines changed

Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ axfeat = { path = "arceos/api/axfeat", features = [
2626
"rtc",
2727
# "sched-fifo",
2828
"sched-rr",
29+
"vsock",
2930
] }
3031

3132
axalloc = { path = "arceos/modules/axalloc" }
@@ -87,6 +88,7 @@ default = []
8788
qemu = [
8889
"axfeat/driver-virtio-blk",
8990
"axfeat/driver-virtio-net",
91+
"axfeat/driver-virtio-socket",
9092

9193
"axfeat/driver-virtio-gpu",
9294
"axfeat/display",
@@ -102,6 +104,7 @@ qemu = [
102104
"axfeat/fs-times",
103105
"starry-api/dev-log",
104106
]
107+
105108
vf2 = ["dep:axplat-riscv64-visionfive2", "axfeat/driver-sdmmc-gpt"]
106109
2k1000la = ["dep:axplat-loongarch64-2k1000la", "axfeat/driver-ahci-gpt"]
107110

Makefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ export MEMTRACK := n
77
# QEMU Options
88
export BLK := y
99
export NET := y
10+
export VSOCK := y
1011
export MEM := 1G
1112
export ICOUNT := n
1213

api/src/socket.rs

Lines changed: 47 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,10 @@ use core::{
88
};
99

1010
use axerrno::{AxError, AxResult, LinuxError};
11-
use axnet::{SocketAddrEx, unix::UnixSocketAddr};
11+
use axnet::{SocketAddrEx, unix::UnixSocketAddr, vsock::VsocketAddr};
1212
use linux_raw_sys::net::{
13-
__kernel_sa_family_t, AF_INET, AF_INET6, AF_UNIX, in_addr, in6_addr, sockaddr, sockaddr_in,
14-
sockaddr_in6, socklen_t,
13+
__kernel_sa_family_t, AF_INET, AF_INET6, AF_UNIX, AF_VSOCK, in_addr, in6_addr, sockaddr,
14+
sockaddr_in, sockaddr_in6, socklen_t,
1515
};
1616

1717
use crate::mm::{UserConstPtr, UserPtr};
@@ -195,11 +195,54 @@ impl SocketAddrExt for UnixSocketAddr {
195195
}
196196
}
197197

198+
// Linux sockaddr_vm is not public in linux_raw_sys crate.
199+
// its struct is like below:
200+
// struct sockaddr_vm {
201+
// __kernel_sa_family_t svm_family; /* Address family */
202+
// unsigned short svm_reserved1;
203+
// __u32 svm_port; /* Port # */
204+
// __u32 svm_cid; /* Context ID */
205+
// unsigned char svm_zero[sizeof(struct sockaddr) - sizeof(__kernel_sa_family_t) - 2 * sizeof(__u32)];
206+
// };
207+
impl SocketAddrExt for VsocketAddr {
208+
fn read_from_user(addr: UserConstPtr<sockaddr>, addrlen: socklen_t) -> AxResult<Self> {
209+
if read_family(addr, addrlen)? as u32 != AF_VSOCK {
210+
return Err(AxError::Other(LinuxError::EAFNOSUPPORT));
211+
}
212+
let addr_vm_ptr: UserConstPtr<u8> = addr.cast::<u8>();
213+
let addr_vm: &'static [u8] = addr_vm_ptr.get_as_slice(addrlen as usize)?;
214+
// sockaddr_vm at least has 12 bytes for family, reserved1, port and cid.
215+
if addr_vm.len() < 12 {
216+
return Err(AxError::InvalidInput);
217+
}
218+
let port: u32 = u32::from_le_bytes([addr_vm[4], addr_vm[5], addr_vm[6], addr_vm[7]]);
219+
let cid: u32 = u32::from_le_bytes([addr_vm[8], addr_vm[9], addr_vm[10], addr_vm[11]]);
220+
221+
info!("read_from_user: port={}, cid={}", port, cid);
222+
Ok(VsocketAddr { cid, port })
223+
}
224+
225+
fn write_to_user(&self, addr: UserPtr<sockaddr>, addrlen: &mut socklen_t) -> AxResult<()> {
226+
let mut buf: Vec<u8> = Vec::with_capacity(16); // size of sockaddr_vm
227+
buf.extend_from_slice(&(AF_VSOCK as u16).to_le_bytes()); // family
228+
buf.extend_from_slice(&0u16.to_le_bytes()); // reserved1
229+
buf.extend_from_slice(&self.port.to_le_bytes());
230+
buf.extend_from_slice(&self.cid.to_le_bytes());
231+
buf.extend_from_slice(&[0u8; 4]); // padding = 16 - 2 - 2 - 4 - 4 = 4
232+
fill_addr(addr, addrlen, &buf)
233+
}
234+
235+
fn family(&self) -> u16 {
236+
AF_VSOCK as u16
237+
}
238+
}
239+
198240
impl SocketAddrExt for SocketAddrEx {
199241
fn read_from_user(addr: UserConstPtr<sockaddr>, addrlen: socklen_t) -> AxResult<Self> {
200242
match read_family(addr, addrlen)? as u32 {
201243
AF_INET | AF_INET6 => SocketAddr::read_from_user(addr, addrlen).map(Self::Ip),
202244
AF_UNIX => UnixSocketAddr::read_from_user(addr, addrlen).map(Self::Unix),
245+
AF_VSOCK => VsocketAddr::read_from_user(addr, addrlen).map(Self::Vsock),
203246
_ => Err(AxError::Other(LinuxError::EAFNOSUPPORT)),
204247
}
205248
}
@@ -208,6 +251,7 @@ impl SocketAddrExt for SocketAddrEx {
208251
match self {
209252
SocketAddrEx::Ip(ip_addr) => ip_addr.write_to_user(addr, addrlen),
210253
SocketAddrEx::Unix(unix_addr) => unix_addr.write_to_user(addr, addrlen),
254+
SocketAddrEx::Vsock(vsock_addr) => vsock_addr.write_to_user(addr, addrlen),
211255
}
212256
}
213257

api/src/syscall/net/socket.rs

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ use axnet::{
44
tcp::TcpSocket,
55
udp::UdpSocket,
66
unix::{DgramTransport, StreamTransport, UnixSocket},
7+
vsock::{VsockSocket, VsockStreamTransport},
78
};
89
use axtask::current;
910
use linux_raw_sys::{
1011
general::{O_CLOEXEC, O_NONBLOCK},
1112
net::{
12-
AF_INET, AF_UNIX, IPPROTO_TCP, IPPROTO_UDP, SHUT_RD, SHUT_RDWR, SHUT_WR, SOCK_DGRAM,
13-
SOCK_SEQPACKET, SOCK_STREAM, sockaddr, socklen_t,
13+
AF_INET, AF_UNIX, AF_VSOCK, IPPROTO_TCP, IPPROTO_UDP, SHUT_RD, SHUT_RDWR, SHUT_WR,
14+
SOCK_DGRAM, SOCK_SEQPACKET, SOCK_STREAM, sockaddr, socklen_t,
1415
},
1516
};
1617
use starry_core::task::AsThread;
@@ -48,6 +49,13 @@ pub fn sys_socket(domain: u32, raw_ty: u32, proto: u32) -> AxResult<isize> {
4849
warn!("Unsupported socket type: domain: {}, ty: {}", domain, ty);
4950
return Err(AxError::Other(LinuxError::ESOCKTNOSUPPORT));
5051
}
52+
(AF_VSOCK, SOCK_STREAM) => {
53+
axnet::Socket::Vsock(VsockSocket::new(VsockStreamTransport::new()))
54+
}
55+
(AF_VSOCK, SOCK_DGRAM) => {
56+
warn!("Unsupported socket type: domain: {}, ty: {}", domain, ty);
57+
return Err(AxError::Other(LinuxError::ESOCKTNOSUPPORT));
58+
}
5159
_ => {
5260
return Err(AxError::Other(LinuxError::EAFNOSUPPORT));
5361
}

0 commit comments

Comments
 (0)