Fix a bug in e1000 driver, run net thread and update Makefile

master
Jiajie Chen 6 years ago
parent 7a3c66a923
commit af9a978a9d

@ -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 += \

@ -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

@ -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::<VirtIONetDriver>().unwrap().clone()
// TODO: support multiple net drivers here
ref_driver.as_any().downcast_ref::<E1000Driver>().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::<TcpSocket>(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();

@ -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.");

Loading…
Cancel
Save