netvsp/
resolver.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4use crate::Nic;
5use async_trait::async_trait;
6use net_backend::resolve::ResolveEndpointParams;
7use netvsp_resources::NetvspHandle;
8use vm_resource::AsyncResolveResource;
9use vm_resource::ResolveError;
10use vm_resource::ResourceResolver;
11use vm_resource::declare_static_async_resolver;
12use vm_resource::kind::VmbusDeviceHandleKind;
13use vmbus_channel::resources::ResolveVmbusDeviceHandleParams;
14use vmbus_channel::resources::ResolvedVmbusDevice;
15
16pub struct NetvspResolver;
17
18declare_static_async_resolver! {
19    NetvspResolver,
20    (VmbusDeviceHandleKind, NetvspHandle),
21}
22
23#[async_trait]
24impl AsyncResolveResource<VmbusDeviceHandleKind, NetvspHandle> for NetvspResolver {
25    type Output = ResolvedVmbusDevice;
26    type Error = ResolveError;
27
28    async fn resolve(
29        &self,
30        resolver: &ResourceResolver,
31        resource: NetvspHandle,
32        input: ResolveVmbusDeviceHandleParams<'_>,
33    ) -> Result<Self::Output, Self::Error> {
34        let endpoint = resolver
35            .resolve(
36                resource.endpoint,
37                ResolveEndpointParams {
38                    mac_address: resource.mac_address,
39                },
40            )
41            .await?;
42
43        let mut builder = Nic::builder();
44        if let Some(max_queues) = resource.max_queues {
45            builder = builder.max_queues(max_queues);
46        }
47        let nic = builder.build(
48            input.driver_source,
49            resource.instance_id,
50            endpoint.0,
51            resource.mac_address,
52            resource.instance_id.data1,
53        );
54        Ok(nic.into())
55    }
56}