diff --git a/kernel/Makefile b/kernel/Makefile index cd14aa8..685f362 100644 --- a/kernel/Makefile +++ b/kernel/Makefile @@ -71,7 +71,7 @@ qemu_opts += \ -serial mon:stdio \ -device isa-debug-exit qemu_net_opts += \ - -device virtio-net-pci,netdev=net0 + -device e1000,netdev=net0 else ifeq ($(arch), riscv32) qemu_opts += \ diff --git a/kernel/src/drivers/net/e1000.rs b/kernel/src/drivers/net/e1000.rs index 0107a65..a00c65c 100644 --- a/kernel/src/drivers/net/e1000.rs +++ b/kernel/src/drivers/net/e1000.rs @@ -238,7 +238,7 @@ impl phy::TxToken for E1000TxToken { fence(Ordering::SeqCst); - tdt = (tdt + 2) % send_queue_size as u32; + tdt = (tdt + 1) % send_queue_size as u32; e1000[0x3818 / 4].write(tdt); fence(Ordering::SeqCst); @@ -318,7 +318,7 @@ pub fn e1000_init(header: usize, size: usize) { e1000[0x3800 / 4].write(send_page_pa as u32); // TDBAL e1000[0x3804 / 4].write((send_page_pa >> 32) as u32); // TDBAH - e1000[0x3808 / 8].write(PAGE_SIZE as u32); // TDLEN + e1000[0x3808 / 4].write(PAGE_SIZE as u32); // TDLEN e1000[0x3810 / 4].write(0); // TDH e1000[0x3818 / 4].write(0); // TDT diff --git a/kernel/src/net/test.rs b/kernel/src/net/test.rs index b3dee09..4bf2d28 100644 --- a/kernel/src/net/test.rs +++ b/kernel/src/net/test.rs @@ -6,6 +6,7 @@ use smoltcp::socket::*; use alloc::collections::BTreeMap; use crate::drivers::NetDriver; use crate::drivers::net::virtio_net::VirtIONetDriver; +use crate::drivers::net::e1000::E1000Driver; use alloc::vec; use smoltcp::time::Instant; use core::fmt::Write; @@ -19,7 +20,8 @@ pub extern fn server(_arg: usize) -> ! { let driver = { let ref_driver = &mut *NET_DRIVERS.lock()[0]; - ref_driver.as_any().downcast_ref::().unwrap().clone() + // TODO: support multiple net drivers here + ref_driver.as_any().downcast_ref::().unwrap().clone() }; let ethernet_addr = driver.get_mac(); let ip_addrs = [IpCidr::new(IpAddress::v4(10,0,0,2), 24)]; @@ -38,15 +40,24 @@ pub extern fn server(_arg: usize) -> ! { let tcp_tx_buffer = TcpSocketBuffer::new(vec![0; 1024]); let tcp_socket = TcpSocket::new(tcp_rx_buffer, tcp_tx_buffer); + let tcp2_rx_buffer = TcpSocketBuffer::new(vec![0; 1024]); + let tcp2_tx_buffer = TcpSocketBuffer::new(vec![0; 1024]); + let tcp2_socket = TcpSocket::new(tcp2_rx_buffer, tcp2_tx_buffer); + let mut sockets = SocketSet::new(vec![]); let udp_handle = sockets.add(udp_socket); let tcp_handle = sockets.add(tcp_socket); + let tcp2_handle = sockets.add(tcp2_socket); loop { { let timestamp = Instant::from_millis(unsafe { crate::trap::TICK as i64 }); match iface.poll(&mut sockets, timestamp) { - Ok(_) => {}, + Ok(event) => { + if (!event) { + continue; + } + }, Err(e) => { println!("poll error: {}", e); } @@ -83,6 +94,19 @@ pub extern fn server(_arg: usize) -> ! { socket.close(); } } + + // simple tcp server that just eats everything + { + let mut socket = sockets.get::(tcp2_handle); + if !socket.is_open() { + socket.listen(2222).unwrap(); + } + + if socket.can_recv() { + let mut data = [0u8; 2048]; + let size = socket.recv_slice(&mut data).unwrap(); + } + } } thread::yield_now(); diff --git a/kernel/src/shell.rs b/kernel/src/shell.rs index e2ed691..7e7b2d9 100644 --- a/kernel/src/shell.rs +++ b/kernel/src/shell.rs @@ -6,6 +6,8 @@ use crate::process::*; use crate::thread; pub fn run_user_shell() { + use crate::net::server; + processor().manager().add(Thread::new_kernel(server, 0), 0); if let Ok(inode) = ROOT_INODE.lookup("sh") { println!("Going to user mode shell."); println!("Use 'ls' to list available programs.");