forked from koniifer/ableos
implementing socket related IPC
This commit is contained in:
parent
f6d0c71a24
commit
3f4c9fdb5a
14
Cargo.lock
generated
14
Cargo.lock
generated
|
@ -38,6 +38,7 @@ dependencies = [
|
||||||
"genfs",
|
"genfs",
|
||||||
"hashbrown 0.7.2",
|
"hashbrown 0.7.2",
|
||||||
"kernel",
|
"kernel",
|
||||||
|
"lazy_static",
|
||||||
"libwasm",
|
"libwasm",
|
||||||
"linked_list_allocator",
|
"linked_list_allocator",
|
||||||
"lliw",
|
"lliw",
|
||||||
|
@ -54,7 +55,7 @@ dependencies = [
|
||||||
"rkyv",
|
"rkyv",
|
||||||
"serde",
|
"serde",
|
||||||
"shadeable",
|
"shadeable",
|
||||||
"spin",
|
"spin 0.9.2",
|
||||||
"toml",
|
"toml",
|
||||||
"uart_16550",
|
"uart_16550",
|
||||||
"unicode-width",
|
"unicode-width",
|
||||||
|
@ -310,7 +311,7 @@ dependencies = [
|
||||||
"bitflags",
|
"bitflags",
|
||||||
"genfs",
|
"genfs",
|
||||||
"rlibc",
|
"rlibc",
|
||||||
"spin",
|
"spin 0.9.2",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -439,6 +440,9 @@ name = "lazy_static"
|
||||||
version = "1.4.0"
|
version = "1.4.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||||
|
dependencies = [
|
||||||
|
"spin 0.5.2",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
|
@ -896,6 +900,12 @@ dependencies = [
|
||||||
"version_check",
|
"version_check",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "spin"
|
||||||
|
version = "0.5.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "spin"
|
name = "spin"
|
||||||
version = "0.9.2"
|
version = "0.9.2"
|
||||||
|
|
|
@ -42,6 +42,8 @@ test-args = [
|
||||||
]
|
]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
lazy_static = { version = "*", features = ["spin_no_std"] }
|
||||||
|
|
||||||
linked_list_allocator = "0.9.0"
|
linked_list_allocator = "0.9.0"
|
||||||
lliw = "0.2.0"
|
lliw = "0.2.0"
|
||||||
spin = "0.9"
|
spin = "0.9"
|
||||||
|
@ -57,8 +59,6 @@ axel = { git = "https://git.ablecorp.us/able/aos_userland" }
|
||||||
versioning = { git = "https://git.ablecorp.us/able/aos_userland" }
|
versioning = { git = "https://git.ablecorp.us/able/aos_userland" }
|
||||||
embedded-graphics = "*"
|
embedded-graphics = "*"
|
||||||
pc-keyboard = "0.5"
|
pc-keyboard = "0.5"
|
||||||
|
|
||||||
|
|
||||||
[dependencies.logos]
|
[dependencies.logos]
|
||||||
version = "0.12"
|
version = "0.12"
|
||||||
default-features = false
|
default-features = false
|
||||||
|
|
|
@ -11,15 +11,14 @@ pub struct BinaryData {
|
||||||
data: Vec<u8>,
|
data: Vec<u8>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Eq, Hash, PartialEq, Clone, Copy)]
|
||||||
pub enum HandleResource {
|
pub enum HandleResource {
|
||||||
Channel(Channel),
|
Channel,
|
||||||
// Device
|
Socket,
|
||||||
/// Used for things like files or images or the like
|
BinaryData,
|
||||||
BinaryData(BinaryData),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug, Eq, Hash, PartialEq, Clone, Copy)]
|
||||||
pub struct Handle {
|
pub struct Handle {
|
||||||
inner: u128,
|
inner: u128,
|
||||||
res: HandleResource,
|
res: HandleResource,
|
||||||
|
@ -29,8 +28,9 @@ impl Display for Handle {
|
||||||
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
|
||||||
write!(f, "Handle-{:032x}", self.inner)?;
|
write!(f, "Handle-{:032x}", self.inner)?;
|
||||||
match &self.res {
|
match &self.res {
|
||||||
HandleResource::Channel(_) => write!(f, "-Channel")?,
|
HandleResource::Channel => write!(f, "-Channel")?,
|
||||||
HandleResource::BinaryData(data) => write!(f, "-Binary-{}", &data.name)?,
|
HandleResource::BinaryData => write!(f, "-Binary")?,
|
||||||
|
Socket => write!(f, "-Socket")?,
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -39,10 +39,10 @@ impl Display for Handle {
|
||||||
|
|
||||||
use crate::handle::HandleResource::*;
|
use crate::handle::HandleResource::*;
|
||||||
impl Handle {
|
impl Handle {
|
||||||
pub fn from_channel(channel: Channel) -> Self {
|
pub fn new(htype: HandleResource) -> Self {
|
||||||
Self {
|
Self {
|
||||||
inner: generate_process_pass(),
|
inner: generate_process_pass(),
|
||||||
res: Channel(channel),
|
res: htype,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,16 +1,46 @@
|
||||||
use self::{channel::Channel, socket::Socket};
|
use hashbrown::HashMap;
|
||||||
|
|
||||||
|
use crate::handle::Handle;
|
||||||
|
|
||||||
|
use self::{
|
||||||
|
channel::Channel,
|
||||||
|
socket::{Socket, SocketError},
|
||||||
|
};
|
||||||
|
|
||||||
pub mod channel;
|
pub mod channel;
|
||||||
pub mod socket;
|
pub mod socket;
|
||||||
|
|
||||||
pub static IPC: spin::Mutex<IPCService> = spin::Mutex::new(IPCService {
|
lazy_static::lazy_static! {
|
||||||
sockets: vec![],
|
pub static ref IPC: spin::Mutex<IPCService> = spin::Mutex::new(IPCService {
|
||||||
channels: vec![],
|
sockets: HashMap::new(),
|
||||||
|
channels: HashMap::new(),
|
||||||
});
|
});
|
||||||
|
}
|
||||||
pub struct IPCService {
|
pub struct IPCService {
|
||||||
pub sockets: Vec<Socket>,
|
pub sockets: HashMap<Handle, Socket>,
|
||||||
pub channels: Vec<Channel>,
|
pub channels: HashMap<Handle, Socket>,
|
||||||
// TODO: Add a public board of each down below which use some method of pointing to the above
|
// TODO: Add a public board of each down below which use some method of pointing to the above
|
||||||
}
|
}
|
||||||
impl IPCService {}
|
|
||||||
|
// Socket Related Impl
|
||||||
|
impl IPCService {
|
||||||
|
pub fn create_socket(&mut self) -> Handle {
|
||||||
|
let handle = Handle::new(crate::handle::HandleResource::Socket);
|
||||||
|
|
||||||
|
let sock = Socket::new();
|
||||||
|
self.sockets.insert(handle.clone(), sock);
|
||||||
|
|
||||||
|
handle
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn send_socket(&mut self, handle: Handle, data: String) -> Result<(), SocketError> {
|
||||||
|
let sock = self.sockets.get_mut(&handle);
|
||||||
|
|
||||||
|
match sock {
|
||||||
|
Some(socket) => {
|
||||||
|
return socket.write(data);
|
||||||
|
}
|
||||||
|
None => return Err(SocketError::NonexistantSocket),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -1,16 +1,21 @@
|
||||||
// SEEALSO: https://git.ablecorp.us/able/ableos/src/branch/master/ableos/src/relib/network/socket.rs
|
// SEEALSO: https://git.ablecorp.us/able/ableos/src/branch/master/ableos/src/relib/network/socket.rs
|
||||||
|
|
||||||
pub enum SocketError {
|
pub enum SocketError {
|
||||||
|
NonexistantSocket,
|
||||||
EmptySocket,
|
EmptySocket,
|
||||||
}
|
}
|
||||||
|
#[derive(Debug)]
|
||||||
pub struct Socket {
|
pub struct Socket {
|
||||||
|
name: Option<String>,
|
||||||
stream: Vec<u8>,
|
stream: Vec<u8>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Socket {
|
impl Socket {
|
||||||
pub fn new() -> Self {
|
pub fn new() -> Self {
|
||||||
Self { stream: vec![] }
|
Self {
|
||||||
|
name: None,
|
||||||
|
stream: vec![],
|
||||||
|
}
|
||||||
}
|
}
|
||||||
pub fn write(&mut self, data: String) -> Result<(), SocketError> {
|
pub fn write(&mut self, data: String) -> Result<(), SocketError> {
|
||||||
for c in data.chars() {
|
for c in data.chars() {
|
||||||
|
@ -28,4 +33,8 @@ impl Socket {
|
||||||
}
|
}
|
||||||
return Err(SocketError::EmptySocket);
|
return Err(SocketError::EmptySocket);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn name(&mut self, name: String) {
|
||||||
|
self.name = Some(name);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,18 @@
|
||||||
#![allow(clippy::empty_loop)]
|
#![allow(clippy::empty_loop)]
|
||||||
|
|
||||||
|
use core::sync::atomic::Ordering;
|
||||||
|
|
||||||
use crate::arch::drivers::sysinfo::master;
|
use crate::arch::drivers::sysinfo::master;
|
||||||
|
use crate::ipc::{self, IPC};
|
||||||
use crate::scheduler::SCHEDULER;
|
use crate::scheduler::SCHEDULER;
|
||||||
|
use crate::time::fetch_time;
|
||||||
use crate::{
|
use crate::{
|
||||||
arch::{init, sloop},
|
arch::{init, sloop},
|
||||||
relib::network::socket::{SimpleSock, Socket},
|
relib::network::socket::{SimpleSock, Socket},
|
||||||
scratchpad,
|
scratchpad,
|
||||||
};
|
};
|
||||||
use crate::{boot_conf::KernelConfig, systeminfo::RELEASE_TYPE};
|
use crate::{boot_conf::KernelConfig, systeminfo::RELEASE_TYPE};
|
||||||
use kernel::KERNEL_VERSION;
|
use kernel::{KERNEL_VERSION, TICK};
|
||||||
use spin::Lazy;
|
use spin::Lazy;
|
||||||
|
|
||||||
// TODO: Change this structure to allow for multiple cores loaded
|
// TODO: Change this structure to allow for multiple cores loaded
|
||||||
|
@ -25,6 +29,13 @@ pub fn kernel_main() -> ! {
|
||||||
log::set_max_level(log::LevelFilter::Off);
|
log::set_max_level(log::LevelFilter::Off);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut ipc_service = IPC.lock();
|
||||||
|
// create some channels or whatever here then drop it
|
||||||
|
let handle = ipc_service.create_socket();
|
||||||
|
ipc_service.send_socket(handle, "nerd".to_string());
|
||||||
|
|
||||||
|
drop(ipc_service);
|
||||||
|
|
||||||
x86_64::instructions::interrupts::without_interrupts(|| {
|
x86_64::instructions::interrupts::without_interrupts(|| {
|
||||||
SCHEDULER.lock().enqueue_spawn(scratchpad);
|
SCHEDULER.lock().enqueue_spawn(scratchpad);
|
||||||
});
|
});
|
||||||
|
|
|
@ -217,6 +217,7 @@ fn engine_construction() -> Engine {
|
||||||
engine.register_fn("poke", poke_memory);
|
engine.register_fn("poke", poke_memory);
|
||||||
engine.register_fn("sloop", sloop);
|
engine.register_fn("sloop", sloop);
|
||||||
engine.register_fn("log_dump", log_dump);
|
engine.register_fn("log_dump", log_dump);
|
||||||
|
// engine.register_fn("ls", ls);
|
||||||
|
|
||||||
engine
|
engine
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ use crate::channels::{Channel, ChannelPermission};
|
||||||
use crate::devices::pci;
|
use crate::devices::pci;
|
||||||
use crate::filesystem::FILE_SYSTEM;
|
use crate::filesystem::FILE_SYSTEM;
|
||||||
use crate::handle::Handle;
|
use crate::handle::Handle;
|
||||||
|
use crate::ipc::IPC;
|
||||||
use crate::rhai_shell::shell;
|
use crate::rhai_shell::shell;
|
||||||
use crate::rhai_shell::KEYBUFF;
|
use crate::rhai_shell::KEYBUFF;
|
||||||
use crate::wasm_jumploader::run_program;
|
use crate::wasm_jumploader::run_program;
|
||||||
|
|
Loading…
Reference in a new issue