1use 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}