net_backend/
tests.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! Types to help test backends.
5
6use crate::BufferAccess;
7use crate::RxBufferSegment;
8use crate::RxId;
9use crate::RxMetadata;
10use guestmem::GuestMemory;
11use memory_range::MemoryRange;
12use parking_lot::Mutex;
13use std::sync::Arc;
14use vm_topology::memory::MemoryLayout;
15
16pub fn test_layout() -> MemoryLayout {
17    MemoryLayout::new(
18        64 * 4096,
19        &[
20            MemoryRange::new(64 * 4096..65 * 4096),
21            MemoryRange::new(65 * 4096..66 * 4096),
22        ],
23        &[],
24        &[],
25        None,
26    )
27    .unwrap()
28}
29
30#[derive(Clone)]
31pub struct Bufs {
32    inner: Arc<BufsInner>,
33    buffer_segment: RxBufferSegment,
34}
35
36struct BufsInner {
37    rx_metadata: Vec<Mutex<Option<RxMetadata>>>,
38    guest_memory: GuestMemory,
39}
40
41impl Bufs {
42    pub fn new(guest_memory: GuestMemory) -> Self {
43        let mut rx_metadata = Vec::new();
44        rx_metadata.resize_with(128, Default::default);
45        Self {
46            inner: Arc::new(BufsInner {
47                rx_metadata,
48                guest_memory,
49            }),
50            buffer_segment: RxBufferSegment { gpa: 0, len: 0 },
51        }
52    }
53}
54
55impl BufferAccess for Bufs {
56    fn guest_memory(&self) -> &GuestMemory {
57        &self.inner.guest_memory
58    }
59
60    fn guest_addresses(&mut self, id: RxId) -> &[RxBufferSegment] {
61        let gpa = id.0 as u64 * 2048;
62        self.buffer_segment = RxBufferSegment { gpa, len: 2048 };
63        std::slice::from_ref(&self.buffer_segment)
64    }
65
66    fn capacity(&self, _id: RxId) -> u32 {
67        2048
68    }
69
70    fn write_data(&mut self, id: RxId, buf: &[u8]) {
71        self.inner
72            .guest_memory
73            .write_at(id.0 as u64 * 2048, buf)
74            .unwrap();
75    }
76
77    fn write_header(&mut self, id: RxId, metadata: &RxMetadata) {
78        *self.inner.rx_metadata[id.0 as usize].lock() = Some(*metadata);
79    }
80}