Skip to content
Snippets Groups Projects
Commit 933086d3 authored by Jeremy Soller's avatar Jeremy Soller
Browse files

Fix ipd

parent 67440cf8
No related branches found
No related tags found
No related merge requests found
Subproject commit a0b3c34ce201a9e160441ac507e5a414b1cc421c
Subproject commit b51d92633b63e75024f2e0d093fb7708b6e129b8
......@@ -22,10 +22,6 @@ impl Interface for LoopbackInterface {
self.ip
}
fn arp_event(&mut self) -> Result<()> {
Ok(())
}
fn recv(&mut self) -> Result<Vec<Ipv4>> {
let mut ips = Vec::new();
......@@ -41,4 +37,12 @@ impl Interface for LoopbackInterface {
Ok(0)
}
fn arp_event(&mut self) -> Result<()> {
Ok(())
}
fn has_loopback_data(&self) -> bool {
! self.packets.is_empty()
}
}
......@@ -9,7 +9,10 @@ mod loopback;
pub trait Interface {
fn ip(&self) -> Ipv4Addr;
fn arp_event(&mut self) -> Result<()>;
fn recv(&mut self) -> Result<Vec<Ipv4>>;
fn send(&mut self, ip: Ipv4) -> Result<usize>;
fn arp_event(&mut self) -> Result<()>;
fn has_loopback_data(&self) -> bool { false }
}
......@@ -110,6 +110,20 @@ impl Ipd {
Ok(())
}
fn loopback_event(&mut self, loopback_id: usize) -> io::Result<()> {
let handle_loopback = if let Some(interface) = self.interfaces.get(loopback_id) {
interface.has_loopback_data()
} else {
false
};
if handle_loopback {
self.ip_event(loopback_id)?;
}
Ok(())
}
}
impl SchemeMut for Ipd {
......@@ -251,13 +265,6 @@ fn main() {
let mut event_queue = EventQueue::<()>::new().expect("ipd: failed to create event queue");
let loopback_id = {
let mut ipd = ipd.borrow_mut();
let if_id = ipd.interfaces.len();
ipd.interfaces.push(Box::new(LoopbackInterface::new()));
if_id
};
//TODO: Multiple interfaces
{
let arp_fd = syscall::open("ethernet:806", syscall::O_RDWR | syscall::O_NONBLOCK).expect("ipd: failed to open ethernet:806");
......@@ -286,10 +293,20 @@ fn main() {
}).expect("ipd: failed to listen to events on ethernet:800");
}
let loopback_id = {
let mut ipd = ipd.borrow_mut();
let if_id = ipd.interfaces.len();
ipd.interfaces.push(Box::new(LoopbackInterface::new()));
if_id
};
event_queue.add(scheme_fd, move |_count: usize| -> io::Result<Option<()>> {
ipd.borrow_mut().ip_event(loopback_id)?;
ipd.borrow_mut().scheme_event()?;
ipd.borrow_mut().ip_event(loopback_id)?;
let mut ipd = ipd.borrow_mut();
ipd.loopback_event(loopback_id)?;
ipd.scheme_event()?;
ipd.loopback_event(loopback_id)?;
Ok(None)
}).expect("ipd: failed to listen to events on :ip");
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment