1#![expect(missing_docs)]
10#![forbid(unsafe_code)]
11
12use mesh::MeshPayload;
13use vm_resource::Resource;
14use vm_resource::ResourceId;
15use vm_resource::kind::PciDeviceHandleKind;
16use vm_resource::kind::VirtioDeviceHandle;
17
18#[derive(MeshPayload)]
20pub struct VirtioPciDeviceHandle(pub Resource<VirtioDeviceHandle>);
21
22impl ResourceId<PciDeviceHandleKind> for VirtioPciDeviceHandle {
23 const ID: &'static str = "virtio";
24}
25
26pub mod p9 {
27 use mesh::MeshPayload;
28 use vm_resource::ResourceId;
29 use vm_resource::kind::VirtioDeviceHandle;
30
31 #[derive(MeshPayload)]
32 pub struct VirtioPlan9Handle {
33 pub tag: String,
34 pub root_path: String,
35 pub debug: bool,
36 }
37
38 impl ResourceId<VirtioDeviceHandle> for VirtioPlan9Handle {
39 const ID: &'static str = "virtio-9p";
40 }
41}
42
43pub mod fs {
44 use mesh::MeshPayload;
45 use vm_resource::ResourceId;
46 use vm_resource::kind::VirtioDeviceHandle;
47
48 #[derive(MeshPayload)]
49 pub struct VirtioFsHandle {
50 pub tag: String,
51 pub fs: VirtioFsBackend,
52 }
53
54 #[derive(MeshPayload)]
55 pub enum VirtioFsBackend {
56 HostFs {
57 root_path: String,
58 mount_options: String,
59 },
60 SectionFs {
61 root_path: String,
62 },
63 Aggregate {
67 children: Vec<VirtioFsAggregateChild>,
68 },
69 }
70
71 #[derive(MeshPayload)]
73 pub struct VirtioFsAggregateChild {
74 pub name: String,
78 pub root_path: String,
79 pub mount_options: String,
80 }
81
82 impl ResourceId<VirtioDeviceHandle> for VirtioFsHandle {
83 const ID: &'static str = "virtiofs";
84 }
85}
86
87pub mod pmem {
88 use mesh::MeshPayload;
89 use vm_resource::ResourceId;
90 use vm_resource::kind::VirtioDeviceHandle;
91
92 #[derive(MeshPayload)]
93 pub struct VirtioPmemHandle {
94 pub path: String,
95 }
96
97 impl ResourceId<VirtioDeviceHandle> for VirtioPmemHandle {
98 const ID: &'static str = "virtio-pmem";
99 }
100}
101
102pub mod rng {
103 use mesh::MeshPayload;
104 use vm_resource::ResourceId;
105 use vm_resource::kind::VirtioDeviceHandle;
106
107 #[derive(MeshPayload)]
108 pub struct VirtioRngHandle;
109
110 impl ResourceId<VirtioDeviceHandle> for VirtioRngHandle {
111 const ID: &'static str = "virtio-rng";
112 }
113}
114
115pub mod blk {
116 use mesh::MeshPayload;
117 use vm_resource::Resource;
118 use vm_resource::ResourceId;
119 use vm_resource::kind::DiskHandleKind;
120 use vm_resource::kind::VirtioDeviceHandle;
121
122 #[derive(MeshPayload)]
123 pub struct VirtioBlkHandle {
124 pub disk: Resource<DiskHandleKind>,
125 pub read_only: bool,
126 }
127
128 impl ResourceId<VirtioDeviceHandle> for VirtioBlkHandle {
129 const ID: &'static str = "virtio-blk";
130 }
131}
132
133pub mod net {
134 use mesh::MeshPayload;
135 use net_backend_resources::mac_address::MacAddress;
136 use vm_resource::Resource;
137 use vm_resource::ResourceId;
138 use vm_resource::kind::NetEndpointHandleKind;
139 use vm_resource::kind::VirtioDeviceHandle;
140
141 #[derive(MeshPayload)]
142 pub struct VirtioNetHandle {
143 pub max_queues: Option<u16>,
144 pub mac_address: MacAddress,
145 pub endpoint: Resource<NetEndpointHandleKind>,
146 }
147
148 impl ResourceId<VirtioDeviceHandle> for VirtioNetHandle {
149 const ID: &'static str = "virtio-net";
150 }
151}
152
153pub mod console {
154 use mesh::MeshPayload;
155 use vm_resource::Resource;
156 use vm_resource::ResourceId;
157 use vm_resource::kind::SerialBackendHandle;
158 use vm_resource::kind::VirtioDeviceHandle;
159
160 #[derive(MeshPayload)]
161 pub struct VirtioConsoleHandle {
162 pub backend: Resource<SerialBackendHandle>,
163 }
164
165 impl ResourceId<VirtioDeviceHandle> for VirtioConsoleHandle {
166 const ID: &'static str = "virtio-console";
167 }
168}
169
170#[cfg(unix)]
171pub mod vhost_user {
172 use mesh::MeshPayload;
173 use std::os::fd::OwnedFd;
174 use vm_resource::ResourceId;
175 use vm_resource::kind::VirtioDeviceHandle;
176
177 #[derive(MeshPayload)]
186 pub struct VhostUserGenericHandle {
187 pub socket: OwnedFd,
189 pub device_id: u16,
191 pub queue_sizes: Vec<u16>,
194 }
195
196 impl ResourceId<VirtioDeviceHandle> for VhostUserGenericHandle {
197 const ID: &'static str = "vhost-user-generic";
198 }
199
200 #[derive(MeshPayload)]
207 pub struct VhostUserFsHandle {
208 pub socket: OwnedFd,
210 pub tag: String,
212 pub num_queues: Option<u16>,
214 pub queue_size: Option<u16>,
216 }
217
218 impl ResourceId<VirtioDeviceHandle> for VhostUserFsHandle {
219 const ID: &'static str = "vhost-user-fs";
220 }
221
222 #[derive(MeshPayload)]
224 pub struct VhostUserBlkHandle {
225 pub socket: OwnedFd,
227 pub num_queues: Option<u16>,
229 pub queue_size: Option<u16>,
231 }
232
233 impl ResourceId<VirtioDeviceHandle> for VhostUserBlkHandle {
234 const ID: &'static str = "vhost-user-blk";
235 }
236}
237
238pub mod vsock {
239 use mesh::MeshPayload;
240 #[cfg(target_os = "linux")]
241 use std::os::fd::OwnedFd;
242 use unix_socket::UnixListener;
243 use vm_resource::ResourceId;
244 use vm_resource::kind::VirtioDeviceHandle;
245
246 #[derive(MeshPayload)]
247 pub struct VirtioVsockHandle {
248 pub guest_cid: u64,
249 pub base_path: String,
250 pub listener: UnixListener,
251 }
252
253 impl ResourceId<VirtioDeviceHandle> for VirtioVsockHandle {
254 const ID: &'static str = "virtio-vsock";
255 }
256
257 #[cfg(target_os = "linux")]
260 #[derive(MeshPayload)]
261 pub struct VirtioVsockVhostHandle {
262 pub vhost: OwnedFd,
267 pub guest_cid: u32,
270 }
271
272 #[cfg(target_os = "linux")]
273 impl ResourceId<VirtioDeviceHandle> for VirtioVsockVhostHandle {
274 const ID: &'static str = "virtio-vsock-vhost";
275 }
276}