1use 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 None,
24 )
25 .unwrap()
26}
27
28#[derive(Clone)]
29pub struct Bufs {
30 inner: Arc<BufsInner>,
31 buffer_segment: RxBufferSegment,
32}
33
34struct BufsInner {
35 rx_metadata: Vec<Mutex<Option<RxMetadata>>>,
36 guest_memory: GuestMemory,
37}
38
39impl Bufs {
40 pub fn new(guest_memory: GuestMemory) -> Self {
41 let mut rx_metadata = Vec::new();
42 rx_metadata.resize_with(128, Default::default);
43 Self {
44 inner: Arc::new(BufsInner {
45 rx_metadata,
46 guest_memory,
47 }),
48 buffer_segment: RxBufferSegment { gpa: 0, len: 0 },
49 }
50 }
51}
52
53impl BufferAccess for Bufs {
54 fn guest_memory(&self) -> &GuestMemory {
55 &self.inner.guest_memory
56 }
57
58 fn guest_addresses(&mut self, id: RxId) -> &[RxBufferSegment] {
59 let gpa = id.0 as u64 * 2048;
60 self.buffer_segment = RxBufferSegment { gpa, len: 2048 };
61 std::slice::from_ref(&self.buffer_segment)
62 }
63
64 fn capacity(&self, _id: RxId) -> u32 {
65 2048
66 }
67
68 fn write_data(&mut self, id: RxId, buf: &[u8]) {
69 self.inner
70 .guest_memory
71 .write_at(id.0 as u64 * 2048, buf)
72 .unwrap();
73 }
74
75 fn write_header(&mut self, id: RxId, metadata: &RxMetadata) {
76 *self.inner.rx_metadata[id.0 as usize].lock() = Some(*metadata);
77 }
78}