refactor: node
This commit is contained in:
parent
bd9ce9f01f
commit
812748981a
8 changed files with 10 additions and 104 deletions
|
@ -1,6 +0,0 @@
|
||||||
You can set up the node in very cool ways.
|
|
||||||
|
|
||||||
# `node.id` (optional)
|
|
||||||
This will set the node's id.
|
|
||||||
Your app may not start if the id is already taken.
|
|
||||||
> tip: `0xFF------` is a free subnet in `domo_node`.
|
|
|
@ -1,3 +0,0 @@
|
||||||
# Todo
|
|
||||||
|
|
||||||
- [ ] `0xFF------` subnet should be free to use without interference.
|
|
|
@ -1,45 +0,0 @@
|
||||||
The `domo_node` implementation is quite limited.
|
|
||||||
It's not made to be used standalone but rather in combination with other tools and use drivers.
|
|
||||||
|
|
||||||
# The Master node (`master`)
|
|
||||||
Of these, there can only be one.
|
|
||||||
The job of a master node is rather complex.
|
|
||||||
|
|
||||||
## Forwarding packets
|
|
||||||
The most straight forward job of the node.
|
|
||||||
It works by essentially having a hashmap with a reference to a socket.
|
|
||||||
When a packet comes in the packet gets forwarded to the right node and socket.
|
|
||||||
|
|
||||||
## Handling network state
|
|
||||||
The master node ensures there are no duplicate identifiers and therefore nodes.
|
|
||||||
Also, it will make sure no invalid updates can be sent.
|
|
||||||
Most packets go through the master node before getting to the source.
|
|
||||||
Most because the subnet node can have private nodes and handle those themselves.
|
|
||||||
|
|
||||||
# The Bridge node (`bridge`)
|
|
||||||
The bridge node is simple.
|
|
||||||
In config you define where to forward the packets to, and they get delivered to there.
|
|
||||||
|
|
||||||
# The Subnet node (`subnet`)
|
|
||||||
This is maybe another advanced node.
|
|
||||||
It's a slave node that also acts as a master node.
|
|
||||||
You can define private nodes in config, and they will be managed by the subnet node.
|
|
||||||
For big domo networks this can be very useful to ensure privacy and keep control.
|
|
||||||
|
|
||||||
## Subnet properties
|
|
||||||
The `domo_node` implementation ensures a couple properties.
|
|
||||||
|
|
||||||
### Lights (`all_lights` = `Switch`)
|
|
||||||
With this property you can turn off all the lights in the subnet.
|
|
||||||
This property will be absent is there are no lights present in the subnet.
|
|
||||||
|
|
||||||
> TODO: this feature requires distinction between switches and lights.
|
|
||||||
> Either with extra identification information in `0x01`
|
|
||||||
|
|
||||||
### Enabled (`enabled` = `Switch`)
|
|
||||||
Enable or disable the subnet.
|
|
||||||
Functionality like: Master emulation, forwarding, private nodes will be paused.
|
|
||||||
|
|
||||||
### Forward (`forward` = `Swtich`)
|
|
||||||
This will disable the forwarding of the subnet's node.
|
|
||||||
Essentially make the subnet all private.
|
|
|
@ -1,3 +0,0 @@
|
||||||
[node.type.bridge]
|
|
||||||
bind = "127.0.0.1:4481"
|
|
||||||
master_address = "127.0.0.1:4480"
|
|
|
@ -1,5 +1,2 @@
|
||||||
[node.type.master]
|
|
||||||
bind = "0.0.0.0:4480"
|
|
||||||
|
|
||||||
[node]
|
[node]
|
||||||
node_id = "ffffffff"
|
node_id = "ff"
|
|
@ -1,47 +1,9 @@
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::fmt::{Display, Formatter};
|
use std::fmt::{Display, Formatter};
|
||||||
use std::net::SocketAddr;
|
|
||||||
use domo_proto::identifier::Identifier;
|
use domo_proto::identifier::Identifier;
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
|
||||||
pub enum NodeType {
|
|
||||||
#[serde(rename = "master")]
|
|
||||||
Master {
|
|
||||||
bind: SocketAddr,
|
|
||||||
},
|
|
||||||
#[serde(rename = "relay")]
|
|
||||||
Bridge {
|
|
||||||
bind: SocketAddr,
|
|
||||||
master_address: SocketAddr
|
|
||||||
},
|
|
||||||
#[serde(rename = "subnet")]
|
|
||||||
Subnet {
|
|
||||||
master_address: String
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Display for NodeType {
|
|
||||||
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
|
||||||
match self {
|
|
||||||
NodeType::Master { .. } => write!(f, "master"),
|
|
||||||
NodeType::Bridge { .. } => write!(f, "relay"),
|
|
||||||
NodeType::Subnet { .. } => write!(f, "subnet"),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Default for NodeType {
|
|
||||||
fn default() -> Self {
|
|
||||||
Self::Master {
|
|
||||||
bind: SocketAddr::from(([0,0,0,0], 4480)),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug, Serialize, Deserialize, Clone)]
|
#[derive(Debug, Serialize, Deserialize, Clone)]
|
||||||
pub struct NodeConfig {
|
pub struct NodeConfig {
|
||||||
#[serde(rename = "type")]
|
|
||||||
pub node_type: NodeType,
|
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub node_id: String
|
pub node_id: String
|
||||||
}
|
}
|
||||||
|
@ -49,7 +11,6 @@ pub struct NodeConfig {
|
||||||
impl Default for NodeConfig {
|
impl Default for NodeConfig {
|
||||||
fn default() -> Self {
|
fn default() -> Self {
|
||||||
Self {
|
Self {
|
||||||
node_type: NodeType::default(),
|
|
||||||
node_id: Identifier::random().to_string()
|
node_id: Identifier::random().to_string()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,8 +27,7 @@ fn main() -> io::Result<()> {
|
||||||
debug!("Built tokio runtime with all features...");
|
debug!("Built tokio runtime with all features...");
|
||||||
|
|
||||||
info!(
|
info!(
|
||||||
"Staring {} node as 0x{}!",
|
"Starting node with id: 0x{}!",
|
||||||
CONFIG.with_borrow(|c| c.node.node_type.clone()),
|
|
||||||
CONFIG.with_borrow(|c| c.node.node_id.clone())
|
CONFIG.with_borrow(|c| c.node.node_id.clone())
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -43,6 +42,8 @@ fn main() -> io::Result<()> {
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
|
|
@ -41,8 +41,12 @@ impl LowerHex for Identifier {
|
||||||
|
|
||||||
impl From<&[u8]> for Identifier {
|
impl From<&[u8]> for Identifier {
|
||||||
fn from(value: &[u8]) -> Self {
|
fn from(value: &[u8]) -> Self {
|
||||||
let mut bytes = [0_u8; 4];
|
let mut bytes = [0; 4];
|
||||||
bytes[..4].copy_from_slice(value[..4].as_ref());
|
for i in 0..4 {
|
||||||
|
if i < value.len() {
|
||||||
|
bytes[i] = value[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
Identifier {
|
Identifier {
|
||||||
bytes
|
bytes
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue