virtio_queue_ser/
state.rs1use serde::{Deserialize, Serialize};
5use versionize::{VersionMap, Versionize, VersionizeResult};
6use versionize_derive::Versionize;
7use virtio_queue::QueueState;
8
9#[derive(Clone, Debug, Deserialize, PartialEq, Eq, Serialize, Versionize)]
11pub struct QueueStateSer {
12 pub max_size: u16,
14 pub next_avail: u16,
16 pub next_used: u16,
18 pub event_idx_enabled: bool,
20 pub size: u16,
22 pub ready: bool,
24 pub desc_table: u64,
26 pub avail_ring: u64,
28 pub used_ring: u64,
30}
31
32impl From<&QueueStateSer> for QueueState {
35 fn from(state: &QueueStateSer) -> Self {
36 QueueState {
37 max_size: state.max_size,
38 next_avail: state.next_avail,
39 next_used: state.next_used,
40 event_idx_enabled: state.event_idx_enabled,
41 size: state.size,
42 ready: state.ready,
43 desc_table: state.desc_table,
44 avail_ring: state.avail_ring,
45 used_ring: state.used_ring,
46 }
47 }
48}
49
50impl From<&QueueState> for QueueStateSer {
51 fn from(state: &QueueState) -> Self {
52 QueueStateSer {
53 max_size: state.max_size,
54 next_avail: state.next_avail,
55 next_used: state.next_used,
56 event_idx_enabled: state.event_idx_enabled,
57 size: state.size,
58 ready: state.ready,
59 desc_table: state.desc_table,
60 avail_ring: state.avail_ring,
61 used_ring: state.used_ring,
62 }
63 }
64}
65
66impl Default for QueueStateSer {
67 fn default() -> Self {
68 QueueStateSer::from(&QueueState::default())
69 }
70}
71
72#[cfg(test)]
73mod tests {
74 use super::*;
75 use virtio_queue::{Error, Queue};
76
77 #[test]
78 fn test_state_ser() {
79 const SOME_VALUE: u16 = 16;
80
81 let state = QueueState {
82 max_size: SOME_VALUE * 2,
83 next_avail: SOME_VALUE - 1,
84 next_used: SOME_VALUE + 1,
85 event_idx_enabled: false,
86 size: SOME_VALUE,
87 ready: true,
88 desc_table: SOME_VALUE as u64,
89 avail_ring: SOME_VALUE as u64 * 2,
90 used_ring: SOME_VALUE as u64 * 4,
91 };
92
93 let ser_state = QueueStateSer::from(&state);
94 let state_from_ser = QueueState::from(&ser_state);
95
96 assert_eq!(state, state_from_ser);
99
100 let default_queue_state_ser = QueueStateSer::default();
102 assert_eq!(
103 QueueState::from(&default_queue_state_ser),
104 QueueState::default()
105 );
106 }
107
108 #[test]
109 fn test_ser_with_len_zero() {
110 let queue_ser = QueueStateSer {
113 max_size: 16,
114 next_avail: 0,
115 next_used: 0,
116 event_idx_enabled: false,
117 size: 0,
118 ready: true,
119 desc_table: 0,
120 avail_ring: 256,
121 used_ring: 276,
122 };
123
124 let queue_state = QueueState::from(&queue_ser);
125 let err = Queue::try_from(queue_state).unwrap_err();
126 assert_eq!(err, Error::InvalidSize);
127 }
128}