网络模块-axnet
axnet 提供了对网络设备的驱动与封装。StarryOS 使用了开源的 smoltcp 库作为其网络协议栈。并在 smoltcp 提供的 API 基础上,封装了 TCPSocket 与 UDPSocket 两个套接字类型。
Linux syscall 所提供的 Socket API 的实现位于 ulib/socket.rs 中。
/// 包装内部的不同协议 Socket
pub struct Socket {
#[allow(dead_code)]
domain: Domain,
socket_type: SocketType,
inner: SocketInner,
close_exec: bool,
recv_timeout: Option<TimeVal>,
reuse_addr: bool,
dont_route: bool,
send_buf_size: usize,
recv_buf_size: usize,
congestion: String,
}
Socket¶
Socket 封装了由 axnet 提供的 TCP/UDP Socket(SocketInner)。并记录了此 Socket 在 Linux Socket API 层具有的其他信息,如 domain(Address Family)、type,以及一些配置信息,如 recv_timeout、close_exec。
此 Socket 类型实现了如 bind()、connect()、accept() 等操作,再 syscall 的实际代码中,只需使用这些函数,无需与 axnet 交互。
Socket 与其他文件相关的类型相同,实现了 FileExt 与 FileIO trait,使得 Socket 对象可以存储在进程的 FdTable 中。也因如此,read()、write() 等面向文件实现的 syscall 也可用于 socket。
SocketOption、TcpSocketOption¶
Linux Socket API 中关于,可以通过 Socket Option 来修改或获取 Socket 的各项选项。对于不同的选项,分别实现了 get() 与 set() 函数,简洁地实现所需功能。
#[derive(TryFromPrimitive, Debug)]
#[repr(usize)]
#[allow(non_camel_case_types)]
pub enum SocketOption {
SO_REUSEADDR = 2,
SO_DONTROUTE = 5,
SO_SNDBUF = 7,
SO_RCVBUF = 8,
SO_KEEPALIVE = 9,
SO_RCVTIMEO = 20,
}