rdif-vsock 0.1.0

Driver Interface vsock definition.
Documentation
#![no_std]

extern crate alloc;

mod addr;
mod error;
mod event;
mod interface;

pub use addr::*;
pub use error::*;
pub use event::*;
pub use interface::*;
pub use rdif_base::{DriverGeneric, KError, io};

#[cfg(test)]
mod tests {
    use super::*;

    struct TestVsock;

    impl DriverGeneric for TestVsock {
        fn name(&self) -> &str {
            "test-vsock"
        }
    }

    impl Interface for TestVsock {
        fn guest_cid(&self) -> u64 {
            3
        }

        fn listen(&mut self, _port: u32) -> Result<(), VsockError> {
            Ok(())
        }

        fn connect(&mut self, _id: VsockConnId) -> Result<(), VsockError> {
            Ok(())
        }

        fn send(&mut self, _id: VsockConnId, buf: &[u8]) -> Result<usize, VsockError> {
            Ok(buf.len())
        }

        fn recv(&mut self, _id: VsockConnId, buf: &mut [u8]) -> Result<usize, VsockError> {
            if !buf.is_empty() {
                buf[0] = 7;
            }
            Ok(buf.len().min(1))
        }

        fn recv_avail(&mut self, _id: VsockConnId) -> Result<usize, VsockError> {
            Ok(1)
        }

        fn disconnect(&mut self, _id: VsockConnId) -> Result<(), VsockError> {
            Ok(())
        }

        fn abort(&mut self, _id: VsockConnId) -> Result<(), VsockError> {
            Ok(())
        }

        fn poll_event(&mut self) -> Result<Option<VsockEvent>, VsockError> {
            Ok(Some(VsockEvent::Connected(VsockConnId::listening(1024))))
        }
    }

    #[test]
    fn vsock_interface_exposes_connections_and_events() {
        let mut vsock = TestVsock;
        let id = VsockConnId::listening(1024);
        assert_eq!(vsock.guest_cid(), 3);
        assert_eq!(vsock.send(id, &[1, 2, 3]).unwrap(), 3);

        let mut buf = [0; 4];
        assert_eq!(vsock.recv(id, &mut buf).unwrap(), 1);
        assert_eq!(buf[0], 7);
        assert_eq!(vsock.poll_event().unwrap(), Some(VsockEvent::Connected(id)));
        assert_eq!(vsock.handle_irq(), Event::none());
    }

    #[test]
    fn already_exists_maps_to_not_available() {
        let kind: io::ErrorKind = VsockError::AlreadyExists.into();

        assert!(matches!(kind, io::ErrorKind::NotAvailable));
    }
}