From 6e66713b438ba2247cc411cbd28f47759e6578a5 Mon Sep 17 00:00:00 2001 From: asxalex Date: Thu, 7 Mar 2024 22:53:45 +0800 Subject: [PATCH] packet struct --- docs/design.md | 2 +- docs/interactive.md | 21 +++++++++++++++++++++ src/packet/command.rs | 18 ++++++++++++++++-- src/packet/common.rs | 11 +++++++++++ src/utils/helper.rs | 8 ++++++++ 5 files changed, 57 insertions(+), 3 deletions(-) create mode 100644 docs/interactive.md diff --git a/docs/design.md b/docs/design.md index 6c39bb3..1d47e75 100644 --- a/docs/design.md +++ b/docs/design.md @@ -1,5 +1,5 @@ # sdlan-sn设计 -服务端为单体应用,多个服务端可以同时启动,后面的服务端启动时,可以指定`--fedration x.x.x.x:7655,y.y.y.y:7656`命令行参数来指定其他的服务端,服务端将其他服务端的信息保存在`fedration`这个network里面。 +服务端为单体应用,多个服务端可以同时启动,后面的服务端启动时,可以指定`--federation x.x.x.x:7655,y.y.y.y:7656`命令行参数来指定其他的服务端,服务端将其他服务端的信息保存在`federation`这个network里面。 比如有如下的结构: diff --git a/docs/interactive.md b/docs/interactive.md new file mode 100644 index 0000000..e829467 --- /dev/null +++ b/docs/interactive.md @@ -0,0 +1,21 @@ +# sdlan交互逻辑 +sdlan节点上线流程如下: + +1. 用户在平台注册,获取自身`user_id`,这个`user_id`有可以创建网络个数和可以上线机器数量的限制。 +2. 用户创建一个(或者多个)token,得到`token_id`,`token_id`可以设置过期时间。 +3. 运行客户端,填写`token_id`,将机器纳入到自己的管理域。 + +当一个`token_id`过期,则使用该id的节点在他注册的sn上会下线并告知id过期。之后,如果使用该过期id上线,就会立即下线。但是,如果此时该节点使用另外一个有效的token上线: + +* 该新的token为同一个用户的另一个token: + * 该token有效 + * 该token无效 +* 该新的token为另一个用户的token: + * 该token有效 + * 该token无效 + +当一个`token_id`被删除,则该节点会在他注册的sn上被删除,并且数据库删除该节点的网络信息以及与token的绑定信息。该节点成为自由节点 + +当一个节点上次用某个用户的token登录之后,然后下次使用同一个用户的另外的token登录,是否允许?(应该允许) + +当一个节点上次用某个用户的token登录之后,下次使用另一个用户的token登录,是否允许? \ No newline at end of file diff --git a/src/packet/command.rs b/src/packet/command.rs index 028f1e2..ea4fef5 100644 --- a/src/packet/command.rs +++ b/src/packet/command.rs @@ -1,9 +1,23 @@ use serde::{Deserialize, Serialize}; +use serde_json::Value; +use serde_repr::{Deserialize_repr, Serialize_repr}; +#[derive(Debug, PartialEq, Serialize_repr, Deserialize_repr, Copy, Clone)] +#[repr(u8)] +pub enum CommandType { + AuthorizePeer, + MovePeer, +} + +#[derive(Serialize, Deserialize)] pub struct Command { - pub cookie: u32, + pub cmd_type: CommandType, + pub message: Value, } +#[derive(Serialize, Deserialize)] pub struct CommandResp { - pub cookie: u32, + cmd_type: CommandType, + resp_code: i8, + resp_information: Value, } diff --git a/src/packet/common.rs b/src/packet/common.rs index 39aaab9..a91c3f0 100644 --- a/src/packet/common.rs +++ b/src/packet/common.rs @@ -67,6 +67,17 @@ impl<'a> Common<'a> { Ok((common, &value[7 + id_len..])) } + pub fn from_old_common(cmn: &'a Common) -> Self { + return Common { + packet_id: cmn.packet_id, + id: cmn.id, + version: cmn.version, + ttl: cmn.ttl, + pc: cmn.pc, + flags: cmn.flags, + }; + } + pub fn new(id: &'a str) -> Self { return Common { packet_id: 0, diff --git a/src/utils/helper.rs b/src/utils/helper.rs index 913b53c..b47ae06 100644 --- a/src/utils/helper.rs +++ b/src/utils/helper.rs @@ -121,3 +121,11 @@ pub fn ip_to_string(ip: u32) -> String { (ip & 0xff) as u8, ) } + +pub fn net_bit_len_to_mask(len: u8) -> u32 { + let mut res = 0u32; + for i in 1..=len { + res |= 1 << (32 - i); + } + res +}