From 933086d390beeb3b68a994977754dec1e1cccb51 Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 22 Nov 2016 21:44:52 -0700 Subject: [PATCH] Fix ipd --- programs/netutils | 2 +- schemes/ipd/src/interface/loopback.rs | 12 ++++++--- schemes/ipd/src/interface/mod.rs | 5 +++- schemes/ipd/src/main.rs | 37 +++++++++++++++++++-------- 4 files changed, 40 insertions(+), 16 deletions(-) diff --git a/programs/netutils b/programs/netutils index a0b3c34..b51d926 160000 --- a/programs/netutils +++ b/programs/netutils @@ -1 +1 @@ -Subproject commit a0b3c34ce201a9e160441ac507e5a414b1cc421c +Subproject commit b51d92633b63e75024f2e0d093fb7708b6e129b8 diff --git a/schemes/ipd/src/interface/loopback.rs b/schemes/ipd/src/interface/loopback.rs index 842e96a..61c7e8c 100644 --- a/schemes/ipd/src/interface/loopback.rs +++ b/schemes/ipd/src/interface/loopback.rs @@ -22,10 +22,6 @@ impl Interface for LoopbackInterface { self.ip } - fn arp_event(&mut self) -> Result<()> { - Ok(()) - } - fn recv(&mut self) -> Result> { 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() + } } diff --git a/schemes/ipd/src/interface/mod.rs b/schemes/ipd/src/interface/mod.rs index 36458dc..279e2be 100644 --- a/schemes/ipd/src/interface/mod.rs +++ b/schemes/ipd/src/interface/mod.rs @@ -9,7 +9,10 @@ mod loopback; pub trait Interface { fn ip(&self) -> Ipv4Addr; - fn arp_event(&mut self) -> Result<()>; fn recv(&mut self) -> Result>; fn send(&mut self, ip: Ipv4) -> Result; + + fn arp_event(&mut self) -> Result<()>; + + fn has_loopback_data(&self) -> bool { false } } diff --git a/schemes/ipd/src/main.rs b/schemes/ipd/src/main.rs index a9cd024..7c4fcaf 100644 --- a/schemes/ipd/src/main.rs +++ b/schemes/ipd/src/main.rs @@ -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> { - 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");