This commit is contained in:
Jeremy Soller 2016-11-22 21:44:52 -07:00
parent 67440cf835
commit 933086d390
4 changed files with 40 additions and 16 deletions

@ -1 +1 @@
Subproject commit a0b3c34ce201a9e160441ac507e5a414b1cc421c
Subproject commit b51d92633b63e75024f2e0d093fb7708b6e129b8

View file

@ -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()
}
}

View file

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

View file

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