Skip to main content

virtio_spec/
vsock.rs

1//! Socket Device
2
3use endian_num::{le16, le32};
4use num_enum::{IntoPrimitive, TryFromPrimitive, UnsafeFromPrimitive};
5use volatile_macro::VolatileFieldAccess;
6
7pub use super::features::vsock::F;
8use crate::le64;
9
10/// Socket Device Configuration Layout
11///
12/// Use [`ConfigVolatileFieldAccess`] to work with this struct.
13#[doc(alias = "virtio_vsock_config")]
14#[derive(VolatileFieldAccess)]
15#[repr(C)]
16pub struct Config {
17    guest_cid: le64,
18}
19
20/// Socket Device Header
21#[doc(alias = "virtio_vsock_hdr")]
22#[cfg_attr(
23    feature = "zerocopy",
24    derive(
25        zerocopy_derive::KnownLayout,
26        zerocopy_derive::Immutable,
27        zerocopy_derive::FromBytes,
28        zerocopy_derive::IntoBytes,
29    )
30)]
31#[derive(Default, Clone, Copy, Debug)]
32#[repr(C, packed)]
33pub struct Hdr {
34    pub src_cid: le64,
35    pub dst_cid: le64,
36    pub src_port: le32,
37    pub dst_port: le32,
38    pub len: le32,
39    pub type_: le16,
40    pub op: le16,
41    pub flags: le32,
42    pub buf_alloc: le32,
43    pub fwd_cnt: le32,
44}
45
46#[doc(alias = "VIRTIO_VSOCK_OP")]
47#[derive(
48    IntoPrimitive, TryFromPrimitive, UnsafeFromPrimitive, PartialEq, Eq, Clone, Copy, Debug,
49)]
50#[non_exhaustive]
51#[repr(u16)]
52pub enum Op {
53    #[doc(alias = "VIRTIO_VSOCK_OP_INVALID")]
54    Invalid = 0,
55
56    #[doc(alias = "VIRTIO_VSOCK_OP_REQUEST")]
57    Request = 1,
58
59    #[doc(alias = "VIRTIO_VSOCK_OP_RESPONSE")]
60    Response = 2,
61
62    #[doc(alias = "VIRTIO_VSOCK_OP_RST")]
63    Rst = 3,
64
65    #[doc(alias = "VIRTIO_VSOCK_OP_SHUTDOWN")]
66    Shutdown = 4,
67
68    #[doc(alias = "VIRTIO_VSOCK_OP_RW")]
69    Rw = 5,
70
71    #[doc(alias = "VIRTIO_VSOCK_OP_CREDIT_UPDATE")]
72    CreditUpdate = 6,
73
74    #[doc(alias = "VIRTIO_VSOCK_OP_CREDIT_REQUEST")]
75    CreditRequest = 7,
76}
77
78#[doc(alias = "VIRTIO_VSOCK_TYPE")]
79#[derive(
80    IntoPrimitive, TryFromPrimitive, UnsafeFromPrimitive, PartialEq, Eq, Clone, Copy, Debug,
81)]
82#[non_exhaustive]
83#[repr(u16)]
84pub enum Type {
85    #[doc(alias = "VIRTIO_VSOCK_TYPE_STREAM")]
86    Stream = 1,
87
88    #[doc(alias = "VIRTIO_VSOCK_TYPE_SEQPACKET")]
89    Seqpacket = 2,
90}
91
92endian_bitflags! {
93    /// Socket Device Shutdown Flags
94    #[doc(alias = "VIRTIO_VSOCK_SHUTDOWN_F")]
95    pub struct ShutdownF: le32 {
96        #[doc(alias = "VIRTIO_VSOCK_SHUTDOWN_F_RECEIVE")]
97        const RECEIVE = 1 << 0;
98
99        #[doc(alias = "VIRTIO_VSOCK_SHUTDOWN_F_SEND")]
100        const SEND = 1 << 1;
101    }
102}
103
104endian_bitflags! {
105    /// Socket Device Sequence Flags
106    #[doc(alias = "VIRTIO_VSOCK_SEQ")]
107    pub struct Seq: le32 {
108        #[doc(alias = "VIRTIO_VSOCK_SEQ_EOM")]
109        const EOM = 1 << 0;
110
111        #[doc(alias = "VIRTIO_VSOCK_SEQ_EOR")]
112        const EOR = 1 << 1;
113    }
114}
115
116#[doc(alias = "VIRTIO_VSOCK_EVENT")]
117#[derive(
118    IntoPrimitive, TryFromPrimitive, UnsafeFromPrimitive, PartialEq, Eq, Clone, Copy, Debug,
119)]
120#[non_exhaustive]
121#[repr(u32)]
122pub enum EventId {
123    #[doc(alias = "VIRTIO_VSOCK_EVENT_TRANSPORT_RESET")]
124    TransportReset = 0,
125}
126
127/// Socket Device Event
128#[doc(alias = "virtio_vsock_event")]
129#[cfg_attr(
130    feature = "zerocopy",
131    derive(
132        zerocopy_derive::KnownLayout,
133        zerocopy_derive::Immutable,
134        zerocopy_derive::FromBytes,
135        zerocopy_derive::IntoBytes,
136    )
137)]
138#[derive(Default, Clone, Copy, Debug)]
139#[repr(C)]
140pub struct Event {
141    id: le32,
142}