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