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:
parent
268c859fd6
commit
2491e4771e
54 changed files with 1884 additions and 1476 deletions
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
@ -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))?;
|
||||
|
|
|
@ -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))?;
|
||||
|
|
|
@ -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))?;
|
||||
|
|
|
@ -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)
|
||||
}
|
||||
|
||||
|
|
|
@ -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());
|
||||
|
|
|
@ -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> {
|
||||
|
|
|
@ -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))?;
|
||||
|
|
|
@ -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> {
|
||||
|
|
|
@ -83,10 +83,10 @@ pub fn open(path: &[u8], flags: usize) -> Result<usize> {
|
|||
let reference_opt = parts.next();
|
||||
|
||||
let (scheme_id, file_id) = {
|
||||
let namespace = namespace_opt.ok_or(Error::new(ENOENT))?;
|
||||
let namespace = namespace_opt.ok_or(Error::new(ENODEV))?;
|
||||
let (scheme_id, scheme) = {
|
||||
let schemes = scheme::schemes();
|
||||
let (scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENOENT))?;
|
||||
let (scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENODEV))?;
|
||||
(scheme_id, scheme.clone())
|
||||
};
|
||||
let file_id = scheme.open(reference_opt.unwrap_or(b""), flags, uid, gid)?;
|
||||
|
@ -146,10 +146,10 @@ pub fn mkdir(path: &[u8], mode: u16) -> Result<usize> {
|
|||
let namespace_opt = parts.next();
|
||||
let reference_opt = parts.next();
|
||||
|
||||
let namespace = namespace_opt.ok_or(Error::new(ENOENT))?;
|
||||
let namespace = namespace_opt.ok_or(Error::new(ENODEV))?;
|
||||
let scheme = {
|
||||
let schemes = scheme::schemes();
|
||||
let (_scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENOENT))?;
|
||||
let (_scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENODEV))?;
|
||||
scheme.clone()
|
||||
};
|
||||
scheme.mkdir(reference_opt.unwrap_or(b""), mode, uid, gid)
|
||||
|
@ -168,10 +168,10 @@ pub fn rmdir(path: &[u8]) -> Result<usize> {
|
|||
let namespace_opt = parts.next();
|
||||
let reference_opt = parts.next();
|
||||
|
||||
let namespace = namespace_opt.ok_or(Error::new(ENOENT))?;
|
||||
let namespace = namespace_opt.ok_or(Error::new(ENODEV))?;
|
||||
let scheme = {
|
||||
let schemes = scheme::schemes();
|
||||
let (_scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENOENT))?;
|
||||
let (_scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENODEV))?;
|
||||
scheme.clone()
|
||||
};
|
||||
scheme.rmdir(reference_opt.unwrap_or(b""), uid, gid)
|
||||
|
@ -190,10 +190,10 @@ pub fn unlink(path: &[u8]) -> Result<usize> {
|
|||
let namespace_opt = parts.next();
|
||||
let reference_opt = parts.next();
|
||||
|
||||
let namespace = namespace_opt.ok_or(Error::new(ENOENT))?;
|
||||
let namespace = namespace_opt.ok_or(Error::new(ENODEV))?;
|
||||
let scheme = {
|
||||
let schemes = scheme::schemes();
|
||||
let (_scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENOENT))?;
|
||||
let (_scheme_id, scheme) = schemes.get_name(namespace).ok_or(Error::new(ENODEV))?;
|
||||
scheme.clone()
|
||||
};
|
||||
scheme.unlink(reference_opt.unwrap_or(b""), uid, gid)
|
||||
|
@ -222,7 +222,7 @@ pub fn close(fd: usize) -> Result<usize> {
|
|||
}
|
||||
|
||||
/// Duplicate file descriptor
|
||||
pub fn dup(fd: usize) -> Result<usize> {
|
||||
pub fn dup(fd: usize, buf: &[u8]) -> Result<usize> {
|
||||
let file = {
|
||||
let contexts = context::contexts();
|
||||
let context_lock = contexts.current().ok_or(Error::new(ESRCH))?;
|
||||
|
@ -237,7 +237,7 @@ pub fn dup(fd: usize) -> Result<usize> {
|
|||
let scheme = schemes.get(file.scheme).ok_or(Error::new(EBADF))?;
|
||||
scheme.clone()
|
||||
};
|
||||
scheme.dup(file.number)?
|
||||
scheme.dup(file.number, buf)?
|
||||
};
|
||||
|
||||
let contexts = context::contexts();
|
||||
|
|
|
@ -39,7 +39,7 @@ pub extern fn syscall(a: usize, b: usize, c: usize, d: usize, e: usize, f: usize
|
|||
SYS_ARG_MSLICE => file_op_mut_slice(a, b, validate_slice_mut(c as *mut u8, d)?),
|
||||
_ => match a {
|
||||
SYS_CLOSE => close(b),
|
||||
SYS_DUP => dup(b),
|
||||
SYS_DUP => dup(b, validate_slice(c as *const u8, d)?),
|
||||
SYS_FEVENT => fevent(b, c),
|
||||
_ => file_op(a, b, c, d)
|
||||
}
|
||||
|
|
|
@ -227,7 +227,7 @@ pub fn clone(flags: usize, stack_base: usize) -> Result<usize> {
|
|||
let scheme = schemes.get(file.scheme).ok_or(Error::new(EBADF))?;
|
||||
scheme.clone()
|
||||
};
|
||||
let result = scheme.dup(file.number);
|
||||
let result = scheme.dup(file.number, &[]);
|
||||
result
|
||||
};
|
||||
match result {
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue