net_backend/
null.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Null (disconnected) endpoint.
5
6use crate::BufferAccess;
7use crate::Endpoint;
8use crate::MultiQueueSupport;
9use crate::Queue;
10use crate::QueueConfig;
11use crate::RssConfig;
12use crate::RxId;
13use crate::TxError;
14use crate::TxId;
15use crate::TxOffloadSupport;
16use crate::TxSegment;
17use crate::resolve::ResolveEndpointParams;
18use crate::resolve::ResolvedEndpoint;
19use async_trait::async_trait;
20use inspect::InspectMut;
21use net_backend_resources::null::NullHandle;
22use std::convert::Infallible;
23use std::task::Context;
24use std::task::Poll;
25use vm_resource::ResolveResource;
26use vm_resource::declare_static_resolver;
27use vm_resource::kind::NetEndpointHandleKind;
28
29pub struct NullResolver;
30
31declare_static_resolver! {
32    NullResolver,
33    (NetEndpointHandleKind, NullHandle),
34}
35
36impl ResolveResource<NetEndpointHandleKind, NullHandle> for NullResolver {
37    type Output = ResolvedEndpoint;
38    type Error = Infallible;
39
40    fn resolve(
41        &self,
42        _resource: NullHandle,
43        _input: ResolveEndpointParams,
44    ) -> Result<Self::Output, Self::Error> {
45        Ok(NullEndpoint::new().into())
46    }
47}
48
49/// An endpoint that never sends or receives any data.
50#[non_exhaustive]
51#[derive(InspectMut)]
52pub struct NullEndpoint {}
53
54impl NullEndpoint {
55    pub fn new() -> Self {
56        Self {}
57    }
58}
59
60#[async_trait]
61impl Endpoint for NullEndpoint {
62    fn endpoint_type(&self) -> &'static str {
63        "null"
64    }
65
66    async fn get_queues(
67        &mut self,
68        config: Vec<QueueConfig>,
69        _rss: Option<&RssConfig<'_>>,
70        queues: &mut Vec<Box<dyn Queue>>,
71    ) -> anyhow::Result<()> {
72        queues.extend(config.iter().map(|_| Box::new(NullQueue) as _));
73        Ok(())
74    }
75
76    async fn stop(&mut self) {}
77
78    fn is_ordered(&self) -> bool {
79        true
80    }
81
82    fn tx_offload_support(&self) -> TxOffloadSupport {
83        TxOffloadSupport {
84            ipv4_header: true,
85            tcp: true,
86            udp: true,
87            tso: true,
88        }
89    }
90
91    fn multiqueue_support(&self) -> MultiQueueSupport {
92        MultiQueueSupport {
93            max_queues: u16::MAX,
94            indirection_table_size: 128,
95        }
96    }
97}
98
99/// A queue that never sends or receives data.
100#[derive(InspectMut)]
101struct NullQueue;
102
103impl Queue for NullQueue {
104    fn poll_ready(&mut self, _cx: &mut Context<'_>, _pool: &mut dyn BufferAccess) -> Poll<()> {
105        Poll::Pending
106    }
107
108    fn rx_avail(&mut self, _pool: &mut dyn BufferAccess, _done: &[RxId]) {}
109
110    fn rx_poll(
111        &mut self,
112        _pool: &mut dyn BufferAccess,
113        _packets: &mut [RxId],
114    ) -> anyhow::Result<usize> {
115        Ok(0)
116    }
117
118    fn tx_avail(
119        &mut self,
120        _pool: &mut dyn BufferAccess,
121        packets: &[TxSegment],
122    ) -> anyhow::Result<(bool, usize)> {
123        Ok((true, packets.len()))
124    }
125
126    fn tx_poll(
127        &mut self,
128        _pool: &mut dyn BufferAccess,
129        _done: &mut [TxId],
130    ) -> Result<usize, TxError> {
131        Ok(0)
132    }
133}