File tree Expand file tree Collapse file tree 3 files changed +10
-8
lines changed
src/devices/src/virtio/net Expand file tree Collapse file tree 3 files changed +10
-8
lines changed Original file line number Diff line number Diff line change @@ -8,6 +8,7 @@ use std::os::fd::{AsRawFd, RawFd};
8
8
use std:: path:: PathBuf ;
9
9
10
10
use super :: backend:: { ConnectError , NetBackend , ReadError , WriteError } ;
11
+ use super :: write_virtio_net_hdr;
11
12
12
13
const VFKIT_MAGIC : [ u8 ; 4 ] = * b"VFKT" ;
13
14
@@ -94,7 +95,8 @@ impl Unixgram {
94
95
impl NetBackend for Unixgram {
95
96
/// Try to read a frame the proxy. If no bytes are available reports ReadError::NothingRead
96
97
fn read_frame ( & mut self , buf : & mut [ u8 ] ) -> Result < usize , ReadError > {
97
- let frame_length = match recv ( self . fd , buf, MsgFlags :: empty ( ) ) {
98
+ let hdr_len = write_virtio_net_hdr ( buf) ;
99
+ let frame_length = match recv ( self . fd , & mut buf[ hdr_len..] , MsgFlags :: empty ( ) ) {
98
100
Ok ( f) => f,
99
101
#[ allow( unreachable_patterns) ]
100
102
Err ( nix:: Error :: EAGAIN | nix:: Error :: EWOULDBLOCK ) => {
@@ -105,7 +107,7 @@ impl NetBackend for Unixgram {
105
107
}
106
108
} ;
107
109
debug ! ( "Read eth frame from proxy: {frame_length} bytes" ) ;
108
- Ok ( frame_length)
110
+ Ok ( hdr_len + frame_length)
109
111
}
110
112
111
113
/// Try to write a frame to the proxy.
Original file line number Diff line number Diff line change @@ -10,6 +10,7 @@ use std::{
10
10
use crate :: virtio:: net:: backend:: ConnectError ;
11
11
12
12
use super :: backend:: { NetBackend , ReadError , WriteError } ;
13
+ use super :: write_virtio_net_hdr;
13
14
14
15
/// Each frame the network proxy is prepended by a 4 byte "header".
15
16
/// It is interpreted as a big-endian u32 integer and is the length of the following ethernet frame.
@@ -158,11 +159,13 @@ impl NetBackend for Unixstream {
158
159
} ;
159
160
}
160
161
162
+ let hdr_len = write_virtio_net_hdr ( buf) ;
163
+ let buf = & mut buf[ hdr_len..] ;
161
164
let frame_length = self . expecting_frame_length as usize ;
162
165
self . read_loop ( & mut buf[ ..frame_length] , false ) ?;
163
166
self . expecting_frame_length = 0 ;
164
167
log:: trace!( "Read eth frame from network proxy: {frame_length} bytes" ) ;
165
- Ok ( frame_length)
168
+ Ok ( hdr_len + frame_length)
166
169
}
167
170
168
171
/// Try to write a frame to the proxy.
Original file line number Diff line number Diff line change @@ -7,7 +7,7 @@ use crate::Error as DeviceError;
7
7
8
8
use super :: backend:: { NetBackend , ReadError , WriteError } ;
9
9
use super :: device:: { FrontendError , RxError , TxError , VirtioNetBackend } ;
10
- use super :: { vnet_hdr_len, write_virtio_net_hdr } ;
10
+ use super :: vnet_hdr_len;
11
11
12
12
use std:: os:: fd:: AsRawFd ;
13
13
use std:: sync:: atomic:: AtomicUsize ;
@@ -456,10 +456,7 @@ impl NetWorker {
456
456
457
457
/// Fills self.rx_frame_buf with an ethernet frame from backend and prepends virtio_net_hdr to it
458
458
fn read_into_rx_frame_buf_from_backend ( & mut self ) -> result:: Result < ( ) , ReadError > {
459
- let mut len = 0 ;
460
- len += write_virtio_net_hdr ( & mut self . rx_frame_buf ) ;
461
- len += self . backend . read_frame ( & mut self . rx_frame_buf [ len..] ) ?;
462
- self . rx_frame_buf_len = len;
459
+ self . rx_frame_buf_len = self . backend . read_frame ( & mut self . rx_frame_buf ) ?;
463
460
Ok ( ( ) )
464
461
}
465
462
}
You can’t perform that action at this time.
0 commit comments