virtio_net/
resolver.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Defines the resource resolver for virtio-net devices.
5
6use 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
17/// Resolver for virtio-pmem devices.
18pub 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}