Walk the driver-provided TX queue buffers, package them up as vsock packets, and send them to the backend for processing.
(&mut self)
| 173 | /// the backend for processing. |
| 174 | /// |
| 175 | fn process_tx(&mut self) -> result::Result<bool, Error> { |
| 176 | debug!("vsock: epoll_handler::process_tx()"); |
| 177 | |
| 178 | let mut used_descs = false; |
| 179 | |
| 180 | while let Some(mut desc_chain) = self.queues[1].pop_descriptor_chain(self.mem.memory()) { |
| 181 | let pkt = match VsockPacket::from_tx_virtq_head( |
| 182 | &mut desc_chain, |
| 183 | self.access_platform.as_deref(), |
| 184 | ) { |
| 185 | Ok(pkt) => pkt, |
| 186 | Err(e) => { |
| 187 | error!("vsock: error reading TX packet: {e:?}"); |
| 188 | self.queues[1] |
| 189 | .add_used(desc_chain.memory(), desc_chain.head_index(), 0) |
| 190 | .map_err(Error::QueueAddUsed)?; |
| 191 | used_descs = true; |
| 192 | continue; |
| 193 | } |
| 194 | }; |
| 195 | |
| 196 | if self.backend.write().unwrap().send_pkt(&pkt).is_err() { |
| 197 | self.queues[1].go_to_previous_position(); |
| 198 | break; |
| 199 | } |
| 200 | |
| 201 | self.queues[1] |
| 202 | .add_used(desc_chain.memory(), desc_chain.head_index(), 0) |
| 203 | .map_err(Error::QueueAddUsed)?; |
| 204 | used_descs = true; |
| 205 | } |
| 206 | |
| 207 | Ok(used_descs) |
| 208 | } |
| 209 | |
| 210 | fn run( |
| 211 | &mut self, |
no test coverage detected