netstack3_device/
queue.rs1use alloc::collections::VecDeque;
8
9use netstack3_base::{ErrorAndSerializer, WorkQueueReport};
10use packet::SerializeError;
11
12use crate::internal::base::DeviceSendFrameError;
13use crate::internal::queue::tx::TxBufferAllocator;
14
15pub(crate) mod api;
16mod fifo;
17pub(crate) mod rx;
18pub(crate) mod tx;
19
20const MAX_RX_QUEUED_LEN: usize = 10000;
22const MAX_TX_QUEUED_LEN: usize = 10000;
24
25#[derive(Debug, PartialEq, Eq)]
27pub struct ReceiveQueueFullError<T>(pub T);
28
29#[derive(Debug, PartialEq, Eq)]
30pub enum TransmitQueueFrameError<S> {
31 NoQueue(DeviceSendFrameError),
32 QueueFull(S),
33 SerializeError(ErrorAndSerializer<SerializeError<()>, S>),
34}
35
36pub struct DequeueState<Meta, Buffer> {
38 dequeued_frames: VecDeque<(Meta, Buffer)>,
39}
40
41impl<Meta, Buffer> Default for DequeueState<Meta, Buffer> {
42 fn default() -> DequeueState<Meta, Buffer> {
43 DequeueState {
44 dequeued_frames: VecDeque::with_capacity(BatchSize::MAX),
47 }
48 }
49}
50
51#[derive(Debug, PartialEq, Eq)]
52enum EnqueueResult {
53 QueueWasPreviouslyEmpty,
54 QueuePreviouslyWasOccupied,
55}
56
57#[derive(Debug)]
58enum DequeueResult {
59 MoreStillQueued,
60 NoMoreLeft,
61}
62
63impl From<DequeueResult> for WorkQueueReport {
64 fn from(value: DequeueResult) -> Self {
65 match value {
66 DequeueResult::MoreStillQueued => Self::Pending,
67 DequeueResult::NoMoreLeft => Self::AllDone,
68 }
69 }
70}
71
72#[derive(Copy, Clone, Debug, Eq, PartialEq)]
78pub struct BatchSize(usize);
79
80impl BatchSize {
81 pub const MAX: usize = 100;
92
93 pub fn new_saturating(v: usize) -> Self {
96 Self(v.min(Self::MAX))
97 }
98}
99
100impl From<BatchSize> for usize {
101 fn from(BatchSize(v): BatchSize) -> Self {
102 v
103 }
104}
105
106impl Default for BatchSize {
107 fn default() -> Self {
108 Self(Self::MAX)
109 }
110}
111
112pub trait DeviceBufferSpec<BT>: netstack3_base::Device + Send + Sync {
114 type TxBuffer: packet::FragmentedBuffer + AsMut<[u8]>;
116 type TxAllocator: TxBufferAllocator<Self::TxBuffer>;
118}