From 574d692cb72207ecec7c89b77bc90f5a13cd25da Mon Sep 17 00:00:00 2001 From: hky1999 <976929993@qq.com> Date: Wed, 27 Sep 2023 21:40:15 +0800 Subject: [PATCH] fix: workflow test bugs --- examples/aarch64/src/main.rs | 1 + examples/riscv/src/tcp.rs | 2 +- examples/x86_64/Makefile | 6 ------ examples/x86_64/src/tcp.rs | 10 ++++----- src/device/net/dev.rs | 10 +++++++-- src/device/net/dev_raw.rs | 39 ++++++++++++++++++------------------ 6 files changed, 34 insertions(+), 34 deletions(-) diff --git a/examples/aarch64/src/main.rs b/examples/aarch64/src/main.rs index c3ec0b3c..7c0ca64a 100644 --- a/examples/aarch64/src/main.rs +++ b/examples/aarch64/src/main.rs @@ -30,6 +30,7 @@ use virtio_drivers::{ blk::VirtIOBlk, console::VirtIOConsole, gpu::VirtIOGpu, + net::VirtIONetRaw, socket::{ VirtIOSocket, VsockAddr, VsockConnectionManager, VsockEventType, VMADDR_CID_HOST, }, diff --git a/examples/riscv/src/tcp.rs b/examples/riscv/src/tcp.rs index 66c89a71..69c6e2b8 100644 --- a/examples/riscv/src/tcp.rs +++ b/examples/riscv/src/tcp.rs @@ -90,7 +90,7 @@ impl TxToken for VirtioTxToken { F: FnOnce(&mut [u8]) -> R, { let mut dev = self.0.borrow_mut(); - let mut tx_buf = dev.new_tx_buffer(len).unwrap(); + let mut tx_buf = dev.new_tx_buffer(len); let result = f(tx_buf.packet_mut()); trace!("SEND {} bytes: {:02X?}", len, tx_buf.packet()); dev.transmit_wait(tx_buf).unwrap(); diff --git a/examples/x86_64/Makefile b/examples/x86_64/Makefile index e22d01d4..bad89bae 100644 --- a/examples/x86_64/Makefile +++ b/examples/x86_64/Makefile @@ -20,12 +20,6 @@ else BUILD_ARGS += --no-default-features endif -ifeq ($(tcp), on) - BUILD_ARGS += --features tcp -else - BUILD_ARGS += --no-default-features -endif - QEMU_ARGS += \ -machine q35 \ -serial mon:stdio \ diff --git a/examples/x86_64/src/tcp.rs b/examples/x86_64/src/tcp.rs index 30ff6db4..07c2c3f6 100644 --- a/examples/x86_64/src/tcp.rs +++ b/examples/x86_64/src/tcp.rs @@ -1,6 +1,6 @@ //! Simple echo server over TCP. //! -//! Ref: https://github.com/smoltcp-rs/smoltcp/blob/master/examples/server.rs +//! Ref: use alloc::{borrow::ToOwned, rc::Rc, vec, vec::Vec}; use core::{cell::RefCell, str::FromStr}; @@ -9,7 +9,7 @@ use smoltcp::iface::{Config, Interface, SocketSet}; use smoltcp::phy::{Device, DeviceCapabilities, Medium, RxToken, TxToken}; use smoltcp::wire::{EthernetAddress, IpAddress, IpCidr, Ipv4Address}; use smoltcp::{socket::tcp, time::Instant}; -use virtio_drivers::device::net::{NetBuffer, VirtIONet}; +use virtio_drivers::device::net::{RxBuffer, VirtIONet}; use virtio_drivers::{transport::Transport, Error}; use super::{HalImpl, NET_QUEUE_SIZE}; @@ -64,7 +64,7 @@ impl Device for DeviceWrapper { } } -struct VirtioRxToken(Rc>>, NetBuffer); +struct VirtioRxToken(Rc>>, RxBuffer); struct VirtioTxToken(Rc>>); impl RxToken for VirtioRxToken { @@ -90,10 +90,10 @@ impl TxToken for VirtioTxToken { F: FnOnce(&mut [u8]) -> R, { let mut dev = self.0.borrow_mut(); - let mut tx_buf = dev.new_tx_buffer(len).unwrap(); + let mut tx_buf = dev.new_tx_buffer(len); let result = f(tx_buf.packet_mut()); trace!("SEND {} bytes: {:02X?}", len, tx_buf.packet()); - dev.transmit_wait(tx_buf).unwrap(); + dev.transmit(tx_buf).unwrap(); result } } diff --git a/src/device/net/dev.rs b/src/device/net/dev.rs index 6c48ecae..aa96573d 100644 --- a/src/device/net/dev.rs +++ b/src/device/net/dev.rs @@ -6,7 +6,7 @@ use crate::{hal::Hal, transport::Transport, Error, Result}; /// Driver for a VirtIO block device. /// -/// Unlike [`VirtIONetRaw`], it uses [`NetBuffer`]s for transmission and +/// Unlike [`VirtIONetRaw`], it uses [`RxBuffer`]s for transmission and /// reception rather than the raw slices. On initialization, it pre-allocates /// all receive buffers and puts them all in the receive queue. /// @@ -117,9 +117,15 @@ impl VirtIONet TxBuffer(vec![0; buf_len]) } + /// Sends a [`TxBuffer`] to the network, and blocks until the request + /// completed. Returns number of bytes transmitted. + pub fn transmit_wait(&mut self, tx_buf: TxBuffer) -> Result { + self.inner.transmit_wait(tx_buf.packet()) + } + /// Sends a [`TxBuffer`] to the network, and blocks until the request /// completed. pub fn send(&mut self, tx_buf: TxBuffer) -> Result { - self.inner.send(tx_buf) + self.inner.send(tx_buf.packet()) } } diff --git a/src/device/net/dev_raw.rs b/src/device/net/dev_raw.rs index fbcb63a3..37e720f7 100644 --- a/src/device/net/dev_raw.rs +++ b/src/device/net/dev_raw.rs @@ -1,4 +1,3 @@ -use super::TxBuffer; use super::{Config, EthernetAddress, Features, VirtioNetHdr}; use super::{MIN_BUFFER_LEN, NET_HDR_SIZE, QUEUE_RECEIVE, QUEUE_TRANSMIT}; use crate::hal::Hal; @@ -242,11 +241,26 @@ impl VirtIONetRaw Result { + let token = unsafe { self.transmit_begin(tx_buf)? }; + while self.poll_transmit().is_none() { + core::hint::spin_loop(); + } + unsafe { self.transmit_complete(token, tx_buf) } + } + + /// Sends a packet to the network, and blocks until the request /// completed. - pub fn send(&mut self, tx_buf: TxBuffer) -> Result { + pub fn send(&mut self, tx_buf: &[u8]) -> Result { let header = VirtioNetHdr::default(); - if tx_buf.packet_len() == 0 { + if tx_buf.len() == 0 { // Special case sending an empty packet, to avoid adding an empty buffer to the // virtqueue. self.send_queue.add_notify_wait_pop( @@ -256,7 +270,7 @@ impl VirtIONetRaw VirtIONetRaw Result { - let token = unsafe { self.transmit_begin(tx_buf)? }; - while self.poll_transmit().is_none() { - core::hint::spin_loop(); - } - unsafe { self.transmit_complete(token, tx_buf) } - } - /// Blocks and waits for a packet to be received. /// /// After completion, the `rx_buf` will contain a header followed by the