* Each port of virtio console device has one receive * queue. One or more empty buffers are placed by the * driver in the receive queue for incoming data. Here, * we place the input data to these empty buffers. */
(&mut self)
| 191 | * we place the input data to these empty buffers. |
| 192 | */ |
| 193 | fn process_input_queue(&mut self) -> Result<bool, Error> { |
| 194 | let mut in_buffer = self.in_buffer.lock().unwrap(); |
| 195 | let recv_queue = &mut self.input_queue; //receiveq |
| 196 | let mut used_descs = false; |
| 197 | |
| 198 | if in_buffer.is_empty() { |
| 199 | return Ok(false); |
| 200 | } |
| 201 | |
| 202 | while let Some(mut desc_chain) = recv_queue.pop_descriptor_chain(self.mem.memory()) { |
| 203 | let mut total_len = 0; |
| 204 | while let Some(desc) = desc_chain.next() { |
| 205 | if in_buffer.is_empty() { |
| 206 | break; |
| 207 | } |
| 208 | if !desc.is_write_only() { |
| 209 | warn!("Skipping device-readable descriptor on receiveq"); |
| 210 | continue; |
| 211 | } |
| 212 | let len = cmp::min(desc.len() as usize, in_buffer.len()); |
| 213 | let addr = match desc |
| 214 | .addr() |
| 215 | .translate_gva(self.access_platform.as_deref(), desc.len() as usize) |
| 216 | { |
| 217 | Ok(a) => a, |
| 218 | Err(e) => { |
| 219 | warn!("Failed to translate receiveq descriptor address: {e}"); |
| 220 | break; |
| 221 | } |
| 222 | }; |
| 223 | let source: Vec<u8> = in_buffer.range(..len).copied().collect(); |
| 224 | if let Err(e) = desc_chain.memory().write_slice(&source, addr) { |
| 225 | warn!("Failed to write to receiveq descriptor: {e}"); |
| 226 | break; |
| 227 | } |
| 228 | in_buffer.drain(..len); |
| 229 | total_len += len as u32; |
| 230 | } |
| 231 | |
| 232 | recv_queue |
| 233 | .add_used(desc_chain.memory(), desc_chain.head_index(), total_len) |
| 234 | .map_err(Error::QueueAddUsed)?; |
| 235 | used_descs = true; |
| 236 | |
| 237 | if in_buffer.is_empty() { |
| 238 | break; |
| 239 | } |
| 240 | } |
| 241 | |
| 242 | Ok(used_descs) |
| 243 | } |
| 244 | |
| 245 | /* |
| 246 | * Each port of virtio console device has one transmit |
no test coverage detected