Redo networking (#22)

* Rewriting network functions

* Add buffer to dup
Fix non-blocking handling by triggering once on enabling events to read to EOF

* Modifications for UDP API

* Implement TCP client side

* Add active close

* Add DMAR parser

* Implement basic TCP listening. Need to improve the state machine

* Reduce debugging

* Fixes for close procedure

* Updates to fix path processing in libstd
This commit is contained in:
Jeremy Soller 2016-10-26 13:19:56 -06:00 committed by GitHub
parent 268c859fd6
commit 2491e4771e
54 changed files with 1884 additions and 1476 deletions

View file

@ -33,7 +33,7 @@ impl Scheme for DebugScheme {
Ok(0)
}
fn dup(&self, _file: usize) -> Result<usize> {
fn dup(&self, _file: usize, _buf: &[u8]) -> Result<usize> {
Ok(0)
}

View file

@ -88,7 +88,7 @@ impl Scheme for EnvScheme {
}
}
fn dup(&self, id: usize) -> Result<usize> {
fn dup(&self, id: usize, _buf: &[u8]) -> Result<usize> {
let new_handle = {
let handles = self.handles.read();
let handle = handles.get(&id).ok_or(Error::new(EBADF))?;

View file

@ -39,7 +39,7 @@ impl Scheme for EventScheme {
Ok(id)
}
fn dup(&self, id: usize) -> Result<usize> {
fn dup(&self, id: usize, _buf: &[u8]) -> Result<usize> {
let handle = {
let handles = self.handles.read();
let handle_weak = handles.get(&id).ok_or(Error::new(EBADF))?;

View file

@ -57,7 +57,7 @@ impl Scheme for InitFsScheme {
Err(Error::new(ENOENT))
}
fn dup(&self, id: usize) -> Result<usize> {
fn dup(&self, id: usize, _buf: &[u8]) -> Result<usize> {
let (path, data, mode, seek) = {
let handles = self.handles.read();
let handle = handles.get(&id).ok_or(Error::new(EBADF))?;

View file

@ -40,7 +40,7 @@ impl Scheme for IrqScheme {
}
}
fn dup(&self, file: usize) -> Result<usize> {
fn dup(&self, file: usize, _buf: &[u8]) -> Result<usize> {
Ok(file)
}

View file

@ -42,7 +42,7 @@ pub fn pipe(flags: usize) -> (usize, usize) {
pub struct PipeScheme;
impl Scheme for PipeScheme {
fn dup(&self, id: usize) -> Result<usize> {
fn dup(&self, id: usize, _buf: &[u8]) -> Result<usize> {
let mut pipes = pipes_mut();
let read_option = pipes.0.get(&id).map(|pipe| pipe.clone());

View file

@ -56,7 +56,7 @@ impl Scheme for RootScheme {
}
}
fn dup(&self, file: usize) -> Result<usize> {
fn dup(&self, file: usize, _buf: &[u8]) -> Result<usize> {
let mut handles = self.handles.write();
let inner = {
let inner = handles.get(&file).ok_or(Error::new(EBADF))?;
@ -89,12 +89,24 @@ impl Scheme for RootScheme {
inner.write(buf)
}
fn fevent(&self, file: usize, _flags: usize) -> Result<usize> {
Ok(file)
fn fevent(&self, file: usize, flags: usize) -> Result<usize> {
let inner = {
let handles = self.handles.read();
let inner = handles.get(&file).ok_or(Error::new(EBADF))?;
inner.clone()
};
inner.fevent(flags)
}
fn fsync(&self, _file: usize) -> Result<usize> {
Ok(0)
fn fsync(&self, file: usize) -> Result<usize> {
let inner = {
let handles = self.handles.read();
let inner = handles.get(&file).ok_or(Error::new(EBADF))?;
inner.clone()
};
inner.fsync()
}
fn close(&self, file: usize) -> Result<usize> {

View file

@ -92,7 +92,7 @@ impl Scheme for SysScheme {
Err(Error::new(ENOENT))
}
fn dup(&self, id: usize) -> Result<usize> {
fn dup(&self, id: usize, _buf: &[u8]) -> Result<usize> {
let (path, data, mode, seek) = {
let handles = self.handles.read();
let handle = handles.get(&id).ok_or(Error::new(EBADF))?;

View file

@ -61,10 +61,7 @@ impl UserInner {
};
let len = self.todo.send(packet);
//TODO: Use O_NONBLOCK and send one notification
for _i in 0 .. len {
context::event::trigger(ROOT_SCHEME_ID.load(Ordering::SeqCst), self.handle_id, EVENT_READ, mem::size_of::<Packet>());
}
context::event::trigger(ROOT_SCHEME_ID.load(Ordering::SeqCst), self.handle_id, EVENT_READ, mem::size_of::<Packet>() * len);
Error::demux(self.done.receive(&id))
}
@ -182,6 +179,14 @@ impl UserInner {
Ok(i * packet_size)
}
pub fn fevent(&self, _flags: usize) -> Result<usize> {
Ok(self.handle_id)
}
pub fn fsync(&self) -> Result<usize> {
Ok(0)
}
}
/// UserInner has to be wrapped
@ -230,9 +235,12 @@ impl Scheme for UserScheme {
result
}
fn dup(&self, file: usize) -> Result<usize> {
fn dup(&self, file: usize, buf: &[u8]) -> Result<usize> {
let inner = self.inner.upgrade().ok_or(Error::new(ENODEV))?;
inner.call(SYS_DUP, file, 0, 0)
let address = inner.capture(buf)?;
let result = inner.call(SYS_DUP, file, address, buf.len());
let _ = inner.release(address);
result
}
fn read(&self, file: usize, buf: &mut [u8]) -> Result<usize> {