Modify virtio-net test util for debian_guest
Use IPv4 instead of IPv6 and remove code for bringing up the ethernet
device.
Change-Id: I92d5d8dbd495959ab38764a7de914e30141e6637
diff --git a/src/bin/virtio_net_test_util.rs b/src/bin/virtio_net_test_util.rs
index 60945b1..37c6bfe 100644
--- a/src/bin/virtio_net_test_util.rs
+++ b/src/bin/virtio_net_test_util.rs
@@ -2,97 +2,31 @@
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
-use libc::{self, c_char, c_int, c_short};
-use std::ffi::CString;
-use std::io::Error;
+#![deny(warnings)]
+
use std::net::UdpSocket;
-use std::ptr;
use structopt::StructOpt;
-// Socket ioctl get interface index. Defined in Linux:include/uapi/linux/sockios.h
-const SIOCSIFFLAGS: c_int = 0x8914;
-
-// Interface flag UP. Defined in Linux:include/uapi/linux/if.h
-const IFF_UP: c_short = 1 << 0;
-const IFF_NOARP: c_short = 1 << 7;
-
-const ETH_IFACE_NAME: &str = "eth0";
-
#[derive(StructOpt, Debug)]
-enum Command {
- #[structopt(name = "up")]
- Up,
- #[structopt(name = "xfer")]
- Transfer {
- send_byte: u8,
- receive_byte: u8,
- length: usize,
- },
-}
-
-// Open a socket and return the file descriptor. The type and protocol don't really matter since
-// we're only using this socket to perform ioctls.
-fn open_fd() -> std::io::Result<i32> {
- // The protocol is a two byte value that must be given as an i32 in network order. It is defined
- // as an i32 in libc so we must cast to u16 before converting to big endian.
- let protocol = (libc::IPPROTO_UDP as u16).to_be() as i32;
- let fd = unsafe { libc::socket(libc::AF_PACKET, libc::SOCK_DGRAM, protocol) };
- if fd == -1 {
- Err(Error::last_os_error())
- } else {
- Ok(fd)
- }
-}
-
-// See Linux:include/uapi/linux/if.h.
-// We add padding to this struct to bring the size to sizeof(ifreq), which is 40.
-#[repr(C)]
-struct SetFlagsRequest {
- name: [c_char; 16],
- flags: c_short,
- _padding: [u8; 22],
-}
-
-// Do a "set interface flags" ioctl on the fd. We use this to bring up the ethernet interface, which
-// is specified in the request using ETH_IFACE_NAME.
-fn set_flags(fd: i32, flags: c_short) -> () {
- let mut req = SetFlagsRequest {
- name: [0; 16],
- flags: flags,
- _padding: [0; 22],
- };
- let name = CString::new(ETH_IFACE_NAME).unwrap();
- unsafe {
- ptr::copy_nonoverlapping(
- name.as_ptr(),
- req.name.as_mut_ptr(),
- name.as_bytes_with_nul().len(),
- );
- libc::ioctl(fd, SIOCSIFFLAGS, &mut req);
- }
+struct Transfer {
+ send_byte: u8,
+ receive_byte: u8,
+ length: usize,
}
fn main() -> std::io::Result<()> {
- let cmd = Command::from_args();
- match cmd {
- Command::Up => {
- let fd = open_fd()?;
- // In addition to bringing up the interface (IFF_UP), we specify no ARP (IFF_NOARP) to
- // reduce packet spam.
- set_flags(fd, IFF_UP | IFF_NOARP);
- println!("PASS");
- }
- Command::Transfer {
+ match Transfer::from_args() {
+ Transfer {
send_byte,
receive_byte,
length,
} => {
// Bind the socket to all addresses, on port 4242.
- let socket = UdpSocket::bind(("::", 4242))?;
+ let socket = UdpSocket::bind(("0.0.0.0", 4242))?;
- // Send to fe80::1, the IPv6 address of the host.
+ // Send to 192.168.0.1, the IPv4 address of the host.
let send_buf = vec![send_byte; length];
- socket.send_to(&send_buf, ("fe80::1", 4242))?;
+ socket.send_to(&send_buf, ("192.168.0.1", 4242))?;
let mut recv_buf = vec![0; length];
let actual = socket.recv(&mut recv_buf)?;