@@ -27,7 +27,7 @@ use vmm_sys_util::eventfd::EventFd;
2727
2828use super :: super :: super :: DeviceError ;
2929use super :: defs:: uapi;
30- use super :: packet:: { VsockPacket , VSOCK_PKT_HDR_SIZE } ;
30+ use super :: packet:: { VsockPacketRx , VsockPacketTx , VSOCK_PKT_HDR_SIZE } ;
3131use super :: { defs, VsockBackend } ;
3232use crate :: devices:: virtio:: device:: { DeviceState , IrqTrigger , IrqType , VirtioDevice } ;
3333use crate :: devices:: virtio:: queue:: Queue as VirtQueue ;
@@ -68,6 +68,9 @@ pub struct Vsock<B> {
6868 // continuous triggers from happening before the device gets activated.
6969 pub ( crate ) activate_evt : EventFd ,
7070 pub ( crate ) device_state : DeviceState ,
71+
72+ pub rx_packet : VsockPacketRx ,
73+ pub tx_packet : VsockPacketTx ,
7174}
7275
7376// TODO: Detect / handle queue deadlock:
@@ -101,6 +104,8 @@ where
101104 irq_trigger : IrqTrigger :: new ( ) . map_err ( VsockError :: EventFd ) ?,
102105 activate_evt : EventFd :: new ( libc:: EFD_NONBLOCK ) . map_err ( VsockError :: EventFd ) ?,
103106 device_state : DeviceState :: Inactive ,
107+ rx_packet : VsockPacketRx :: default ( ) ,
108+ tx_packet : VsockPacketTx :: default ( ) ,
104109 } )
105110 }
106111
@@ -147,14 +152,14 @@ where
147152
148153 while let Some ( head) = self . queues [ RXQ_INDEX ] . pop ( ) {
149154 let index = head. index ;
150- let used_len = match VsockPacket :: from_rx_virtq_head ( mem, head) {
151- Ok ( mut pkt ) => {
152- if self . backend . recv_pkt ( & mut pkt ) . is_ok ( ) {
153- match pkt . commit_hdr ( ) {
155+ let used_len = match self . rx_packet . parse ( mem, head) {
156+ Ok ( ( ) ) => {
157+ if self . backend . recv_pkt ( & mut self . rx_packet ) . is_ok ( ) {
158+ match self . rx_packet . commit_hdr ( ) {
154159 // This addition cannot overflow, because packet length
155160 // is previously validated against `MAX_PKT_BUF_SIZE`
156161 // bound as part of `commit_hdr()`.
157- Ok ( ( ) ) => VSOCK_PKT_HDR_SIZE + pkt . len ( ) ,
162+ Ok ( ( ) ) => VSOCK_PKT_HDR_SIZE + self . rx_packet . hdr . len ( ) ,
158163 Err ( err) => {
159164 warn ! (
160165 "vsock: Error writing packet header to guest memory: \
@@ -200,8 +205,9 @@ where
200205
201206 while let Some ( head) = self . queues [ TXQ_INDEX ] . pop ( ) {
202207 let index = head. index ;
203- let pkt = match VsockPacket :: from_tx_virtq_head ( mem, head) {
204- Ok ( pkt) => pkt,
208+ // let pkt = match VsockPacket::from_tx_virtq_head(mem, head) {
209+ match self . tx_packet . parse ( mem, head) {
210+ Ok ( ( ) ) => ( ) ,
205211 Err ( err) => {
206212 error ! ( "vsock: error reading TX packet: {:?}" , err) ;
207213 have_used = true ;
@@ -214,7 +220,7 @@ where
214220 }
215221 } ;
216222
217- if self . backend . send_pkt ( & pkt ) . is_err ( ) {
223+ if self . backend . send_pkt ( & self . tx_packet ) . is_err ( ) {
218224 self . queues [ TXQ_INDEX ] . undo_pop ( ) ;
219225 break ;
220226 }
0 commit comments