use std::os::unix::io::RawFd;
pub const HOST_CID: u64 = 2;
pub const RESERVED_CID: u64 = 1;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct VsockAddr {
pub cid: u64,
pub port: u32,
}
impl VsockAddr {
#[must_use]
pub const fn new(cid: u64, port: u32) -> Self {
Self { cid, port }
}
#[must_use]
pub const fn host(port: u32) -> Self {
Self::new(HOST_CID, port)
}
}
pub trait VsockHostConnections: Send + Sync {
fn fd_for(&self, guest_port: u32, host_port: u32) -> Option<RawFd>;
fn mark_connected(&mut self, guest_port: u32, host_port: u32);
fn remove_connection(&mut self, guest_port: u32, host_port: u32);
fn update_peer_credit(
&mut self,
_guest_port: u32,
_host_port: u32,
_buf_alloc: u32,
_fwd_cnt: u32,
) {
}
fn advance_fwd_cnt(&mut self, _guest_port: u32, _host_port: u32, _bytes: u32) -> bool {
false
}
fn enqueue_credit_update(&mut self, _guest_port: u32, _host_port: u32) {}
fn handle_shutdown(&mut self, guest_port: u32, host_port: u32, _flags: u32) {
self.remove_connection(guest_port, host_port);
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_vsock_addr_new() {
let addr = VsockAddr::new(3, 1234);
assert_eq!(addr.cid, 3);
assert_eq!(addr.port, 1234);
}
#[test]
fn test_vsock_addr_host() {
let addr = VsockAddr::host(8080);
assert_eq!(addr.cid, HOST_CID);
assert_eq!(addr.cid, 2);
assert_eq!(addr.port, 8080);
}
#[test]
#[allow(clippy::clone_on_copy)]
fn test_vsock_addr_clone_copy() {
let addr = VsockAddr::new(10, 5000);
let cloned = addr.clone();
let copied = addr;
assert_eq!(cloned.cid, 10);
assert_eq!(copied.port, 5000);
}
#[test]
fn test_vsock_addr_eq() {
let addr1 = VsockAddr::new(3, 1234);
let addr2 = VsockAddr::new(3, 1234);
let addr3 = VsockAddr::new(3, 5678);
assert_eq!(addr1, addr2);
assert_ne!(addr1, addr3);
}
#[test]
fn test_vsock_addr_hash() {
use std::collections::HashSet;
let mut set = HashSet::new();
set.insert(VsockAddr::new(3, 1234));
set.insert(VsockAddr::new(3, 1234)); set.insert(VsockAddr::new(4, 1234));
assert_eq!(set.len(), 2);
}
#[test]
fn test_vsock_constants() {
assert_eq!(HOST_CID, 2);
assert_eq!(RESERVED_CID, 1);
}
}