1use crate::Device;
7use async_trait::async_trait;
8use net_backend::resolve::ResolveEndpointParams;
9use virtio::resolve::ResolvedVirtioDevice;
10use virtio::resolve::VirtioResolveInput;
11use virtio_resources::net::VirtioNetHandle;
12use vm_resource::AsyncResolveResource;
13use vm_resource::ResourceResolver;
14use vm_resource::declare_static_async_resolver;
15use vm_resource::kind::VirtioDeviceHandle;
16
17pub struct VirtioNetResolver;
19
20declare_static_async_resolver! {
21 VirtioNetResolver,
22 (VirtioDeviceHandle, VirtioNetHandle),
23}
24
25#[async_trait]
26impl AsyncResolveResource<VirtioDeviceHandle, VirtioNetHandle> for VirtioNetResolver {
27 type Output = ResolvedVirtioDevice;
28 type Error = anyhow::Error;
29
30 async fn resolve(
31 &self,
32 resolver: &ResourceResolver,
33 resource: VirtioNetHandle,
34 input: VirtioResolveInput<'_>,
35 ) -> Result<Self::Output, Self::Error> {
36 let mut builder = Device::builder();
37 if let Some(max_queues) = resource.max_queues {
38 builder = builder.max_queues(max_queues);
39 }
40
41 let endpoint = resolver
42 .resolve(
43 resource.endpoint,
44 ResolveEndpointParams {
45 mac_address: resource.mac_address,
46 },
47 )
48 .await?;
49
50 let device = builder.build(
51 input.driver_source,
52 input.guest_memory.clone(),
53 endpoint.0,
54 resource.mac_address,
55 );
56
57 Ok(device.into())
58 }
59}