Skip to content

Commit 4d4d794

Browse files
committed
net: move net_hdr operations to the backends
We're going to incorporate a new backend that doesn't require us to write the header on each frame, so move this functionality from the worker to each backend. Signed-off-by: Sergio Lopez <[email protected]>
1 parent a7255b3 commit 4d4d794

File tree

3 files changed

+10
-8
lines changed

3 files changed

+10
-8
lines changed

src/devices/src/virtio/net/unixgram.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use std::os::fd::{AsRawFd, RawFd};
88
use std::path::PathBuf;
99

1010
use super::backend::{ConnectError, NetBackend, ReadError, WriteError};
11+
use super::write_virtio_net_hdr;
1112

1213
const VFKIT_MAGIC: [u8; 4] = *b"VFKT";
1314

@@ -94,7 +95,8 @@ impl Unixgram {
9495
impl NetBackend for Unixgram {
9596
/// Try to read a frame the proxy. If no bytes are available reports ReadError::NothingRead
9697
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()) {
98100
Ok(f) => f,
99101
#[allow(unreachable_patterns)]
100102
Err(nix::Error::EAGAIN | nix::Error::EWOULDBLOCK) => {
@@ -105,7 +107,7 @@ impl NetBackend for Unixgram {
105107
}
106108
};
107109
debug!("Read eth frame from proxy: {frame_length} bytes");
108-
Ok(frame_length)
110+
Ok(hdr_len + frame_length)
109111
}
110112

111113
/// Try to write a frame to the proxy.

src/devices/src/virtio/net/unixstream.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use std::{
1010
use crate::virtio::net::backend::ConnectError;
1111

1212
use super::backend::{NetBackend, ReadError, WriteError};
13+
use super::write_virtio_net_hdr;
1314

1415
/// Each frame the network proxy is prepended by a 4 byte "header".
1516
/// 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 {
158159
};
159160
}
160161

162+
let hdr_len = write_virtio_net_hdr(buf);
163+
let buf = &mut buf[hdr_len..];
161164
let frame_length = self.expecting_frame_length as usize;
162165
self.read_loop(&mut buf[..frame_length], false)?;
163166
self.expecting_frame_length = 0;
164167
log::trace!("Read eth frame from network proxy: {frame_length} bytes");
165-
Ok(frame_length)
168+
Ok(hdr_len + frame_length)
166169
}
167170

168171
/// Try to write a frame to the proxy.

src/devices/src/virtio/net/worker.rs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use crate::Error as DeviceError;
77

88
use super::backend::{NetBackend, ReadError, WriteError};
99
use super::device::{FrontendError, RxError, TxError, VirtioNetBackend};
10-
use super::{vnet_hdr_len, write_virtio_net_hdr};
10+
use super::vnet_hdr_len;
1111

1212
use std::os::fd::AsRawFd;
1313
use std::sync::atomic::AtomicUsize;
@@ -456,10 +456,7 @@ impl NetWorker {
456456

457457
/// Fills self.rx_frame_buf with an ethernet frame from backend and prepends virtio_net_hdr to it
458458
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)?;
463460
Ok(())
464461
}
465462
}

0 commit comments

Comments
 (0)