Fix ipd
This commit is contained in:
parent
67440cf835
commit
933086d390
|
@ -1 +1 @@
|
|||
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");
|
||||
|
||||
|
|
Loading…
Reference in a new issue